[webview_flutter] add debuggingEnabled property (#1401)
This property enables webview debugging on Android.
diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md
index 19a0fcd..dff6c4c 100644
--- a/packages/webview_flutter/CHANGELOG.md
+++ b/packages/webview_flutter/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.3.8
+
+* Add `debuggingEnabled` property.
+
## 0.3.7+1
* Fix an issue where JavaScriptChannel messages weren't sent from the platform thread on Android.
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 a9f60ff..a2bed90 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
@@ -202,6 +202,11 @@
webView.setWebViewClient(webViewClient);
break;
+ case "debuggingEnabled":
+ final boolean debuggingEnabled = (boolean) settings.get(key);
+
+ webView.setWebContentsDebuggingEnabled(debuggingEnabled);
+ break;
default:
throw new IllegalArgumentException("Unknown WebView setting: " + key);
}
diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart
index 2f5bffc..1dabba1 100644
--- a/packages/webview_flutter/lib/webview_flutter.dart
+++ b/packages/webview_flutter/lib/webview_flutter.dart
@@ -117,6 +117,7 @@
this.navigationDelegate,
this.gestureRecognizers,
this.onPageFinished,
+ this.debuggingEnabled = false,
}) : assert(javascriptMode != null),
super(key: key);
@@ -205,6 +206,19 @@
/// [WebViewController.evaluateJavascript] can assume this.
final PageFinishedCallback onPageFinished;
+ /// Controls whether WebView debugging is enabled.
+ ///
+ /// Setting this to true enables [WebView debugging on Android](https://developers.google.com/web/tools/chrome-devtools/remote-debugging/).
+ ///
+ /// WebView debugging is enabled by default in dev builds on iOS.
+ ///
+ /// To debug WebViews on iOS:
+ /// - Enable developer options (Open Safari, go to Preferences -> Advanced and make sure "Show Develop Menu in Menubar" is on.)
+ /// - From the Menu-bar (of Safari) select Develop -> iPhone Simulator -> <your webview page>
+ ///
+ /// By default `debuggingEnabled` is false.
+ final bool debuggingEnabled;
+
@override
State<StatefulWidget> createState() => _WebViewState();
}
@@ -324,22 +338,26 @@
_WebSettings({
this.javascriptMode,
this.hasNavigationDelegate,
+ this.debuggingEnabled,
});
static _WebSettings fromWidget(WebView widget) {
return _WebSettings(
javascriptMode: widget.javascriptMode,
hasNavigationDelegate: widget.navigationDelegate != null,
+ debuggingEnabled: widget.debuggingEnabled,
);
}
final JavascriptMode javascriptMode;
final bool hasNavigationDelegate;
+ final bool debuggingEnabled;
Map<String, dynamic> toMap() {
return <String, dynamic>{
'jsMode': javascriptMode.index,
'hasNavigationDelegate': hasNavigationDelegate,
+ 'debuggingEnabled': debuggingEnabled,
};
}
@@ -351,6 +369,11 @@
if (hasNavigationDelegate != newSettings.hasNavigationDelegate) {
updates['hasNavigationDelegate'] = newSettings.hasNavigationDelegate;
}
+
+ if (debuggingEnabled != newSettings.debuggingEnabled) {
+ updates['debuggingEnabled'] = newSettings.debuggingEnabled;
+ }
+
return updates;
}
}
diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml
index 789657a..3d9e9a0 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.7+1
+version: 0.3.8
author: Flutter Team <flutter-dev@googlegroups.com>
homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter
diff --git a/packages/webview_flutter/test/webview_flutter_test.dart b/packages/webview_flutter/test/webview_flutter_test.dart
index 67a5547..699b891 100644
--- a/packages/webview_flutter/test/webview_flutter_test.dart
+++ b/packages/webview_flutter/test/webview_flutter_test.dart
@@ -6,6 +6,7 @@
import 'dart:typed_data';
import 'package:flutter/services.dart';
+import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:webview_flutter/webview_flutter.dart';
@@ -702,6 +703,50 @@
expect(platformWebView.currentUrl, 'https://flutter.dev');
});
});
+
+ group('debuggingEnabled', () {
+ testWidgets('enable debugging', (WidgetTester tester) async {
+ await tester.pumpWidget(const WebView(
+ debuggingEnabled: true,
+ ));
+
+ final FakePlatformWebView platformWebView =
+ fakePlatformViewsController.lastCreatedView;
+
+ expect(platformWebView.debuggingEnabled, true);
+ });
+
+ testWidgets('defaults to false', (WidgetTester tester) async {
+ await tester.pumpWidget(const WebView());
+
+ final FakePlatformWebView platformWebView =
+ fakePlatformViewsController.lastCreatedView;
+
+ expect(platformWebView.debuggingEnabled, false);
+ });
+
+ testWidgets('can be changed', (WidgetTester tester) async {
+ final GlobalKey key = GlobalKey();
+ await tester.pumpWidget(WebView(key: key));
+
+ final FakePlatformWebView platformWebView =
+ fakePlatformViewsController.lastCreatedView;
+
+ await tester.pumpWidget(WebView(
+ key: key,
+ debuggingEnabled: true,
+ ));
+
+ expect(platformWebView.debuggingEnabled, true);
+
+ await tester.pumpWidget(WebView(
+ key: key,
+ debuggingEnabled: false,
+ ));
+
+ expect(platformWebView.debuggingEnabled, false);
+ });
+ });
}
class FakePlatformWebView {
@@ -720,6 +765,8 @@
javascriptMode = JavascriptMode.values[params['settings']['jsMode']];
hasNavigationDelegate =
params['settings']['hasNavigationDelegate'] ?? false;
+ debuggingEnabled = params['settings']['debuggingEnabled'];
+
channel = MethodChannel(
'plugins.flutter.io/webview_$id', const StandardMethodCodec());
channel.setMockMethodCallHandler(onMethodCall);
@@ -737,6 +784,7 @@
List<String> javascriptChannelNames;
bool hasNavigationDelegate;
+ bool debuggingEnabled;
Future<dynamic> onMethodCall(MethodCall call) {
switch (call.method) {
@@ -751,6 +799,9 @@
if (call.arguments['hasNavigationDelegate'] != null) {
hasNavigationDelegate = call.arguments['hasNavigationDelegate'];
}
+ if (call.arguments['debuggingEnabled'] != null) {
+ debuggingEnabled = call.arguments['debuggingEnabled'];
+ }
break;
case 'canGoBack':
return Future<bool>.sync(() => currentPosition > 0);