[Webkit] Add executor parameter to url prerender API
Restricting the API to be called only from the UI thread.
Switch form the deprecated androidx CancellationSignal to the framework one.
Relnote: "Add executor parameter to the url prerendering API.
Also, restricting the API to be called only from the UI thread."
Bug: 375375703
Test: N/A
Change-Id: I505202159a24e7d5ba494ed1075422c6b0800fbc
diff --git a/webkit/webkit/api/current.txt b/webkit/webkit/api/current.txt
index 77fa0ba..d147a89 100644
--- a/webkit/webkit/api/current.txt
+++ b/webkit/webkit/api/current.txt
@@ -406,8 +406,8 @@
method @AnyThread @RequiresFeature(name=androidx.webkit.WebViewFeature.MULTI_PROCESS, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static boolean isMultiProcessEnabled();
method @RequiresFeature(name=androidx.webkit.WebViewFeature.VISUAL_STATE_CALLBACK, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread public static void postVisualStateCallback(android.webkit.WebView, long, androidx.webkit.WebViewCompat.VisualStateCallback);
method @RequiresFeature(name=androidx.webkit.WebViewFeature.POST_WEB_MESSAGE, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread public static void postWebMessage(android.webkit.WebView, androidx.webkit.WebMessageCompat, android.net.Uri);
- method @SuppressCompatibility @AnyThread @RequiresFeature(name=androidx.webkit.WebViewFeature.PRERENDER_WITH_URL, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @androidx.webkit.WebViewCompat.ExperimentalUrlPrerender public static void prerenderUrlAsync(android.webkit.WebView, String, androidx.core.os.CancellationSignal?, androidx.webkit.PrerenderOperationCallback);
- method @SuppressCompatibility @AnyThread @RequiresFeature(name=androidx.webkit.WebViewFeature.PRERENDER_WITH_URL, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @androidx.webkit.WebViewCompat.ExperimentalUrlPrerender public static void prerenderUrlAsync(android.webkit.WebView, String, androidx.core.os.CancellationSignal?, androidx.webkit.SpeculativeLoadingParameters, androidx.webkit.PrerenderOperationCallback);
+ method @SuppressCompatibility @RequiresFeature(name=androidx.webkit.WebViewFeature.PRERENDER_WITH_URL, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread @androidx.webkit.WebViewCompat.ExperimentalUrlPrerender public static void prerenderUrl(android.webkit.WebView, String, android.os.CancellationSignal?, java.util.concurrent.Executor, androidx.webkit.PrerenderOperationCallback);
+ method @SuppressCompatibility @RequiresFeature(name=androidx.webkit.WebViewFeature.PRERENDER_WITH_URL, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread @androidx.webkit.WebViewCompat.ExperimentalUrlPrerender public static void prerenderUrl(android.webkit.WebView, String, android.os.CancellationSignal?, java.util.concurrent.Executor, androidx.webkit.SpeculativeLoadingParameters, androidx.webkit.PrerenderOperationCallback);
method @RequiresFeature(name=androidx.webkit.WebViewFeature.WEB_MESSAGE_LISTENER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread public static void removeWebMessageListener(android.webkit.WebView, String);
method @RequiresFeature(name=androidx.webkit.WebViewFeature.MUTE_AUDIO, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread public static void setAudioMuted(android.webkit.WebView, boolean);
method @AnyThread @RequiresFeature(name=androidx.webkit.WebViewFeature.DEFAULT_TRAFFICSTATS_TAGGING, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setDefaultTrafficStatsTag(int);
@@ -462,7 +462,7 @@
field public static final String MUTE_AUDIO = "MUTE_AUDIO";
field public static final String OFF_SCREEN_PRERASTER = "OFF_SCREEN_PRERASTER";
field public static final String POST_WEB_MESSAGE = "POST_WEB_MESSAGE";
- field @SuppressCompatibility @androidx.webkit.WebViewCompat.ExperimentalUrlPrerender public static final String PRERENDER_WITH_URL = "PRERENDER_URL";
+ field @SuppressCompatibility @androidx.webkit.WebViewCompat.ExperimentalUrlPrerender public static final String PRERENDER_WITH_URL = "PRERENDER_URL_V2";
field @SuppressCompatibility @androidx.webkit.Profile.ExperimentalUrlPrefetch public static final String PROFILE_URL_PREFETCH = "PREFETCH_URL_V3";
field public static final String PROXY_OVERRIDE = "PROXY_OVERRIDE";
field public static final String PROXY_OVERRIDE_REVERSE_BYPASS = "PROXY_OVERRIDE_REVERSE_BYPASS";
diff --git a/webkit/webkit/api/restricted_current.txt b/webkit/webkit/api/restricted_current.txt
index 77fa0ba..d147a89 100644
--- a/webkit/webkit/api/restricted_current.txt
+++ b/webkit/webkit/api/restricted_current.txt
@@ -406,8 +406,8 @@
method @AnyThread @RequiresFeature(name=androidx.webkit.WebViewFeature.MULTI_PROCESS, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static boolean isMultiProcessEnabled();
method @RequiresFeature(name=androidx.webkit.WebViewFeature.VISUAL_STATE_CALLBACK, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread public static void postVisualStateCallback(android.webkit.WebView, long, androidx.webkit.WebViewCompat.VisualStateCallback);
method @RequiresFeature(name=androidx.webkit.WebViewFeature.POST_WEB_MESSAGE, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread public static void postWebMessage(android.webkit.WebView, androidx.webkit.WebMessageCompat, android.net.Uri);
- method @SuppressCompatibility @AnyThread @RequiresFeature(name=androidx.webkit.WebViewFeature.PRERENDER_WITH_URL, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @androidx.webkit.WebViewCompat.ExperimentalUrlPrerender public static void prerenderUrlAsync(android.webkit.WebView, String, androidx.core.os.CancellationSignal?, androidx.webkit.PrerenderOperationCallback);
- method @SuppressCompatibility @AnyThread @RequiresFeature(name=androidx.webkit.WebViewFeature.PRERENDER_WITH_URL, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @androidx.webkit.WebViewCompat.ExperimentalUrlPrerender public static void prerenderUrlAsync(android.webkit.WebView, String, androidx.core.os.CancellationSignal?, androidx.webkit.SpeculativeLoadingParameters, androidx.webkit.PrerenderOperationCallback);
+ method @SuppressCompatibility @RequiresFeature(name=androidx.webkit.WebViewFeature.PRERENDER_WITH_URL, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread @androidx.webkit.WebViewCompat.ExperimentalUrlPrerender public static void prerenderUrl(android.webkit.WebView, String, android.os.CancellationSignal?, java.util.concurrent.Executor, androidx.webkit.PrerenderOperationCallback);
+ method @SuppressCompatibility @RequiresFeature(name=androidx.webkit.WebViewFeature.PRERENDER_WITH_URL, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread @androidx.webkit.WebViewCompat.ExperimentalUrlPrerender public static void prerenderUrl(android.webkit.WebView, String, android.os.CancellationSignal?, java.util.concurrent.Executor, androidx.webkit.SpeculativeLoadingParameters, androidx.webkit.PrerenderOperationCallback);
method @RequiresFeature(name=androidx.webkit.WebViewFeature.WEB_MESSAGE_LISTENER, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread public static void removeWebMessageListener(android.webkit.WebView, String);
method @RequiresFeature(name=androidx.webkit.WebViewFeature.MUTE_AUDIO, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") @UiThread public static void setAudioMuted(android.webkit.WebView, boolean);
method @AnyThread @RequiresFeature(name=androidx.webkit.WebViewFeature.DEFAULT_TRAFFICSTATS_TAGGING, enforcement="androidx.webkit.WebViewFeature#isFeatureSupported") public static void setDefaultTrafficStatsTag(int);
@@ -462,7 +462,7 @@
field public static final String MUTE_AUDIO = "MUTE_AUDIO";
field public static final String OFF_SCREEN_PRERASTER = "OFF_SCREEN_PRERASTER";
field public static final String POST_WEB_MESSAGE = "POST_WEB_MESSAGE";
- field @SuppressCompatibility @androidx.webkit.WebViewCompat.ExperimentalUrlPrerender public static final String PRERENDER_WITH_URL = "PRERENDER_URL";
+ field @SuppressCompatibility @androidx.webkit.WebViewCompat.ExperimentalUrlPrerender public static final String PRERENDER_WITH_URL = "PRERENDER_URL_V2";
field @SuppressCompatibility @androidx.webkit.Profile.ExperimentalUrlPrefetch public static final String PROFILE_URL_PREFETCH = "PREFETCH_URL_V3";
field public static final String PROXY_OVERRIDE = "PROXY_OVERRIDE";
field public static final String PROXY_OVERRIDE_REVERSE_BYPASS = "PROXY_OVERRIDE_REVERSE_BYPASS";
diff --git a/webkit/webkit/src/main/java/androidx/webkit/WebViewCompat.java b/webkit/webkit/src/main/java/androidx/webkit/WebViewCompat.java
index 0fde2c0..a461177 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/WebViewCompat.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/WebViewCompat.java
@@ -22,6 +22,7 @@
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
+import android.os.CancellationSignal;
import android.os.Handler;
import android.os.Looper;
import android.webkit.ValueCallback;
@@ -35,7 +36,6 @@
import androidx.annotation.RequiresOptIn;
import androidx.annotation.RestrictTo;
import androidx.annotation.UiThread;
-import androidx.core.os.CancellationSignal;
import androidx.webkit.internal.ApiFeature;
import androidx.webkit.internal.ApiHelperForM;
import androidx.webkit.internal.ApiHelperForO;
@@ -1341,8 +1341,7 @@
}
/**
- * Starts a URL prerender request for this WebView. Can be called from any
- * thread.
+ * Starts a URL prerender request for this WebView. Must be called from the UI thread.
* <p>
* This WebView will use a URL request matching algorithm during execution
* of all variants of {@link android.webkit.WebView#loadUrl(String)} for
@@ -1363,26 +1362,26 @@
* <p>
* The {@link CancellationSignal} will make the best effort to cancel an
* in-flight prerender request; however cancellation it is not guaranteed.
- * <p>
- * All result callbacks will be resolved on the calling thread.
*
* @param webView the WebView for which we trigger the prerender request.
* @param url the url associated with the prerender request.
* @param cancellationSignal used to trigger prerender cancellation.
+ * @param callbackExecutor the executor to resolve the callback with.
* @param callback callbacks for reporting result back to application.
*/
@RequiresFeature(name = WebViewFeature.PRERENDER_WITH_URL,
enforcement = "androidx.webkit.WebViewFeature#isFeatureSupported")
- @AnyThread
+ @UiThread
@ExperimentalUrlPrerender
- public static void prerenderUrlAsync(
+ public static void prerenderUrl(
@NonNull WebView webView,
@NonNull String url,
@Nullable CancellationSignal cancellationSignal,
+ @NonNull Executor callbackExecutor,
@NonNull PrerenderOperationCallback callback) {
ApiFeature.NoFramework feature = WebViewFeatureInternal.PRERENDER_WITH_URL;
if (feature.isSupportedByWebView()) {
- getProvider(webView).prerenderUrlAsync(url, cancellationSignal, callback);
+ getProvider(webView).prerenderUrl(url, cancellationSignal, callbackExecutor, callback);
} else {
throw WebViewFeatureInternal.getUnsupportedOperationException();
}
@@ -1390,28 +1389,31 @@
/**
* The same as
- * {@link WebViewCompat#prerenderUrlAsync(WebView, String, CancellationSignal, PrerenderOperationCallback)},
+ * {@link WebViewCompat#prerenderUrl(WebView, String, CancellationSignal, Executor, PrerenderOperationCallback)},
* but allows customizing the request by providing {@link SpeculativeLoadingParameters}.
*
* @param webView the WebView for which we trigger the prerender request.
* @param url the url associated with the prerender request.
* @param cancellationSignal used to trigger prerender cancellation.
+ * @param callbackExecutor the executor to resolve the callback with.
* @param params parameters to customize the prerender request.
* @param callback callbacks for reporting result back to application.
*/
@RequiresFeature(name = WebViewFeature.PRERENDER_WITH_URL,
enforcement = "androidx.webkit.WebViewFeature#isFeatureSupported")
- @AnyThread
+ @UiThread
@ExperimentalUrlPrerender
- public static void prerenderUrlAsync(
+ public static void prerenderUrl(
@NonNull WebView webView,
@NonNull String url,
@Nullable CancellationSignal cancellationSignal,
+ @NonNull Executor callbackExecutor,
@NonNull SpeculativeLoadingParameters params,
@NonNull PrerenderOperationCallback callback) {
ApiFeature.NoFramework feature = WebViewFeatureInternal.PRERENDER_WITH_URL;
if (feature.isSupportedByWebView()) {
- getProvider(webView).prerenderUrlAsync(url, cancellationSignal, params, callback);
+ getProvider(webView).prerenderUrl(url, cancellationSignal, callbackExecutor, params,
+ callback);
} else {
throw WebViewFeatureInternal.getUnsupportedOperationException();
}
diff --git a/webkit/webkit/src/main/java/androidx/webkit/WebViewFeature.java b/webkit/webkit/src/main/java/androidx/webkit/WebViewFeature.java
index 2ff0751..d532198 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/WebViewFeature.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/WebViewFeature.java
@@ -653,11 +653,11 @@
/**
* Feature for {@link #isFeatureSupported(String)}.
* This feature covers
- * {@link androidx.webkit.WebViewCompat#prerenderUrlAsync(WebView, String,
- * SpeculativeLoadingParameters, CancellationSignal, PrerenderOperationCallback)}}
+ * {@link androidx.webkit.WebViewCompat#prerenderUrl(WebView, String, CancellationSignal,
+ * Executor, SpeculativeLoadingParameters, PrerenderOperationCallback)}}
*/
@WebViewCompat.ExperimentalUrlPrerender
- public static final String PRERENDER_WITH_URL = "PRERENDER_URL";
+ public static final String PRERENDER_WITH_URL = "PRERENDER_URL_V2";
/**
* Return whether a feature is supported at run-time. This will check whether a feature is
diff --git a/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewFeatureInternal.java b/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewFeatureInternal.java
index dc818ef..cfd2156 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewFeatureInternal.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewFeatureInternal.java
@@ -31,6 +31,7 @@
import androidx.annotation.RestrictTo;
import androidx.annotation.VisibleForTesting;
import androidx.webkit.OutcomeReceiverCompat;
+import androidx.webkit.PrerenderOperationCallback;
import androidx.webkit.Profile;
import androidx.webkit.ProfileStore;
import androidx.webkit.ProxyConfig;
@@ -688,8 +689,9 @@
/**
* Feature for {@link WebViewFeature#isFeatureSupported(String)}.
- * This feature covers {@link androidx.webkit.WebViewCompat#prerenderUrlAsync(WebView, String,
- * SpeculativeLoadingParameters, CancellationSignal, PrerenderOperationCallback)}}
+ * This feature covers
+ * {@link androidx.webkit.WebViewCompat#prerenderUrl(WebView, String, CancellationSignal, Executor,
+ * SpeculativeLoadingParameters, PrerenderOperationCallback)}}
*/
public static final ApiFeature.NoFramework PRERENDER_WITH_URL =
new ApiFeature.NoFramework(WebViewFeature.PRERENDER_WITH_URL,
diff --git a/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewProviderAdapter.java b/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewProviderAdapter.java
index 0bfb95e..44b00b1 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewProviderAdapter.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/internal/WebViewProviderAdapter.java
@@ -18,11 +18,13 @@
import android.annotation.SuppressLint;
import android.net.Uri;
+import android.os.CancellationSignal;
+import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
-import androidx.core.os.CancellationSignal;
+import androidx.webkit.PrerenderException;
import androidx.webkit.PrerenderOperationCallback;
import androidx.webkit.Profile;
import androidx.webkit.SpeculativeLoadingParameters;
@@ -194,24 +196,58 @@
/**
* Adapter method for
- * {@link WebViewCompat#prerenderUrlAsync(WebView, String, CancellationSignal,
+ * {@link WebViewCompat#prerenderUrl(WebView, String, CancellationSignal, Executor,
* PrerenderOperationCallback)}.
*/
- public void prerenderUrlAsync(
+ public void prerenderUrl(
@NonNull String url,
@Nullable CancellationSignal cancellationSignal,
+ @NonNull Executor callbackExecutor,
@NonNull PrerenderOperationCallback callback) {
+
+ ValueCallback<Void> activationCallback = (value) -> {
+ // value will always be null.
+ callback.onPrerenderActivated();
+ };
+ ValueCallback<Throwable> errorCallback = (throwable) -> {
+ callback.onError(new PrerenderException("Prerender operation failed", throwable));
+ };
+ mImpl.prerenderUrl(
+ url,
+ cancellationSignal,
+ callbackExecutor,
+ activationCallback,
+ errorCallback);
}
/**
* Adapter method for
- * {@link WebViewCompat#prerenderUrlAsync(WebView, String, CancellationSignal,
+ * {@link WebViewCompat#prerenderUrl(WebView, String, CancellationSignal, Executor,
* SpeculativeLoadingParameters, PrerenderOperationCallback)}.
*/
- public void prerenderUrlAsync(
+ public void prerenderUrl(
@NonNull String url,
@Nullable CancellationSignal cancellationSignal,
+ @NonNull Executor callbackExecutor,
@NonNull SpeculativeLoadingParameters params,
@NonNull PrerenderOperationCallback callback) {
+
+ InvocationHandler paramsBoundaryInterface =
+ BoundaryInterfaceReflectionUtil.createInvocationHandlerFor(
+ new SpeculativeLoadingParametersAdapter(params));
+ ValueCallback<Void> activationCallback = (value) -> {
+ // value will always be null.
+ callback.onPrerenderActivated();
+ };
+ ValueCallback<Throwable> errorCallback = (throwable) -> {
+ callback.onError(new PrerenderException("Prerender operation failed", throwable));
+ };
+ mImpl.prerenderUrl(
+ url,
+ cancellationSignal,
+ callbackExecutor,
+ paramsBoundaryInterface,
+ activationCallback,
+ errorCallback);
}
}