[webview_flutter] Update webview platform interface with new methods for running JavaScript. (#4401)
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md
index 93c470c..04641f9 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md
+++ b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.2.0
+
+* Added `runJavascript` and `runJavascriptReturningResult` interface methods to supersede `evaluateJavascript`.
+
## 1.1.0
* Add `zoomEnabled` functionality to `WebSettings`.
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/method_channel/webview_method_channel.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/method_channel/webview_method_channel.dart
index 411cad0..9610038 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/method_channel/webview_method_channel.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/method_channel/webview_method_channel.dart
@@ -123,9 +123,21 @@
}
@override
- Future<String> evaluateJavascript(String javascriptString) {
+ Future<String> evaluateJavascript(String javascript) {
return _channel
- .invokeMethod<String>('evaluateJavascript', javascriptString)
+ .invokeMethod<String>('evaluateJavascript', javascript)
+ .then((result) => result!);
+ }
+
+ @override
+ Future<void> runJavascript(String javascript) async {
+ await _channel.invokeMethod<String>('runJavascript', javascript);
+ }
+
+ @override
+ Future<String> runJavascriptReturningResult(String javascript) {
+ return _channel
+ .invokeMethod<String>('runJavascriptReturningResult', javascript)
.then((result) => result!);
}
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/webview_platform_controller.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/webview_platform_controller.dart
index 319ca7e..b42da43 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/webview_platform_controller.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/webview_platform_controller.dart
@@ -106,12 +106,30 @@
/// Evaluates a JavaScript expression in the context of the current page.
///
/// The Future completes with an error if a JavaScript error occurred, or if the type of the
- /// evaluated expression is not supported(e.g on iOS not all non primitive type can be evaluated).
- Future<String> evaluateJavascript(String javascriptString) {
+ /// evaluated expression is not supported (e.g on iOS not all non-primitive types can be evaluated).
+ Future<String> evaluateJavascript(String javascript) {
throw UnimplementedError(
"WebView evaluateJavascript is not implemented on the current platform");
}
+ /// Runs the given JavaScript in the context of the current page.
+ ///
+ /// The Future completes with an error if a JavaScript error occurred.
+ Future<void> runJavascript(String javascript) {
+ throw UnimplementedError(
+ "WebView runJavascript is not implemented on the current platform");
+ }
+
+ /// Runs the given JavaScript in the context of the current page, and returns the result.
+ ///
+ /// The Future completes with an error if a JavaScript error occurred, or if the
+ /// type the given expression evaluates to is unsupported. Unsupported values include
+ /// certain non-primitive types on iOS, as well as `undefined` or `null` on iOS 14+.
+ Future<String> runJavascriptReturningResult(String javascript) {
+ throw UnimplementedError(
+ "WebView runJavascriptReturningResult is not implemented on the current platform");
+ }
+
/// Adds new JavaScript channels to the set of enabled channels.
///
/// For each value in this list the platform's webview should make sure that a corresponding
@@ -130,7 +148,7 @@
/// Removes JavaScript channel names from the set of enabled channels.
///
- /// This disables channels that were previously enabled by [addJavaScriptChannels] or through
+ /// This disables channels that were previously enabled by [addJavascriptChannels] or through
/// [CreationParams.javascriptChannelNames].
Future<void> removeJavascriptChannels(Set<String> javascriptChannelNames) {
throw UnimplementedError(
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/javascript_channel.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/javascript_channel.dart
index 8b31f5b..f32a418 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/javascript_channel.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/javascript_channel.dart
@@ -4,14 +4,14 @@
import 'javascript_message.dart';
-/// Callback type for handling messages sent from Javascript running in a web view.
+/// Callback type for handling messages sent from JavaScript running in a web view.
typedef void JavascriptMessageHandler(JavascriptMessage message);
final RegExp _validChannelNames = RegExp('^[a-zA-Z_][a-zA-Z0-9_]*\$');
/// A named channel for receiving messaged from JavaScript code running inside a web view.
class JavascriptChannel {
- /// Constructs a Javascript channel.
+ /// Constructs a JavaScript channel.
///
/// The parameters `name` and `onMessageReceived` must not be null.
JavascriptChannel({
@@ -24,7 +24,7 @@
/// The channel's name.
///
/// Passing this channel object as part of a [WebView.javascriptChannels] adds a channel object to
- /// the Javascript window object's property named `name`.
+ /// the JavaScript window object's property named `name`.
///
/// The name must start with a letter or underscore(_), followed by any combination of those
/// characters plus digits.
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml
index 166c55b..994c3dc 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml
+++ b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml
@@ -4,7 +4,7 @@
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview_flutter%22
# NOTE: We strongly prefer non-breaking changes, even at the expense of a
# less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes
-version: 1.1.0
+version: 1.2.0
environment:
sdk: ">=2.12.0 <3.0.0"
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/method_channel/webview_method_channel_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/method_channel/webview_method_channel_test.dart
index 3914b20..85f184f 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/method_channel/webview_method_channel_test.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/method_channel/webview_method_channel_test.dart
@@ -30,6 +30,7 @@
case 'canGoBack':
case 'canGoForward':
return true;
+ case 'runJavascriptReturningResult':
case 'evaluateJavascript':
return methodCall.arguments as String;
case 'getScrollX':
@@ -266,16 +267,50 @@
test('evaluateJavascript', () async {
final String evaluateJavascript =
await webViewPlatform.evaluateJavascript(
- 'This simulates some Javascript code.',
+ 'This simulates some JavaScript code.',
);
- expect('This simulates some Javascript code.', evaluateJavascript);
+ expect('This simulates some JavaScript code.', evaluateJavascript);
expect(
log,
<Matcher>[
isMethodCall(
'evaluateJavascript',
- arguments: 'This simulates some Javascript code.',
+ arguments: 'This simulates some JavaScript code.',
+ ),
+ ],
+ );
+ });
+
+ test('runJavascript', () async {
+ await webViewPlatform.runJavascript(
+ 'This simulates some JavaScript code.',
+ );
+
+ expect(
+ log,
+ <Matcher>[
+ isMethodCall(
+ 'runJavascript',
+ arguments: 'This simulates some JavaScript code.',
+ ),
+ ],
+ );
+ });
+
+ test('runJavascriptReturningResult', () async {
+ final String evaluateJavascript =
+ await webViewPlatform.runJavascriptReturningResult(
+ 'This simulates some JavaScript code.',
+ );
+
+ expect('This simulates some JavaScript code.', evaluateJavascript);
+ expect(
+ log,
+ <Matcher>[
+ isMethodCall(
+ 'runJavascriptReturningResult',
+ arguments: 'This simulates some JavaScript code.',
),
],
);