createBaseWebViewController function

WebViewController createBaseWebViewController(
  1. void bridgeMessagesHandler(
    1. JavaScriptMessage
    )
)

Implementation

WebViewController createBaseWebViewController(
  void Function(JavaScriptMessage) bridgeMessagesHandler,
) {
  late final PlatformWebViewControllerCreationParams params;
  if (WebViewPlatform.instance is WebKitWebViewPlatform) {
    params = WebKitWebViewControllerCreationParams(
      allowsInlineMediaPlayback: true,
      mediaTypesRequiringUserAction: const <PlaybackMediaTypes>{},
    );
  } else {
    params = const PlatformWebViewControllerCreationParams();
  }
  final controller = WebViewController.fromPlatformCreationParams(
    params,
    onPermissionRequest: (request) async {
      final resources = request.platform.types.toList();
      if (resources.isEmpty) {
        return;
      }

      final permissions = Platform.isAndroid
          ? resources
              .map((r) {
                final permission =
                    TabbyPermissionResourceType.toAndroidPermission(r);
                return permission;
              })
              .whereType<Permission>()
              .toList()
          : [Permission.camera, Permission.microphone];
      final statuses = await permissions.request();
      final isGranted = statuses.values.every((s) => s.isGranted);
      final future = isGranted ? request.grant : request.deny;
      await future();
    },
  )
    ..setBackgroundColor(Colors.transparent)
    ..setJavaScriptMode(JavaScriptMode.unrestricted)
    ..addJavaScriptChannel(
      TabbySDK.jsBridgeName,
      onMessageReceived: (message) {
        if (kDebugMode) {
          log(
            'Got message from JS '
            '[${TabbySDK.jsBridgeName}]: '
            '${message.message}',
          );
        }
        bridgeMessagesHandler(message);
      },
    );
  if (controller.platform is AndroidWebViewController) {
    (controller.platform as AndroidWebViewController)
      ..setMediaPlaybackRequiresUserGesture(false)
      ..setOnShowFileSelector(
        (params) async {
          return _androidFilePicker(params);
        },
      );
  }
  return controller;
}