[webview_flutter] Fix iOS WebView not opening href with target="_blank" (#2500)
Right now, flutter webview on Android will open href's with target="_blank", but iOS will not. This PR fixes this.
diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md
index f87091e..0e6e097 100644
--- a/packages/webview_flutter/CHANGELOG.md
+++ b/packages/webview_flutter/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.3.19+6
+
+* Enable opening links that target the "_blank" window (links open in same window).
+
## 0.3.19+5
* On iOS, always keep contentInsets of the WebView to be 0.
diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java
index 0e5a560..f4bc8c3 100644
--- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java
+++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java
@@ -48,6 +48,7 @@
platformThreadHandler = new Handler(context.getMainLooper());
// Allow local storage.
webView.getSettings().setDomStorageEnabled(true);
+ webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
methodChannel = new MethodChannel(messenger, "plugins.flutter.io/webview_" + id);
methodChannel.setMethodCallHandler(this);
diff --git a/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart b/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart
index 9bb7259..5ce50b8 100644
--- a/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart
+++ b/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart
@@ -245,7 +245,7 @@
textDirection: TextDirection.ltr,
child: WebView(
key: _globalKey,
- initialUrl: 'https://flutter.dev/',
+ initialUrl: 'about:blank',
javascriptMode: JavascriptMode.unrestricted,
userAgent: 'Custom_User_Agent1',
onWebViewCreated: (WebViewController controller) {
@@ -263,7 +263,7 @@
textDirection: TextDirection.ltr,
child: WebView(
key: _globalKey,
- initialUrl: 'https://flutter.dev/',
+ initialUrl: 'about:blank',
javascriptMode: JavascriptMode.unrestricted,
userAgent: 'Custom_User_Agent2',
),
@@ -301,7 +301,7 @@
textDirection: TextDirection.ltr,
child: WebView(
key: _globalKey,
- initialUrl: 'https://flutter.dev/',
+ initialUrl: 'about:blank',
javascriptMode: JavascriptMode.unrestricted,
userAgent: 'Custom_User_Agent',
),
@@ -315,7 +315,7 @@
textDirection: TextDirection.ltr,
child: WebView(
key: _globalKey,
- initialUrl: 'https://flutter.dev/',
+ initialUrl: 'about:blank',
javascriptMode: JavascriptMode.unrestricted,
),
),
@@ -678,6 +678,33 @@
final String currentUrl = await controller.currentUrl();
expect(currentUrl, 'https://flutter.dev/');
});
+
+ testWidgets('target _blank opens in same window',
+ (WidgetTester tester) async {
+ final Completer<WebViewController> controllerCompleter =
+ Completer<WebViewController>();
+ final Completer<void> pageLoaded = Completer<void>();
+ await tester.pumpWidget(
+ Directionality(
+ textDirection: TextDirection.ltr,
+ child: WebView(
+ key: GlobalKey(),
+ onWebViewCreated: (WebViewController controller) {
+ controllerCompleter.complete(controller);
+ },
+ javascriptMode: JavascriptMode.unrestricted,
+ onPageFinished: (String url) {
+ pageLoaded.complete(null);
+ },
+ ),
+ ),
+ );
+ final WebViewController controller = await controllerCompleter.future;
+ await controller.evaluateJavascript('window.open("about:blank", "_blank")');
+ await pageLoaded.future;
+ final String currentUrl = await controller.currentUrl();
+ expect(currentUrl, 'about:blank');
+ });
}
// JavaScript booleans evaluate to different string values on Android and iOS.
diff --git a/packages/webview_flutter/ios/Classes/FlutterWebView.h b/packages/webview_flutter/ios/Classes/FlutterWebView.h
index 6277901..875551d 100644
--- a/packages/webview_flutter/ios/Classes/FlutterWebView.h
+++ b/packages/webview_flutter/ios/Classes/FlutterWebView.h
@@ -7,7 +7,7 @@
NS_ASSUME_NONNULL_BEGIN
-@interface FLTWebViewController : NSObject <FlutterPlatformView>
+@interface FLTWebViewController : NSObject <FlutterPlatformView, WKUIDelegate>
- (instancetype)initWithFrame:(CGRect)frame
viewIdentifier:(int64_t)viewId
diff --git a/packages/webview_flutter/ios/Classes/FlutterWebView.m b/packages/webview_flutter/ios/Classes/FlutterWebView.m
index 20aad2c..5e3456d 100644
--- a/packages/webview_flutter/ios/Classes/FlutterWebView.m
+++ b/packages/webview_flutter/ios/Classes/FlutterWebView.m
@@ -93,6 +93,7 @@
_webView = [[FLTWKWebView alloc] initWithFrame:frame configuration:configuration];
_navigationDelegate = [[FLTWKNavigationDelegate alloc] initWithChannel:_channel];
+ _webView.UIDelegate = self;
_webView.navigationDelegate = _navigationDelegate;
__weak __typeof__(self) weakSelf = self;
[_channel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {
@@ -398,4 +399,17 @@
}
}
+#pragma mark WKUIDelegate
+
+- (WKWebView*)webView:(WKWebView*)webView
+ createWebViewWithConfiguration:(WKWebViewConfiguration*)configuration
+ forNavigationAction:(WKNavigationAction*)navigationAction
+ windowFeatures:(WKWindowFeatures*)windowFeatures {
+ if (!navigationAction.targetFrame.isMainFrame) {
+ [webView loadRequest:navigationAction.request];
+ }
+
+ return nil;
+}
+
@end
diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml
index bbe6107..24a8eed 100644
--- a/packages/webview_flutter/pubspec.yaml
+++ b/packages/webview_flutter/pubspec.yaml
@@ -1,6 +1,6 @@
name: webview_flutter
description: A Flutter plugin that provides a WebView widget on Android and iOS.
-version: 0.3.19+5
+version: 0.3.19+6
homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter
environment: