import 'dart:io'; import 'content_blocker.dart'; import 'types.dart'; class AndroidOptions {} class IosOptions {} class WebViewOptions { Map toMap() { return {}; } static WebViewOptions fromMap(Map map) { return null; } } class BrowserOptions { Map toMap() { return {}; } static BrowserOptions fromMap(Map map) { return null; } } class ChromeSafariBrowserOptions { Map toMap() { return {}; } static ChromeSafariBrowserOptions fromMap(Map map) { return null; } } ///This class represents all the cross-platform WebView options available. class InAppWebViewOptions implements WebViewOptions, BrowserOptions, AndroidOptions, IosOptions { ///Set to `true` to be able to listen at the [shouldOverrideUrlLoading] event. The default value is `false`. bool useShouldOverrideUrlLoading; ///Set to `true` to be able to listen at the [onLoadResource] event. The default value is `false`. bool useOnLoadResource; ///Set to `true` to be able to listen at the [onDownloadStart] event. The default value is `false`. bool useOnDownloadStart; ///Set to `true` to have all the browser's cache cleared before the new window is opened. The default value is `false`. bool clearCache; ///Sets the user-agent for the WebView. /// ///**NOTE**: available on iOS 9.0+. String userAgent; ///Append to the existing user-agent. Setting userAgent will override this. /// ///**NOTE**: available on Android 17+ and on iOS 9.0+. String applicationNameForUserAgent; ///Set to `true` to enable JavaScript. The default value is `true`. bool javaScriptEnabled; ///Enables debugging of web contents (HTML / CSS / JavaScript) loaded into any WebViews of this application. ///This flag can be enabled in order to facilitate debugging of web layouts and JavaScript code running inside WebViews. The default is `false`. /// ///**NOTE**: on iOS the debugging mode is always enabled. bool debuggingEnabled; ///Set to `true` to allow JavaScript open windows without user interaction. The default value is `false`. bool javaScriptCanOpenWindowsAutomatically; ///Set to `true` to prevent HTML5 audio or video from autoplaying. The default value is `true`. /// ///**NOTE**: available on iOS 10.0+. bool mediaPlaybackRequiresUserGesture; ///Sets the minimum font size. The default value is `8` for Android, `0` for iOS. int minimumFontSize; ///Define whether the vertical scrollbar should be drawn or not. The default value is `true`. bool verticalScrollBarEnabled; ///Define whether the horizontal scrollbar should be drawn or not. The default value is `true`. bool horizontalScrollBarEnabled; ///List of custom schemes that the WebView must handle. Use the [onLoadResourceCustomScheme] event to intercept resource requests with custom scheme. /// ///**NOTE**: available on iOS 11.0+. List resourceCustomSchemes; ///List of [ContentBlocker] that are a set of rules used to block content in the browser window. /// ///**NOTE**: available on iOS 11.0+. List contentBlockers; ///Sets the content mode that the WebView needs to use when loading and rendering a webpage. The default value is [InAppWebViewUserPreferredContentMode.RECOMMENDED]. /// ///**NOTE**: available on iOS 13.0+. InAppWebViewUserPreferredContentMode preferredContentMode; ///Set to `true` to be able to listen at the [shouldInterceptAjaxRequest] event. The default value is `false`. bool useShouldInterceptAjaxRequest; ///Set to `true` to be able to listen at the [shouldInterceptFetchRequest] event. The default value is `false`. bool useShouldInterceptFetchRequest; ///Set to `true` to open a browser window with incognito mode. The default value is `false`. /// ///**NOTE**: available on iOS 9.0+. bool incognito; ///Sets whether WebView should use browser caching. The default value is `true`. /// ///**NOTE**: available on iOS 9.0+. bool cacheEnabled; ///Set to `true` to make the background of the WebView transparent. If your app has a dark theme, this can prevent a white flash on initialization. The default value is `false`. bool transparentBackground; ///Set to `true` to disable vertical scroll. The default value is `false`. bool disableVerticalScroll; ///Set to `true` to disable horizontal scroll. The default value is `false`. bool disableHorizontalScroll; InAppWebViewOptions( {this.useShouldOverrideUrlLoading = false, this.useOnLoadResource = false, this.useOnDownloadStart = false, this.clearCache = false, this.userAgent = "", this.applicationNameForUserAgent = "", this.javaScriptEnabled = true, this.debuggingEnabled = false, this.javaScriptCanOpenWindowsAutomatically = false, this.mediaPlaybackRequiresUserGesture = true, this.minimumFontSize, this.verticalScrollBarEnabled = true, this.horizontalScrollBarEnabled = true, this.resourceCustomSchemes = const [], this.contentBlockers = const [], this.preferredContentMode = InAppWebViewUserPreferredContentMode.RECOMMENDED, this.useShouldInterceptAjaxRequest = false, this.useShouldInterceptFetchRequest = false, this.incognito = false, this.cacheEnabled = true, this.transparentBackground = false, this.disableVerticalScroll = false, this.disableHorizontalScroll = false}) { if (this.minimumFontSize == null) this.minimumFontSize = Platform.isAndroid ? 8 : 0; assert(!this.resourceCustomSchemes.contains("http") && !this.resourceCustomSchemes.contains("https")); } @override Map toMap() { List>> contentBlockersMapList = []; contentBlockers.forEach((contentBlocker) { contentBlockersMapList.add(contentBlocker.toMap()); }); return { "useShouldOverrideUrlLoading": useShouldOverrideUrlLoading, "useOnLoadResource": useOnLoadResource, "useOnDownloadStart": useOnDownloadStart, "clearCache": clearCache, "userAgent": userAgent, "applicationNameForUserAgent": applicationNameForUserAgent, "javaScriptEnabled": javaScriptEnabled, "debuggingEnabled": debuggingEnabled, "javaScriptCanOpenWindowsAutomatically": javaScriptCanOpenWindowsAutomatically, "mediaPlaybackRequiresUserGesture": mediaPlaybackRequiresUserGesture, "verticalScrollBarEnabled": verticalScrollBarEnabled, "horizontalScrollBarEnabled": horizontalScrollBarEnabled, "resourceCustomSchemes": resourceCustomSchemes, "contentBlockers": contentBlockersMapList, "preferredContentMode": preferredContentMode?.toValue(), "useShouldInterceptAjaxRequest": useShouldInterceptAjaxRequest, "useShouldInterceptFetchRequest": useShouldInterceptFetchRequest, "incognito": incognito, "cacheEnabled": cacheEnabled, "transparentBackground": transparentBackground, "disableVerticalScroll": disableVerticalScroll, "disableHorizontalScroll": disableHorizontalScroll }; } static InAppWebViewOptions fromMap(Map map) { List contentBlockers = []; List contentBlockersMapList = map["contentBlockers"]; if (contentBlockersMapList != null) { contentBlockersMapList.forEach((contentBlocker) { contentBlockers.add(ContentBlocker.fromMap( Map>.from( Map.from(contentBlocker)))); }); } InAppWebViewOptions options = new InAppWebViewOptions(); options.useShouldOverrideUrlLoading = map["useShouldOverrideUrlLoading"]; options.useOnLoadResource = map["useOnLoadResource"]; options.useOnDownloadStart = map["useOnDownloadStart"]; options.clearCache = map["clearCache"]; options.userAgent = map["userAgent"]; options.applicationNameForUserAgent = map["applicationNameForUserAgent"]; options.javaScriptEnabled = map["javaScriptEnabled"]; options.debuggingEnabled = map["debuggingEnabled"]; options.javaScriptCanOpenWindowsAutomatically = map["javaScriptCanOpenWindowsAutomatically"]; options.mediaPlaybackRequiresUserGesture = map["mediaPlaybackRequiresUserGesture"]; options.verticalScrollBarEnabled = map["verticalScrollBarEnabled"]; options.horizontalScrollBarEnabled = map["horizontalScrollBarEnabled"]; options.resourceCustomSchemes = List.from(map["resourceCustomSchemes"] ?? []); options.contentBlockers = contentBlockers; options.preferredContentMode = InAppWebViewUserPreferredContentMode.fromValue( map["preferredContentMode"]); options.useShouldInterceptAjaxRequest = map["useShouldInterceptAjaxRequest"]; options.useShouldInterceptFetchRequest = map["useShouldInterceptFetchRequest"]; options.incognito = map["incognito"]; options.cacheEnabled = map["cacheEnabled"]; options.transparentBackground = map["transparentBackground"]; options.disableVerticalScroll = map["disableVerticalScroll"]; options.disableHorizontalScroll = map["disableHorizontalScroll"]; return options; } } ///This class represents all the Android-only WebView options available. class AndroidInAppWebViewOptions implements WebViewOptions, BrowserOptions, AndroidOptions { ///Sets the text zoom of the page in percent. The default value is `100`. int textZoom; ///Set to `true` to have the session cookie cache cleared before the new window is opened. bool clearSessionCache; ///Set to `true` if the WebView should use its built-in zoom mechanisms. The default value is `false`. bool builtInZoomControls; ///Set to `true` if the WebView should display on-screen zoom controls when using the built-in zoom mechanisms. The default value is `false`. bool displayZoomControls; ///Set to `false` if the WebView should not support zooming using its on-screen zoom controls and gestures. The default value is `true`. bool supportZoom; ///Set to `true` if you want the database storage API is enabled. The default value is `false`. bool databaseEnabled; ///Set to `true` if you want the DOM storage API is enabled. The default value is `true`. bool domStorageEnabled; ///Set to `true` if the WebView should enable support for the "viewport" HTML meta tag or should use a wide viewport. ///When the value of the setting is false, the layout width is always set to the width of the WebView control in device-independent (CSS) pixels. ///When the value is true and the page contains the viewport meta tag, the value of the width specified in the tag is used. ///If the page does not contain the tag or does not provide a width, then a wide viewport will be used. The default value is `true`. bool useWideViewPort; ///Sets whether Safe Browsing is enabled. Safe Browsing allows WebView to protect against malware and phishing attacks by verifying the links. ///Safe Browsing is enabled by default for devices which support it. /// ///**NOTE**: available on Android 26+. bool safeBrowsingEnabled; ///Configures the WebView's behavior when a secure origin attempts to load a resource from an insecure origin. /// ///**NOTE**: available on Android 21+. AndroidInAppWebViewMixedContentMode mixedContentMode; ///Enables or disables content URL access within WebView. Content URL access allows WebView to load content from a content provider installed in the system. The default value is `true`. bool allowContentAccess; ///Enables or disables file access within WebView. Note that this enables or disables file system access only. ///Assets and resources are still accessible using \file:///android_asset` and `file:///android_res`. The default value is `true`. bool allowFileAccess; ///Sets whether JavaScript running in the context of a file scheme URL should be allowed to access content from other file scheme URLs. ///Note that the value of this setting is ignored if the value of [allowFileAccessFromFileURLs] is `true`. ///Note too, that this setting affects only JavaScript access to file scheme resources. The default value is `false`. bool allowFileAccessFromFileURLs; ///Sets whether JavaScript running in the context of a file scheme URL should be allowed to access content from any origin. ///Note that this setting affects only JavaScript access to file scheme resources. ///This includes access to content from other file scheme URLs. The default value is `false`. bool allowUniversalAccessFromFileURLs; ///Sets the path to the Application Caches files. In order for the Application Caches API to be enabled, this option must be set a path to which the application can write. ///This option is used one time: repeated calls are ignored. String appCachePath; ///Sets whether the WebView should not load image resources from the network (resources accessed via http and https URI schemes). The default value is `false`. bool blockNetworkImage; ///Sets whether the WebView should not load resources from the network. The default value is `false`. bool blockNetworkLoads; ///Overrides the way the cache is used. The way the cache is used is based on the navigation type. For a normal page load, the cache is checked and content is re-validated as needed. ///When navigating back, content is not revalidated, instead the content is just retrieved from the cache. The default value is [AndroidInAppWebViewCacheMode.LOAD_DEFAULT]. AndroidInAppWebViewCacheMode cacheMode; ///Sets the cursive font family name. The default value is `"cursive"`. String cursiveFontFamily; ///Sets the default fixed font size. The default value is `16`. int defaultFixedFontSize; ///Sets the default font size. The default value is `16`. int defaultFontSize; ///Sets the default text encoding name to use when decoding html pages. The default value is `"UTF-8"`. String defaultTextEncodingName; ///Disables the action mode menu items according to menuItems flag. /// ///**NOTE**: available on Android 24+. AndroidInAppWebViewModeMenuItem disabledActionModeMenuItems; ///Sets the fantasy font family name. The default value is `"fantasy"`. String fantasyFontFamily; ///Sets the fixed font family name. The default value is `"monospace"`. String fixedFontFamily; ///Set the force dark mode for this WebView. The default value is [AndroidInAppWebViewForceDark.FORCE_DARK_OFF]. /// ///**NOTE**: available on Android 29+. AndroidInAppWebViewForceDark forceDark; ///Sets whether Geolocation API is enabled. The default value is `true`. bool geolocationEnabled; ///Sets the underlying layout algorithm. This will cause a re-layout of the WebView. AndroidInAppWebViewLayoutAlgorithm layoutAlgorithm; ///Sets whether the WebView loads pages in overview mode, that is, zooms out the content to fit on screen by width. ///This setting is taken into account when the content width is greater than the width of the WebView control, for example, when [useWideViewPort] is enabled. ///The default value is `false`. bool loadWithOverviewMode; ///Sets whether the WebView should load image resources. Note that this method controls loading of all images, including those embedded using the data URI scheme. ///Note that if the value of this setting is changed from false to true, all images resources referenced by content currently displayed by the WebView are loaded automatically. ///The default value is `true`. bool loadsImagesAutomatically; ///Sets the minimum logical font size. The default is `8`. int minimumLogicalFontSize; ///Sets the initial scale for this WebView. 0 means default. The behavior for the default scale depends on the state of [useWideViewPort] and [loadWithOverviewMode]. ///If the content fits into the WebView control by width, then the zoom is set to 100%. For wide content, the behavior depends on the state of [loadWithOverviewMode]. ///If its value is true, the content will be zoomed out to be fit by width into the WebView control, otherwise not. ///If initial scale is greater than 0, WebView starts with this value as initial scale. ///Please note that unlike the scale properties in the viewport meta tag, this method doesn't take the screen density into account. ///The default is `0`. int initialScale; ///Tells the WebView whether it needs to set a node. The default value is `true`. bool needInitialFocus; ///Sets whether this WebView should raster tiles when it is offscreen but attached to a window. ///Turning this on can avoid rendering artifacts when animating an offscreen WebView on-screen. ///Offscreen WebViews in this mode use more memory. The default value is `false`. /// ///**NOTE**: available on Android 23+. bool offscreenPreRaster; ///Sets the sans-serif font family name. The default value is `"sans-serif"`. String sansSerifFontFamily; ///Sets the serif font family name. The default value is `"sans-serif"`. String serifFontFamily; ///Sets the standard font family name. The default value is `"sans-serif"`. String standardFontFamily; ///Sets whether the WebView should save form data. In Android O, the platform has implemented a fully functional Autofill feature to store form data. ///Therefore, the Webview form data save feature is disabled. Note that the feature will continue to be supported on older versions of Android as before. ///The default value is `true`. bool saveFormData; ///Boolean value to enable third party cookies in the WebView. ///Used on Android Lollipop and above only as third party cookies are enabled by default on Android Kitkat and below and on iOS. ///The default value is `true`. /// ///**NOTE**: available on Android 21+. bool thirdPartyCookiesEnabled; ///Boolean value to enable Hardware Acceleration in the WebView. ///The default value is `true`. bool hardwareAcceleration; ///Sets whether the WebView whether supports multiple windows. ///If set to `true`, [onCreateWindow] event must be implemented by the host application. The default value is `false`. bool supportMultipleWindows; ///Regular expression used by [shouldOverrideUrlLoading] event to cancel navigation requests for frames that are not the main frame. ///If the url request of a subframe matches the regular expression, then the request of that subframe is canceled. String regexToCancelSubFramesLoading; ///Enable a temporary workaround for html dropdowns (`