Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
48d4c9d
make deps path based
bparrishMines Mar 24, 2023
4ad0174
interface implementation
bparrishMines Mar 24, 2023
a51decc
support for permissionrequest
bparrishMines Mar 24, 2023
c6880bb
add method to webchromeclient
bparrishMines Mar 24, 2023
896ce9b
android impl without tests
bparrishMines Mar 24, 2023
f2f6f2a
remove imports
bparrishMines Mar 24, 2023
d7a54d0
update platform interface
bparrishMines Mar 24, 2023
38a727d
update interface again
bparrishMines Mar 24, 2023
44a0c2e
finish android implementation
bparrishMines Mar 24, 2023
8588900
change to platformwebviewpermissionrequest
bparrishMines Mar 24, 2023
631cfb8
version bump formatting and app facing implementation
bparrishMines Mar 24, 2023
4505f04
test constants
bparrishMines Mar 24, 2023
df40eca
redundant version checks
bparrishMines Mar 24, 2023
83c428a
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 6, 2023
e58ea0d
undo ios mocks change
bparrishMines Apr 6, 2023
07c3ac1
update webviewpermissionrequest
bparrishMines Apr 7, 2023
c8466f4
update app-facing package
bparrishMines Apr 7, 2023
e0801bc
add wkwebview method dart impl
bparrishMines Apr 7, 2023
da4a45f
finish dart ios code with failing tests
bparrishMines Apr 7, 2023
bfd6f27
formatting
bparrishMines Apr 7, 2023
e63f3e9
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 8, 2023
09eea9a
fix tests
bparrishMines Apr 8, 2023
c7606bb
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 10, 2023
10ef24c
controller test
bparrishMines Apr 10, 2023
d516b34
webview data converters
bparrishMines Apr 10, 2023
85f2b56
implement callback
bparrishMines Apr 10, 2023
5fbca14
update app-facing package
bparrishMines Apr 10, 2023
482b7c1
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 10, 2023
a291c52
fix lint errors
bparrishMines Apr 10, 2023
fb2b779
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 11, 2023
eeff573
try fix test
bparrishMines Apr 11, 2023
7a9a039
fix objc test
bparrishMines Apr 11, 2023
356e8ad
prompt by default
bparrishMines Apr 11, 2023
4800b3a
comment
bparrishMines Apr 11, 2023
fd3af75
test that ios works
bparrishMines Apr 11, 2023
7570c5b
add permissions to debug camera access
bparrishMines Apr 11, 2023
8946b87
reference permissions and version bump
bparrishMines Apr 11, 2023
23121e5
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 11, 2023
7d71719
undo webview_flutter change
bparrishMines Apr 11, 2023
6717cf4
improve docs and fix tests
bparrishMines Apr 11, 2023
d566b5e
naming
bparrishMines Apr 11, 2023
8e39a28
add version check
bparrishMines Apr 11, 2023
922028e
fix integration test
bparrishMines Apr 11, 2023
e592ae1
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 13, 2023
adc7f3c
add baseline back
bparrishMines Apr 13, 2023
9a57b03
fix lint
bparrishMines Apr 13, 2023
96b1515
add call to observe URL back
bparrishMines Apr 13, 2023
bfe3d64
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 15, 2023
44aaf7e
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 18, 2023
4f4c253
some of the review comments
bparrishMines Apr 18, 2023
bef6efa
fix methods, docs and make template naming consistent
bparrishMines Apr 19, 2023
f155afb
update dataconverter class names
bparrishMines Apr 19, 2023
f8b2691
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 19, 2023
68610f1
fix old method names
bparrishMines Apr 19, 2023
07a074b
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 19, 2023
a33ea19
docs and added a test
bparrishMines Apr 19, 2023
0638c30
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 20, 2023
d9c4a6e
add a comment about not recognizing permissions
bparrishMines Apr 20, 2023
a6496b8
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 21, 2023
fd13fce
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 21, 2023
ec80236
version bump
bparrishMines Apr 21, 2023
b065c45
move macro
bparrishMines Apr 21, 2023
535374b
fix files
bparrishMines Apr 21, 2023
b8a409f
last file
bparrishMines Apr 21, 2023
ba07eb1
export main_file.PlatformWebViewPermissionRequest
bparrishMines Apr 21, 2023
8715691
undo the export
bparrishMines Apr 21, 2023
520bf59
add more documention
bparrishMines Apr 22, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
add wkwebview method dart impl
  • Loading branch information
