create static method

Future<WebViewSession?> create({
  1. WebViewSessionMode mode = WebViewSessionMode.incognito,
  2. void onPermissionRequest(
    1. WebViewPermissionRequest request
    )?,
})

Creates one owned WebView with the requested data policy.

Unsupported modes or creation failures print a diagnostic and return null. No ordinary WebView is created as a fallback for private browsing.

Implementation

static Future<WebViewSession?> create({
  WebViewSessionMode mode = WebViewSessionMode.incognito,
  void Function(WebViewPermissionRequest request)? onPermissionRequest,
}) async {
  final capabilities = await getCapabilities();
  if (!capabilities.canClose || !capabilities.supports(mode)) {
    final message =
        'Owned WebView session mode ${mode.name} is not supported on this platform/runtime.';
    debugPrint(
      'webview_all: $message ${capabilities.privateSessionRestriction ?? ''} No WebView was created.',
    );
    return null;
  }
  if (mode == WebViewSessionMode.incognito &&
      capabilities.incognitoSupport == WebViewIncognitoSupport.limited) {
    debugPrint(
      'webview_all: Limited incognito handling. ${capabilities.privateSessionRestriction ?? "Website data may remain shared and persistent."}',
    );
  }
  WebViewController? controller;
  try {
    controller = WebViewController.fromPlatformCreationParams(
      PlatformWebViewControllerCreationParams(sessionMode: mode),
      onPermissionRequest: onPermissionRequest,
    );
    await controller.platform.prepareSession();
    return WebViewSession._(controller, mode, capabilities);
  } catch (error) {
    try {
      await controller?.platform.closeWebViewSession();
    } catch (_) {
      // Preserve the creation failure.
    }
    debugPrint(
      'webview_all: WebView session creation failed: $error. No session was returned.',
    );
    return null;
  }
}