Skip to content

Commit b4d7cc7

Browse files
bparrishMinesnploi
authored andcommitted
[webview_flutter_platform_interface] Adds method to receive permission requests (flutter#3767)
1 parent b7a2285 commit b4d7cc7

11 files changed

+139
-7
lines changed

packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 2.3.0
2+
3+
* Adds support to receive permission requests. See
4+
`PlatformWebViewController.setOnPlatformPermissionRequest`.
5+
16
## 2.2.0
27

38
* Updates minimum Flutter version to 3.3.

packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_navigation_delegate.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ import 'dart:async';
66

77
import 'package:flutter/foundation.dart';
88
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
9+
import 'types/types.dart';
910

10-
import 'webview_platform.dart';
11+
import 'webview_platform.dart' show WebViewPlatform;
1112

1213
/// Signature for callbacks that report a pending navigation request.
1314
typedef NavigationRequestCallback = FutureOr<NavigationDecision> Function(

packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_controller.dart

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import 'package:flutter/painting.dart';
77
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
88

99
import 'platform_navigation_delegate.dart';
10-
import 'webview_platform.dart';
10+
import 'types/types.dart';
11+
import 'webview_platform.dart' show WebViewPlatform;
1112

1213
/// Interface for a platform implementation of a web view controller.
1314
///
@@ -259,6 +260,16 @@ abstract class PlatformWebViewController extends PlatformInterface {
259260
throw UnimplementedError(
260261
'setUserAgent is not implemented on the current platform');
261262
}
263+
264+
/// Sets a callback that notifies the host application that web content is
265+
/// requesting permission to access the specified resources.
266+
Future<void> setOnPlatformPermissionRequest(
267+
void Function(PlatformWebViewPermissionRequest request) onPermissionRequest,
268+
) {
269+
throw UnimplementedError(
270+
'setOnPermissionRequest is not implemented on the current platform',
271+
);
272+
}
262273
}
263274

264275
/// Describes the parameters necessary for registering a JavaScript channel.

packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_cookie_manager.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
import 'package:flutter/foundation.dart';
66
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
77

8-
import 'webview_platform.dart';
8+
import 'types/types.dart';
9+
import 'webview_platform.dart' show WebViewPlatform;
910

1011
/// Interface for a platform implementation of a cookie manager.
1112
///

packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_widget.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
import 'package:flutter/widgets.dart';
66
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
77

8-
import 'webview_platform.dart';
8+
import 'types/types.dart';
9+
import 'webview_platform.dart' show WebViewPlatform;
910

1011
/// Interface for a platform implementation of a web view widget.
1112
abstract class PlatformWebViewWidget extends PlatformInterface {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
import 'package:flutter/cupertino.dart';
6+
7+
/// Types of resources that can require permissions.
8+
///
9+
/// Platform specific implementations can create their own resource types.
10+
///
11+
/// This example demonstrates how to extend the [WebViewPermissionResourceType]
12+
/// to create additional platform-specific types:
13+
///
14+
/// ```dart
15+
/// class AndroidWebViewPermissionResourceType
16+
/// extends WebViewPermissionResourceType {
17+
/// const AndroidWebViewPermissionResourceType._(super.name);
18+
///
19+
/// static const AndroidWebViewPermissionResourceType midiSysex =
20+
/// AndroidWebViewPermissionResourceType._('midiSysex');
21+
///
22+
/// static const AndroidWebViewPermissionResourceType protectedMediaId =
23+
/// AndroidWebViewPermissionResourceType._('protectedMediaId');
24+
/// }
25+
///```
26+
///
27+
@immutable
28+
class WebViewPermissionResourceType {
29+
/// Constructs a [WebViewPermissionResourceType].
30+
///
31+
/// This should only be used by this class and subclasses in platform
32+
/// implementations.
33+
@protected
34+
const WebViewPermissionResourceType(this.name);
35+
36+
/// Unique name of the resource type.
37+
///
38+
/// For platform implementations, this should match the name of variable.
39+
final String name;
40+
41+
/// A media device that can capture video.
42+
static const WebViewPermissionResourceType camera =
43+
WebViewPermissionResourceType('camera');
44+
45+
/// A media device that can capture audio.
46+
static const WebViewPermissionResourceType microphone =
47+
WebViewPermissionResourceType('microphone');
48+
}
49+
50+
/// Permissions request when web content requests access to protected resources.
51+
///
52+
/// A response MUST be provided by calling a provided method.
53+
///
54+
/// Platform specific implementations can add additional methods when extending
55+
/// this class.
56+
///
57+
/// This example demonstrates how to extend the
58+
/// [PlatformWebViewPermissionRequest] to provide additional platform-specific
59+
/// features:
60+
///
61+
/// ```dart
62+
/// class WebKitWebViewPermissionRequest extends PlatformWebViewPermissionRequest {
63+
/// const WebKitWebViewPermissionRequest._({
64+
/// required super.types,
65+
/// required void Function(WKPermissionDecision decision) onDecision,
66+
/// }) : _onDecision = onDecision;
67+
///
68+
/// final void Function(WKPermissionDecision) _onDecision;
69+
///
70+
/// @override
71+
/// Future<void> grant() async {
72+
/// _onDecision(WKPermissionDecision.grant);
73+
/// }
74+
///
75+
/// @override
76+
/// Future<void> deny() async {
77+
/// _onDecision(WKPermissionDecision.deny);
78+
/// }
79+
///
80+
/// Future<void> prompt() async {
81+
/// _onDecision(WKPermissionDecision.prompt);
82+
/// }
83+
/// }
84+
/// ```
85+
@immutable
86+
abstract class PlatformWebViewPermissionRequest {
87+
/// Creates a [PlatformWebViewPermissionRequest].
88+
const PlatformWebViewPermissionRequest({required this.types});
89+
90+
/// All resources access has been requested for.
91+
final Set<WebViewPermissionResourceType> types;
92+
93+
/// Grant permission for the requested resource(s).
94+
Future<void> grant();
95+
96+
/// Deny permission for the requested resource(s).
97+
Future<void> deny();
98+
}

packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/types.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export 'navigation_request.dart';
1111
export 'platform_navigation_delegate_creation_params.dart';
1212
export 'platform_webview_controller_creation_params.dart';
1313
export 'platform_webview_cookie_manager_creation_params.dart';
14+
export 'platform_webview_permission_request.dart';
1415
export 'platform_webview_widget_creation_params.dart';
1516
export 'url_change.dart';
1617
export 'web_resource_error.dart';

packages/webview_flutter/webview_flutter_platform_interface/lib/src/webview_platform.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import 'platform_webview_cookie_manager.dart';
1010
import 'platform_webview_widget.dart';
1111
import 'types/types.dart';
1212

13+
// TODO(bparrishMines): This should be removed once webview_flutter_android and
14+
// webview_flutter_wkwebview no longer depend on this file in tests.
1315
export 'types/types.dart';
1416

1517
/// Interface for a platform implementation of a WebView.

packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/webview_flutt
44
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview_flutter%22
55
# NOTE: We strongly prefer non-breaking changes, even at the expense of a
66
# less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes
7-
version: 2.2.0
7+
version: 2.3.0
88

99
environment:
1010
sdk: ">=2.18.0 <4.0.0"

packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_controller_test.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,19 @@ void main() {
374374
throwsUnimplementedError,
375375
);
376376
});
377+
378+
test(
379+
'Default implementation of setOnPermissionRequest should throw unimplemented error',
380+
() {
381+
final PlatformWebViewController controller =
382+
ExtendsPlatformWebViewController(
383+
const PlatformWebViewControllerCreationParams());
384+
385+
expect(
386+
() => controller.setOnPlatformPermissionRequest((_) {}),
387+
throwsUnimplementedError,
388+
);
389+
});
377390
}
378391

379392
class MockWebViewPlatformWithMixin extends MockWebViewPlatform

0 commit comments

Comments
 (0)