WebKitWebViewController constructor
WebKitWebViewController(
- PlatformWebViewControllerCreationParams params
Constructs a WebKitWebViewController.
Implementation
WebKitWebViewController(PlatformWebViewControllerCreationParams params)
: super.implementation(params is WebKitWebViewControllerCreationParams
? params
: WebKitWebViewControllerCreationParams
.fromPlatformWebViewControllerCreationParams(params)) {
_webView.addObserver(
_webView,
keyPath: 'estimatedProgress',
options: <NSKeyValueObservingOptions>{
NSKeyValueObservingOptions.newValue,
},
);
_webView.addObserver(
_webView,
keyPath: 'URL',
options: <NSKeyValueObservingOptions>{
NSKeyValueObservingOptions.newValue,
},
);
final WeakReference<WebKitWebViewController> weakThis =
WeakReference<WebKitWebViewController>(this);
_uiDelegate = _webKitParams.webKitProxy.createUIDelegate(
instanceManager: _webKitParams._instanceManager,
onCreateWebView: (
WKWebView webView,
WKWebViewConfiguration configuration,
WKNavigationAction navigationAction,
) {
if (!navigationAction.targetFrame.isMainFrame) {
webView.loadRequest(navigationAction.request);
}
},
requestMediaCapturePermission: (
WKUIDelegate instance,
WKWebView webView,
WKSecurityOrigin origin,
WKFrameInfo frame,
WKMediaCaptureType type,
) async {
final void Function(PlatformWebViewPermissionRequest)? callback =
weakThis.target?._onPermissionRequestCallback;
if (callback == null) {
// The default response for iOS is to prompt. See
// https://developer.apple.com/documentation/webkit/wkuidelegate/3763087-webview?language=objc
return WKPermissionDecision.prompt;
} else {
late final Set<WebViewPermissionResourceType> types;
switch (type) {
case WKMediaCaptureType.camera:
types = <WebViewPermissionResourceType>{
WebViewPermissionResourceType.camera
};
case WKMediaCaptureType.cameraAndMicrophone:
types = <WebViewPermissionResourceType>{
WebViewPermissionResourceType.camera,
WebViewPermissionResourceType.microphone
};
case WKMediaCaptureType.microphone:
types = <WebViewPermissionResourceType>{
WebViewPermissionResourceType.microphone
};
case WKMediaCaptureType.unknown:
// The default response for iOS is to prompt. See
// https://developer.apple.com/documentation/webkit/wkuidelegate/3763087-webview?language=objc
return WKPermissionDecision.prompt;
}
final Completer<WKPermissionDecision> decisionCompleter =
Completer<WKPermissionDecision>();
callback(
WebKitWebViewPermissionRequest._(
types: types,
onDecision: decisionCompleter.complete,
),
);
return decisionCompleter.future;
}
},
runJavaScriptAlertDialog: (String message, WKFrameInfo frame) async {
final Future<void> Function(JavaScriptAlertDialogRequest request)?
callback = weakThis.target?._onJavaScriptAlertDialog;
if (callback != null) {
final JavaScriptAlertDialogRequest request =
JavaScriptAlertDialogRequest(
message: message, url: frame.request.url);
await callback.call(request);
return;
}
},
runJavaScriptConfirmDialog: (String message, WKFrameInfo frame) async {
final Future<bool> Function(JavaScriptConfirmDialogRequest request)?
callback = weakThis.target?._onJavaScriptConfirmDialog;
if (callback != null) {
final JavaScriptConfirmDialogRequest request =
JavaScriptConfirmDialogRequest(
message: message, url: frame.request.url);
final bool result = await callback.call(request);
return result;
}
return false;
},
runJavaScriptTextInputDialog:
(String prompt, String defaultText, WKFrameInfo frame) async {
final Future<String> Function(JavaScriptTextInputDialogRequest request)?
callback = weakThis.target?._onJavaScriptTextInputDialog;
if (callback != null) {
final JavaScriptTextInputDialogRequest request =
JavaScriptTextInputDialogRequest(
message: prompt,
url: frame.request.url,
defaultText: defaultText);
final String result = await callback.call(request);
return result;
}
return '';
},
);
_webView.setUIDelegate(_uiDelegate);
}