From 7d88cd80bed9b7021a3d8e735d79e05a70db6636 Mon Sep 17 00:00:00 2001 From: Lorenzo Pichilli Date: Fri, 29 May 2020 14:51:26 +0200 Subject: [PATCH] updated docs --- README.md | 3 + lib/src/cookie_manager.dart | 2 + lib/src/http_auth_credentials_database.dart | 3 +- lib/src/in_app_webview.dart | 11 -- lib/src/in_app_webview_controller.dart | 139 +++++++++++++++++++- lib/src/types.dart | 66 ++++++---- lib/src/web_storage_manager.dart | 2 + lib/src/webview.dart | 2 + 8 files changed, 182 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index 39b426db..b8e1fbf0 100755 --- a/README.md +++ b/README.md @@ -1306,6 +1306,9 @@ Future main() async { This class implements a singleton object (shared instance) which manages the cookies used by WebView instances. +On Android, it is implemented using [CookieManager](https://developer.android.com/reference/android/webkit/CookieManager). +On iOS, it is implemented using [WKHTTPCookieStore](https://developer.apple.com/documentation/webkit/wkhttpcookiestore). + **NOTE for iOS**: available from iOS 11.0+. #### `CookieManager` methods diff --git a/lib/src/cookie_manager.dart b/lib/src/cookie_manager.dart index 7f5adf12..007ff84a 100755 --- a/lib/src/cookie_manager.dart +++ b/lib/src/cookie_manager.dart @@ -6,6 +6,8 @@ import 'package:flutter/services.dart'; import 'types.dart'; ///Class that implements a singleton object (shared instance) which manages the cookies used by WebView instances. +///On Android, it is implemented using [CookieManager](https://developer.android.com/reference/android/webkit/CookieManager). +///On iOS, it is implemented using [WKHTTPCookieStore](https://developer.apple.com/documentation/webkit/wkhttpcookiestore). /// ///**NOTE for iOS**: available from iOS 11.0+. class CookieManager { diff --git a/lib/src/http_auth_credentials_database.dart b/lib/src/http_auth_credentials_database.dart index 79f5adae..67ec00d2 100755 --- a/lib/src/http_auth_credentials_database.dart +++ b/lib/src/http_auth_credentials_database.dart @@ -7,7 +7,8 @@ import 'package:flutter/services.dart'; ///Class that implements a singleton object (shared instance) which manages the shared HTTP auth credentials cache. ///On iOS, this class uses the [URLCredentialStorage](https://developer.apple.com/documentation/foundation/urlcredentialstorage) class. -///On Android, this class has a custom implementation using `android.database.sqlite.SQLiteDatabase` because [WebViewDatabase](https://developer.android.com/reference/android/webkit/WebViewDatabase) +///On Android, this class has a custom implementation using `android.database.sqlite.SQLiteDatabase` because +///[WebViewDatabase](https://developer.android.com/reference/android/webkit/WebViewDatabase) ///doesn't offer the same functionalities as iOS `URLCredentialStorage`. class HttpAuthCredentialDatabase { static HttpAuthCredentialDatabase _instance; diff --git a/lib/src/in_app_webview.dart b/lib/src/in_app_webview.dart index 9af84428..0d8d0f9c 100755 --- a/lib/src/in_app_webview.dart +++ b/lib/src/in_app_webview.dart @@ -11,17 +11,6 @@ import 'webview.dart'; import 'types.dart'; import 'in_app_webview_controller.dart'; -///List of forbidden names for JavaScript handlers. -const javaScriptHandlerForbiddenNames = [ - "onLoadResource", - "shouldInterceptAjaxRequest", - "onAjaxReadyStateChange", - "onAjaxProgress", - "shouldInterceptFetchRequest", - "onPrint", - "androidKeyboardWorkaroundFocusoutEvent" -]; - ///Flutter Widget for adding an **inline native WebView** integrated in the flutter widget tree. class InAppWebView extends StatefulWidget implements WebView { /// `gestureRecognizers` specifies which gestures should be consumed by the web view. diff --git a/lib/src/in_app_webview_controller.dart b/lib/src/in_app_webview_controller.dart index 1a6bee07..722791c6 100644 --- a/lib/src/in_app_webview_controller.dart +++ b/lib/src/in_app_webview_controller.dart @@ -8,14 +8,27 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; -import 'package:flutter_inappwebview/flutter_inappwebview.dart'; -import 'package:flutter_inappwebview/src/webview.dart'; import 'package:html/parser.dart' show parse; +import 'context_menu.dart'; import 'types.dart'; import 'in_app_browser.dart'; import 'webview_options.dart'; +import 'headless_in_app_webview.dart'; +import 'webview.dart'; +import 'in_app_webview.dart'; + +///List of forbidden names for JavaScript handlers. +const javaScriptHandlerForbiddenNames = [ + "onLoadResource", + "shouldInterceptAjaxRequest", + "onAjaxReadyStateChange", + "onAjaxProgress", + "shouldInterceptFetchRequest", + "onPrint", + "androidKeyboardWorkaroundFocusoutEvent" +]; ///Controls a WebView, such as an [InAppWebView] widget instance, a [HeadlessInAppWebView] instance or [InAppBrowser] WebView instance. /// @@ -746,19 +759,28 @@ class InAppWebViewController { } ///Gets the URL for the current page. - ///This is not always the same as the URL passed to [InAppWebView.onLoadStarted] because although the load for that URL has begun, the current page may not have changed. + ///This is not always the same as the URL passed to [WebView.onLoadStart] because although the load for that URL has begun, the current page may not have changed. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#getUrl() + ///**Official iOS API**: https://developer.apple.com/documentation/webkit/wkwebview/1415005-url Future getUrl() async { Map args = {}; return await _channel.invokeMethod('getUrl', args); } ///Gets the title for the current page. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#getTitle() + ///**Official iOS API**: https://developer.apple.com/documentation/webkit/wkwebview/1415015-title Future getTitle() async { Map args = {}; return await _channel.invokeMethod('getTitle', args); } ///Gets the progress for the current page. The progress value is between 0 and 100. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#getProgress() + ///**Official iOS API**: https://developer.apple.com/documentation/webkit/wkwebview/1415007-estimatedprogress Future getProgress() async { Map args = {}; return await _channel.invokeMethod('getProgress', args); @@ -926,6 +948,9 @@ class InAppWebViewController { } ///Loads the given [url] with optional [headers] specified as a map from name to value. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#loadUrl(java.lang.String) + ///**Official iOS API**: https://developer.apple.com/documentation/webkit/wkwebview/1414954-load Future loadUrl( {@required String url, Map headers = const {}}) async { assert(url != null && url.isNotEmpty); @@ -936,6 +961,8 @@ class InAppWebViewController { } ///Loads the given [url] with [postData] using `POST` method into this WebView. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#postUrl(java.lang.String,%20byte[]) Future postUrl( {@required String url, @required Uint8List postData}) async { assert(url != null && url.isNotEmpty); @@ -953,6 +980,11 @@ class InAppWebViewController { ///The [encoding] parameter specifies the encoding of the data. The default value is `"utf8"`. /// ///The [androidHistoryUrl] parameter is the URL to use as the history entry. The default value is `about:blank`. If non-null, this must be a valid URL. This parameter is used only on Android. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#loadDataWithBaseURL(java.lang.String,%20java.lang.String,%20java.lang.String,%20java.lang.String,%20java.lang.String) + ///**Official iOS API**: + ///- https://developer.apple.com/documentation/webkit/wkwebview/1415004-loadhtmlstring + ///- https://developer.apple.com/documentation/webkit/wkwebview/1415011-load Future loadData( {@required String data, String mimeType = "text/html", @@ -1009,36 +1041,54 @@ class InAppWebViewController { } ///Reloads the WebView. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#reload() + ///**Official iOS API**: https://developer.apple.com/documentation/webkit/wkwebview/1414969-reload Future reload() async { Map args = {}; await _channel.invokeMethod('reload', args); } ///Goes back in the history of the WebView. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#goBack() + ///**Official iOS API**: https://developer.apple.com/documentation/webkit/wkwebview/1414952-goback Future goBack() async { Map args = {}; await _channel.invokeMethod('goBack', args); } ///Returns a boolean value indicating whether the WebView can move backward. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#canGoBack() + ///**Official iOS API**: https://developer.apple.com/documentation/webkit/wkwebview/1414966-cangoback Future canGoBack() async { Map args = {}; return await _channel.invokeMethod('canGoBack', args); } ///Goes forward in the history of the WebView. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#goForward() + ///**Official iOS API**: https://developer.apple.com/documentation/webkit/wkwebview/1414993-goforward Future goForward() async { Map args = {}; await _channel.invokeMethod('goForward', args); } ///Returns a boolean value indicating whether the WebView can move forward. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#canGoForward() + ///**Official iOS API**: https://developer.apple.com/documentation/webkit/wkwebview/1414962-cangoforward Future canGoForward() async { Map args = {}; return await _channel.invokeMethod('canGoForward', args); } ///Goes to the history item that is the number of steps away from the current item. Steps is negative if backward and positive if forward. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#goBackOrForward(int) + ///**Official iOS API**: https://developer.apple.com/documentation/webkit/wkwebview/1414991-go Future goBackOrForward({@required int steps}) async { assert(steps != null); @@ -1048,6 +1098,8 @@ class InAppWebViewController { } ///Returns a boolean value indicating whether the WebView can go back or forward the given number of steps. Steps is negative if backward and positive if forward. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#canGoBackOrForward(int) Future canGoBackOrForward({@required int steps}) async { assert(steps != null); @@ -1068,12 +1120,18 @@ class InAppWebViewController { } ///Stops the WebView from loading. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#stopLoading() + ///**Official iOS API**: https://developer.apple.com/documentation/webkit/wkwebview/1414981-stoploading Future stopLoading() async { Map args = {}; await _channel.invokeMethod('stopLoading', args); } ///Evaluates JavaScript code into the WebView and returns the result of the evaluation. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#evaluateJavascript(java.lang.String,%20android.webkit.ValueCallback%3Cjava.lang.String%3E) + ///**Official iOS API**: https://developer.apple.com/documentation/webkit/wkwebview/1415017-evaluatejavascript Future evaluateJavascript({@required String source}) async { Map args = {}; args.putIfAbsent('source', () => source); @@ -1180,6 +1238,8 @@ class InAppWebViewController { ///Takes a screenshot (in PNG format) of the WebView's visible viewport and returns a `Uint8List`. Returns `null` if it wasn't be able to take it. /// ///**NOTE for iOS**: available from iOS 11.0+. + /// + ///**Official iOS API**: https://developer.apple.com/documentation/webkit/wkwebview/2873260-takesnapshot Future takeScreenshot() async { Map args = {}; return await _channel.invokeMethod('takeScreenshot', args); @@ -1219,6 +1279,9 @@ class InAppWebViewController { ///This contains only a snapshot of the current state. ///Multiple calls to this method may return different objects. ///The object returned from this method will not be updated to reflect any new state. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#copyBackForwardList() + ///**Official iOS API**: https://developer.apple.com/documentation/webkit/wkwebview/1414977-backforwardlist Future getCopyBackForwardList() async { Map args = {}; Map result = @@ -1256,6 +1319,8 @@ class InAppWebViewController { ///**NOTE**: on Android, it finds all instances asynchronously. Successive calls to this will cancel any pending searches. /// ///**NOTE**: on iOS, this is implemented using CSS and Javascript. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#findAllAsync(java.lang.String) Future findAllAsync({@required String find}) async { assert(find != null); Map args = {}; @@ -1268,6 +1333,8 @@ class InAppWebViewController { ///[forward] represents the direction to search. /// ///**NOTE**: on iOS, this is implemented using CSS and Javascript. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#findNext(boolean) Future findNext({@required bool forward}) async { assert(forward != null); Map args = {}; @@ -1278,6 +1345,8 @@ class InAppWebViewController { ///Clears the highlighting surrounding text matches created by [findAllAsync()]. /// ///**NOTE**: on iOS, this is implemented using CSS and Javascript. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#clearMatches() Future clearMatches() async { Map args = {}; await _channel.invokeMethod('clearMatches', args); @@ -1300,6 +1369,9 @@ class InAppWebViewController { ///[x] represents the x position to scroll to. /// ///[y] represents the y position to scroll to. + /// + ///**Official Android API**: https://developer.android.com/reference/android/view/View#scrollTo(int,%20int) + ///**Official iOS API**: https://developer.apple.com/documentation/uikit/uiscrollview/1619400-setcontentoffset Future scrollTo({@required int x, @required int y}) async { assert(x != null && y != null); Map args = {}; @@ -1313,6 +1385,9 @@ class InAppWebViewController { ///[x] represents the amount of pixels to scroll by horizontally. /// ///[y] represents the amount of pixels to scroll by vertically. + /// + ///**Official Android API**: https://developer.android.com/reference/android/view/View#scrollBy(int,%20int) + ///**Official iOS API**: https://developer.apple.com/documentation/uikit/uiscrollview/1619400-setcontentoffset Future scrollBy({@required int x, @required int y}) async { assert(x != null && y != null); Map args = {}; @@ -1325,6 +1400,8 @@ class InAppWebViewController { ///This is a global requests, not restricted to just this WebView. This can be useful if the application has been paused. /// ///On iOS, it is restricted to just this WebView. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#pauseTimers() Future pauseTimers() async { Map args = {}; await _channel.invokeMethod('pauseTimers', args); @@ -1333,6 +1410,8 @@ class InAppWebViewController { ///On Android, it resumes all layout, parsing, and JavaScript timers for all WebViews. This will resume dispatching all timers. /// ///On iOS, it resumes all layout, parsing, and JavaScript timers to just this WebView. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#resumeTimers() Future resumeTimers() async { Map args = {}; await _channel.invokeMethod('resumeTimers', args); @@ -1341,12 +1420,18 @@ class InAppWebViewController { ///Prints the current page. /// ///**NOTE**: available on Android 21+. + /// + ///**Official Android API**: https://developer.android.com/reference/android/print/PrintManager + ///**Official iOS API**: https://developer.apple.com/documentation/uikit/uiprintinteractioncontroller Future printCurrentPage() async { Map args = {}; await _channel.invokeMethod('printCurrentPage', args); } ///Gets the height of the HTML content. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#getContentHeight() + ///**Official iOS API**: https://developer.apple.com/documentation/uikit/uiscrollview/1619399-contentsize Future getContentHeight() async { Map args = {}; return await _channel.invokeMethod('getContentHeight', args); @@ -1357,6 +1442,9 @@ class InAppWebViewController { ///[zoomFactor] represents the zoom factor to apply. On Android, the zoom factor will be clamped to the Webview's zoom limits and, also, this value must be in the range 0.01 to 100.0 inclusive. /// ///**NOTE**: available on Android 21+. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#zoomBy(float) + ///**Official iOS API**: https://developer.apple.com/documentation/uikit/uiscrollview/1619412-setzoomscale Future zoomBy(double zoomFactor) async { Map args = {}; args.putIfAbsent('zoomFactor', () => zoomFactor); @@ -1364,6 +1452,11 @@ class InAppWebViewController { } ///Gets the current scale of this WebView. + /// + ///**Official Android API**: + ///- https://developer.android.com/reference/android/util/DisplayMetrics#density + ///- https://developer.android.com/reference/android/webkit/WebViewClient#onScaleChanged(android.webkit.WebView,%20float,%20float) + ///**Official iOS API**: https://developer.apple.com/documentation/uikit/uiscrollview/1619419-zoomscale Future getScale() async { Map args = {}; return await _channel.invokeMethod('getScale', args); @@ -1381,6 +1474,8 @@ class InAppWebViewController { ///Gets the hit result for hitting an HTML elements. /// ///**NOTE**: On iOS it is implemented using JavaScript. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#getHitTestResult() Future getHitTestResult() async { Map args = {}; var hitTestResultMap = @@ -1393,6 +1488,8 @@ class InAppWebViewController { } ///Gets the default user agent. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebSettings#getDefaultUserAgent(android.content.Context) static Future getDefaultUserAgent() async { Map args = {}; return await _staticChannel.invokeMethod('getDefaultUserAgent', args); @@ -1416,12 +1513,16 @@ class AndroidInAppWebViewController { ///or [AndroidInAppWebViewOptions.safeBrowsingEnabled]. This prepares resources used for Safe Browsing. /// ///**NOTE**: available only on Android 27+. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#startSafeBrowsing(android.content.Context,%20android.webkit.ValueCallback%3Cjava.lang.Boolean%3E) Future startSafeBrowsing() async { Map args = {}; return await _controller._channel.invokeMethod('startSafeBrowsing', args); } ///Clears the SSL preferences table stored in response to proceeding with SSL certificate errors. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#clearSslPreferences() Future clearSslPreferences() async { Map args = {}; await _controller._channel.invokeMethod('clearSslPreferences', args); @@ -1429,12 +1530,16 @@ class AndroidInAppWebViewController { ///Does a best-effort attempt to pause any processing that can be paused safely, such as animations and geolocation. Note that this call does not pause JavaScript. ///To pause JavaScript globally, use [pauseTimers()]. To resume WebView, call [resume()]. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#onPause() Future pause() async { Map args = {}; await _controller._channel.invokeMethod('pause', args); } ///Resumes a WebView after a previous call to [pause()]. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#onResume() Future resume() async { Map args = {}; await _controller._channel.invokeMethod('resume', args); @@ -1443,6 +1548,8 @@ class AndroidInAppWebViewController { ///Gets the URL that was originally requested for the current page. ///This is not always the same as the URL passed to [InAppWebView.onLoadStarted] because although the load for that URL has begun, ///the current page may not have changed. Also, there may have been redirects resulting in a different URL to that originally requested. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#getOriginalUrl() Future getOriginalUrl() async { Map args = {}; return await _controller._channel.invokeMethod('getOriginalUrl', args); @@ -1451,7 +1558,9 @@ class AndroidInAppWebViewController { ///Scrolls the contents of this WebView down by half the page size. ///Returns `true` if the page was scrolled. /// - ///[bottom] `true` to jump to bottom of page + ///[bottom] `true` to jump to bottom of page. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#pageDown(boolean) Future pageDown({@required bool bottom}) async { assert(bottom != null); Map args = {}; @@ -1462,7 +1571,9 @@ class AndroidInAppWebViewController { ///Scrolls the contents of this WebView up by half the view size. ///Returns `true` if the page was scrolled. /// - ///[bottom] `true` to jump to the top of the page + ///[bottom] `true` to jump to the top of the page. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#pageUp(boolean) Future pageUp({@required bool top}) async { assert(top != null); Map args = {}; @@ -1477,6 +1588,8 @@ class AndroidInAppWebViewController { /// ///[autoname] if `false`, takes basename to be a file. ///If `true`, [basename] is assumed to be a directory in which a filename will be chosen according to the URL of the current page. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#saveWebArchive(java.lang.String,%20boolean,%20android.webkit.ValueCallback%3Cjava.lang.String%3E) Future saveWebArchive({@required String basename, @required bool autoname}) async { assert(basename != null && autoname != null); Map args = {}; @@ -1487,6 +1600,8 @@ class AndroidInAppWebViewController { ///Performs zoom in in this WebView. ///Returns `true` if zoom in succeeds, `false` if no zoom changes. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#zoomIn() Future zoomIn() async { Map args = {}; return await _controller._channel.invokeMethod('zoomIn', args); @@ -1494,6 +1609,8 @@ class AndroidInAppWebViewController { ///Performs zoom out in this WebView. ///Returns `true` if zoom out succeeds, `false` if no zoom changes. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#zoomOut() Future zoomOut() async { Map args = {}; return await _controller._channel.invokeMethod('zoomOut', args); @@ -1506,6 +1623,8 @@ class AndroidInAppWebViewController { ///**NOTE**: On iOS certificate-based credentials are never stored permanently. /// ///**NOTE**: available on Android 21+. + /// + ///**Official Android API**: https://developer.android.com/reference/android/webkit/WebView#clearClientCertPreferences(java.lang.Runnable) static Future clearClientCertPreferences() async { Map args = {}; await InAppWebViewController._staticChannel @@ -1515,6 +1634,8 @@ class AndroidInAppWebViewController { ///Returns a URL pointing to the privacy policy for Safe Browsing reporting. This value will never be `null`. /// ///**NOTE**: available only on Android 27+. + /// + ///**Official Android API**: https://developer.android.com/reference/androidx/webkit/WebViewCompat#getSafeBrowsingPrivacyPolicyUrl() static Future getSafeBrowsingPrivacyPolicyUrl() async { Map args = {}; return await InAppWebViewController._staticChannel @@ -1536,6 +1657,8 @@ class AndroidInAppWebViewController { ///[hosts] represents the list of hosts. This value must never be null. /// ///**NOTE**: available only on Android 27+. + /// + ///**Official Android API**: https://developer.android.com/reference/androidx/webkit/WebViewCompat#getSafeBrowsingPrivacyPolicyUrl() static Future setSafeBrowsingWhitelist( {@required List hosts}) async { assert(hosts != null); @@ -1554,6 +1677,8 @@ class AndroidInAppWebViewController { ///The next time the app starts and loads WebView it will use the new WebView package instead. /// ///**NOTE**: available only on Android 26+. + /// + ///**Official Android API**: https://developer.android.com/reference/androidx/webkit/WebViewCompat#getCurrentWebViewPackage(android.content.Context) static Future getCurrentWebViewPackage() async { Map args = {}; Map packageInfo = (await InAppWebViewController._staticChannel.invokeMethod('getCurrentWebViewPackage', args))?.cast(); @@ -1570,12 +1695,16 @@ class IOSInAppWebViewController { } ///Reloads the current page, performing end-to-end revalidation using cache-validating conditionals if possible. + /// + ///**Official iOS API**: https://developer.apple.com/documentation/webkit/wkwebview/1414956-reloadfromorigin Future reloadFromOrigin() async { Map args = {}; await _controller._channel.invokeMethod('reloadFromOrigin', args); } ///A Boolean value indicating whether all resources on the page have been loaded over securely encrypted connections. + /// + ///**Official iOS API**: https://developer.apple.com/documentation/webkit/wkwebview/1415002-hasonlysecurecontent Future hasOnlySecureContent() async { Map args = {}; return await _controller._channel diff --git a/lib/src/types.dart b/lib/src/types.dart index 63a4a7cc..bc333b78 100755 --- a/lib/src/types.dart +++ b/lib/src/types.dart @@ -1,15 +1,22 @@ import 'dart:io'; import 'dart:typed_data'; +import 'dart:convert'; import 'package:uuid/uuid.dart'; import 'package:flutter/foundation.dart'; +import 'in_app_browser.dart'; import 'webview.dart'; import 'webview_options.dart'; +import 'in_app_webview_controller.dart'; +import 'http_auth_credentials_database.dart'; +import 'chrome_safari_browser.dart'; +import 'cookie_manager.dart'; +import 'web_storage_manager.dart'; var uuidGenerator = new Uuid(); -///This type represents a callback, added with [addJavaScriptHandler], that listens to post messages sent from JavaScript. +///This type represents a callback, added with [InAppWebViewController.addJavaScriptHandler], that listens to post messages sent from JavaScript. /// ///The Android implementation uses [addJavascriptInterface](https://developer.android.com/reference/android/webkit/WebView#addJavascriptInterface(java.lang.Object,%20java.lang.String)). ///The iOS implementation uses [addScriptMessageHandler](https://developer.apple.com/documentation/webkit/wkusercontentcontroller/1537172-addscriptmessagehandler?language=objc) @@ -64,8 +71,8 @@ class ConsoleMessageLevel { int get hashCode => _value.hashCode; } -///Class representing a resource response of the [InAppBrowser] WebView. -///It is used by the method [InAppBrowser.onLoadResource()]. +///Class representing a resource response of the [WebView]. +///It is used by the method [WebView.onLoadResource]. class LoadedResource { ///A string representing the type of resource. String initiatorType; @@ -82,7 +89,7 @@ class LoadedResource { LoadedResource({this.initiatorType, this.url, this.startTime, this.duration}); } -///Initial [data] as a content for an [InAppWebView] instance, using [baseUrl] as the base URL for it. +///Initial [data] as a content for an [WebView] instance, using [baseUrl] as the base URL for it. class InAppWebViewInitialData { ///A String of data in the given encoding. String data; @@ -233,7 +240,7 @@ class CustomSchemeResponse { ///Class representing a JavaScript console message from WebCore. ///This could be a issued by a call to one of the console logging functions (e.g. console.log('...')) or a JavaScript error on the page. /// -///To receive notifications of these messages, use the [onConsoleMessage] event. +///To receive notifications of these messages, use the [WebView.onConsoleMessage] event. class ConsoleMessage { String message; ConsoleMessageLevel messageLevel; @@ -242,7 +249,7 @@ class ConsoleMessage { {this.message = "", this.messageLevel = ConsoleMessageLevel.LOG}); } -///This class contains a snapshot of the current back/forward list for a WebView. +///This class contains a snapshot of the current back/forward list for a [WebView]. class WebHistory { ///List of all [WebHistoryItem]s. List list; @@ -253,7 +260,7 @@ class WebHistory { WebHistory({this.list, this.currentIndex}); } -///A convenience class for accessing fields in an entry in the back/forward list of a WebView. Each WebHistoryItem is a snapshot of the requested history item. +///A convenience class for accessing fields in an entry in the back/forward list of a WebView. Each [WebHistoryItem] is a snapshot of the requested history item. class WebHistoryItem { ///Original url of this history item. String originalUrl; @@ -274,7 +281,7 @@ class WebHistoryItem { {this.originalUrl, this.title, this.url, this.index, this.offset}); } -///Class used by the host application to set the Geolocation permission state for an origin during the [androidOnGeolocationPermissionsShowPrompt] event. +///Class used by the host application to set the Geolocation permission state for an origin during the [WebView.androidOnGeolocationPermissionsShowPrompt] event. class GeolocationPermissionShowPromptResponse { ///The origin for which permissions are set. String origin; @@ -309,7 +316,7 @@ class JsAlertResponseAction { int get hashCode => _value.hashCode; } -///Class that represents the response used by the [onJsAlert] event to control a JavaScript alert dialog. +///Class that represents the response used by the [WebView.onJsAlert] event to control a JavaScript alert dialog. class JsAlertResponse { ///Message to be displayed in the window. String message; @@ -356,7 +363,7 @@ class JsConfirmResponseAction { int get hashCode => _value.hashCode; } -///Class that represents the response used by the [onJsConfirm] event to control a JavaScript confirm dialog. +///Class that represents the response used by the [WebView.onJsConfirm] event to control a JavaScript confirm dialog. class JsConfirmResponse { ///Message to be displayed in the window. String message; @@ -408,7 +415,7 @@ class JsPromptResponseAction { int get hashCode => _value.hashCode; } -///Class that represents the response used by the [onJsPrompt] event to control a JavaScript prompt dialog. +///Class that represents the response used by the [WebView.onJsPrompt] event to control a JavaScript prompt dialog. class JsPromptResponse { ///Message to be displayed in the window. String message; @@ -524,10 +531,10 @@ class SafeBrowsingResponseAction { int get hashCode => _value.hashCode; } -///Class that represents the response used by the [androidOnSafeBrowsingHit] event. +///Class that represents the response used by the [WebView.androidOnSafeBrowsingHit] event. ///It is used to indicate an action to take when hitting a malicious URL. class SafeBrowsingResponse { - ///If reporting is enabled, all reports will be sent according to the privacy policy referenced by [InAppWebViewController.androidGetSafeBrowsingPrivacyPolicyUrl]. + ///If reporting is enabled, all reports will be sent according to the privacy policy referenced by [AndroidInAppWebViewController.getSafeBrowsingPrivacyPolicyUrl]. bool report; ///Indicate the [SafeBrowsingResponseAction] to take when hitting a malicious URL. @@ -566,7 +573,7 @@ class HttpAuthResponseAction { int get hashCode => _value.hashCode; } -///Class that represents the response used by the [onReceivedHttpAuthRequest] event. +///Class that represents the response used by the [WebView.onReceivedHttpAuthRequest] event. class HttpAuthResponse { ///Represents the username used for the authentication if the [action] corresponds to [HttpAuthResponseAction.PROCEED] String username; @@ -596,7 +603,7 @@ class HttpAuthResponse { } } -///Class that represents the challenge of the [onReceivedHttpAuthRequest] event. +///Class that represents the challenge of the [WebView.onReceivedHttpAuthRequest] event. ///It provides all the information about the challenge. class HttpAuthChallenge { ///A count of previous failed authentication attempts. @@ -664,7 +671,7 @@ class ServerTrustAuthResponseAction { int get hashCode => _value.hashCode; } -///ServerTrustAuthResponse class represents the response used by the [onReceivedServerTrustAuthRequest] event. +///ServerTrustAuthResponse class represents the response used by the [WebView.onReceivedServerTrustAuthRequest] event. class ServerTrustAuthResponse { ///Indicate the [ServerTrustAuthResponseAction] to take in response of the server trust authentication challenge. ServerTrustAuthResponseAction action; @@ -676,7 +683,7 @@ class ServerTrustAuthResponse { } } -///Class that represents the challenge of the [onReceivedServerTrustAuthRequest] event. +///Class that represents the challenge of the [WebView.onReceivedServerTrustAuthRequest] event. ///It provides all the information about the challenge. class ServerTrustChallenge { ///The protection space requiring authentication. @@ -726,7 +733,7 @@ class ClientCertResponseAction { int get hashCode => _value.hashCode; } -///Class that represents the response used by the [onReceivedClientCertRequest] event. +///Class that represents the response used by the [WebView.onReceivedClientCertRequest] event. class ClientCertResponse { ///The file path of the certificate to use. String certificatePath; @@ -759,7 +766,7 @@ class ClientCertResponse { } } -///Class that represents the challenge of the [onReceivedClientCertRequest] event. +///Class that represents the challenge of the [WebView.onReceivedClientCertRequest] event. ///It provides all the information about the challenge. class ClientCertChallenge { ///The protection space requiring authentication. @@ -1058,7 +1065,7 @@ class IOSWKSelectionGranularity { int get hashCode => _value.hashCode; } -///Class that represents an iOS-specific class used to specify a dataDetectoryTypes value that adds interactivity to web content that matches the value. +///Class that represents an iOS-specific class used to specify a `dataDetectoryTypes` value that adds interactivity to web content that matches the value. /// ///**NOTE**: available on iOS 10.0+. class IOSWKDataDetectorTypes { @@ -2126,7 +2133,7 @@ class PermissionRequestResponseAction { int get hashCode => _value.hashCode; } -///Class that represents the response used by the [androidOnPermissionRequest] event. +///Class that represents the response used by the [WebView.androidOnPermissionRequest] event. class PermissionRequestResponse { ///Resources granted to be accessed by origin. List resources; @@ -2143,7 +2150,7 @@ class PermissionRequestResponse { } } -///Class that is used by [shouldOverrideUrlLoading] event. +///Class that is used by [WebView.shouldOverrideUrlLoading] event. ///It represents the policy to pass back to the decision handler. class ShouldOverrideUrlLoadingAction { final int _value; @@ -2170,7 +2177,7 @@ class ShouldOverrideUrlLoadingAction { } } -///Class that represents the type of action triggering a navigation on iOS for the [shouldOverrideUrlLoading] event. +///Class that represents the type of action triggering a navigation on iOS for the [WebView.shouldOverrideUrlLoading] event. class IOSWKNavigationType { final int _value; @@ -2208,7 +2215,7 @@ class IOSWKNavigationType { int get hashCode => _value.hashCode; } -///Class that represents the navigation request used by the [shouldOverrideUrlLoading] event. +///Class that represents the navigation request used by the [WebView.shouldOverrideUrlLoading] event. class ShouldOverrideUrlLoadingRequest { ///Represents the url of the navigation request. String url; @@ -2246,7 +2253,7 @@ class ShouldOverrideUrlLoadingRequest { this.iosWKNavigationType}); } -///Class that represents the navigation request used by the [shouldOverrideUrlLoading] event. +///Class that represents the navigation request used by the [WebView.onCreateWindow] event. class OnCreateWindowRequest { ///Represents the url of the navigation request. String url; @@ -2680,8 +2687,9 @@ class AndroidOverScrollMode { ///The scrollbars can be overlaid or inset. ///When inset, they add to the padding of the view. And the scrollbars can be drawn inside the padding area or on the edge of the view. ///For example, if a view has a background drawable and you want to draw the scrollbars inside the padding specified by the drawable, -///you can use SCROLLBARS_INSIDE_OVERLAY or SCROLLBARS_INSIDE_INSET. If you want them to appear at the edge of the view, ignoring the padding, -///then you can use SCROLLBARS_OUTSIDE_OVERLAY or SCROLLBARS_OUTSIDE_INSET. +///you can use [AndroidScrollBarStyle.SCROLLBARS_INSIDE_OVERLAY] or [AndroidScrollBarStyle.SCROLLBARS_INSIDE_INSET]. +///If you want them to appear at the edge of the view, ignoring the padding, +///then you can use [AndroidScrollBarStyle.SCROLLBARS_OUTSIDE_OVERLAY] or [AndroidScrollBarStyle.SCROLLBARS_OUTSIDE_INSET]. class AndroidScrollBarStyle { final int _value; @@ -2783,9 +2791,9 @@ class AndroidVerticalScrollbarPosition { ///Class that represents an Android WebView package info. class AndroidWebViewPackageInfo { - ///The version name of this package. + ///The version name of this WebView package. String versionName; - ///The name of this package. + ///The name of this WebView package. String packageName; AndroidWebViewPackageInfo({this.versionName, this.packageName}); diff --git a/lib/src/web_storage_manager.dart b/lib/src/web_storage_manager.dart index acca053f..945579e9 100755 --- a/lib/src/web_storage_manager.dart +++ b/lib/src/web_storage_manager.dart @@ -6,6 +6,8 @@ import 'package:flutter/services.dart'; import 'types.dart'; ///Class that implements a singleton object (shared instance) which manages the web storage used by WebView instances. +///On Android, it is implemented using [WebStorage](https://developer.android.com/reference/android/webkit/WebStorage.html). +///On iOS, it is implemented using [WKWebsiteDataStore.default()](https://developer.apple.com/documentation/webkit/wkwebsitedatastore). /// ///**NOTE for iOS**: available from iOS 9.0+. class WebStorageManager { diff --git a/lib/src/webview.dart b/lib/src/webview.dart index 559cdfe5..2e082a26 100644 --- a/lib/src/webview.dart +++ b/lib/src/webview.dart @@ -2,6 +2,8 @@ import 'package:flutter_inappwebview/src/context_menu.dart'; import 'types.dart'; import 'in_app_webview_controller.dart'; +import 'webview_options.dart'; +import 'headless_in_app_webview.dart'; ///Abstract class that represents a WebView. Used by [WebView] and [HeadlessInAppWebView]. abstract class WebView {