From 6f5976521fb289e1fb5d36a8fe40b938bd288425 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 28 Jun 2023 15:53:24 -0400 Subject: [PATCH 1/7] add some fixes --- .../webview_flutter_wkwebview/CHANGELOG.md | 6 ++++++ .../ios/RunnerTests/FWFInstanceManagerTests.m | 16 ++++++++++++++++ .../ios/RunnerTests/FWFWebViewHostApiTests.m | 2 ++ .../ios/Classes/FWFInstanceManager.m | 14 +++++++++++--- .../ios/Classes/FWFWebViewHostApi.m | 2 ++ .../webview_flutter_wkwebview/pubspec.yaml | 2 +- 6 files changed, 38 insertions(+), 4 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md index 2f5fca2be758..c9a57bb2a4d2 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 an native `NSURL` could be removed from an `InstanceManager` if 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..f53a6f11c5a5 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] initWithDeallocCallback:nil]; + + 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..3c64bb2f45e8 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,6 +465,7 @@ - (void)testContentInsetsSumAlwaysZeroAfterSetFrame { XCTAssertTrue(CGRectEqualToRect(webView.frame, CGRectMake(0, 0, 300, 100))); } +#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 164000 - (void)testSetInspectable API_AVAILABLE(ios(16.4), macos(13.3), tvos(16.4)) { FWFWebView *mockWebView = OCMClassMock([FWFWebView class]); @@ -480,4 +481,5 @@ - (void)testSetInspectable API_AVAILABLE(ios(16.4), macos(13.3), tvos(16.4)) { OCMVerify([mockWebView setInspectable:YES]); XCTAssertNil(error); } +#endif @end 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..13b6c4c6be4b 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 __IPHONE_OS_VERSION_MIN_REQUIRED >= 164000 [[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 f0c1b59e251f..7fa06ed0dde9 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" From f8a88794f6ed665cbe3ef235c8d7add8d30b4141 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 28 Jun 2023 16:19:55 -0400 Subject: [PATCH 2/7] fix versions --- .../example/ios/RunnerTests/FWFWebViewHostApiTests.m | 3 ++- .../webview_flutter_wkwebview/ios/Classes/FWFWebViewHostApi.m | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) 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 3c64bb2f45e8..46013730b44c 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,8 @@ - (void)testContentInsetsSumAlwaysZeroAfterSetFrame { XCTAssertTrue(CGRectEqualToRect(webView.frame, CGRectMake(0, 0, 300, 100))); } -#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 164000 +#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 130300 || __IPHONE_OS_VERSION_MAX_ALLOWED >= 160400 || \ + __TV_OS_VERSION_MAX_ALLOWED >= 160400 - (void)testSetInspectable API_AVAILABLE(ios(16.4), macos(13.3), tvos(16.4)) { FWFWebView *mockWebView = OCMClassMock([FWFWebView class]); 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 13b6c4c6be4b..4caa21dc1a64 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,8 @@ - (void)setInspectableForWebViewWithIdentifier:(NSNumber *)identifier inspectable:(NSNumber *)inspectable error:(FlutterError *_Nullable *_Nonnull)error { if (@available(macOS 13.3, iOS 16.4, tvOS 16.4, *)) { -#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 164000 +#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 130300 || __IPHONE_OS_VERSION_MAX_ALLOWED >= 160400 || \ + __TV_OS_VERSION_MAX_ALLOWED >= 160400 [[self webViewForIdentifier:identifier] setInspectable:inspectable.boolValue]; #endif } else { From ad5691946201398e2f4769edf48433d8fa3bd72d Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 28 Jun 2023 16:21:32 -0400 Subject: [PATCH 3/7] fix changelog --- packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md index c9a57bb2a4d2..29b791deb3b8 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md @@ -1,6 +1,6 @@ ## 3.6.1 -* Fixes bug where an native `NSURL` could be removed from an `InstanceManager` if is equal to an +* 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. From 2b003b372f31cf834532e273f7ef0900bb8866fe Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 28 Jun 2023 16:41:40 -0400 Subject: [PATCH 4/7] maybe version bump will fix? --- .../example/ios/Runner.xcodeproj/project.pbxproj | 2 +- .../ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/Runner.xcodeproj/project.pbxproj b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/Runner.xcodeproj/project.pbxproj index 19e2b39a5c12..e6586e969666 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/Runner.xcodeproj/project.pbxproj @@ -315,7 +315,7 @@ isa = PBXProject; attributes = { DefaultBuildSystemTypeForWorkspace = Original; - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = "The Flutter Authors"; TargetAttributes = { 68BDCAE823C3F7CB00D9C032 = { diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index cb713d767632..cf07c46df2ed 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ Date: Wed, 28 Jun 2023 16:46:22 -0400 Subject: [PATCH 5/7] set min ios version to 11 --- .../webview_flutter_wkwebview/example/ios/Podfile | 2 +- .../example/ios/Runner.xcodeproj/project.pbxproj | 2 +- .../ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/Podfile b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/Podfile index d01e899e347b..e88de0e69900 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/Podfile +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '11.0' +platform :ios, '11.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/Runner.xcodeproj/project.pbxproj b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/Runner.xcodeproj/project.pbxproj index e6586e969666..19e2b39a5c12 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/Runner.xcodeproj/project.pbxproj @@ -315,7 +315,7 @@ isa = PBXProject; attributes = { DefaultBuildSystemTypeForWorkspace = Original; - LastUpgradeCheck = 1430; + LastUpgradeCheck = 1300; ORGANIZATIONNAME = "The Flutter Authors"; TargetAttributes = { 68BDCAE823C3F7CB00D9C032 = { diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index cf07c46df2ed..cb713d767632 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ Date: Thu, 29 Jun 2023 13:10:48 -0400 Subject: [PATCH 6/7] dont check tvos and dont guard test --- .../example/ios/RunnerTests/FWFWebViewHostApiTests.m | 5 +---- .../ios/Classes/FWFWebViewHostApi.m | 3 +-- 2 files changed, 2 insertions(+), 6 deletions(-) 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 46013730b44c..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,9 +465,7 @@ - (void)testContentInsetsSumAlwaysZeroAfterSetFrame { XCTAssertTrue(CGRectEqualToRect(webView.frame, CGRectMake(0, 0, 300, 100))); } -#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 130300 || __IPHONE_OS_VERSION_MAX_ALLOWED >= 160400 || \ - __TV_OS_VERSION_MAX_ALLOWED >= 160400 -- (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]; @@ -482,5 +480,4 @@ - (void)testSetInspectable API_AVAILABLE(ios(16.4), macos(13.3), tvos(16.4)) { OCMVerify([mockWebView setInspectable:YES]); XCTAssertNil(error); } -#endif @end 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 4caa21dc1a64..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,8 +201,7 @@ - (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 || \ - __TV_OS_VERSION_MAX_ALLOWED >= 160400 +#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 130300 || __IPHONE_OS_VERSION_MAX_ALLOWED >= 160400 [[self webViewForIdentifier:identifier] setInspectable:inspectable.boolValue]; #endif } else { From 2a91b997d591eda26488ee5739bc32aa67bfc0f4 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Thu, 29 Jun 2023 13:29:30 -0400 Subject: [PATCH 7/7] fix error --- .../webview_flutter_wkwebview/example/ios/Podfile | 2 +- .../example/ios/RunnerTests/FWFInstanceManagerTests.m | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/Podfile b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/Podfile index e88de0e69900..d01e899e347b 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/Podfile +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -platform :ios, '11.0' +# platform :ios, '11.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' 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 f53a6f11c5a5..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 @@ -54,7 +54,7 @@ - (void)testDeallocCallbackIsIgnoredIfNull { } - (void)testObjectsAreStoredWithPointerHashcode { - FWFInstanceManager *instanceManager = [[FWFInstanceManager alloc] initWithDeallocCallback:nil]; + FWFInstanceManager *instanceManager = [[FWFInstanceManager alloc] init]; NSURL *url1 = [NSURL URLWithString:@"https://www.flutter.dev"]; NSURL *url2 = [NSURL URLWithString:@"https://www.flutter.dev"];