bparrishMines committed Apr 7, 2023
commit e0801bcbb52cf105247a09ba41a0a1d7e5c1d567

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ import '../foundation/foundation.dart';
import '../ui_kit/ui_kit.dart';
import 'web_kit_api_impls.dart';

export 'web_kit_api_impls.dart' show WKNavigationType;
export 'web_kit_api_impls.dart'
show WKNavigationType, WKPermissionDecision, WKMediaCaptureType;

/// Times at which to inject script content into a webpage.
///
Expand Down Expand Up @@ -712,6 +713,7 @@ class WKUIDelegate extends NSObject {
/// Constructs a [WKUIDelegate].
WKUIDelegate({
this.onCreateWebView,
this.requestMediaCapturePermission,
super.observeValue,
super.binaryMessenger,
super.instanceManager,
Expand All @@ -732,6 +734,7 @@ class WKUIDelegate extends NSObject {
/// create copies.
WKUIDelegate.detached({
this.onCreateWebView,
this.requestMediaCapturePermission,
super.observeValue,
super.binaryMessenger,
super.instanceManager,
Expand All @@ -752,17 +755,50 @@ class WKUIDelegate extends NSObject {
WKNavigationAction navigationAction,
)? onCreateWebView;

/// Determines whether a web resource, which the security origin object
/// describes, can access to the device’s microphone audio and camera video.
final Future<WKPermissionDecision> Function(
WKUIDelegate instance,
WKWebView webView,
WKSecurityOrigin origin,
WKFrameInfo frame,
WKMediaCaptureType type,
)? requestMediaCapturePermission;

@override
WKUIDelegate copy() {
return WKUIDelegate.detached(
onCreateWebView: onCreateWebView,
requestMediaCapturePermission: requestMediaCapturePermission,
observeValue: observeValue,
binaryMessenger: _uiDelegateApi.binaryMessenger,
instanceManager: _uiDelegateApi.instanceManager,
);
}
}

/// An object that identifies the origin of a particular resource.
///
/// Wraps https://developer.apple.com/documentation/webkit/wksecurityorigin?language=objc.
@immutable
class WKSecurityOrigin {
/// Constructs an [WKSecurityOrigin].
const WKSecurityOrigin({
required this.host,
required this.port,
required this.protocol,
});

/// The security origin’s host.
final String host;

/// The security origin's port.
final int port;

/// The security origin's protocol.
final String protocol;
}

/// Methods for handling navigation changes and tracking navigation requests.
///
/// Set the methods of the [WKNavigationDelegate] in the object you use to
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ import '../common/web_kit.g.dart';
import '../foundation/foundation.dart';
import 'web_kit.dart';

export '../common/web_kit.g.dart' show WKNavigationType;
export '../common/web_kit.g.dart'
show WKNavigationType, WKPermissionDecision, WKMediaCaptureType;

Iterable<WKWebsiteDataTypeEnumData> _toWKWebsiteDataTypeEnumData(
Iterable<WKWebsiteDataType> types) {
Expand Down Expand Up @@ -230,6 +231,12 @@ extension _NSUrlRequestConverter on NSUrlRequest {
}
}

extension _WKSecurityOriginConverter on WKSecurityOriginData {
WKSecurityOrigin toWKSecurityOrigin() {
return WKSecurityOrigin(host: host, port: port, protocol: protocol);
}
}

/// Handles initialization of Flutter APIs for WebKit.
class WebKitFlutterApis {
/// Constructs a [WebKitFlutterApis].
Expand Down Expand Up @@ -719,6 +726,34 @@ class WKUIDelegateFlutterApiImpl extends WKUIDelegateFlutterApi {
navigationAction.toNavigationAction(),
);
}

@override
Future<WKPermissionDecisionData> requestMediaCapturePermission(
int identifier,
int webViewIdentifier,
WKSecurityOriginData origin,
WKFrameInfoData frame,
WKMediaCaptureTypeData type,
) async {
final WKUIDelegate instance =
instanceManager.getInstanceWithWeakReference(identifier)!;

late final WKPermissionDecision decision;
if (instance.requestMediaCapturePermission != null) {
decision = await instance.requestMediaCapturePermission!(
instance,
instanceManager.getInstanceWithWeakReference(webViewIdentifier)!
as WKWebView,
origin.toWKSecurityOrigin(),
frame.toWKFrameInfo(),
type.value,
);
} else {
decision = WKPermissionDecision.deny;
}

return WKPermissionDecisionData(value: decision);
}
}

/// Host api implementation for [WKNavigationDelegate].
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,58 @@ enum WKNavigationType {
other,
}

/// Possible permission decisions for device resource access.
///
/// See https://developer.apple.com/documentation/webkit/wkpermissiondecision?language=objc.
enum WKPermissionDecision {
/// Deny permission for the requested resource.
///
/// See https://developer.apple.com/documentation/webkit/wkpermissiondecision/wkpermissiondecisiondeny?language=objc.
deny,

/// Deny permission for the requested resource.
///
/// See https://developer.apple.com/documentation/webkit/wkpermissiondecision/wkpermissiondecisiongrant?language=objc.
grant,

/// Prompt the user for permission for the requested resource.
///
/// See https://developer.apple.com/documentation/webkit/wkpermissiondecision/wkpermissiondecisionprompt?language=objc.
prompt,
}

// TODO(bparrishMines): Enums need be wrapped in a data class because thay can't
// be used as primitive arguments. See https://github.com/flutter/flutter/issues/87307
class WKPermissionDecisionData {
late WKPermissionDecision value;
}

/// List of the types of media devices that can capture audio, video, or both.
///
/// See https://developer.apple.com/documentation/webkit/wkmediacapturetype?language=objc.
enum WKMediaCaptureType {
/// A media device that can capture video.
///
/// See https://developer.apple.com/documentation/webkit/wkmediacapturetype/wkmediacapturetypecamera?language=objc.
camera,

/// A media device or devices that can capture audio and video.
///
/// See https://developer.apple.com/documentation/webkit/wkmediacapturetype/wkmediacapturetypecameraandmicrophone?language=objc.
cameraAndMicrophone,

/// A media device that can capture audio.
///
/// See https://developer.apple.com/documentation/webkit/wkmediacapturetype/wkmediacapturetypemicrophone?language=objc.
microphone,
}

// TODO(bparrishMines): Enums need be wrapped in a data class because thay can't
// be used as primitive arguments. See https://github.com/flutter/flutter/issues/87307
class WKMediaCaptureTypeData {
late WKMediaCaptureType value;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not-nullable, but FWFWKMediaCaptureTypeDataFromWKMediaCaptureType would return nil if a new version of iOS added a new enum value that we didn't support yet, so unless I missed a step something would crash if that happened. We need to make the code gracefully handle new OS enum values in some way (e.g., maybe we need an unknown enum value to translate them to, so clients know they are being asked about something not yet supported by the plugin.)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a good suggestion. Other enums could also use this update. I will create an issue to track doing this.

}

/// Mirror of NSURLRequest.
///
/// See https://developer.apple.com/documentation/foundation/nsurlrequest?language=objc.
Expand Down Expand Up @@ -245,6 +297,15 @@ class WKScriptMessageData {
late Object? body;
}

/// Mirror of WKSecurityOrigin.
///
/// See https://developer.apple.com/documentation/webkit/wksecurityorigin?language=objc.
class WKSecurityOriginData {
late String host;
late int port;
late String protocol;
}

/// Mirror of NSHttpCookieData.
///
/// See https://developer.apple.com/documentation/foundation/nshttpcookie?language=objc.
Expand Down Expand Up @@ -629,6 +690,19 @@ abstract class WKUIDelegateFlutterApi {
int configurationIdentifier,
WKNavigationActionData navigationAction,
);

/// Callback to Dart function `WKUIDelegate.requestMediaCapturePermission`.
@ObjCSelector(
'requestMediaCapturePermissionForDelegateWithIdentifier:webViewIdentifier:origin:frame:type:',
)
@async
WKPermissionDecisionData requestMediaCapturePermission(
int identifier,
int webViewIdentifier,
WKSecurityOriginData origin,
WKFrameInfoData frame,
WKMediaCaptureTypeData type,
);
}

/// Mirror of WKHttpCookieStore.
Expand Down
16 changes: 16 additions & 0 deletions packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,27 @@ flutter:
dependencies:
flutter:
sdk: flutter
simple_ast:
git:
url: [email protected]:bparrishMines/penguin.git
path: packages/simple_ast
path: ^1.8.0
webview_flutter_platform_interface: ^2.0.0

dev_dependencies:
build_runner: ^2.1.5
code_template_processor:
git:
url: [email protected]:bparrishMines/penguin.git
path: packages/code_template_processor
gen_api_impls:
git:
url: [email protected]:bparrishMines/penguin.git
path: packages/gen_api_impls
simple_ast_generator:
git:
url: [email protected]:bparrishMines/penguin.git
path: packages/simple_ast_generator
flutter_driver:
sdk: flutter
flutter_test:
Expand Down
Loading