diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md index 566f23fb67b..69c700f5228 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md @@ -1,3 +1,8 @@ +## 3.5.0 + +* Adds support to limit navigation to pages within the app’s domain. See + `WebKitWebViewControllerCreationParams.limitsNavigationsToAppBoundDomains`. + ## 3.4.4 * Removes obsolete null checks on non-nullable values. diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FWFWebViewConfigurationHostApiTests.m b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FWFWebViewConfigurationHostApiTests.m index 2ec74d0522d..98be6dfe9e2 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FWFWebViewConfigurationHostApiTests.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FWFWebViewConfigurationHostApiTests.m @@ -62,6 +62,24 @@ - (void)testSetAllowsInlineMediaPlayback { XCTAssertNil(error); } +- (void)testSetLimitsNavigationsToAppBoundDomains API_AVAILABLE(ios(14.0)) { + WKWebViewConfiguration *mockWebViewConfiguration = OCMClassMock([WKWebViewConfiguration class]); + + FWFInstanceManager *instanceManager = [[FWFInstanceManager alloc] init]; + [instanceManager addDartCreatedInstance:mockWebViewConfiguration withIdentifier:0]; + + FWFWebViewConfigurationHostApiImpl *hostAPI = [[FWFWebViewConfigurationHostApiImpl alloc] + initWithBinaryMessenger:OCMProtocolMock(@protocol(FlutterBinaryMessenger)) + instanceManager:instanceManager]; + + FlutterError *error; + [hostAPI setLimitsNavigationsToAppBoundDomainsForConfigurationWithIdentifier:@0 + isLimited:@NO + error:&error]; + OCMVerify([mockWebViewConfiguration setLimitsNavigationsToAppBoundDomains:NO]); + XCTAssertNil(error); +} + - (void)testSetMediaTypesRequiringUserActionForPlayback { WKWebViewConfiguration *mockWebViewConfiguration = OCMClassMock([WKWebViewConfiguration class]); diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.h b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.h index 45b1e42a355..24b6346e14e 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.h +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.h @@ -1,7 +1,7 @@ // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Autogenerated from Pigeon (v9.2.4), do not edit directly. +// Autogenerated from Pigeon (v9.2.5), do not edit directly. // See also: https://pub.dev/packages/pigeon #import @@ -480,6 +480,10 @@ NSObject *FWFWKWebViewConfigurationHostApiGetCodec(void); error: (FlutterError *_Nullable *_Nonnull) error; +- (void)setLimitsNavigationsToAppBoundDomainsForConfigurationWithIdentifier:(NSNumber *)identifier + isLimited:(NSNumber *)limit + error:(FlutterError *_Nullable + *_Nonnull)error; - (void) setMediaTypesRequiresUserActionForConfigurationWithIdentifier:(NSNumber *)identifier forTypes: diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.m index 3a5dff6a5d5..fc28c28cc55 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFGeneratedWebKitApis.m @@ -1,7 +1,7 @@ // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Autogenerated from Pigeon (v9.2.4), do not edit directly. +// Autogenerated from Pigeon (v9.2.5), do not edit directly. // See also: https://pub.dev/packages/pigeon #import "FWFGeneratedWebKitApis.h" @@ -1002,6 +1002,34 @@ void FWFWKWebViewConfigurationHostApiSetup(id binaryMess [channel setMessageHandler:nil]; } } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:@"dev.flutter.pigeon.WKWebViewConfigurationHostApi." + @"setLimitsNavigationsToAppBoundDomains" + binaryMessenger:binaryMessenger + codec:FWFWKWebViewConfigurationHostApiGetCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector + (setLimitsNavigationsToAppBoundDomainsForConfigurationWithIdentifier: + isLimited:error:)], + @"FWFWKWebViewConfigurationHostApi api (%@) doesn't respond to " + @"@selector(setLimitsNavigationsToAppBoundDomainsForConfigurationWithIdentifier:" + @"isLimited:error:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + NSArray *args = message; + NSNumber *arg_identifier = GetNullableObjectAtIndex(args, 0); + NSNumber *arg_limit = GetNullableObjectAtIndex(args, 1); + FlutterError *error; + [api setLimitsNavigationsToAppBoundDomainsForConfigurationWithIdentifier:arg_identifier + isLimited:arg_limit + error:&error]; + callback(wrapResult(nil, error)); + }]; + } else { + [channel setMessageHandler:nil]; + } + } { FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] initWithName:@"dev.flutter.pigeon.WKWebViewConfigurationHostApi." diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFWebViewConfigurationHostApi.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFWebViewConfigurationHostApi.m index 987d3f45ff2..762c07b5abe 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFWebViewConfigurationHostApi.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFWebViewConfigurationHostApi.m @@ -104,6 +104,23 @@ - (void)setAllowsInlineMediaPlaybackForConfigurationWithIdentifier:(nonnull NSNu setAllowsInlineMediaPlayback:allow.boolValue]; } +- (void)setLimitsNavigationsToAppBoundDomainsForConfigurationWithIdentifier: + (nonnull NSNumber *)identifier + isLimited: + (nonnull NSNumber *)limit + error:(FlutterError *_Nullable + *_Nonnull)error { + if (@available(iOS 14, *)) { + [[self webViewConfigurationForIdentifier:identifier] + setLimitsNavigationsToAppBoundDomains:limit.boolValue]; + } else { + *error = [FlutterError + errorWithCode:@"FWFUnsupportedVersionError" + message:@"setLimitsNavigationsToAppBoundDomains is only supported on versions 14+." + details:nil]; + } +} + - (void) setMediaTypesRequiresUserActionForConfigurationWithIdentifier:(nonnull NSNumber *)identifier forTypes: diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/web_kit.g.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/web_kit.g.dart index 2ce5055d056..0f3547a5a44 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/web_kit.g.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/common/web_kit.g.dart @@ -1,7 +1,7 @@ // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Autogenerated from Pigeon (v9.2.4), do not edit directly. +// Autogenerated from Pigeon (v9.2.5), do not edit directly. // See also: https://pub.dev/packages/pigeon // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import @@ -1067,6 +1067,30 @@ class WKWebViewConfigurationHostApi { } } + Future setLimitsNavigationsToAppBoundDomains( + int arg_identifier, bool arg_limit) async { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WKWebViewConfigurationHostApi.setLimitsNavigationsToAppBoundDomains', + codec, + binaryMessenger: _binaryMessenger); + final List? replyList = await channel + .send([arg_identifier, arg_limit]) as List?; + if (replyList == null) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel.', + ); + } else if (replyList.length > 1) { + throw PlatformException( + code: replyList[0]! as String, + message: replyList[1] as String?, + details: replyList[2], + ); + } else { + return; + } + } + Future setMediaTypesRequiringUserActionForPlayback(int arg_identifier, List arg_types) async { final BasicMessageChannel channel = BasicMessageChannel( diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit.dart index 070f554a5d5..31cbbf3e1cd 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit.dart @@ -678,6 +678,20 @@ class WKWebViewConfiguration extends NSObject { ); } + /// Indicates whether the web view limits navigation to pages within the app’s domain. + /// + /// When navigation is limited, Javascript evaluation is unrestricted. + /// See https://webkit.org/blog/10882/app-bound-domains/ + /// + /// Sets [WKWebViewConfiguration.limitsNavigationsToAppBoundDomains](https://developer.apple.com/documentation/webkit/wkwebviewconfiguration/3585117-limitsnavigationstoappbounddomai?language=objc). + Future setLimitsNavigationsToAppBoundDomains(bool limit) { + return _webViewConfigurationApi + .setLimitsNavigationsToAppBoundDomainsForInstances( + this, + limit, + ); + } + /// The media types that require a user gesture to begin playing. /// /// Use [WKAudiovisualMediaType.none] to indicate that no user gestures are diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit_api_impls.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit_api_impls.dart index 07a32aee8d3..daba854763a 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit_api_impls.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit/web_kit_api_impls.dart @@ -629,6 +629,17 @@ class WKWebViewConfigurationHostApiImpl extends WKWebViewConfigurationHostApi { ); } + /// Calls [setLimitsNavigationsToAppBoundDomains] with the ids of the provided object instances. + Future setLimitsNavigationsToAppBoundDomainsForInstances( + WKWebViewConfiguration instance, + bool limit, + ) { + return setLimitsNavigationsToAppBoundDomains( + instanceManager.getIdentifier(instance)!, + limit, + ); + } + /// Calls [setMediaTypesRequiringUserActionForPlayback] with the ids of the provided object instances. Future setMediaTypesRequiringUserActionForPlaybackForInstances( WKWebViewConfiguration instance, diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart index e49d41257e8..b0666e6dd7c 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart @@ -48,6 +48,7 @@ class WebKitWebViewControllerCreationParams PlaybackMediaTypes.video, }, this.allowsInlineMediaPlayback = false, + this.limitsNavigationsToAppBoundDomains = false, @visibleForTesting InstanceManager? instanceManager, }) : _instanceManager = instanceManager ?? NSObject.globalInstanceManager { _configuration = webKitProxy.createWebViewConfiguration( @@ -68,6 +69,8 @@ class WebKitWebViewControllerCreationParams ); } _configuration.setAllowsInlineMediaPlayback(allowsInlineMediaPlayback); + _configuration.setLimitsNavigationsToAppBoundDomains( + limitsNavigationsToAppBoundDomains); } /// Constructs a [WebKitWebViewControllerCreationParams] using a @@ -83,11 +86,14 @@ class WebKitWebViewControllerCreationParams PlaybackMediaTypes.video, }, bool allowsInlineMediaPlayback = false, + bool limitsNavigationsToAppBoundDomains = false, @visibleForTesting InstanceManager? instanceManager, }) : this( webKitProxy: webKitProxy, mediaTypesRequiringUserAction: mediaTypesRequiringUserAction, allowsInlineMediaPlayback: allowsInlineMediaPlayback, + limitsNavigationsToAppBoundDomains: + limitsNavigationsToAppBoundDomains, instanceManager: instanceManager, ); @@ -104,6 +110,13 @@ class WebKitWebViewControllerCreationParams /// Defaults to false. final bool allowsInlineMediaPlayback; + /// Whether to limit navigation to configured domains. + /// + /// See https://webkit.org/blog/10882/app-bound-domains/ + /// (Only available for iOS > 14.0) + /// Defaults to false. + final bool limitsNavigationsToAppBoundDomains; + /// Handles constructing objects and calling static methods for the WebKit /// native library. @visibleForTesting diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pigeons/web_kit.dart b/packages/webview_flutter/webview_flutter_wkwebview/pigeons/web_kit.dart index 20d4ee41f4f..ac13958089c 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/pigeons/web_kit.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/pigeons/web_kit.dart @@ -416,6 +416,11 @@ abstract class WKWebViewConfigurationHostApi { ) void setAllowsInlineMediaPlayback(int identifier, bool allow); + @ObjCSelector( + 'setLimitsNavigationsToAppBoundDomainsForConfigurationWithIdentifier:isLimited:', + ) + void setLimitsNavigationsToAppBoundDomains(int identifier, bool limit); + @ObjCSelector( 'setMediaTypesRequiresUserActionForConfigurationWithIdentifier:forTypes:', ) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml index db7407ba56f..9056fd9ecae 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml @@ -2,7 +2,7 @@ name: webview_flutter_wkwebview description: A Flutter plugin that provides a WebView widget based on Apple's WKWebView control. repository: https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter_wkwebview issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22 -version: 3.4.4 +version: 3.5.0 environment: sdk: ">=2.18.0 <4.0.0" diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/src/common/test_web_kit.g.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/src/common/test_web_kit.g.dart index ff09d4401ee..faf01239918 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/src/common/test_web_kit.g.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/src/common/test_web_kit.g.dart @@ -1,7 +1,7 @@ // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Autogenerated from Pigeon (v9.2.4), do not edit directly. +// Autogenerated from Pigeon (v9.2.5), do not edit directly. // See also: https://pub.dev/packages/pigeon // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, unnecessary_import // ignore_for_file: avoid_relative_lib_imports @@ -369,6 +369,8 @@ abstract class TestWKWebViewConfigurationHostApi { void setAllowsInlineMediaPlayback(int identifier, bool allow); + void setLimitsNavigationsToAppBoundDomains(int identifier, bool limit); + void setMediaTypesRequiringUserActionForPlayback( int identifier, List types); @@ -448,6 +450,33 @@ abstract class TestWKWebViewConfigurationHostApi { }); } } + { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.WKWebViewConfigurationHostApi.setLimitsNavigationsToAppBoundDomains', + codec, + binaryMessenger: binaryMessenger); + if (api == null) { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, null); + } else { + _testBinaryMessengerBinding!.defaultBinaryMessenger + .setMockDecodedMessageHandler(channel, + (Object? message) async { + assert(message != null, + 'Argument for dev.flutter.pigeon.WKWebViewConfigurationHostApi.setLimitsNavigationsToAppBoundDomains was null.'); + final List args = (message as List?)!; + final int? arg_identifier = (args[0] as int?); + assert(arg_identifier != null, + 'Argument for dev.flutter.pigeon.WKWebViewConfigurationHostApi.setLimitsNavigationsToAppBoundDomains was null, expected non-null int.'); + final bool? arg_limit = (args[1] as bool?); + assert(arg_limit != null, + 'Argument for dev.flutter.pigeon.WKWebViewConfigurationHostApi.setLimitsNavigationsToAppBoundDomains was null, expected non-null bool.'); + api.setLimitsNavigationsToAppBoundDomains( + arg_identifier!, arg_limit!); + return []; + }); + } + } { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.WKWebViewConfigurationHostApi.setMediaTypesRequiringUserActionForPlayback', diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/src/ui_kit/ui_kit_test.mocks.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/src/ui_kit/ui_kit_test.mocks.dart index 355d69e7dc9..8a9cc199885 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/src/ui_kit/ui_kit_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/src/ui_kit/ui_kit_test.mocks.dart @@ -69,6 +69,21 @@ class MockTestWKWebViewConfigurationHostApi extends _i1.Mock returnValueForMissingStub: null, ); @override + void setLimitsNavigationsToAppBoundDomains( + int? identifier, + bool? limit, + ) => + super.noSuchMethod( + Invocation.method( + #setLimitsNavigationsToAppBoundDomains, + [ + identifier, + limit, + ], + ), + returnValueForMissingStub: null, + ); + @override void setMediaTypesRequiringUserActionForPlayback( int? identifier, List<_i3.WKAudiovisualMediaTypeEnumData?>? types, diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.dart index e2d53bc9fec..ac266ff79eb 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.dart @@ -441,6 +441,14 @@ void main() { )); }); + test('limitsNavigationsToAppBoundDomains', () { + webViewConfiguration.setLimitsNavigationsToAppBoundDomains(true); + verify(mockPlatformHostApi.setLimitsNavigationsToAppBoundDomains( + instanceManager.getIdentifier(webViewConfiguration), + true, + )); + }); + test('mediaTypesRequiringUserActionForPlayback', () { webViewConfiguration.setMediaTypesRequiringUserActionForPlayback( { diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.mocks.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.mocks.dart index 601964044de..0291867aaf1 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit/web_kit_test.mocks.dart @@ -298,6 +298,21 @@ class MockTestWKWebViewConfigurationHostApi extends _i1.Mock returnValueForMissingStub: null, ); @override + void setLimitsNavigationsToAppBoundDomains( + int? identifier, + bool? limit, + ) => + super.noSuchMethod( + Invocation.method( + #setLimitsNavigationsToAppBoundDomains, + [ + identifier, + limit, + ], + ), + returnValueForMissingStub: null, + ); + @override void setMediaTypesRequiringUserActionForPlayback( int? identifier, List<_i4.WKAudiovisualMediaTypeEnumData?>? types, diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart index 7e61d36ec7a..4e56c21dea8 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.dart @@ -140,6 +140,24 @@ void main() { ); }); + test('limitsNavigationsToAppBoundDomains', () { + final MockWKWebViewConfiguration mockConfiguration = + MockWKWebViewConfiguration(); + + WebKitWebViewControllerCreationParams( + webKitProxy: WebKitProxy( + createWebViewConfiguration: ({InstanceManager? instanceManager}) { + return mockConfiguration; + }, + ), + limitsNavigationsToAppBoundDomains: true, + ); + + verify( + mockConfiguration.setLimitsNavigationsToAppBoundDomains(true), + ); + }); + test('mediaTypesRequiringUserAction', () { final MockWKWebViewConfiguration mockConfiguration = MockWKWebViewConfiguration(); diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.mocks.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.mocks.dart index 9eb03971e82..de787a1e5e2 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_controller_test.mocks.dart @@ -848,6 +848,16 @@ class MockWKWebViewConfiguration extends _i1.Mock returnValueForMissingStub: _i6.Future.value(), ) as _i6.Future); @override + _i6.Future setLimitsNavigationsToAppBoundDomains(bool? limit) => + (super.noSuchMethod( + Invocation.method( + #setLimitsNavigationsToAppBoundDomains, + [limit], + ), + returnValue: _i6.Future.value(), + returnValueForMissingStub: _i6.Future.value(), + ) as _i6.Future); + @override _i6.Future setMediaTypesRequiringUserActionForPlayback( Set<_i5.WKAudiovisualMediaType>? types) => (super.noSuchMethod( diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_widget_test.mocks.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_widget_test.mocks.dart index fe86de77af0..b171e28a3bf 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_widget_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_webview_widget_test.mocks.dart @@ -176,6 +176,16 @@ class MockWKWebViewConfiguration extends _i1.Mock returnValueForMissingStub: _i3.Future.value(), ) as _i3.Future); @override + _i3.Future setLimitsNavigationsToAppBoundDomains(bool? limit) => + (super.noSuchMethod( + Invocation.method( + #setLimitsNavigationsToAppBoundDomains, + [limit], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + @override _i3.Future setMediaTypesRequiringUserActionForPlayback( Set<_i2.WKAudiovisualMediaType>? types) => (super.noSuchMethod(