diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md index 2f5fca2be758..29b791deb3b8 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md @@ -1,3 +1,9 @@ +## 3.6.1 + +* Fixes bug where a native `NSURL` could be removed from an `InstanceManager` if it is equal to an + already present `NSURL`. +* Fixes compile-time error from using `WKWebView.inspectable` on unsupported Xcode versions. + ## 3.6.0 * Adds support to enable debugging of web contents on the latest versions of WebKit. See diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FWFInstanceManagerTests.m b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FWFInstanceManagerTests.m index c893ab51ef42..34ceb613f6f8 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FWFInstanceManagerTests.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FWFInstanceManagerTests.m @@ -52,4 +52,20 @@ - (void)testDeallocCallbackIsIgnoredIfNull { // Tests that this doesn't cause a EXC_BAD_ACCESS crash. [instanceManager removeInstanceWithIdentifier:0]; } + +- (void)testObjectsAreStoredWithPointerHashcode { + FWFInstanceManager *instanceManager = [[FWFInstanceManager alloc] init]; + + NSURL *url1 = [NSURL URLWithString:@"https://www.flutter.dev"]; + NSURL *url2 = [NSURL URLWithString:@"https://www.flutter.dev"]; + + // Ensure urls are considered equal. + XCTAssertTrue([url1 isEqual:url2]); + + [instanceManager addHostCreatedInstance:url1]; + [instanceManager addHostCreatedInstance:url2]; + + XCTAssertNotEqual([instanceManager identifierWithStrongReferenceForInstance:url1], + [instanceManager identifierWithStrongReferenceForInstance:url2]); +} @end diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FWFWebViewHostApiTests.m b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FWFWebViewHostApiTests.m index 29751d87a555..248f947a846f 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FWFWebViewHostApiTests.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FWFWebViewHostApiTests.m @@ -465,7 +465,7 @@ - (void)testContentInsetsSumAlwaysZeroAfterSetFrame { XCTAssertTrue(CGRectEqualToRect(webView.frame, CGRectMake(0, 0, 300, 100))); } -- (void)testSetInspectable API_AVAILABLE(ios(16.4), macos(13.3), tvos(16.4)) { +- (void)testSetInspectable API_AVAILABLE(ios(16.4), macos(13.3)) { FWFWebView *mockWebView = OCMClassMock([FWFWebView class]); FWFInstanceManager *instanceManager = [[FWFInstanceManager alloc] init]; diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFInstanceManager.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFInstanceManager.m index e87a4037bd04..242a5f707348 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFInstanceManager.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFInstanceManager.m @@ -67,9 +67,17 @@ - (instancetype)init { _deallocCallback = _deallocCallback ? _deallocCallback : ^(long identifier) { }; _lockQueue = dispatch_queue_create("FWFInstanceManager", DISPATCH_QUEUE_SERIAL); - _identifiers = [NSMapTable weakToStrongObjectsMapTable]; - _weakInstances = [NSMapTable strongToWeakObjectsMapTable]; - _strongInstances = [NSMapTable strongToStrongObjectsMapTable]; + // Pointer equality is used to prevent collisions of objects that override the `isEqualTo:` + // method. + _identifiers = + [NSMapTable mapTableWithKeyOptions:NSMapTableWeakMemory | NSMapTableObjectPointerPersonality + valueOptions:NSMapTableStrongMemory]; + _weakInstances = [NSMapTable + mapTableWithKeyOptions:NSMapTableStrongMemory + valueOptions:NSMapTableWeakMemory | NSMapTableObjectPointerPersonality]; + _strongInstances = [NSMapTable + mapTableWithKeyOptions:NSMapTableStrongMemory + valueOptions:NSMapTableStrongMemory | NSMapTableObjectPointerPersonality]; _nextIdentifier = FWFMinHostCreatedIdentifier; } return self; diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFWebViewHostApi.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFWebViewHostApi.m index b6914d66f6dc..924b9bba4bca 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFWebViewHostApi.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFWebViewHostApi.m @@ -201,7 +201,9 @@ - (void)setInspectableForWebViewWithIdentifier:(NSNumber *)identifier inspectable:(NSNumber *)inspectable error:(FlutterError *_Nullable *_Nonnull)error { if (@available(macOS 13.3, iOS 16.4, tvOS 16.4, *)) { +#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 130300 || __IPHONE_OS_VERSION_MAX_ALLOWED >= 160400 [[self webViewForIdentifier:identifier] setInspectable:inspectable.boolValue]; +#endif } else { *error = [FlutterError errorWithCode:@"FWFUnsupportedVersionError" message:@"setInspectable is only supported on versions 16.4+." diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml index 4385f822dc78..2572ecc4f59a 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.6.0 +version: 3.6.1 environment: sdk: ">=2.18.0 <4.0.0"