WebKitWebViewController constructor

WebKitWebViewController(
  1. 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);
}