import 'package:flutter/foundation.dart'; import 'content_blocker.dart'; import 'types.dart'; import 'webview.dart'; class AndroidOptions {} class IosOptions {} class WebViewOptions { Map toMap() { return {}; } static WebViewOptions fromMap(Map map) { return new WebViewOptions(); } WebViewOptions copy() { return WebViewOptions.fromMap(this.toMap()); } Map toJson() { return this.toMap(); } @override String toString() { return toMap().toString(); } } class BrowserOptions { Map toMap() { return {}; } static BrowserOptions fromMap(Map map) { return new BrowserOptions(); } BrowserOptions copy() { return BrowserOptions.fromMap(this.toMap()); } Map toJson() { return this.toMap(); } @override String toString() { return toMap().toString(); } } class ChromeSafariBrowserOptions { Map toMap() { return {}; } static ChromeSafariBrowserOptions fromMap(Map map) { return new ChromeSafariBrowserOptions(); } ChromeSafariBrowserOptions copy() { return ChromeSafariBrowserOptions.fromMap(this.toMap()); } Map toJson() { return this.toMap(); } @override String toString() { return toMap().toString(); } } ///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 [WebView.shouldOverrideUrlLoading] event. The default value is `false`. bool useShouldOverrideUrlLoading; ///Set to `true` to be able to listen at the [WebView.onLoadResource] event. The default value is `false`. bool useOnLoadResource; ///Set to `true` to be able to listen at the [WebView.onDownloadStart] event. The default value is `false`. bool useOnDownloadStart; ///Set to `true` to have all the browser's cache cleared before the new WebView 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; ///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 [WebView.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 [UserPreferredContentMode.RECOMMENDED]. /// ///**NOTE**: available on iOS 13.0+. UserPreferredContentMode? preferredContentMode; ///Set to `true` to be able to listen at the [WebView.shouldInterceptAjaxRequest] event. The default value is `false`. bool useShouldInterceptAjaxRequest; ///Set to `true` to be able to listen at the [WebView.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+. ///On Android, by setting this option to `true`, it will clear all the cookies of all WebView instances, ///because there isn't any way to make the website data store non-persistent for the specific WebView instance such as on iOS. 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; ///Set to `true` to disable context menu. The default value is `false`. bool disableContextMenu; ///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; ///Sets whether cross-origin requests in the context of a file scheme URL should be allowed to access content from other file scheme URLs. ///Note that some accesses such as image HTML elements don't follow same-origin rules and aren't affected by this setting. /// ///Don't enable this setting if you open files that may be created or altered by external sources. ///Enabling this setting allows malicious scripts loaded in a `file://` context to access arbitrary local files including WebView cookies and app private data. /// ///Note that the value of this setting is ignored if the value of [allowUniversalAccessFromFileURLs] is `true`. /// ///The default value is `false`. bool allowFileAccessFromFileURLs; ///Sets whether cross-origin requests in the context of a file scheme URL should be allowed to access content from any origin. ///This includes access to content from other file scheme URLs or web contexts. ///Note that some access such as image HTML elements doesn't follow same-origin rules and isn't affected by this setting. /// ///Don't enable this setting if you open files that may be created or altered by external sources. ///Enabling this setting allows malicious scripts loaded in a `file://` context to launch cross-site scripting attacks, ///either accessing arbitrary local files including WebView cookies, app private data or even credentials used on arbitrary web sites. /// ///The default value is `false`. bool allowUniversalAccessFromFileURLs; InAppWebViewOptions( {this.useShouldOverrideUrlLoading = false, this.useOnLoadResource = false, this.useOnDownloadStart = false, this.clearCache = false, this.userAgent = "", this.applicationNameForUserAgent = "", this.javaScriptEnabled = true, this.javaScriptCanOpenWindowsAutomatically = false, this.mediaPlaybackRequiresUserGesture = true, this.minimumFontSize, this.verticalScrollBarEnabled = true, this.horizontalScrollBarEnabled = true, this.resourceCustomSchemes = const [], this.contentBlockers = const [], this.preferredContentMode = UserPreferredContentMode.RECOMMENDED, this.useShouldInterceptAjaxRequest = false, this.useShouldInterceptFetchRequest = false, this.incognito = false, this.cacheEnabled = true, this.transparentBackground = false, this.disableVerticalScroll = false, this.disableHorizontalScroll = false, this.disableContextMenu = false, this.supportZoom = true, this.allowFileAccessFromFileURLs = false, this.allowUniversalAccessFromFileURLs = false}) { if (this.minimumFontSize == null) this.minimumFontSize = defaultTargetPlatform == TargetPlatform.android ? 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, "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, "disableContextMenu": disableContextMenu, "supportZoom": supportZoom, "allowFileAccessFromFileURLs": allowFileAccessFromFileURLs, "allowUniversalAccessFromFileURLs": allowUniversalAccessFromFileURLs }; } 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 = 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.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 = UserPreferredContentMode.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"]; options.disableContextMenu = map["disableContextMenu"]; options.supportZoom = map["supportZoom"]; options.allowFileAccessFromFileURLs = map["allowFileAccessFromFileURLs"]; options.allowUniversalAccessFromFileURLs = map["allowUniversalAccessFromFileURLs"]; return options; } @override Map toJson() { return this.toMap(); } @override String toString() { return toMap().toString(); } @override InAppWebViewOptions copy() { return InAppWebViewOptions.fromMap(this.toMap()); } } ///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 `true`. 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 `true` if you want the database storage API is enabled. The default value is `true`. 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+. AndroidMixedContentMode? 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 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 [AndroidCacheMode.LOAD_DEFAULT]. AndroidCacheMode? 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+. AndroidActionModeMenuItem? 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 [AndroidForceDark.FORCE_DARK_OFF]. /// ///**NOTE**: available on Android 29+. AndroidForceDark? 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. AndroidLayoutAlgorithm? 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 supports multiple windows. ///If set to `true`, [WebView.onCreateWindow] event must be implemented by the host application. The default value is `false`. bool supportMultipleWindows; ///Regular expression used by [WebView.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; ///Set to `true` to enable Flutter's new Hybrid Composition. The default value is `false`. ///Hybrid Composition is supported starting with Flutter v1.20+. /// ///**NOTE**: It is recommended to use Hybrid Composition only on Android 10+ for a release app, ///as it can cause framerate drops on animations in Android 9 and lower (see [Hybrid-Composition#performance](https://github.com/flutter/flutter/wiki/Hybrid-Composition#performance)). bool useHybridComposition; ///Set to `true` to be able to listen at the [WebView.androidShouldInterceptRequest] event. The default value is `false`. bool useShouldInterceptRequest; ///Set to `true` to be able to listen at the [WebView.androidOnRenderProcessGone] event. The default value is `false`. bool useOnRenderProcessGone; ///Sets the WebView's over-scroll mode. ///Setting the over-scroll mode of a WebView will have an effect only if the WebView is capable of scrolling. ///The default value is [AndroidOverScrollMode.OVER_SCROLL_IF_CONTENT_SCROLLS]. AndroidOverScrollMode? overScrollMode; ///Informs WebView of the network state. ///This is used to set the JavaScript property `window.navigator.isOnline` and generates the online/offline event as specified in HTML5, sec. 5.7.7. bool? networkAvailable; ///Specifies the style of the scrollbars. 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. ///The default value is [AndroidScrollBarStyle.SCROLLBARS_INSIDE_OVERLAY]. AndroidScrollBarStyle? scrollBarStyle; ///Sets the position of the vertical scroll bar. ///The default value is [AndroidVerticalScrollbarPosition.SCROLLBAR_POSITION_DEFAULT]. AndroidVerticalScrollbarPosition? verticalScrollbarPosition; ///Defines the delay in milliseconds that a scrollbar waits before fade out. int? scrollBarDefaultDelayBeforeFade; ///Defines whether scrollbars will fade when the view is not scrolling. ///The default value is `true`. bool scrollbarFadingEnabled; ///Defines the scrollbar fade duration in milliseconds. int? scrollBarFadeDuration; ///Sets the renderer priority policy for this WebView. RendererPriorityPolicy? rendererPriorityPolicy; ///Sets whether the default Android error page should be disabled. ///The default value is `false`. bool? disableDefaultErrorPage; AndroidInAppWebViewOptions({ this.textZoom = 100, this.clearSessionCache = false, this.builtInZoomControls = true, this.displayZoomControls = false, this.databaseEnabled = true, this.domStorageEnabled = true, this.useWideViewPort = true, this.safeBrowsingEnabled = true, this.mixedContentMode, this.allowContentAccess = true, this.allowFileAccess = true, this.appCachePath, this.blockNetworkImage = false, this.blockNetworkLoads = false, this.cacheMode = AndroidCacheMode.LOAD_DEFAULT, this.cursiveFontFamily = "cursive", this.defaultFixedFontSize = 16, this.defaultFontSize = 16, this.defaultTextEncodingName = "UTF-8", this.disabledActionModeMenuItems, this.fantasyFontFamily = "fantasy", this.fixedFontFamily = "monospace", this.forceDark = AndroidForceDark.FORCE_DARK_OFF, this.geolocationEnabled = true, this.layoutAlgorithm, this.loadWithOverviewMode = true, this.loadsImagesAutomatically = true, this.minimumLogicalFontSize = 8, this.needInitialFocus = true, this.offscreenPreRaster = false, this.sansSerifFontFamily = "sans-serif", this.serifFontFamily = "sans-serif", this.standardFontFamily = "sans-serif", this.saveFormData = true, this.thirdPartyCookiesEnabled = true, this.hardwareAcceleration = true, this.initialScale = 0, this.supportMultipleWindows = false, this.regexToCancelSubFramesLoading, this.useHybridComposition = false, this.useShouldInterceptRequest = false, this.useOnRenderProcessGone = false, this.overScrollMode = AndroidOverScrollMode.OVER_SCROLL_IF_CONTENT_SCROLLS, this.networkAvailable, this.scrollBarStyle = AndroidScrollBarStyle.SCROLLBARS_INSIDE_OVERLAY, this.verticalScrollbarPosition = AndroidVerticalScrollbarPosition.SCROLLBAR_POSITION_DEFAULT, this.scrollBarDefaultDelayBeforeFade, this.scrollbarFadingEnabled = true, this.scrollBarFadeDuration, this.rendererPriorityPolicy, this.disableDefaultErrorPage, }); @override Map toMap() { return { "textZoom": textZoom, "clearSessionCache": clearSessionCache, "builtInZoomControls": builtInZoomControls, "displayZoomControls": displayZoomControls, "databaseEnabled": databaseEnabled, "domStorageEnabled": domStorageEnabled, "useWideViewPort": useWideViewPort, "safeBrowsingEnabled": safeBrowsingEnabled, "mixedContentMode": mixedContentMode?.toValue(), "allowContentAccess": allowContentAccess, "allowFileAccess": allowFileAccess, "appCachePath": appCachePath, "blockNetworkImage": blockNetworkImage, "blockNetworkLoads": blockNetworkLoads, "cacheMode": cacheMode?.toValue(), "cursiveFontFamily": cursiveFontFamily, "defaultFixedFontSize": defaultFixedFontSize, "defaultFontSize": defaultFontSize, "defaultTextEncodingName": defaultTextEncodingName, "disabledActionModeMenuItems": disabledActionModeMenuItems?.toValue(), "fantasyFontFamily": fantasyFontFamily, "fixedFontFamily": fixedFontFamily, "forceDark": forceDark?.toValue(), "geolocationEnabled": geolocationEnabled, "layoutAlgorithm": layoutAlgorithm?.toValue(), "loadWithOverviewMode": loadWithOverviewMode, "loadsImagesAutomatically": loadsImagesAutomatically, "minimumLogicalFontSize": minimumLogicalFontSize, "initialScale": initialScale, "needInitialFocus": needInitialFocus, "offscreenPreRaster": offscreenPreRaster, "sansSerifFontFamily": sansSerifFontFamily, "serifFontFamily": serifFontFamily, "standardFontFamily": standardFontFamily, "saveFormData": saveFormData, "thirdPartyCookiesEnabled": thirdPartyCookiesEnabled, "hardwareAcceleration": hardwareAcceleration, "supportMultipleWindows": supportMultipleWindows, "useHybridComposition": useHybridComposition, "regexToCancelSubFramesLoading": regexToCancelSubFramesLoading, "useShouldInterceptRequest": useShouldInterceptRequest, "useOnRenderProcessGone": useOnRenderProcessGone, "overScrollMode": overScrollMode?.toValue(), "networkAvailable": networkAvailable, "scrollBarStyle": scrollBarStyle?.toValue(), "verticalScrollbarPosition": verticalScrollbarPosition?.toValue(), "scrollBarDefaultDelayBeforeFade": scrollBarDefaultDelayBeforeFade, "scrollbarFadingEnabled": scrollbarFadingEnabled, "scrollBarFadeDuration": scrollBarFadeDuration, "rendererPriorityPolicy": rendererPriorityPolicy?.toMap(), "disableDefaultErrorPage": disableDefaultErrorPage }; } static AndroidInAppWebViewOptions fromMap(Map map) { AndroidInAppWebViewOptions options = AndroidInAppWebViewOptions(); options.textZoom = map["textZoom"]; options.clearSessionCache = map["clearSessionCache"]; options.builtInZoomControls = map["builtInZoomControls"]; options.displayZoomControls = map["displayZoomControls"]; options.databaseEnabled = map["databaseEnabled"]; options.domStorageEnabled = map["domStorageEnabled"]; options.useWideViewPort = map["useWideViewPort"]; options.safeBrowsingEnabled = map["safeBrowsingEnabled"]; options.mixedContentMode = AndroidMixedContentMode.fromValue(map["mixedContentMode"]); options.allowContentAccess = map["allowContentAccess"]; options.allowFileAccess = map["allowFileAccess"]; options.appCachePath = map["appCachePath"]; options.blockNetworkImage = map["blockNetworkImage"]; options.blockNetworkLoads = map["blockNetworkLoads"]; options.cacheMode = AndroidCacheMode.fromValue(map["cacheMode"]); options.cursiveFontFamily = map["cursiveFontFamily"]; options.defaultFixedFontSize = map["defaultFixedFontSize"]; options.defaultFontSize = map["defaultFontSize"]; options.defaultTextEncodingName = map["defaultTextEncodingName"]; options.disabledActionModeMenuItems = AndroidActionModeMenuItem.fromValue(map["disabledActionModeMenuItems"]); options.fantasyFontFamily = map["fantasyFontFamily"]; options.fixedFontFamily = map["fixedFontFamily"]; options.forceDark = AndroidForceDark.fromValue(map["forceDark"]); options.geolocationEnabled = map["geolocationEnabled"]; options.layoutAlgorithm = AndroidLayoutAlgorithm.fromValue(map["layoutAlgorithm"]); options.loadWithOverviewMode = map["loadWithOverviewMode"]; options.loadsImagesAutomatically = map["loadsImagesAutomatically"]; options.minimumLogicalFontSize = map["minimumLogicalFontSize"]; options.initialScale = map["initialScale"]; options.needInitialFocus = map["needInitialFocus"]; options.offscreenPreRaster = map["offscreenPreRaster"]; options.sansSerifFontFamily = map["sansSerifFontFamily"]; options.serifFontFamily = map["serifFontFamily"]; options.standardFontFamily = map["standardFontFamily"]; options.saveFormData = map["saveFormData"]; options.thirdPartyCookiesEnabled = map["thirdPartyCookiesEnabled"]; options.hardwareAcceleration = map["hardwareAcceleration"]; options.supportMultipleWindows = map["supportMultipleWindows"]; options.regexToCancelSubFramesLoading = map["regexToCancelSubFramesLoading"]; options.useHybridComposition = map["useHybridComposition"]; options.useShouldInterceptRequest = map["useShouldInterceptRequest"]; options.useOnRenderProcessGone = map["useOnRenderProcessGone"]; options.overScrollMode = AndroidOverScrollMode.fromValue(map["overScrollMode"]); options.networkAvailable = map["networkAvailable"]; options.scrollBarStyle = AndroidScrollBarStyle.fromValue(map["scrollBarStyle"]); options.verticalScrollbarPosition = AndroidVerticalScrollbarPosition.fromValue( map["verticalScrollbarPosition"]); options.scrollBarDefaultDelayBeforeFade = map["scrollBarDefaultDelayBeforeFade"]; options.scrollbarFadingEnabled = map["scrollbarFadingEnabled"]; options.scrollBarFadeDuration = map["scrollBarFadeDuration"]; options.rendererPriorityPolicy = RendererPriorityPolicy.fromMap( map["rendererPriorityPolicy"]?.cast()); options.disableDefaultErrorPage = map["disableDefaultErrorPage"]; return options; } @override Map toJson() { return this.toMap(); } @override String toString() { return toMap().toString(); } @override AndroidInAppWebViewOptions copy() { return AndroidInAppWebViewOptions.fromMap(this.toMap()); } } ///This class represents all the iOS-only WebView options available. class IOSInAppWebViewOptions implements WebViewOptions, BrowserOptions, IosOptions { ///Set to `true` to disable the bouncing of the WebView when the scrolling has reached an edge of the content. The default value is `false`. bool disallowOverScroll; ///Set to `true` to allow a viewport meta tag to either disable or restrict the range of user scaling. The default value is `false`. bool enableViewportScale; ///Set to `true` if you want the WebView suppresses content rendering until it is fully loaded into memory. The default value is `false`. bool suppressesIncrementalRendering; ///Set to `true` to allow AirPlay. The default value is `true`. bool allowsAirPlayForMediaPlayback; ///Set to `true` to allow the horizontal swipe gestures trigger back-forward list navigations. The default value is `true`. bool allowsBackForwardNavigationGestures; ///Set to `true` to allow that pressing on a link displays a preview of the destination for the link. The default value is `true`. /// ///**NOTE**: available on iOS 9.0+. bool allowsLinkPreview; ///Set to `true` if you want that the WebView should always allow scaling of the webpage, regardless of the author's intent. ///The ignoresViewportScaleLimits property overrides the `user-scalable` HTML property in a webpage. The default value is `false`. bool ignoresViewportScaleLimits; ///Set to `true` to allow HTML5 media playback to appear inline within the screen layout, using browser-supplied controls rather than native controls. ///For this to work, add the `webkit-playsinline` attribute to any `