added minimumViewportInset and maximumViewportInset iOS webview settings
This commit is contained in:
parent
3f8b1591c8
commit
432e882e8f
@ -7,7 +7,7 @@
|
|||||||
- Added `WebAuthenticationSession` for iOS
|
- Added `WebAuthenticationSession` for iOS
|
||||||
- Added `FindInteractionController` for Android and iOS
|
- Added `FindInteractionController` for Android and iOS
|
||||||
- Added `pauseAllMediaPlayback`, `setAllMediaPlaybackSuspended`, `closeAllMediaPresentations`, `requestMediaPlaybackState`, `isInFullscreen`, `getCameraCaptureState`, `setCameraCaptureState`, `getMicrophoneCaptureState`, `setMicrophoneCaptureState` WebView controller methods
|
- Added `pauseAllMediaPlayback`, `setAllMediaPlaybackSuspended`, `closeAllMediaPresentations`, `requestMediaPlaybackState`, `isInFullscreen`, `getCameraCaptureState`, `setCameraCaptureState`, `getMicrophoneCaptureState`, `setMicrophoneCaptureState` WebView controller methods
|
||||||
- Added `underPageBackgroundColor`, `isTextInteractionEnabled`, `isSiteSpecificQuirksModeEnabled`, `upgradeKnownHostsToHTTPS`, `forceDarkStrategy`, `willSuppressErrorPage`, `algorithmicDarkeningAllowed`, `requestedWithHeaderMode`, `enterpriseAuthenticationAppLinkPolicyEnabled`, `isElementFullscreenEnabled`, `isFindInteractionEnabled` WebView settings
|
- Added `underPageBackgroundColor`, `isTextInteractionEnabled`, `isSiteSpecificQuirksModeEnabled`, `upgradeKnownHostsToHTTPS`, `forceDarkStrategy`, `willSuppressErrorPage`, `algorithmicDarkeningAllowed`, `requestedWithHeaderMode`, `enterpriseAuthenticationAppLinkPolicyEnabled`, `isElementFullscreenEnabled`, `isFindInteractionEnabled`, `minimumViewportInset`, `maximumViewportInset` WebView settings
|
||||||
- Added `onCameraCaptureStateChanged`, `onMicrophoneCaptureStateChanged` WebView events
|
- Added `onCameraCaptureStateChanged`, `onMicrophoneCaptureStateChanged` WebView events
|
||||||
- Added support for `onPermissionRequest` event on iOS 15.0+
|
- Added support for `onPermissionRequest` event on iOS 15.0+
|
||||||
- Added `debugLoggingSettings` static property for WebView and ChromeSafariBrowser
|
- Added `debugLoggingSettings` static property for WebView and ChromeSafariBrowser
|
||||||
|
@ -416,6 +416,12 @@ public class InAppWebView: WKWebView, UIScrollViewDelegate, WKUIDelegate,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if #available(iOS 15.5, *) {
|
||||||
|
if let minViewportInset = settings.minimumViewportInset, let maxViewportInset = settings.maximumViewportInset {
|
||||||
|
setMinimumViewportInset(minViewportInset, maximumViewportInset: maxViewportInset)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if #available(iOS 16.0, *) {
|
if #available(iOS 16.0, *) {
|
||||||
isFindInteractionEnabled = settings.isFindInteractionEnabled
|
isFindInteractionEnabled = settings.isFindInteractionEnabled
|
||||||
}
|
}
|
||||||
@ -1188,11 +1194,17 @@ public class InAppWebView: WKWebView, UIScrollViewDelegate, WKUIDelegate,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if #available(iOS 15.4, *) {
|
if #available(iOS 15.4, *) {
|
||||||
if newSettingsMap["isSiteSpecificQuirksModeEnabled"] != nil &&
|
if newSettingsMap["isSiteSpecificQuirksModeEnabled"] != nil, settings?.isSiteSpecificQuirksModeEnabled != newSettings.isSiteSpecificQuirksModeEnabled {
|
||||||
settings?.isSiteSpecificQuirksModeEnabled != newSettings.isSiteSpecificQuirksModeEnabled {
|
|
||||||
configuration.preferences.isSiteSpecificQuirksModeEnabled = newSettings.isSiteSpecificQuirksModeEnabled
|
configuration.preferences.isSiteSpecificQuirksModeEnabled = newSettings.isSiteSpecificQuirksModeEnabled
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if #available(iOS 15.5, *) {
|
||||||
|
if ((newSettingsMap["minimumViewportInset"] != nil && settings?.minimumViewportInset != newSettings.minimumViewportInset) ||
|
||||||
|
(newSettingsMap["maximumViewportInset"] != nil && settings?.maximumViewportInset != newSettings.maximumViewportInset)),
|
||||||
|
let minViewportInset = newSettings.minimumViewportInset, let maxViewportInset = newSettings.maximumViewportInset {
|
||||||
|
setMinimumViewportInset(minViewportInset, maximumViewportInset: maxViewportInset)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
scrollView.isScrollEnabled = !(newSettings.disableVerticalScroll && newSettings.disableHorizontalScroll)
|
scrollView.isScrollEnabled = !(newSettings.disableVerticalScroll && newSettings.disableHorizontalScroll)
|
||||||
|
|
||||||
|
@ -76,12 +76,23 @@ public class InAppWebViewSettings: ISettings<InAppWebView> {
|
|||||||
var upgradeKnownHostsToHTTPS = true
|
var upgradeKnownHostsToHTTPS = true
|
||||||
var isElementFullscreenEnabled = true
|
var isElementFullscreenEnabled = true
|
||||||
var isFindInteractionEnabled = false
|
var isFindInteractionEnabled = false
|
||||||
|
var minimumViewportInset: UIEdgeInsets? = nil
|
||||||
|
var maximumViewportInset: UIEdgeInsets? = nil
|
||||||
|
|
||||||
override init(){
|
override init(){
|
||||||
super.init()
|
super.init()
|
||||||
}
|
}
|
||||||
|
|
||||||
override func parse(settings: [String: Any?]) -> InAppWebViewSettings {
|
override func parse(settings: [String: Any?]) -> InAppWebViewSettings {
|
||||||
|
var settings = settings // re-assing to be able to use removeValue
|
||||||
|
if let minimumViewportInsetMap = settings["minimumViewportInset"] as? [String : Double] {
|
||||||
|
minimumViewportInset = UIEdgeInsets.fromMap(map: minimumViewportInsetMap)
|
||||||
|
settings.removeValue(forKey: "minimumViewportInset")
|
||||||
|
}
|
||||||
|
if let maximumViewportInsetMap = settings["maximumViewportInset"] as? [String : Double] {
|
||||||
|
maximumViewportInset = UIEdgeInsets.fromMap(map: maximumViewportInsetMap)
|
||||||
|
settings.removeValue(forKey: "maximumViewportInset")
|
||||||
|
}
|
||||||
let _ = super.parse(settings: settings)
|
let _ = super.parse(settings: settings)
|
||||||
if #available(iOS 13.0, *) {} else {
|
if #available(iOS 13.0, *) {} else {
|
||||||
applePayAPIEnabled = false
|
applePayAPIEnabled = false
|
||||||
@ -150,6 +161,10 @@ public class InAppWebViewSettings: ISettings<InAppWebView> {
|
|||||||
realSettings["isSiteSpecificQuirksModeEnabled"] = configuration.preferences.isSiteSpecificQuirksModeEnabled
|
realSettings["isSiteSpecificQuirksModeEnabled"] = configuration.preferences.isSiteSpecificQuirksModeEnabled
|
||||||
realSettings["isElementFullscreenEnabled"] = configuration.preferences.isElementFullscreenEnabled
|
realSettings["isElementFullscreenEnabled"] = configuration.preferences.isElementFullscreenEnabled
|
||||||
}
|
}
|
||||||
|
if #available(iOS 15.5, *) {
|
||||||
|
realSettings["minimumViewportInset"] = webView.minimumViewportInset.toMap()
|
||||||
|
realSettings["maximumViewportInset"] = webView.maximumViewportInset.toMap()
|
||||||
|
}
|
||||||
if #available(iOS 16.0, *) {
|
if #available(iOS 16.0, *) {
|
||||||
realSettings["isFindInteractionEnabled"] = webView.isFindInteractionEnabled
|
realSettings["isFindInteractionEnabled"] = webView.isFindInteractionEnabled
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import 'dart:ui';
|
import 'dart:ui';
|
||||||
|
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
|
||||||
import '../types/requested_with_header_mode.dart';
|
import '../types/requested_with_header_mode.dart';
|
||||||
import 'android/in_app_webview_options.dart';
|
import 'android/in_app_webview_options.dart';
|
||||||
@ -11,6 +12,9 @@ import '../util.dart';
|
|||||||
import '../in_app_browser/in_app_browser_settings.dart';
|
import '../in_app_browser/in_app_browser_settings.dart';
|
||||||
import 'webview.dart';
|
import 'webview.dart';
|
||||||
import '../android/webview_feature.dart';
|
import '../android/webview_feature.dart';
|
||||||
|
import '../in_app_webview/in_app_webview_controller.dart';
|
||||||
|
import '../context_menu.dart';
|
||||||
|
|
||||||
|
|
||||||
///This class represents all the WebView settings available.
|
///This class represents all the WebView settings available.
|
||||||
class InAppWebViewSettings {
|
class InAppWebViewSettings {
|
||||||
@ -555,7 +559,7 @@ class InAppWebViewSettings {
|
|||||||
|
|
||||||
///Sets the WebView's over-scroll mode.
|
///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.
|
///Setting the over-scroll mode of a WebView will have an effect only if the WebView is capable of scrolling.
|
||||||
///The default value is [OverScrollMode.OVER_SCROLL_IF_CONTENT_SCROLLS].
|
///The default value is [OverScrollMode.IF_CONTENT_SCROLLS].
|
||||||
///
|
///
|
||||||
///**Supported Platforms/Implementations**:
|
///**Supported Platforms/Implementations**:
|
||||||
///- Android native WebView
|
///- Android native WebView
|
||||||
@ -1077,6 +1081,24 @@ class InAppWebViewSettings {
|
|||||||
///- iOS
|
///- iOS
|
||||||
bool isFindInteractionEnabled;
|
bool isFindInteractionEnabled;
|
||||||
|
|
||||||
|
///Set minimum viewport inset to the smallest inset a webpage may experience in your app's maximally collapsed UI configuration.
|
||||||
|
///Values must be either zero or positive. It must be smaller than [maximumViewportInset].
|
||||||
|
///
|
||||||
|
///**NOTE**: available on iOS 15.5+.
|
||||||
|
///
|
||||||
|
///**Supported Platforms/Implementations**:
|
||||||
|
///- iOS
|
||||||
|
EdgeInsets? minimumViewportInset;
|
||||||
|
|
||||||
|
///Set maximum viewport inset to the largest inset a webpage may experience in your app's maximally expanded UI configuration.
|
||||||
|
///Values must be either zero or positive. It must be larger than [minimumViewportInset].
|
||||||
|
///
|
||||||
|
///**NOTE**: available on iOS 15.5+.
|
||||||
|
///
|
||||||
|
///**Supported Platforms/Implementations**:
|
||||||
|
///- iOS
|
||||||
|
EdgeInsets? maximumViewportInset;
|
||||||
|
|
||||||
///Specifies a feature policy for the `<iframe>`.
|
///Specifies a feature policy for the `<iframe>`.
|
||||||
///The policy defines what features are available to the `<iframe>` based on the origin of the request
|
///The policy defines what features are available to the `<iframe>` based on the origin of the request
|
||||||
///(e.g. access to the microphone, camera, battery, web-share API, etc.).
|
///(e.g. access to the microphone, camera, battery, web-share API, etc.).
|
||||||
@ -1242,6 +1264,8 @@ class InAppWebViewSettings {
|
|||||||
this.upgradeKnownHostsToHTTPS = true,
|
this.upgradeKnownHostsToHTTPS = true,
|
||||||
this.isElementFullscreenEnabled = true,
|
this.isElementFullscreenEnabled = true,
|
||||||
this.isFindInteractionEnabled = false,
|
this.isFindInteractionEnabled = false,
|
||||||
|
this.minimumViewportInset,
|
||||||
|
this.maximumViewportInset,
|
||||||
this.iframeAllow,
|
this.iframeAllow,
|
||||||
this.iframeAllowFullscreen,
|
this.iframeAllowFullscreen,
|
||||||
this.iframeSandbox,
|
this.iframeSandbox,
|
||||||
@ -1256,6 +1280,12 @@ class InAppWebViewSettings {
|
|||||||
!this.resourceCustomSchemes.contains("https"));
|
!this.resourceCustomSchemes.contains("https"));
|
||||||
assert(
|
assert(
|
||||||
allowingReadAccessTo == null || allowingReadAccessTo!.isScheme("file"));
|
allowingReadAccessTo == null || allowingReadAccessTo!.isScheme("file"));
|
||||||
|
assert((minimumViewportInset == null && maximumViewportInset == null) ||
|
||||||
|
minimumViewportInset != null && maximumViewportInset != null &&
|
||||||
|
minimumViewportInset!.isNonNegative && maximumViewportInset!.isNonNegative &&
|
||||||
|
minimumViewportInset!.vertical <= maximumViewportInset!.vertical &&
|
||||||
|
minimumViewportInset!.horizontal <= maximumViewportInset!.horizontal,
|
||||||
|
"minimumViewportInset cannot be larger than maximumViewportInset");
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, dynamic> toMap() {
|
Map<String, dynamic> toMap() {
|
||||||
@ -1397,6 +1427,8 @@ class InAppWebViewSettings {
|
|||||||
"upgradeKnownHostsToHTTPS": upgradeKnownHostsToHTTPS,
|
"upgradeKnownHostsToHTTPS": upgradeKnownHostsToHTTPS,
|
||||||
"isElementFullscreenEnabled": isElementFullscreenEnabled,
|
"isElementFullscreenEnabled": isElementFullscreenEnabled,
|
||||||
"isFindInteractionEnabled": isFindInteractionEnabled,
|
"isFindInteractionEnabled": isFindInteractionEnabled,
|
||||||
|
"minimumViewportInset": minimumViewportInset?.toMap(),
|
||||||
|
"maximumViewportInset": maximumViewportInset?.toMap(),
|
||||||
"iframeAllow": iframeAllow,
|
"iframeAllow": iframeAllow,
|
||||||
"iframeAllowFullscreen": iframeAllowFullscreen,
|
"iframeAllowFullscreen": iframeAllowFullscreen,
|
||||||
"iframeSandbox": iframeSandbox?.map((e) => e.toNativeValue()).toList(),
|
"iframeSandbox": iframeSandbox?.map((e) => e.toNativeValue()).toList(),
|
||||||
@ -1602,6 +1634,8 @@ class InAppWebViewSettings {
|
|||||||
settings.upgradeKnownHostsToHTTPS = map["upgradeKnownHostsToHTTPS"];
|
settings.upgradeKnownHostsToHTTPS = map["upgradeKnownHostsToHTTPS"];
|
||||||
settings.isElementFullscreenEnabled = map["isElementFullscreenEnabled"];
|
settings.isElementFullscreenEnabled = map["isElementFullscreenEnabled"];
|
||||||
settings.isFindInteractionEnabled = map["isFindInteractionEnabled"];
|
settings.isFindInteractionEnabled = map["isFindInteractionEnabled"];
|
||||||
|
settings.minimumViewportInset = MapEdgeInsets.fromMap(map["minimumViewportInset"]?.cast<String, double>());
|
||||||
|
settings.maximumViewportInset = MapEdgeInsets.fromMap(map["maximumViewportInset"]?.cast<String, double>());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return settings;
|
return settings;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user