Merge branch 'v4_webview' of github.com:flutter/plugins into v4_webview_android_navigation_delegate
diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/GeneratedAndroidWebView.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/GeneratedAndroidWebView.java
index af096bf..15c80cc 100644
--- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/GeneratedAndroidWebView.java
+++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/GeneratedAndroidWebView.java
@@ -1,7 +1,7 @@
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// Autogenerated from Pigeon (v4.0.2), do not edit directly.
+// Autogenerated from Pigeon (v4.2.3), do not edit directly.
// See also: https://pub.dev/packages/pigeon
package io.flutter.plugins.webviewflutter;
@@ -17,6 +17,7 @@
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -342,22 +343,22 @@
void error(Throwable error);
}
-
- private static class JavaObjectHostApiCodec extends StandardMessageCodec {
- public static final JavaObjectHostApiCodec INSTANCE = new JavaObjectHostApiCodec();
-
- private JavaObjectHostApiCodec() {}
- }
-
- /** Generated interface from Pigeon that represents a handler of messages from Flutter. */
+ /**
+ * Handles methods calls to the native Java Object class.
+ *
+ * <p>Also handles calls to remove the reference to an instance with `dispose`.
+ *
+ * <p>See https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html.
+ *
+ * <p>Generated interface from Pigeon that represents a handler of messages from Flutter.
+ */
public interface JavaObjectHostApi {
void dispose(@NonNull Long identifier);
/** The codec used by JavaObjectHostApi. */
static MessageCodec<Object> getCodec() {
- return JavaObjectHostApiCodec.INSTANCE;
+ return new StandardMessageCodec();
}
-
/**
* Sets up an instance of `JavaObjectHostApi` to handle messages through the `binaryMessenger`.
*/
@@ -372,6 +373,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number identifierArg = (Number) args.get(0);
if (identifierArg == null) {
throw new NullPointerException("identifierArg unexpectedly null.");
@@ -389,14 +391,13 @@
}
}
}
-
- private static class JavaObjectFlutterApiCodec extends StandardMessageCodec {
- public static final JavaObjectFlutterApiCodec INSTANCE = new JavaObjectFlutterApiCodec();
-
- private JavaObjectFlutterApiCodec() {}
- }
-
- /** Generated class from Pigeon that represents Flutter messages that can be called from Java. */
+ /**
+ * Handles callbacks methods for the native Java Object class.
+ *
+ * <p>See https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html.
+ *
+ * <p>Generated class from Pigeon that represents Flutter messages that can be called from Java.
+ */
public static class JavaObjectFlutterApi {
private final BinaryMessenger binaryMessenger;
@@ -407,9 +408,9 @@
public interface Reply<T> {
void reply(T reply);
}
-
+ /** The codec used by JavaObjectFlutterApi. */
static MessageCodec<Object> getCodec() {
- return JavaObjectFlutterApiCodec.INSTANCE;
+ return new StandardMessageCodec();
}
public void dispose(@NonNull Long identifierArg, Reply<Void> callback) {
@@ -417,19 +418,12 @@
new BasicMessageChannel<>(
binaryMessenger, "dev.flutter.pigeon.JavaObjectFlutterApi.dispose", getCodec());
channel.send(
- new ArrayList<Object>(Arrays.asList(identifierArg)),
+ new ArrayList<Object>(Collections.singletonList(identifierArg)),
channelReply -> {
callback.reply(null);
});
}
}
-
- private static class CookieManagerHostApiCodec extends StandardMessageCodec {
- public static final CookieManagerHostApiCodec INSTANCE = new CookieManagerHostApiCodec();
-
- private CookieManagerHostApiCodec() {}
- }
-
/** Generated interface from Pigeon that represents a handler of messages from Flutter. */
public interface CookieManagerHostApi {
void clearCookies(Result<Boolean> result);
@@ -438,9 +432,8 @@
/** The codec used by CookieManagerHostApi. */
static MessageCodec<Object> getCodec() {
- return CookieManagerHostApiCodec.INSTANCE;
+ return new StandardMessageCodec();
}
-
/**
* Sets up an instance of `CookieManagerHostApi` to handle messages through the
* `binaryMessenger`.
@@ -490,6 +483,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
String urlArg = (String) args.get(0);
if (urlArg == null) {
throw new NullPointerException("urlArg unexpectedly null.");
@@ -518,7 +512,7 @@
private WebViewHostApiCodec() {}
@Override
- protected Object readValueOfType(byte type, ByteBuffer buffer) {
+ protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) {
switch (type) {
case (byte) 128:
return WebViewPoint.fromMap((Map<String, Object>) readValue(buffer));
@@ -529,7 +523,7 @@
}
@Override
- protected void writeValue(ByteArrayOutputStream stream, Object value) {
+ protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) {
if (value instanceof WebViewPoint) {
stream.write(128);
writeValue(stream, ((WebViewPoint) value).toMap());
@@ -617,7 +611,6 @@
static MessageCodec<Object> getCodec() {
return WebViewHostApiCodec.INSTANCE;
}
-
/** Sets up an instance of `WebViewHostApi` to handle messages through the `binaryMessenger`. */
static void setup(BinaryMessenger binaryMessenger, WebViewHostApi api) {
{
@@ -630,6 +623,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -661,6 +655,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -698,6 +693,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -737,6 +733,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -773,6 +770,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -807,6 +805,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -833,6 +832,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -859,6 +859,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -885,6 +886,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -910,6 +912,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -935,6 +938,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -960,6 +964,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -993,6 +998,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1037,6 +1043,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1063,6 +1070,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1099,6 +1107,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1135,6 +1144,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1161,6 +1171,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1187,6 +1198,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1216,6 +1228,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Boolean enabledArg = (Boolean) args.get(0);
if (enabledArg == null) {
throw new NullPointerException("enabledArg unexpectedly null.");
@@ -1241,6 +1254,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1276,6 +1290,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1312,6 +1327,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1348,6 +1364,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1378,6 +1395,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1408,6 +1426,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1431,13 +1450,6 @@
}
}
}
-
- private static class WebSettingsHostApiCodec extends StandardMessageCodec {
- public static final WebSettingsHostApiCodec INSTANCE = new WebSettingsHostApiCodec();
-
- private WebSettingsHostApiCodec() {}
- }
-
/** Generated interface from Pigeon that represents a handler of messages from Flutter. */
public interface WebSettingsHostApi {
void create(@NonNull Long instanceId, @NonNull Long webViewInstanceId);
@@ -1468,9 +1480,8 @@
/** The codec used by WebSettingsHostApi. */
static MessageCodec<Object> getCodec() {
- return WebSettingsHostApiCodec.INSTANCE;
+ return new StandardMessageCodec();
}
-
/**
* Sets up an instance of `WebSettingsHostApi` to handle messages through the `binaryMessenger`.
*/
@@ -1485,6 +1496,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1518,6 +1530,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1550,6 +1563,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1582,6 +1596,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1614,6 +1629,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1646,6 +1662,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1676,6 +1693,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1708,6 +1726,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1740,6 +1759,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1772,6 +1792,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1804,6 +1825,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1836,6 +1858,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1868,6 +1891,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1890,23 +1914,14 @@
}
}
}
-
- private static class JavaScriptChannelHostApiCodec extends StandardMessageCodec {
- public static final JavaScriptChannelHostApiCodec INSTANCE =
- new JavaScriptChannelHostApiCodec();
-
- private JavaScriptChannelHostApiCodec() {}
- }
-
/** Generated interface from Pigeon that represents a handler of messages from Flutter. */
public interface JavaScriptChannelHostApi {
void create(@NonNull Long instanceId, @NonNull String channelName);
/** The codec used by JavaScriptChannelHostApi. */
static MessageCodec<Object> getCodec() {
- return JavaScriptChannelHostApiCodec.INSTANCE;
+ return new StandardMessageCodec();
}
-
/**
* Sets up an instance of `JavaScriptChannelHostApi` to handle messages through the
* `binaryMessenger`.
@@ -1922,6 +1937,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -1944,14 +1960,6 @@
}
}
}
-
- private static class JavaScriptChannelFlutterApiCodec extends StandardMessageCodec {
- public static final JavaScriptChannelFlutterApiCodec INSTANCE =
- new JavaScriptChannelFlutterApiCodec();
-
- private JavaScriptChannelFlutterApiCodec() {}
- }
-
/** Generated class from Pigeon that represents Flutter messages that can be called from Java. */
public static class JavaScriptChannelFlutterApi {
private final BinaryMessenger binaryMessenger;
@@ -1963,9 +1971,9 @@
public interface Reply<T> {
void reply(T reply);
}
-
+ /** The codec used by JavaScriptChannelFlutterApi. */
static MessageCodec<Object> getCodec() {
- return JavaScriptChannelFlutterApiCodec.INSTANCE;
+ return new StandardMessageCodec();
}
public void postMessage(
@@ -1982,22 +1990,17 @@
});
}
}
-
- private static class WebViewClientHostApiCodec extends StandardMessageCodec {
- public static final WebViewClientHostApiCodec INSTANCE = new WebViewClientHostApiCodec();
-
- private WebViewClientHostApiCodec() {}
- }
-
/** Generated interface from Pigeon that represents a handler of messages from Flutter. */
public interface WebViewClientHostApi {
- void create(@NonNull Long instanceId, @NonNull Boolean shouldOverrideUrlLoading);
+ void create(@NonNull Long instanceId);
+
+ void setSynchronousReturnValueForShouldOverrideUrlLoading(
+ @NonNull Long instanceId, @NonNull Boolean value);
/** The codec used by WebViewClientHostApi. */
static MessageCodec<Object> getCodec() {
- return WebViewClientHostApiCodec.INSTANCE;
+ return new StandardMessageCodec();
}
-
/**
* Sets up an instance of `WebViewClientHostApi` to handle messages through the
* `binaryMessenger`.
@@ -2013,18 +2016,45 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
}
- Boolean shouldOverrideUrlLoadingArg = (Boolean) args.get(1);
- if (shouldOverrideUrlLoadingArg == null) {
- throw new NullPointerException(
- "shouldOverrideUrlLoadingArg unexpectedly null.");
+ api.create((instanceIdArg == null) ? null : instanceIdArg.longValue());
+ wrapped.put("result", null);
+ } catch (Error | RuntimeException exception) {
+ wrapped.put("error", wrapError(exception));
+ }
+ reply.reply(wrapped);
+ });
+ } else {
+ channel.setMessageHandler(null);
+ }
+ }
+ {
+ BasicMessageChannel<Object> channel =
+ new BasicMessageChannel<>(
+ binaryMessenger,
+ "dev.flutter.pigeon.WebViewClientHostApi.setSynchronousReturnValueForShouldOverrideUrlLoading",
+ getCodec());
+ if (api != null) {
+ channel.setMessageHandler(
+ (message, reply) -> {
+ Map<String, Object> wrapped = new HashMap<>();
+ try {
+ ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
+ Number instanceIdArg = (Number) args.get(0);
+ if (instanceIdArg == null) {
+ throw new NullPointerException("instanceIdArg unexpectedly null.");
}
- api.create(
- (instanceIdArg == null) ? null : instanceIdArg.longValue(),
- shouldOverrideUrlLoadingArg);
+ Boolean valueArg = (Boolean) args.get(1);
+ if (valueArg == null) {
+ throw new NullPointerException("valueArg unexpectedly null.");
+ }
+ api.setSynchronousReturnValueForShouldOverrideUrlLoading(
+ (instanceIdArg == null) ? null : instanceIdArg.longValue(), valueArg);
wrapped.put("result", null);
} catch (Error | RuntimeException exception) {
wrapped.put("error", wrapError(exception));
@@ -2044,7 +2074,7 @@
private WebViewClientFlutterApiCodec() {}
@Override
- protected Object readValueOfType(byte type, ByteBuffer buffer) {
+ protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) {
switch (type) {
case (byte) 128:
return WebResourceErrorData.fromMap((Map<String, Object>) readValue(buffer));
@@ -2058,7 +2088,7 @@
}
@Override
- protected void writeValue(ByteArrayOutputStream stream, Object value) {
+ protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) {
if (value instanceof WebResourceErrorData) {
stream.write(128);
writeValue(stream, ((WebResourceErrorData) value).toMap());
@@ -2082,7 +2112,7 @@
public interface Reply<T> {
void reply(T reply);
}
-
+ /** The codec used by WebViewClientFlutterApi. */
static MessageCodec<Object> getCodec() {
return WebViewClientFlutterApiCodec.INSTANCE;
}
@@ -2197,22 +2227,14 @@
});
}
}
-
- private static class DownloadListenerHostApiCodec extends StandardMessageCodec {
- public static final DownloadListenerHostApiCodec INSTANCE = new DownloadListenerHostApiCodec();
-
- private DownloadListenerHostApiCodec() {}
- }
-
/** Generated interface from Pigeon that represents a handler of messages from Flutter. */
public interface DownloadListenerHostApi {
void create(@NonNull Long instanceId);
/** The codec used by DownloadListenerHostApi. */
static MessageCodec<Object> getCodec() {
- return DownloadListenerHostApiCodec.INSTANCE;
+ return new StandardMessageCodec();
}
-
/**
* Sets up an instance of `DownloadListenerHostApi` to handle messages through the
* `binaryMessenger`.
@@ -2228,6 +2250,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -2245,14 +2268,6 @@
}
}
}
-
- private static class DownloadListenerFlutterApiCodec extends StandardMessageCodec {
- public static final DownloadListenerFlutterApiCodec INSTANCE =
- new DownloadListenerFlutterApiCodec();
-
- private DownloadListenerFlutterApiCodec() {}
- }
-
/** Generated class from Pigeon that represents Flutter messages that can be called from Java. */
public static class DownloadListenerFlutterApi {
private final BinaryMessenger binaryMessenger;
@@ -2264,9 +2279,9 @@
public interface Reply<T> {
void reply(T reply);
}
-
+ /** The codec used by DownloadListenerFlutterApi. */
static MessageCodec<Object> getCodec() {
- return DownloadListenerFlutterApiCodec.INSTANCE;
+ return new StandardMessageCodec();
}
public void onDownloadStart(
@@ -2296,22 +2311,14 @@
});
}
}
-
- private static class WebChromeClientHostApiCodec extends StandardMessageCodec {
- public static final WebChromeClientHostApiCodec INSTANCE = new WebChromeClientHostApiCodec();
-
- private WebChromeClientHostApiCodec() {}
- }
-
/** Generated interface from Pigeon that represents a handler of messages from Flutter. */
public interface WebChromeClientHostApi {
void create(@NonNull Long instanceId);
/** The codec used by WebChromeClientHostApi. */
static MessageCodec<Object> getCodec() {
- return WebChromeClientHostApiCodec.INSTANCE;
+ return new StandardMessageCodec();
}
-
/**
* Sets up an instance of `WebChromeClientHostApi` to handle messages through the
* `binaryMessenger`.
@@ -2327,6 +2334,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -2344,14 +2352,6 @@
}
}
}
-
- private static class FlutterAssetManagerHostApiCodec extends StandardMessageCodec {
- public static final FlutterAssetManagerHostApiCodec INSTANCE =
- new FlutterAssetManagerHostApiCodec();
-
- private FlutterAssetManagerHostApiCodec() {}
- }
-
/** Generated interface from Pigeon that represents a handler of messages from Flutter. */
public interface FlutterAssetManagerHostApi {
@NonNull
@@ -2362,9 +2362,8 @@
/** The codec used by FlutterAssetManagerHostApi. */
static MessageCodec<Object> getCodec() {
- return FlutterAssetManagerHostApiCodec.INSTANCE;
+ return new StandardMessageCodec();
}
-
/**
* Sets up an instance of `FlutterAssetManagerHostApi` to handle messages through the
* `binaryMessenger`.
@@ -2380,6 +2379,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
String pathArg = (String) args.get(0);
if (pathArg == null) {
throw new NullPointerException("pathArg unexpectedly null.");
@@ -2407,6 +2407,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
String nameArg = (String) args.get(0);
if (nameArg == null) {
throw new NullPointerException("nameArg unexpectedly null.");
@@ -2424,14 +2425,6 @@
}
}
}
-
- private static class WebChromeClientFlutterApiCodec extends StandardMessageCodec {
- public static final WebChromeClientFlutterApiCodec INSTANCE =
- new WebChromeClientFlutterApiCodec();
-
- private WebChromeClientFlutterApiCodec() {}
- }
-
/** Generated class from Pigeon that represents Flutter messages that can be called from Java. */
public static class WebChromeClientFlutterApi {
private final BinaryMessenger binaryMessenger;
@@ -2443,9 +2436,9 @@
public interface Reply<T> {
void reply(T reply);
}
-
+ /** The codec used by WebChromeClientFlutterApi. */
static MessageCodec<Object> getCodec() {
- return WebChromeClientFlutterApiCodec.INSTANCE;
+ return new StandardMessageCodec();
}
public void onProgressChanged(
@@ -2465,13 +2458,6 @@
});
}
}
-
- private static class WebStorageHostApiCodec extends StandardMessageCodec {
- public static final WebStorageHostApiCodec INSTANCE = new WebStorageHostApiCodec();
-
- private WebStorageHostApiCodec() {}
- }
-
/** Generated interface from Pigeon that represents a handler of messages from Flutter. */
public interface WebStorageHostApi {
void create(@NonNull Long instanceId);
@@ -2480,9 +2466,8 @@
/** The codec used by WebStorageHostApi. */
static MessageCodec<Object> getCodec() {
- return WebStorageHostApiCodec.INSTANCE;
+ return new StandardMessageCodec();
}
-
/**
* Sets up an instance of `WebStorageHostApi` to handle messages through the `binaryMessenger`.
*/
@@ -2497,6 +2482,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -2522,6 +2508,7 @@
Map<String, Object> wrapped = new HashMap<>();
try {
ArrayList<Object> args = (ArrayList<Object>) message;
+ assert args != null;
Number instanceIdArg = (Number) args.get(0);
if (instanceIdArg == null) {
throw new NullPointerException("instanceIdArg unexpectedly null.");
@@ -2540,7 +2527,8 @@
}
}
- private static Map<String, Object> wrapError(Throwable exception) {
+ @NonNull
+ private static Map<String, Object> wrapError(@NonNull Throwable exception) {
Map<String, Object> errorMap = new HashMap<>();
errorMap.put("message", exception.toString());
errorMap.put("code", exception.getClass().getSimpleName());
diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientHostApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientHostApiImpl.java
index fd08cfa..09a34f2 100644
--- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientHostApiImpl.java
+++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewClientHostApiImpl.java
@@ -17,6 +17,7 @@
import androidx.annotation.RequiresApi;
import androidx.webkit.WebResourceErrorCompat;
import androidx.webkit.WebViewClientCompat;
+import java.util.Objects;
/**
* Host api implementation for {@link WebViewClient}.
@@ -32,17 +33,14 @@
@RequiresApi(Build.VERSION_CODES.N)
public static class WebViewClientImpl extends WebViewClient {
private final WebViewClientFlutterApiImpl flutterApi;
- private final boolean shouldOverrideUrlLoading;
+ private boolean returnValueForShouldOverrideUrlLoading = false;
/**
* Creates a {@link WebViewClient} that passes arguments of callbacks methods to Dart.
*
* @param flutterApi handles sending messages to Dart
- * @param shouldOverrideUrlLoading whether loading a url should be overridden
*/
- public WebViewClientImpl(
- @NonNull WebViewClientFlutterApiImpl flutterApi, boolean shouldOverrideUrlLoading) {
- this.shouldOverrideUrlLoading = shouldOverrideUrlLoading;
+ public WebViewClientImpl(@NonNull WebViewClientFlutterApiImpl flutterApi) {
this.flutterApi = flutterApi;
}
@@ -71,13 +69,13 @@
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
flutterApi.requestLoading(this, view, request, reply -> {});
- return shouldOverrideUrlLoading;
+ return returnValueForShouldOverrideUrlLoading;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
flutterApi.urlLoading(this, view, url, reply -> {});
- return shouldOverrideUrlLoading;
+ return returnValueForShouldOverrideUrlLoading;
}
@Override
@@ -86,6 +84,11 @@
// handled even though they were handled. We don't want to propagate those as they're not
// truly lost.
}
+
+ /** Sets return value for {@link #shouldOverrideUrlLoading}. */
+ public void setReturnValueForShouldOverrideUrlLoading(boolean value) {
+ returnValueForShouldOverrideUrlLoading = value;
+ }
}
/**
@@ -94,11 +97,9 @@
*/
public static class WebViewClientCompatImpl extends WebViewClientCompat {
private final WebViewClientFlutterApiImpl flutterApi;
- private final boolean shouldOverrideUrlLoading;
+ private boolean returnValueForShouldOverrideUrlLoading = false;
- public WebViewClientCompatImpl(
- @NonNull WebViewClientFlutterApiImpl flutterApi, boolean shouldOverrideUrlLoading) {
- this.shouldOverrideUrlLoading = shouldOverrideUrlLoading;
+ public WebViewClientCompatImpl(@NonNull WebViewClientFlutterApiImpl flutterApi) {
this.flutterApi = flutterApi;
}
@@ -136,13 +137,13 @@
public boolean shouldOverrideUrlLoading(
@NonNull WebView view, @NonNull WebResourceRequest request) {
flutterApi.requestLoading(this, view, request, reply -> {});
- return shouldOverrideUrlLoading;
+ return returnValueForShouldOverrideUrlLoading;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
flutterApi.urlLoading(this, view, url, reply -> {});
- return shouldOverrideUrlLoading;
+ return returnValueForShouldOverrideUrlLoading;
}
@Override
@@ -151,6 +152,11 @@
// handled even though they were handled. We don't want to propagate those as they're not
// truly lost.
}
+
+ /** Sets return value for {@link #shouldOverrideUrlLoading}. */
+ public void setReturnValueForShouldOverrideUrlLoading(boolean value) {
+ returnValueForShouldOverrideUrlLoading = value;
+ }
}
/** Handles creating {@link WebViewClient}s for a {@link WebViewClientHostApiImpl}. */
@@ -161,8 +167,7 @@
* @param flutterApi handles sending messages to Dart
* @return the created {@link WebViewClient}
*/
- public WebViewClient createWebViewClient(
- WebViewClientFlutterApiImpl flutterApi, boolean shouldOverrideUrlLoading) {
+ public WebViewClient createWebViewClient(WebViewClientFlutterApiImpl flutterApi) {
// WebViewClientCompat is used to get
// shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
// invoked by the webview on older Android devices, without it pages that use iframes will
@@ -172,9 +177,9 @@
// to bug https://bugs.chromium.org/p/chromium/issues/detail?id=925887. Also, see
// https://github.com/flutter/flutter/issues/29446.
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
- return new WebViewClientImpl(flutterApi, shouldOverrideUrlLoading);
+ return new WebViewClientImpl(flutterApi);
} else {
- return new WebViewClientCompatImpl(flutterApi, shouldOverrideUrlLoading);
+ return new WebViewClientCompatImpl(flutterApi);
}
}
}
@@ -196,9 +201,24 @@
}
@Override
- public void create(Long instanceId, Boolean shouldOverrideUrlLoading) {
- final WebViewClient webViewClient =
- webViewClientCreator.createWebViewClient(flutterApi, shouldOverrideUrlLoading);
+ public void create(@NonNull Long instanceId) {
+ final WebViewClient webViewClient = webViewClientCreator.createWebViewClient(flutterApi);
instanceManager.addDartCreatedInstance(webViewClient, instanceId);
}
+
+ @Override
+ public void setSynchronousReturnValueForShouldOverrideUrlLoading(
+ @NonNull Long instanceId, @NonNull Boolean value) {
+ final WebViewClient webViewClient =
+ Objects.requireNonNull(instanceManager.getInstance(instanceId));
+ if (webViewClient instanceof WebViewClientCompatImpl) {
+ ((WebViewClientCompatImpl) webViewClient).setReturnValueForShouldOverrideUrlLoading(value);
+ } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
+ && webViewClient instanceof WebViewClientImpl) {
+ ((WebViewClientImpl) webViewClient).setReturnValueForShouldOverrideUrlLoading(value);
+ } else {
+ throw new IllegalStateException(
+ "This WebViewClient doesn't support setting the returnValueForShouldOverrideUrlLoading.");
+ }
+ }
}
diff --git a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewClientTest.java b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewClientTest.java
index 87b39d4..3267291 100644
--- a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewClientTest.java
+++ b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewClientTest.java
@@ -33,6 +33,8 @@
@Mock public WebView mockWebView;
+ @Mock public WebViewClientCompatImpl mockWebViewClient;
+
InstanceManager instanceManager;
WebViewClientHostApiImpl hostApiImpl;
WebViewClientCompatImpl webViewClient;
@@ -46,18 +48,15 @@
final WebViewClientCreator webViewClientCreator =
new WebViewClientCreator() {
@Override
- public WebViewClient createWebViewClient(
- WebViewClientFlutterApiImpl flutterApi, boolean shouldOverrideUrlLoading) {
- webViewClient =
- (WebViewClientCompatImpl)
- super.createWebViewClient(flutterApi, shouldOverrideUrlLoading);
+ public WebViewClient createWebViewClient(WebViewClientFlutterApiImpl flutterApi) {
+ webViewClient = (WebViewClientCompatImpl) super.createWebViewClient(flutterApi);
return webViewClient;
}
};
hostApiImpl =
new WebViewClientHostApiImpl(instanceManager, webViewClientCreator, mockFlutterApi);
- hostApiImpl.create(1L, true);
+ hostApiImpl.create(1L);
}
@After
@@ -107,4 +106,23 @@
WebViewClientFlutterApiImpl.createWebResourceRequestData(mockRequest);
assertEquals(data.getRequestHeaders(), new HashMap<String, String>());
}
+
+ @Test
+ public void setReturnValueForShouldOverrideUrlLoading() {
+ final WebViewClientHostApiImpl webViewClientHostApi =
+ new WebViewClientHostApiImpl(
+ instanceManager,
+ new WebViewClientCreator() {
+ @Override
+ public WebViewClient createWebViewClient(WebViewClientFlutterApiImpl flutterApi) {
+ return mockWebViewClient;
+ }
+ },
+ mockFlutterApi);
+
+ instanceManager.addDartCreatedInstance(mockWebViewClient, 0);
+ webViewClientHostApi.setSynchronousReturnValueForShouldOverrideUrlLoading(0L, false);
+
+ verify(mockWebViewClient).setReturnValueForShouldOverrideUrlLoading(false);
+ }
}
diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart
index fa5b516..d2f0333 100644
--- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart
+++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.dart
@@ -634,7 +634,6 @@
class WebViewClient extends JavaObject {
/// Constructs a [WebViewClient].
WebViewClient({
- this.shouldOverrideUrlLoading = true,
this.onPageStarted,
this.onPageFinished,
this.onReceivedRequestError,
@@ -651,7 +650,6 @@
/// This should only be used by subclasses created by this library or to
/// create copies.
WebViewClient.detached({
- this.shouldOverrideUrlLoading = true,
this.onPageStarted,
this.onPageFinished,
this.onReceivedRequestError,
@@ -744,20 +742,6 @@
@visibleForTesting
static WebViewClientHostApiImpl api = WebViewClientHostApiImpl();
- /// Whether loading a url should be overridden.
- ///
- /// In Java, `shouldOverrideUrlLoading()` and `shouldOverrideRequestLoading()`
- /// callbacks must synchronously return a boolean. This sets the default
- /// return value.
- ///
- /// Setting [shouldOverrideUrlLoading] to true causes the current [WebView] to
- /// abort loading the URL, while returning false causes the [WebView] to
- /// continue loading the URL as usual. [requestLoading] or [urlLoading] will
- /// still be called either way.
- ///
- /// Defaults to true.
- final bool shouldOverrideUrlLoading;
-
/// Notify the host application that a page has started loading.
///
/// This method is called once for each main frame load so a page with iframes
@@ -801,31 +785,40 @@
String failingUrl,
)? onReceivedError;
- // TODO(bparrishMines): Update documentation once synchronous url handling is supported.
- /// When a URL is about to be loaded in the current [WebView].
+ /// When the current [WebView] wants to load a URL.
///
- /// If a [WebViewClient] is not provided, by default [WebView] will ask
- /// Activity Manager to choose the proper handler for the URL. If a
- /// [WebViewClient] is provided, setting [shouldOverrideUrlLoading] to true
- /// causes the current [WebView] to abort loading the URL, while returning
- /// false causes the [WebView] to continue loading the URL as usual.
+ /// The value set by [setSynchronousReturnValueForShouldOverrideUrlLoading]
+ /// indicates whether the [WebView] loaded the request.
final void Function(WebView webView, WebResourceRequest request)?
requestLoading;
- // TODO(bparrishMines): Update documentation once synchronous url handling is supported.
- /// When a URL is about to be loaded in the current [WebView].
+ /// When the current [WebView] wants to load a URL.
///
- /// If a [WebViewClient] is not provided, by default [WebView] will ask
- /// Activity Manager to choose the proper handler for the URL. If a
- /// [WebViewClient] is provided, setting [shouldOverrideUrlLoading] to true
- /// causes the current [WebView] to abort loading the URL, while returning
- /// false causes the [WebView] to continue loading the URL as usual.
+ /// The value set by [setSynchronousReturnValueForShouldOverrideUrlLoading]
+ /// indicates whether the [WebView] loaded the URL.
final void Function(WebView webView, String url)? urlLoading;
+ /// Sets the required synchronous return value for the Java method,
+ /// `WebViewClient.shouldOverrideUrlLoading(...)`.
+ ///
+ /// The Java method, `WebViewClient.shouldOverrideUrlLoading(...)`, requires
+ /// a boolean to be returned and this method sets the returned value for all
+ /// calls to the Java method.
+ ///
+ /// Setting this to true causes the current [WebView] to abort loading any URL
+ /// received by [requestLoading] or [urlLoading], while setting this to false
+ /// causes the [WebView] to continue loading a URL as usual.
+ ///
+ /// Defaults to false.
+ Future<void> setSynchronousReturnValueForShouldOverrideUrlLoading(
+ bool value,
+ ) {
+ return api.setShouldOverrideUrlLoadingReturnValueFromInstance(this, value);
+ }
+
@override
WebViewClient copy() {
return WebViewClient.detached(
- shouldOverrideUrlLoading: shouldOverrideUrlLoading,
onPageStarted: onPageStarted,
onPageFinished: onPageFinished,
onReceivedRequestError: onReceivedRequestError,
diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.pigeon.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.pigeon.dart
index 49385e5..5bdab16 100644
--- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.pigeon.dart
+++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview.pigeon.dart
@@ -1,7 +1,7 @@
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// Autogenerated from Pigeon (v4.0.2), do not edit directly.
+// Autogenerated from Pigeon (v4.2.3), do not edit directly.
// See also: https://pub.dev/packages/pigeon
// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import
import 'dart:async';
@@ -102,20 +102,20 @@
}
}
-class _JavaObjectHostApiCodec extends StandardMessageCodec {
- const _JavaObjectHostApiCodec();
-}
-
+/// Handles methods calls to the native Java Object class.
+///
+/// Also handles calls to remove the reference to an instance with `dispose`.
+///
+/// See https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html.
class JavaObjectHostApi {
/// Constructor for [JavaObjectHostApi]. The [binaryMessenger] named argument is
/// available for dependency injection. If it is left null, the default
/// BinaryMessenger will be used which routes to the host platform.
JavaObjectHostApi({BinaryMessenger? binaryMessenger})
: _binaryMessenger = binaryMessenger;
-
final BinaryMessenger? _binaryMessenger;
- static const MessageCodec<Object?> codec = _JavaObjectHostApiCodec();
+ static const MessageCodec<Object?> codec = StandardMessageCodec();
Future<void> dispose(int arg_identifier) async {
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
@@ -142,12 +142,11 @@
}
}
-class _JavaObjectFlutterApiCodec extends StandardMessageCodec {
- const _JavaObjectFlutterApiCodec();
-}
-
+/// Handles callbacks methods for the native Java Object class.
+///
+/// See https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html.
abstract class JavaObjectFlutterApi {
- static const MessageCodec<Object?> codec = _JavaObjectFlutterApiCodec();
+ static const MessageCodec<Object?> codec = StandardMessageCodec();
void dispose(int identifier);
static void setup(JavaObjectFlutterApi? api,
@@ -174,20 +173,15 @@
}
}
-class _CookieManagerHostApiCodec extends StandardMessageCodec {
- const _CookieManagerHostApiCodec();
-}
-
class CookieManagerHostApi {
/// Constructor for [CookieManagerHostApi]. The [binaryMessenger] named argument is
/// available for dependency injection. If it is left null, the default
/// BinaryMessenger will be used which routes to the host platform.
CookieManagerHostApi({BinaryMessenger? binaryMessenger})
: _binaryMessenger = binaryMessenger;
-
final BinaryMessenger? _binaryMessenger;
- static const MessageCodec<Object?> codec = _CookieManagerHostApiCodec();
+ static const MessageCodec<Object?> codec = StandardMessageCodec();
Future<bool> clearCookies() async {
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
@@ -273,7 +267,6 @@
/// BinaryMessenger will be used which routes to the host platform.
WebViewHostApi({BinaryMessenger? binaryMessenger})
: _binaryMessenger = binaryMessenger;
-
final BinaryMessenger? _binaryMessenger;
static const MessageCodec<Object?> codec = _WebViewHostApiCodec();
@@ -963,20 +956,15 @@
}
}
-class _WebSettingsHostApiCodec extends StandardMessageCodec {
- const _WebSettingsHostApiCodec();
-}
-
class WebSettingsHostApi {
/// Constructor for [WebSettingsHostApi]. The [binaryMessenger] named argument is
/// available for dependency injection. If it is left null, the default
/// BinaryMessenger will be used which routes to the host platform.
WebSettingsHostApi({BinaryMessenger? binaryMessenger})
: _binaryMessenger = binaryMessenger;
-
final BinaryMessenger? _binaryMessenger;
- static const MessageCodec<Object?> codec = _WebSettingsHostApiCodec();
+ static const MessageCodec<Object?> codec = StandardMessageCodec();
Future<void> create(int arg_instanceId, int arg_webViewInstanceId) async {
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
@@ -1304,20 +1292,15 @@
}
}
-class _JavaScriptChannelHostApiCodec extends StandardMessageCodec {
- const _JavaScriptChannelHostApiCodec();
-}
-
class JavaScriptChannelHostApi {
/// Constructor for [JavaScriptChannelHostApi]. The [binaryMessenger] named argument is
/// available for dependency injection. If it is left null, the default
/// BinaryMessenger will be used which routes to the host platform.
JavaScriptChannelHostApi({BinaryMessenger? binaryMessenger})
: _binaryMessenger = binaryMessenger;
-
final BinaryMessenger? _binaryMessenger;
- static const MessageCodec<Object?> codec = _JavaScriptChannelHostApiCodec();
+ static const MessageCodec<Object?> codec = StandardMessageCodec();
Future<void> create(int arg_instanceId, String arg_channelName) async {
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
@@ -1345,13 +1328,8 @@
}
}
-class _JavaScriptChannelFlutterApiCodec extends StandardMessageCodec {
- const _JavaScriptChannelFlutterApiCodec();
-}
-
abstract class JavaScriptChannelFlutterApi {
- static const MessageCodec<Object?> codec =
- _JavaScriptChannelFlutterApiCodec();
+ static const MessageCodec<Object?> codec = StandardMessageCodec();
void postMessage(int instanceId, String message);
static void setup(JavaScriptChannelFlutterApi? api,
@@ -1381,29 +1359,48 @@
}
}
-class _WebViewClientHostApiCodec extends StandardMessageCodec {
- const _WebViewClientHostApiCodec();
-}
-
class WebViewClientHostApi {
/// Constructor for [WebViewClientHostApi]. The [binaryMessenger] named argument is
/// available for dependency injection. If it is left null, the default
/// BinaryMessenger will be used which routes to the host platform.
WebViewClientHostApi({BinaryMessenger? binaryMessenger})
: _binaryMessenger = binaryMessenger;
-
final BinaryMessenger? _binaryMessenger;
- static const MessageCodec<Object?> codec = _WebViewClientHostApiCodec();
+ static const MessageCodec<Object?> codec = StandardMessageCodec();
- Future<void> create(
- int arg_instanceId, bool arg_shouldOverrideUrlLoading) async {
+ Future<void> create(int arg_instanceId) async {
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
'dev.flutter.pigeon.WebViewClientHostApi.create', codec,
binaryMessenger: _binaryMessenger);
+ final Map<Object?, Object?>? replyMap =
+ await channel.send(<Object?>[arg_instanceId]) as Map<Object?, Object?>?;
+ if (replyMap == null) {
+ throw PlatformException(
+ code: 'channel-error',
+ message: 'Unable to establish connection on channel.',
+ );
+ } else if (replyMap['error'] != null) {
+ final Map<Object?, Object?> error =
+ (replyMap['error'] as Map<Object?, Object?>?)!;
+ throw PlatformException(
+ code: (error['code'] as String?)!,
+ message: error['message'] as String?,
+ details: error['details'],
+ );
+ } else {
+ return;
+ }
+ }
+
+ Future<void> setSynchronousReturnValueForShouldOverrideUrlLoading(
+ int arg_instanceId, bool arg_value) async {
+ final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+ 'dev.flutter.pigeon.WebViewClientHostApi.setSynchronousReturnValueForShouldOverrideUrlLoading',
+ codec,
+ binaryMessenger: _binaryMessenger);
final Map<Object?, Object?>? replyMap = await channel
- .send(<Object?>[arg_instanceId, arg_shouldOverrideUrlLoading])
- as Map<Object?, Object?>?;
+ .send(<Object?>[arg_instanceId, arg_value]) as Map<Object?, Object?>?;
if (replyMap == null) {
throw PlatformException(
code: 'channel-error',
@@ -1636,20 +1633,15 @@
}
}
-class _DownloadListenerHostApiCodec extends StandardMessageCodec {
- const _DownloadListenerHostApiCodec();
-}
-
class DownloadListenerHostApi {
/// Constructor for [DownloadListenerHostApi]. The [binaryMessenger] named argument is
/// available for dependency injection. If it is left null, the default
/// BinaryMessenger will be used which routes to the host platform.
DownloadListenerHostApi({BinaryMessenger? binaryMessenger})
: _binaryMessenger = binaryMessenger;
-
final BinaryMessenger? _binaryMessenger;
- static const MessageCodec<Object?> codec = _DownloadListenerHostApiCodec();
+ static const MessageCodec<Object?> codec = StandardMessageCodec();
Future<void> create(int arg_instanceId) async {
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
@@ -1676,12 +1668,8 @@
}
}
-class _DownloadListenerFlutterApiCodec extends StandardMessageCodec {
- const _DownloadListenerFlutterApiCodec();
-}
-
abstract class DownloadListenerFlutterApi {
- static const MessageCodec<Object?> codec = _DownloadListenerFlutterApiCodec();
+ static const MessageCodec<Object?> codec = StandardMessageCodec();
void onDownloadStart(int instanceId, String url, String userAgent,
String contentDisposition, String mimetype, int contentLength);
@@ -1726,20 +1714,15 @@
}
}
-class _WebChromeClientHostApiCodec extends StandardMessageCodec {
- const _WebChromeClientHostApiCodec();
-}
-
class WebChromeClientHostApi {
/// Constructor for [WebChromeClientHostApi]. The [binaryMessenger] named argument is
/// available for dependency injection. If it is left null, the default
/// BinaryMessenger will be used which routes to the host platform.
WebChromeClientHostApi({BinaryMessenger? binaryMessenger})
: _binaryMessenger = binaryMessenger;
-
final BinaryMessenger? _binaryMessenger;
- static const MessageCodec<Object?> codec = _WebChromeClientHostApiCodec();
+ static const MessageCodec<Object?> codec = StandardMessageCodec();
Future<void> create(int arg_instanceId) async {
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
@@ -1766,20 +1749,15 @@
}
}
-class _FlutterAssetManagerHostApiCodec extends StandardMessageCodec {
- const _FlutterAssetManagerHostApiCodec();
-}
-
class FlutterAssetManagerHostApi {
/// Constructor for [FlutterAssetManagerHostApi]. The [binaryMessenger] named argument is
/// available for dependency injection. If it is left null, the default
/// BinaryMessenger will be used which routes to the host platform.
FlutterAssetManagerHostApi({BinaryMessenger? binaryMessenger})
: _binaryMessenger = binaryMessenger;
-
final BinaryMessenger? _binaryMessenger;
- static const MessageCodec<Object?> codec = _FlutterAssetManagerHostApiCodec();
+ static const MessageCodec<Object?> codec = StandardMessageCodec();
Future<List<String?>> list(String arg_path) async {
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
@@ -1841,12 +1819,8 @@
}
}
-class _WebChromeClientFlutterApiCodec extends StandardMessageCodec {
- const _WebChromeClientFlutterApiCodec();
-}
-
abstract class WebChromeClientFlutterApi {
- static const MessageCodec<Object?> codec = _WebChromeClientFlutterApiCodec();
+ static const MessageCodec<Object?> codec = StandardMessageCodec();
void onProgressChanged(int instanceId, int webViewInstanceId, int progress);
static void setup(WebChromeClientFlutterApi? api,
@@ -1881,20 +1855,15 @@
}
}
-class _WebStorageHostApiCodec extends StandardMessageCodec {
- const _WebStorageHostApiCodec();
-}
-
class WebStorageHostApi {
/// Constructor for [WebStorageHostApi]. The [binaryMessenger] named argument is
/// available for dependency injection. If it is left null, the default
/// BinaryMessenger will be used which routes to the host platform.
WebStorageHostApi({BinaryMessenger? binaryMessenger})
: _binaryMessenger = binaryMessenger;
-
final BinaryMessenger? _binaryMessenger;
- static const MessageCodec<Object?> codec = _WebStorageHostApiCodec();
+ static const MessageCodec<Object?> codec = StandardMessageCodec();
Future<void> create(int arg_instanceId) async {
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
diff --git a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart
index 5becdb3..8aa5f7d 100644
--- a/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart
+++ b/packages/webview_flutter/webview_flutter_android/lib/src/android_webview_api_impls.dart
@@ -537,9 +537,20 @@
Future<void> createFromInstance(WebViewClient instance) async {
if (instanceManager.getIdentifier(instance) == null) {
final int identifier = instanceManager.addDartCreatedInstance(instance);
- return create(identifier, instance.shouldOverrideUrlLoading);
+ return create(identifier);
}
}
+
+ /// Helper method to convert instances ids to objects.
+ Future<void> setShouldOverrideUrlLoadingReturnValueFromInstance(
+ WebViewClient instance,
+ bool value,
+ ) {
+ return setSynchronousReturnValueForShouldOverrideUrlLoading(
+ instanceManager.getIdentifier(instance)!,
+ value,
+ );
+ }
}
/// Flutter api implementation for [WebViewClient].
diff --git a/packages/webview_flutter/webview_flutter_android/lib/webview_android_widget.dart b/packages/webview_flutter/webview_flutter_android/lib/webview_android_widget.dart
index 8070a11..4cb99b5 100644
--- a/packages/webview_flutter/webview_flutter_android/lib/webview_android_widget.dart
+++ b/packages/webview_flutter/webview_flutter_android/lib/webview_android_widget.dart
@@ -122,6 +122,7 @@
_setCreationParams(creationParams);
webView.setDownloadListener(downloadListener);
webView.setWebChromeClient(webChromeClient);
+ webView.setWebViewClient(webViewClient);
final String? initialUrl = creationParams.initialUrl;
if (initialUrl != null) {
@@ -132,7 +133,58 @@
final Map<String, WebViewAndroidJavaScriptChannel> _javaScriptChannels =
<String, WebViewAndroidJavaScriptChannel>{};
- late android_webview.WebViewClient _webViewClient;
+ late final android_webview.WebViewClient _webViewClient = withWeakRefenceTo(
+ this, (WeakReference<WebViewAndroidPlatformController> weakReference) {
+ return webViewProxy.createWebViewClient(
+ onPageStarted: (_, String url) {
+ weakReference.target?.callbacksHandler.onPageStarted(url);
+ },
+ onPageFinished: (_, String url) {
+ weakReference.target?.callbacksHandler.onPageFinished(url);
+ },
+ onReceivedError: (
+ _,
+ int errorCode,
+ String description,
+ String failingUrl,
+ ) {
+ weakReference.target?.callbacksHandler
+ .onWebResourceError(WebResourceError(
+ errorCode: errorCode,
+ description: description,
+ failingUrl: failingUrl,
+ errorType: _errorCodeToErrorType(errorCode),
+ ));
+ },
+ onReceivedRequestError: (
+ _,
+ android_webview.WebResourceRequest request,
+ android_webview.WebResourceError error,
+ ) {
+ if (request.isForMainFrame) {
+ weakReference.target?.callbacksHandler
+ .onWebResourceError(WebResourceError(
+ errorCode: error.errorCode,
+ description: error.description,
+ failingUrl: request.url,
+ errorType: _errorCodeToErrorType(error.errorCode),
+ ));
+ }
+ },
+ urlLoading: (_, String url) {
+ weakReference.target?._handleNavigationRequest(
+ url: url,
+ isForMainFrame: true,
+ );
+ },
+ requestLoading: (_, android_webview.WebResourceRequest request) {
+ weakReference.target?._handleNavigationRequest(
+ url: request.url,
+ isForMainFrame: request.isForMainFrame,
+ );
+ },
+ );
+ });
bool _hasNavigationDelegate = false;
bool _hasProgressTracking = false;
@@ -416,58 +468,9 @@
Future<void> _setHasNavigationDelegate(bool hasNavigationDelegate) {
_hasNavigationDelegate = hasNavigationDelegate;
-
- final WeakReference<WebViewAndroidPlatformController> weakThis =
- WeakReference<WebViewAndroidPlatformController>(this);
- _webViewClient = android_webview.WebViewClient(
- shouldOverrideUrlLoading: hasNavigationDelegate,
- onPageStarted: (_, String url) {
- weakThis.target?.callbacksHandler.onPageStarted(url);
- },
- onPageFinished: (_, String url) {
- weakThis.target?.callbacksHandler.onPageFinished(url);
- },
- onReceivedError: (
- _,
- int errorCode,
- String description,
- String failingUrl,
- ) {
- weakThis.target?.callbacksHandler.onWebResourceError(WebResourceError(
- errorCode: errorCode,
- description: description,
- failingUrl: failingUrl,
- errorType: _errorCodeToErrorType(errorCode),
- ));
- },
- onReceivedRequestError: (
- _,
- android_webview.WebResourceRequest request,
- android_webview.WebResourceError error,
- ) {
- if (request.isForMainFrame) {
- weakThis.target?.callbacksHandler.onWebResourceError(WebResourceError(
- errorCode: error.errorCode,
- description: error.description,
- failingUrl: request.url,
- errorType: _errorCodeToErrorType(error.errorCode),
- ));
- }
- },
- urlLoading: (_, String url) {
- weakThis.target?._handleNavigationRequest(
- url: url,
- isForMainFrame: true,
- );
- },
- requestLoading: (_, android_webview.WebResourceRequest request) {
- weakThis.target?._handleNavigationRequest(
- url: request.url,
- isForMainFrame: request.isForMainFrame,
- );
- },
+ return _webViewClient.setSynchronousReturnValueForShouldOverrideUrlLoading(
+ hasNavigationDelegate,
);
- return webView.setWebViewClient(_webViewClient);
}
Future<void> _setJavaScriptMode(JavascriptMode mode) {
@@ -600,6 +603,38 @@
return android_webview.WebView(useHybridComposition: useHybridComposition);
}
+ /// Constructs a [android_webview.WebViewClient].
+ android_webview.WebViewClient createWebViewClient({
+ void Function(android_webview.WebView webView, String url)? onPageStarted,
+ void Function(android_webview.WebView webView, String url)? onPageFinished,
+ void Function(
+ android_webview.WebView webView,
+ android_webview.WebResourceRequest request,
+ android_webview.WebResourceError error,
+ )?
+ onReceivedRequestError,
+ void Function(
+ android_webview.WebView webView,
+ int errorCode,
+ String description,
+ String failingUrl,
+ )?
+ onReceivedError,
+ void Function(android_webview.WebView webView,
+ android_webview.WebResourceRequest request)?
+ requestLoading,
+ void Function(android_webview.WebView webView, String url)? urlLoading,
+ }) {
+ return android_webview.WebViewClient(
+ onPageStarted: onPageStarted,
+ onPageFinished: onPageFinished,
+ onReceivedRequestError: onReceivedRequestError,
+ onReceivedError: onReceivedError,
+ requestLoading: requestLoading,
+ urlLoading: urlLoading,
+ );
+ }
+
/// Enables debugging of web contents (HTML / CSS / JavaScript) loaded into any WebViews of this application.
///
/// This flag can be enabled in order to facilitate debugging of web layouts
diff --git a/packages/webview_flutter/webview_flutter_android/pigeons/android_webview.dart b/packages/webview_flutter/webview_flutter_android/pigeons/android_webview.dart
index 26f773d..d3adac8 100644
--- a/packages/webview_flutter/webview_flutter_android/pigeons/android_webview.dart
+++ b/packages/webview_flutter/webview_flutter_android/pigeons/android_webview.dart
@@ -204,7 +204,12 @@
@HostApi(dartHostTestHandler: 'TestWebViewClientHostApi')
abstract class WebViewClientHostApi {
- void create(int instanceId, bool shouldOverrideUrlLoading);
+ void create(int instanceId);
+
+ void setSynchronousReturnValueForShouldOverrideUrlLoading(
+ int instanceId,
+ bool value,
+ );
}
@FlutterApi()
diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml
index 94a8e5e..8384b7c 100644
--- a/packages/webview_flutter/webview_flutter_android/pubspec.yaml
+++ b/packages/webview_flutter/webview_flutter_android/pubspec.yaml
@@ -29,5 +29,5 @@
sdk: flutter
flutter_test:
sdk: flutter
- mockito: ^5.2.0
- pigeon: ^4.0.2
+ mockito: ^5.3.2
+ pigeon: ^4.2.3
diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart
index d10f4e7..4e972fe 100644
--- a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart
+++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.dart
@@ -269,7 +269,6 @@
final WebViewClient mockWebViewClient = MockWebViewClient();
when(mockWebViewClient.copy()).thenReturn(MockWebViewClient());
- when(mockWebViewClient.shouldOverrideUrlLoading).thenReturn(false);
instanceManager.addDartCreatedInstance(mockWebViewClient);
webView.setWebViewClient(mockWebViewClient);
diff --git a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.mocks.dart b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.mocks.dart
index 6ffda42..81cdc9e 100644
--- a/packages/webview_flutter/webview_flutter_android/test/android_webview_test.mocks.dart
+++ b/packages/webview_flutter/webview_flutter_android/test/android_webview_test.mocks.dart
@@ -1,4 +1,4 @@
-// Mocks generated by Mockito 5.3.1 from annotations
+// Mocks generated by Mockito 5.3.2 from annotations
// in webview_flutter_android/test/android_webview_test.dart.
// Do not manually edit this file.
@@ -549,16 +549,24 @@
}
@override
- void create(
+ void create(int? instanceId) => super.noSuchMethod(
+ Invocation.method(
+ #create,
+ [instanceId],
+ ),
+ returnValueForMissingStub: null,
+ );
+ @override
+ void setSynchronousReturnValueForShouldOverrideUrlLoading(
int? instanceId,
- bool? shouldOverrideUrlLoading,
+ bool? value,
) =>
super.noSuchMethod(
Invocation.method(
- #create,
+ #setSynchronousReturnValueForShouldOverrideUrlLoading,
[
instanceId,
- shouldOverrideUrlLoading,
+ value,
],
),
returnValueForMissingStub: null,
@@ -1280,10 +1288,16 @@
}
@override
- bool get shouldOverrideUrlLoading => (super.noSuchMethod(
- Invocation.getter(#shouldOverrideUrlLoading),
- returnValue: false,
- ) as bool);
+ _i5.Future<void> setSynchronousReturnValueForShouldOverrideUrlLoading(
+ bool? value) =>
+ (super.noSuchMethod(
+ Invocation.method(
+ #setSynchronousReturnValueForShouldOverrideUrlLoading,
+ [value],
+ ),
+ returnValue: _i5.Future<void>.value(),
+ returnValueForMissingStub: _i5.Future<void>.value(),
+ ) as _i5.Future<void>);
@override
_i2.WebViewClient copy() => (super.noSuchMethod(
Invocation.method(
diff --git a/packages/webview_flutter/webview_flutter_android/test/test_android_webview.pigeon.dart b/packages/webview_flutter/webview_flutter_android/test/test_android_webview.pigeon.dart
index 91a7bf1..bcfb453 100644
--- a/packages/webview_flutter/webview_flutter_android/test/test_android_webview.pigeon.dart
+++ b/packages/webview_flutter/webview_flutter_android/test/test_android_webview.pigeon.dart
@@ -1,7 +1,7 @@
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-// Autogenerated from Pigeon (v4.0.2), do not edit directly.
+// Autogenerated from Pigeon (v4.2.3), do not edit directly.
// See also: https://pub.dev/packages/pigeon
// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, unnecessary_import
// ignore_for_file: avoid_relative_lib_imports
@@ -13,12 +13,13 @@
import 'package:webview_flutter_android/src/android_webview.pigeon.dart';
-class _TestJavaObjectHostApiCodec extends StandardMessageCodec {
- const _TestJavaObjectHostApiCodec();
-}
-
+/// Handles methods calls to the native Java Object class.
+///
+/// Also handles calls to remove the reference to an instance with `dispose`.
+///
+/// See https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html.
abstract class TestJavaObjectHostApi {
- static const MessageCodec<Object?> codec = _TestJavaObjectHostApiCodec();
+ static const MessageCodec<Object?> codec = StandardMessageCodec();
void dispose(int identifier);
static void setup(TestJavaObjectHostApi? api,
@@ -664,12 +665,8 @@
}
}
-class _TestWebSettingsHostApiCodec extends StandardMessageCodec {
- const _TestWebSettingsHostApiCodec();
-}
-
abstract class TestWebSettingsHostApi {
- static const MessageCodec<Object?> codec = _TestWebSettingsHostApiCodec();
+ static const MessageCodec<Object?> codec = StandardMessageCodec();
void create(int instanceId, int webViewInstanceId);
void setDomStorageEnabled(int instanceId, bool flag);
@@ -979,13 +976,8 @@
}
}
-class _TestJavaScriptChannelHostApiCodec extends StandardMessageCodec {
- const _TestJavaScriptChannelHostApiCodec();
-}
-
abstract class TestJavaScriptChannelHostApi {
- static const MessageCodec<Object?> codec =
- _TestJavaScriptChannelHostApiCodec();
+ static const MessageCodec<Object?> codec = StandardMessageCodec();
void create(int instanceId, String channelName);
static void setup(TestJavaScriptChannelHostApi? api,
@@ -1015,14 +1007,12 @@
}
}
-class _TestWebViewClientHostApiCodec extends StandardMessageCodec {
- const _TestWebViewClientHostApiCodec();
-}
-
abstract class TestWebViewClientHostApi {
- static const MessageCodec<Object?> codec = _TestWebViewClientHostApiCodec();
+ static const MessageCodec<Object?> codec = StandardMessageCodec();
- void create(int instanceId, bool shouldOverrideUrlLoading);
+ void create(int instanceId);
+ void setSynchronousReturnValueForShouldOverrideUrlLoading(
+ int instanceId, bool value);
static void setup(TestWebViewClientHostApi? api,
{BinaryMessenger? binaryMessenger}) {
{
@@ -1039,10 +1029,31 @@
final int? arg_instanceId = (args[0] as int?);
assert(arg_instanceId != null,
'Argument for dev.flutter.pigeon.WebViewClientHostApi.create was null, expected non-null int.');
- final bool? arg_shouldOverrideUrlLoading = (args[1] as bool?);
- assert(arg_shouldOverrideUrlLoading != null,
- 'Argument for dev.flutter.pigeon.WebViewClientHostApi.create was null, expected non-null bool.');
- api.create(arg_instanceId!, arg_shouldOverrideUrlLoading!);
+ api.create(arg_instanceId!);
+ return <Object?, Object?>{};
+ });
+ }
+ }
+ {
+ final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+ 'dev.flutter.pigeon.WebViewClientHostApi.setSynchronousReturnValueForShouldOverrideUrlLoading',
+ codec,
+ binaryMessenger: binaryMessenger);
+ if (api == null) {
+ channel.setMockMessageHandler(null);
+ } else {
+ channel.setMockMessageHandler((Object? message) async {
+ assert(message != null,
+ 'Argument for dev.flutter.pigeon.WebViewClientHostApi.setSynchronousReturnValueForShouldOverrideUrlLoading was null.');
+ final List<Object?> args = (message as List<Object?>?)!;
+ final int? arg_instanceId = (args[0] as int?);
+ assert(arg_instanceId != null,
+ 'Argument for dev.flutter.pigeon.WebViewClientHostApi.setSynchronousReturnValueForShouldOverrideUrlLoading was null, expected non-null int.');
+ final bool? arg_value = (args[1] as bool?);
+ assert(arg_value != null,
+ 'Argument for dev.flutter.pigeon.WebViewClientHostApi.setSynchronousReturnValueForShouldOverrideUrlLoading was null, expected non-null bool.');
+ api.setSynchronousReturnValueForShouldOverrideUrlLoading(
+ arg_instanceId!, arg_value!);
return <Object?, Object?>{};
});
}
@@ -1050,13 +1061,8 @@
}
}
-class _TestDownloadListenerHostApiCodec extends StandardMessageCodec {
- const _TestDownloadListenerHostApiCodec();
-}
-
abstract class TestDownloadListenerHostApi {
- static const MessageCodec<Object?> codec =
- _TestDownloadListenerHostApiCodec();
+ static const MessageCodec<Object?> codec = StandardMessageCodec();
void create(int instanceId);
static void setup(TestDownloadListenerHostApi? api,
@@ -1083,12 +1089,8 @@
}
}
-class _TestWebChromeClientHostApiCodec extends StandardMessageCodec {
- const _TestWebChromeClientHostApiCodec();
-}
-
abstract class TestWebChromeClientHostApi {
- static const MessageCodec<Object?> codec = _TestWebChromeClientHostApiCodec();
+ static const MessageCodec<Object?> codec = StandardMessageCodec();
void create(int instanceId);
static void setup(TestWebChromeClientHostApi? api,
@@ -1115,12 +1117,8 @@
}
}
-class _TestAssetManagerHostApiCodec extends StandardMessageCodec {
- const _TestAssetManagerHostApiCodec();
-}
-
abstract class TestAssetManagerHostApi {
- static const MessageCodec<Object?> codec = _TestAssetManagerHostApiCodec();
+ static const MessageCodec<Object?> codec = StandardMessageCodec();
List<String?> list(String path);
String getAssetFilePathByName(String name);
@@ -1168,12 +1166,8 @@
}
}
-class _TestWebStorageHostApiCodec extends StandardMessageCodec {
- const _TestWebStorageHostApiCodec();
-}
-
abstract class TestWebStorageHostApi {
- static const MessageCodec<Object?> codec = _TestWebStorageHostApiCodec();
+ static const MessageCodec<Object?> codec = StandardMessageCodec();
void create(int instanceId);
void deleteAllData(int instanceId);
diff --git a/packages/webview_flutter/webview_flutter_android/test/v4/android_webview_cookie_manager_test.mocks.dart b/packages/webview_flutter/webview_flutter_android/test/v4/android_webview_cookie_manager_test.mocks.dart
index a7279d5..df673fc 100644
--- a/packages/webview_flutter/webview_flutter_android/test/v4/android_webview_cookie_manager_test.mocks.dart
+++ b/packages/webview_flutter/webview_flutter_android/test/v4/android_webview_cookie_manager_test.mocks.dart
@@ -1,4 +1,4 @@
-// Mocks generated by Mockito 5.3.1 from annotations
+// Mocks generated by Mockito 5.3.2 from annotations
// in webview_flutter_android/test/v4/android_webview_cookie_manager_test.dart.
// Do not manually edit this file.
diff --git a/packages/webview_flutter/webview_flutter_android/test/webview_android_cookie_manager_test.mocks.dart b/packages/webview_flutter/webview_flutter_android/test/webview_android_cookie_manager_test.mocks.dart
index dea6d80..725e63a 100644
--- a/packages/webview_flutter/webview_flutter_android/test/webview_android_cookie_manager_test.mocks.dart
+++ b/packages/webview_flutter/webview_flutter_android/test/webview_android_cookie_manager_test.mocks.dart
@@ -1,4 +1,4 @@
-// Mocks generated by Mockito 5.3.1 from annotations
+// Mocks generated by Mockito 5.3.2 from annotations
// in webview_flutter_android/test/webview_android_cookie_manager_test.dart.
// Do not manually edit this file.
diff --git a/packages/webview_flutter/webview_flutter_android/test/webview_android_widget_test.dart b/packages/webview_flutter/webview_flutter_android/test/webview_android_widget_test.dart
index 5eea6db..4d85510 100644
--- a/packages/webview_flutter/webview_flutter_android/test/webview_android_widget_test.dart
+++ b/packages/webview_flutter/webview_flutter_android/test/webview_android_widget_test.dart
@@ -44,7 +44,7 @@
late MockWebViewProxy mockWebViewProxy;
late MockWebViewPlatformCallbacksHandler mockCallbacksHandler;
- late android_webview.WebViewClient webViewClient;
+ late MockWebViewClient mockWebViewClient;
late android_webview.DownloadListener downloadListener;
late android_webview.WebChromeClient webChromeClient;
@@ -57,12 +57,21 @@
mockWebView = MockWebView();
mockWebSettings = MockWebSettings();
mockWebStorage = MockWebStorage();
+ mockWebViewClient = MockWebViewClient();
when(mockWebView.settings).thenReturn(mockWebSettings);
mockWebViewProxy = MockWebViewProxy();
when(mockWebViewProxy.createWebView(
useHybridComposition: anyNamed('useHybridComposition'),
)).thenReturn(mockWebView);
+ when(mockWebViewProxy.createWebViewClient(
+ onPageStarted: anyNamed('onPageStarted'),
+ onPageFinished: anyNamed('onPageFinished'),
+ onReceivedError: anyNamed('onReceivedError'),
+ onReceivedRequestError: anyNamed('onReceivedRequestError'),
+ requestLoading: anyNamed('requestLoading'),
+ urlLoading: anyNamed('urlLoading'),
+ )).thenReturn(mockWebViewClient);
mockCallbacksHandler = MockWebViewPlatformCallbacksHandler();
mockJavascriptChannelRegistry = MockJavascriptChannelRegistry();
@@ -96,7 +105,7 @@
},
));
- webViewClient = testController.webViewClient;
+ mockWebViewClient = testController.webViewClient as MockWebViewClient;
downloadListener = testController.downloadListener;
webChromeClient = testController.webChromeClient;
}
@@ -113,9 +122,9 @@
verify(mockWebSettings.setBuiltInZoomControls(true));
verifyInOrder(<Future<void>>[
- mockWebView.setWebViewClient(webViewClient),
mockWebView.setDownloadListener(downloadListener),
mockWebView.setWebChromeClient(webChromeClient),
+ mockWebView.setWebViewClient(mockWebViewClient),
]);
});
@@ -224,6 +233,16 @@
});
testWidgets('hasNavigationDelegate', (WidgetTester tester) async {
+ final MockWebViewClient mockWebViewClient = MockWebViewClient();
+ when(mockWebViewProxy.createWebViewClient(
+ onPageStarted: anyNamed('onPageStarted'),
+ onPageFinished: anyNamed('onPageFinished'),
+ onReceivedError: anyNamed('onReceivedError'),
+ onReceivedRequestError: anyNamed('onReceivedRequestError'),
+ requestLoading: anyNamed('requestLoading'),
+ urlLoading: anyNamed('urlLoading'),
+ )).thenReturn(mockWebViewClient);
+
await buildWidget(
tester,
creationParams: CreationParams(
@@ -234,7 +253,10 @@
),
);
- expect(testController.webViewClient.shouldOverrideUrlLoading, isTrue);
+ verify(
+ mockWebViewClient
+ .setSynchronousReturnValueForShouldOverrideUrlLoading(true),
+ );
});
testWidgets('debuggingEnabled true', (WidgetTester tester) async {
@@ -691,20 +713,53 @@
group('WebViewPlatformCallbacksHandler', () {
testWidgets('onPageStarted', (WidgetTester tester) async {
await buildWidget(tester);
- webViewClient.onPageStarted!(mockWebView, 'https://google.com');
+ final void Function(android_webview.WebView, String) onPageStarted =
+ verify(mockWebViewProxy.createWebViewClient(
+ onPageStarted: captureAnyNamed('onPageStarted'),
+ onPageFinished: anyNamed('onPageFinished'),
+ onReceivedError: anyNamed('onReceivedError'),
+ onReceivedRequestError: anyNamed('onReceivedRequestError'),
+ requestLoading: anyNamed('requestLoading'),
+ urlLoading: anyNamed('urlLoading'),
+ )).captured.single as Function(android_webview.WebView, String);
+
+ onPageStarted(mockWebView, 'https://google.com');
verify(mockCallbacksHandler.onPageStarted('https://google.com'));
});
testWidgets('onPageFinished', (WidgetTester tester) async {
await buildWidget(tester);
- webViewClient.onPageFinished!(mockWebView, 'https://google.com');
+
+ final void Function(android_webview.WebView, String) onPageFinished =
+ verify(mockWebViewProxy.createWebViewClient(
+ onPageStarted: anyNamed('onPageStarted'),
+ onPageFinished: captureAnyNamed('onPageFinished'),
+ onReceivedError: anyNamed('onReceivedError'),
+ onReceivedRequestError: anyNamed('onReceivedRequestError'),
+ requestLoading: anyNamed('requestLoading'),
+ urlLoading: anyNamed('urlLoading'),
+ )).captured.single as Function(android_webview.WebView, String);
+
+ onPageFinished(mockWebView, 'https://google.com');
verify(mockCallbacksHandler.onPageFinished('https://google.com'));
});
testWidgets('onWebResourceError from onReceivedError',
(WidgetTester tester) async {
await buildWidget(tester);
- webViewClient.onReceivedError!(
+
+ final void Function(android_webview.WebView, int, String, String)
+ onReceivedError = verify(mockWebViewProxy.createWebViewClient(
+ onPageStarted: anyNamed('onPageStarted'),
+ onPageFinished: anyNamed('onPageFinished'),
+ onReceivedError: captureAnyNamed('onReceivedError'),
+ onReceivedRequestError: anyNamed('onReceivedRequestError'),
+ requestLoading: anyNamed('requestLoading'),
+ urlLoading: anyNamed('urlLoading'),
+ )).captured.single as Function(
+ android_webview.WebView, int, String, String);
+
+ onReceivedError(
mockWebView,
android_webview.WebViewClient.errorAuthentication,
'description',
@@ -725,7 +780,25 @@
testWidgets('onWebResourceError from onReceivedRequestError',
(WidgetTester tester) async {
await buildWidget(tester);
- webViewClient.onReceivedRequestError!(
+
+ final void Function(
+ android_webview.WebView,
+ android_webview.WebResourceRequest,
+ android_webview.WebResourceError,
+ ) onReceivedRequestError = verify(mockWebViewProxy.createWebViewClient(
+ onPageStarted: anyNamed('onPageStarted'),
+ onPageFinished: anyNamed('onPageFinished'),
+ onReceivedError: anyNamed('onReceivedError'),
+ onReceivedRequestError: captureAnyNamed('onReceivedRequestError'),
+ requestLoading: anyNamed('requestLoading'),
+ urlLoading: anyNamed('urlLoading'),
+ )).captured.single as Function(
+ android_webview.WebView,
+ android_webview.WebResourceRequest,
+ android_webview.WebResourceError,
+ );
+
+ onReceivedRequestError(
mockWebView,
android_webview.WebResourceRequest(
url: 'https://google.com',
@@ -760,7 +833,17 @@
url: 'https://google.com',
)).thenReturn(true);
- webViewClient.urlLoading!(mockWebView, 'https://google.com');
+ final void Function(android_webview.WebView, String) urlLoading =
+ verify(mockWebViewProxy.createWebViewClient(
+ onPageStarted: anyNamed('onPageStarted'),
+ onPageFinished: anyNamed('onPageFinished'),
+ onReceivedError: anyNamed('onReceivedError'),
+ onReceivedRequestError: anyNamed('onReceivedRequestError'),
+ requestLoading: anyNamed('requestLoading'),
+ urlLoading: captureAnyNamed('urlLoading'),
+ )).captured.single as Function(android_webview.WebView, String);
+
+ urlLoading(mockWebView, 'https://google.com');
verify(mockCallbacksHandler.onNavigationRequest(
url: 'https://google.com',
isForMainFrame: true,
@@ -776,7 +859,22 @@
url: 'https://google.com',
)).thenReturn(true);
- webViewClient.requestLoading!(
+ final void Function(
+ android_webview.WebView,
+ android_webview.WebResourceRequest,
+ ) requestLoading = verify(mockWebViewProxy.createWebViewClient(
+ onPageStarted: anyNamed('onPageStarted'),
+ onPageFinished: anyNamed('onPageFinished'),
+ onReceivedError: anyNamed('onReceivedError'),
+ onReceivedRequestError: anyNamed('onReceivedRequestError'),
+ requestLoading: captureAnyNamed('requestLoading'),
+ urlLoading: anyNamed('urlLoading'),
+ )).captured.single as Function(
+ android_webview.WebView,
+ android_webview.WebResourceRequest,
+ );
+
+ requestLoading(
mockWebView,
android_webview.WebResourceRequest(
url: 'https://google.com',
diff --git a/packages/webview_flutter/webview_flutter_android/test/webview_android_widget_test.mocks.dart b/packages/webview_flutter/webview_flutter_android/test/webview_android_widget_test.mocks.dart
index 390e2ab..a012ae2 100644
--- a/packages/webview_flutter/webview_flutter_android/test/webview_android_widget_test.mocks.dart
+++ b/packages/webview_flutter/webview_flutter_android/test/webview_android_widget_test.mocks.dart
@@ -1,4 +1,4 @@
-// Mocks generated by Mockito 5.3.1 from annotations
+// Mocks generated by Mockito 5.3.2 from annotations
// in webview_flutter_android/test/webview_android_widget_test.dart.
// Do not manually edit this file.
@@ -787,10 +787,16 @@
}
@override
- bool get shouldOverrideUrlLoading => (super.noSuchMethod(
- Invocation.getter(#shouldOverrideUrlLoading),
- returnValue: false,
- ) as bool);
+ _i5.Future<void> setSynchronousReturnValueForShouldOverrideUrlLoading(
+ bool? value) =>
+ (super.noSuchMethod(
+ Invocation.method(
+ #setSynchronousReturnValueForShouldOverrideUrlLoading,
+ [value],
+ ),
+ returnValue: _i5.Future<void>.value(),
+ returnValueForMissingStub: _i5.Future<void>.value(),
+ ) as _i5.Future<void>);
@override
_i2.WebViewClient copy() => (super.noSuchMethod(
Invocation.method(
@@ -932,6 +938,71 @@
),
) as _i2.WebView);
@override
+ _i2.WebViewClient createWebViewClient({
+ void Function(
+ _i2.WebView,
+ String,
+ )?
+ onPageStarted,
+ void Function(
+ _i2.WebView,
+ String,
+ )?
+ onPageFinished,
+ void Function(
+ _i2.WebView,
+ _i2.WebResourceRequest,
+ _i2.WebResourceError,
+ )?
+ onReceivedRequestError,
+ void Function(
+ _i2.WebView,
+ int,
+ String,
+ String,
+ )?
+ onReceivedError,
+ void Function(
+ _i2.WebView,
+ _i2.WebResourceRequest,
+ )?
+ requestLoading,
+ void Function(
+ _i2.WebView,
+ String,
+ )?
+ urlLoading,
+ }) =>
+ (super.noSuchMethod(
+ Invocation.method(
+ #createWebViewClient,
+ [],
+ {
+ #onPageStarted: onPageStarted,
+ #onPageFinished: onPageFinished,
+ #onReceivedRequestError: onReceivedRequestError,
+ #onReceivedError: onReceivedError,
+ #requestLoading: requestLoading,
+ #urlLoading: urlLoading,
+ },
+ ),
+ returnValue: _FakeWebViewClient_8(
+ this,
+ Invocation.method(
+ #createWebViewClient,
+ [],
+ {
+ #onPageStarted: onPageStarted,
+ #onPageFinished: onPageFinished,
+ #onReceivedRequestError: onReceivedRequestError,
+ #onReceivedError: onReceivedError,
+ #requestLoading: requestLoading,
+ #urlLoading: urlLoading,
+ },
+ ),
+ ),
+ ) as _i2.WebViewClient);
+ @override
_i5.Future<void> setWebContentsDebuggingEnabled(bool? enabled) =>
(super.noSuchMethod(
Invocation.method(