@@ -17,14 +17,54 @@ import '../../foundation/foundation.dart';
1717import '../../web_kit/web_kit.dart' ;
1818import 'webkit_proxy.dart' ;
1919
20+ /// Media types that can require a user gesture to begin playing.
21+ ///
22+ /// See [WebKitWebViewControllerCreationParams.mediaTypesRequiringUserAction] .
23+ enum PlaybackMediaTypes {
24+ /// A media type that contains audio.
25+ audio,
26+
27+ /// A media type that contains video.
28+ video;
29+
30+ WKAudiovisualMediaType _toWKAudiovisualMediaType () {
31+ switch (this ) {
32+ case PlaybackMediaTypes .audio:
33+ return WKAudiovisualMediaType .audio;
34+ case PlaybackMediaTypes .video:
35+ return WKAudiovisualMediaType .video;
36+ }
37+ }
38+ }
39+
2040/// Object specifying creation parameters for a [WebKitWebViewController] .
2141@immutable
2242class WebKitWebViewControllerCreationParams
2343 extends PlatformWebViewControllerCreationParams {
2444 /// Constructs a [WebKitWebViewControllerCreationParams] .
2545 WebKitWebViewControllerCreationParams ({
2646 @visibleForTesting this .webKitProxy = const WebKitProxy (),
27- }) : _configuration = webKitProxy.createWebViewConfiguration ();
47+ this .mediaTypesRequiringUserAction = const < PlaybackMediaTypes > {
48+ PlaybackMediaTypes .audio,
49+ PlaybackMediaTypes .video,
50+ },
51+ this .allowsInlineMediaPlayback = false ,
52+ }) : _configuration = webKitProxy.createWebViewConfiguration () {
53+ if (mediaTypesRequiringUserAction.isEmpty) {
54+ _configuration.setMediaTypesRequiringUserActionForPlayback (
55+ < WKAudiovisualMediaType > {WKAudiovisualMediaType .none},
56+ );
57+ } else {
58+ _configuration.setMediaTypesRequiringUserActionForPlayback (
59+ mediaTypesRequiringUserAction
60+ .map <WKAudiovisualMediaType >(
61+ (PlaybackMediaTypes type) => type._toWKAudiovisualMediaType (),
62+ )
63+ .toSet (),
64+ );
65+ }
66+ _configuration.setAllowsInlineMediaPlayback (allowsInlineMediaPlayback);
67+ }
2868
2969 /// Constructs a [WebKitWebViewControllerCreationParams] using a
3070 /// [PlatformWebViewControllerCreationParams] .
@@ -33,10 +73,31 @@ class WebKitWebViewControllerCreationParams
3373 // ignore: avoid_unused_constructor_parameters
3474 PlatformWebViewControllerCreationParams params, {
3575 @visibleForTesting WebKitProxy webKitProxy = const WebKitProxy (),
36- }) : this (webKitProxy: webKitProxy);
76+ Set <PlaybackMediaTypes > mediaTypesRequiringUserAction =
77+ const < PlaybackMediaTypes > {
78+ PlaybackMediaTypes .audio,
79+ PlaybackMediaTypes .video,
80+ },
81+ bool allowsInlineMediaPlayback = false ,
82+ }) : this (
83+ webKitProxy: webKitProxy,
84+ mediaTypesRequiringUserAction: mediaTypesRequiringUserAction,
85+ allowsInlineMediaPlayback: allowsInlineMediaPlayback,
86+ );
3787
3888 final WKWebViewConfiguration _configuration;
3989
90+ /// Media types that require a user gesture to begin playing.
91+ ///
92+ /// Defaults to include [PlaybackMediaTypes.audio] and
93+ /// [PlaybackMediaTypes.video] .
94+ final Set <PlaybackMediaTypes > mediaTypesRequiringUserAction;
95+
96+ /// Whether inline playback of HTML5 videos is allowed.
97+ ///
98+ /// Defaults to false.
99+ final bool allowsInlineMediaPlayback;
100+
40101 /// Handles constructing objects and calling static methods for the WebKit
41102 /// native library.
42103 @visibleForTesting
@@ -226,11 +287,6 @@ class WebKitWebViewController extends PlatformWebViewController {
226287 return result.toString ();
227288 }
228289
229- /// Controls whether inline playback of HTML5 videos is allowed.
230- Future <void > setAllowsInlineMediaPlayback (bool allow) {
231- return _webView.configuration.setAllowsInlineMediaPlayback (allow);
232- }
233-
234290 @override
235291 Future <String ?> getTitle () => _webView.getTitle ();
236292
0 commit comments