[webview_flutter_wkwebview] Prevent crash from released deallocCallback (#6131)
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
index 72fab85..5d44502 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
+++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 2.9.2
+
+* Fixes crash when an Objective-C object in `FWFInstanceManager` is released, but the dealloc
+ callback is no longer available.
+
## 2.9.1
* Fixes regression where the behavior for the `UIScrollView` insets were removed.
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 2ad4bd4..c893ab5 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
@@ -39,4 +39,17 @@
XCTAssertEqualObjects([instanceManager removeInstanceWithIdentifier:0], object);
XCTAssertEqual([instanceManager strongInstanceCount], 0);
}
+
+- (void)testDeallocCallbackIsIgnoredIfNull {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnonnull"
+ // This sets deallocCallback to nil to test that uses are null checked.
+ FWFInstanceManager *instanceManager = [[FWFInstanceManager alloc] initWithDeallocCallback:nil];
+#pragma clang diagnostic pop
+
+ [instanceManager addDartCreatedInstance:[[NSObject alloc] init] withIdentifier:0];
+
+ // Tests that this doesn't cause a EXC_BAD_ACCESS crash.
+ [instanceManager removeInstanceWithIdentifier:0];
+}
@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 1fe04a3..e87a403 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFInstanceManager.m
+++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFInstanceManager.m
@@ -40,7 +40,9 @@
}
- (void)dealloc {
- _callback(_identifier);
+ if (_callback) {
+ _callback(_identifier);
+ }
}
@end
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml
index 446f909..c7f5ffb 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml
+++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml
@@ -2,7 +2,7 @@
description: A Flutter plugin that provides a WebView widget based on Apple's WKWebView control.
repository: https://github.com/flutter/plugins/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: 2.9.1
+version: 2.9.2
environment:
sdk: ">=2.17.0 <3.0.0"