Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.

Commit ec8a69b

Browse files
[webview_flutter_wkwebview] Prevents NSObject.removeObserver from being called without calling addObserver first (#5975)
1 parent 95a1f2c commit ec8a69b

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

packages/webview_flutter/webview_flutter_wkwebview/lib/src/web_kit_webview_widget.dart

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ class WebKitWebViewPlatformController extends WebViewPlatformController {
9393

9494
bool _zoomEnabled = true;
9595
bool _hasNavigationDelegate = false;
96+
bool _progressObserverSet = false;
9697

9798
final Map<String, WKScriptMessageHandler> _scriptMessageHandlers =
9899
<String, WKScriptMessageHandler>{};
@@ -455,17 +456,20 @@ class WebKitWebViewPlatformController extends WebViewPlatformController {
455456
await _resetUserScripts(removedJavaScriptChannels: javascriptChannelNames);
456457
}
457458

458-
Future<void> _setHasProgressTracking(bool hasProgressTracking) {
459+
Future<void> _setHasProgressTracking(bool hasProgressTracking) async {
459460
if (hasProgressTracking) {
460-
return webView.addObserver(
461+
_progressObserverSet = true;
462+
await webView.addObserver(
461463
webView,
462464
keyPath: 'estimatedProgress',
463465
options: <NSKeyValueObservingOptions>{
464466
NSKeyValueObservingOptions.newValue,
465467
},
466468
);
467-
} else {
468-
return webView.removeObserver(webView, keyPath: 'estimatedProgress');
469+
} else if (_progressObserverSet) {
470+
// Calls to removeObserver before addObserver causes a crash.
471+
_progressObserverSet = false;
472+
await webView.removeObserver(webView, keyPath: 'estimatedProgress');
469473
}
470474
}
471475

packages/webview_flutter/webview_flutter_wkwebview/test/src/web_kit_webview_widget_test.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1195,6 +1195,16 @@ void main() {
11951195

11961196
verify(mockCallbacksHandler.onProgress(32));
11971197
});
1198+
1199+
testWidgets('progress observer is not removed without being set first',
1200+
(WidgetTester tester) async {
1201+
await buildWidget(tester, hasProgressTracking: false);
1202+
1203+
verifyNever(mockWebView.removeObserver(
1204+
mockWebView,
1205+
keyPath: 'estimatedProgress',
1206+
));
1207+
});
11981208
});
11991209

12001210
group('JavascriptChannelRegistry', () {

0 commit comments

Comments
 (0)