Commit 208287be authored by Tobias Sargeant's avatar Tobias Sargeant Committed by Commit Bot

[aw] Support library glue for WebViewRendererClient

This exposes a support library feature allowing applications to set a
WebViewRendererClient object upon which renderer related callbacks are
received. Specifically, these callbacks are:

onRendererUnresponsive(renderer) - called when the renderer associated
    with a webview does not ack an input event, or a navigation does
    not commit within 5 seconds. The callback will continue to be
    called at 5 second intervals until the renderer is killed or the
    unresponsiveness resolves. |renderer| may be null if webview is
    operating in single process mode.

onRendererResponsive(renderer) - called once when an unresponsive
    renderer becomes responsive again.

Bug: 907887
Change-Id: Ic5c74160e293791e3efc051a5727448ee061c9e2
Reviewed-on: https://chromium-review.googlesource.com/c/1361242Reviewed-by: default avatarChangwan Ryu <changwan@chromium.org>
Reviewed-by: default avatarNate Fischer <ntfschr@chromium.org>
Reviewed-by: default avatarRichard Coles <torne@chromium.org>
Commit-Queue: Tobias Sargeant <tobiasjs@chromium.org>
Cr-Commit-Position: refs/heads/master@{#615738}
parent 33f80443
......@@ -62,6 +62,7 @@ android_library("glue") {
"java/src/com/android/webview/chromium/WebViewChromiumFactoryProviderForP.java",
"java/src/com/android/webview/chromium/SharedWebViewChromium.java",
"java/src/com/android/webview/chromium/SharedWebViewContentsClientAdapter.java",
"java/src/com/android/webview/chromium/SharedWebViewRendererClientAdapter.java",
"java/src/com/android/webview/chromium/WebViewContentsClientAdapter.java",
"java/src/com/android/webview/chromium/WebViewDatabaseAdapter.java",
"java/src/com/android/webview/chromium/WebViewDelegateFactory.java",
......
......@@ -117,6 +117,34 @@ public class SharedWebViewChromium {
mAwContents.postMessageToFrame(null, message, targetOrigin, sentPorts);
}
public void setWebViewRendererClientAdapter(
SharedWebViewRendererClientAdapter webViewRendererClientAdapter) {
if (checkNeedsPost()) {
mRunQueue.addTask(new Runnable() {
@Override
public void run() {
setWebViewRendererClientAdapter(webViewRendererClientAdapter);
}
});
return;
}
mContentsClientAdapter.setWebViewRendererClientAdapter(webViewRendererClientAdapter);
}
public SharedWebViewRendererClientAdapter getWebViewRendererClientAdapter() {
mAwInit.startYourEngines(true);
if (checkNeedsPost()) {
return mRunQueue.runOnUiThreadBlocking(
new Callable<SharedWebViewRendererClientAdapter>() {
@Override
public SharedWebViewRendererClientAdapter call() {
return getWebViewRendererClientAdapter();
}
});
}
return mContentsClientAdapter.getWebViewRendererClientAdapter();
}
protected boolean checkNeedsPost() {
boolean needsPost = !mRunQueue.chromiumHasStarted() || !ThreadUtils.runningOnUiThread();
if (!needsPost && mAwContents == null) {
......
......@@ -6,6 +6,7 @@ package com.android.webview.chromium;
import android.content.Context;
import android.os.Build;
import android.support.annotation.Nullable;
import android.webkit.WebResourceResponse;
import android.webkit.WebView;
import android.webkit.WebViewClient;
......@@ -13,6 +14,7 @@ import android.webkit.WebViewClient;
import com.android.webview.chromium.WebViewDelegateFactory.WebViewDelegate;
import org.chromium.android_webview.AwContentsClient;
import org.chromium.android_webview.AwRenderProcess;
import org.chromium.android_webview.AwSafeBrowsingResponse;
import org.chromium.android_webview.AwWebResourceResponse;
import org.chromium.android_webview.SafeBrowsingAction;
......@@ -42,6 +44,9 @@ abstract class SharedWebViewContentsClientAdapter extends AwContentsClient {
protected WebViewClient mWebViewClient = SharedWebViewChromium.sNullWebViewClient;
// Some callbacks will be forwarded to this client for apps using the support library.
private final SupportLibWebViewContentsClientAdapter mSupportLibClient;
private @Nullable SharedWebViewRendererClientAdapter mWebViewRendererClientAdapter;
/**
* Adapter constructor.
*
......@@ -216,4 +221,25 @@ abstract class SharedWebViewContentsClientAdapter extends AwContentsClient {
TraceEvent.end("WebViewContentsClientAdapter.onReceivedHttpError");
}
}
void setWebViewRendererClientAdapter(
SharedWebViewRendererClientAdapter webViewRendererClientAdapter) {
mWebViewRendererClientAdapter = webViewRendererClientAdapter;
}
SharedWebViewRendererClientAdapter getWebViewRendererClientAdapter() {
return mWebViewRendererClientAdapter;
}
@Override
public void onRendererUnresponsive(final AwRenderProcess renderProcess) {
if (mWebViewRendererClientAdapter != null)
mWebViewRendererClientAdapter.onRendererUnresponsive(mWebView, renderProcess);
}
@Override
public void onRendererResponsive(final AwRenderProcess renderProcess) {
if (mWebViewRendererClientAdapter != null)
mWebViewRendererClientAdapter.onRendererResponsive(mWebView, renderProcess);
}
}
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package com.android.webview.chromium;
import android.webkit.WebView;
import org.chromium.android_webview.AwRenderProcess;
import java.lang.reflect.InvocationHandler;
/**
*/
public class SharedWebViewRendererClientAdapter {
public SharedWebViewRendererClientAdapter() {}
public InvocationHandler getSupportLibInvocationHandler() {
return null;
}
public void onRendererUnresponsive(final WebView view, final AwRenderProcess renderProcess) {}
public void onRendererResponsive(final WebView view, final AwRenderProcess renderProcess) {}
}
......@@ -42,7 +42,6 @@ import org.chromium.android_webview.AwContentsClient;
import org.chromium.android_webview.AwContentsClientBridge;
import org.chromium.android_webview.AwGeolocationPermissions;
import org.chromium.android_webview.AwHttpAuthHandler;
import org.chromium.android_webview.AwRenderProcess;
import org.chromium.android_webview.AwRenderProcessGoneDetail;
import org.chromium.android_webview.AwWebResourceResponse;
import org.chromium.android_webview.JsPromptResultReceiver;
......@@ -1019,14 +1018,6 @@ class WebViewContentsClientAdapter extends SharedWebViewContentsClientAdapter {
}
}
// TODO(tobiasjs) connect to support app-settable callbacks.
@Override
public void onRendererUnresponsive(final AwRenderProcess renderProcess) {}
// TODO(tobiasjs) connect to support app-settable callbacks.
@Override
public void onRendererResponsive(final AwRenderProcess renderProcess) {}
@Override
public boolean onRenderProcessGone(final AwRenderProcessGoneDetail detail) {
// WebViewClient.onRenderProcessGone was added in O.
......
......@@ -20,6 +20,7 @@ android_library("support_lib_glue_java") {
"java/src/org/chromium/support_lib_glue/SupportLibWebViewChromium.java",
"java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java",
"java/src/org/chromium/support_lib_glue/SupportLibWebViewRendererAdapter.java",
"java/src/org/chromium/support_lib_glue/SupportLibWebViewRendererClientAdapter.java",
"java/src/org/chromium/support_lib_glue/SupportLibWebkitToCompatConverterAdapter.java",
]
......
......@@ -16,6 +16,7 @@ android_library("boundary_interface_java") {
"src/org/chromium/support_lib_boundary/StaticsBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/TracingControllerBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/VisualStateCallbackBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/WebkitToCompatConverterBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/WebMessageBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/WebMessageCallbackBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/WebMessagePortBoundaryInterface.java",
......@@ -26,7 +27,7 @@ android_library("boundary_interface_java") {
"src/org/chromium/support_lib_boundary/WebViewProviderBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/WebViewProviderFactoryBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/WebViewRendererBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/WebkitToCompatConverterBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/WebViewRendererClientBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/util/BoundaryInterfaceReflectionUtil.java",
"src/org/chromium/support_lib_boundary/util/Features.java",
]
......
......@@ -20,4 +20,7 @@ public interface WebViewProviderBoundaryInterface {
WebViewClient getWebViewClient();
WebChromeClient getWebChromeClient();
/* WebViewRenderer */ InvocationHandler getWebViewRenderer();
/* WebViewRendererClient */ InvocationHandler getWebViewRendererClient();
void setWebViewRendererClient(
/* WebViewRendererClient */ InvocationHandler webViewRendererClient);
}
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.support_lib_boundary;
import android.webkit.WebView;
import java.lang.reflect.InvocationHandler;
/**
* Boundary interface for WebViewRendererClient.
*/
public interface WebViewRendererClientBoundaryInterface extends FeatureFlagHolderBoundaryInterface {
void onRendererUnresponsive(WebView view, /* WebViewRenderer */ InvocationHandler renderer);
void onRendererResponsive(WebView view, /* WebViewRenderer */ InvocationHandler renderer);
}
......@@ -143,4 +143,13 @@ public class Features {
// TracingController.start
// TracingController.stop
public static final String TRACING_CONTROLLER_BASIC_USAGE = "TRACING_CONTROLLER_BASIC_USAGE";
// Renderer client set/getter and callbacks:
//
// WebView.getWebViewRendererClient
// WebView.setWebViewRendererClient
// WebViewRendererClient.onRendererUnresponsive()
// WebViewRendererClient.onRendererResponsive()
public static final String WEB_VIEW_RENDERER_CLIENT_BASIC_USAGE =
"WEB_VIEW_RENDERER_CLIENT_BASIC_USAGE";
}
......@@ -9,6 +9,7 @@ import android.webkit.WebChromeClient;
import android.webkit.WebViewClient;
import com.android.webview.chromium.SharedWebViewChromium;
import com.android.webview.chromium.SharedWebViewRendererClientAdapter;
import org.chromium.android_webview.AwContents;
import org.chromium.support_lib_boundary.VisualStateCallbackBoundaryInterface;
......@@ -20,6 +21,9 @@ import java.lang.reflect.InvocationHandler;
/**
* Support library glue version of WebViewChromium.
*
* A new instance of this class is created transiently for every shared library
* WebViewCompat call. Do not store state here.
*/
class SupportLibWebViewChromium implements WebViewProviderBoundaryInterface {
private final SharedWebViewChromium mSharedWebViewChromium;
......@@ -76,4 +80,21 @@ class SupportLibWebViewChromium implements WebViewProviderBoundaryInterface {
return BoundaryInterfaceReflectionUtil.createInvocationHandlerFor(
new SupportLibWebViewRendererAdapter(mSharedWebViewChromium.getRenderProcess()));
}
@Override
public /* WebViewRendererClient */ InvocationHandler getWebViewRendererClient() {
SharedWebViewRendererClientAdapter webViewRendererClientAdapter =
mSharedWebViewChromium.getWebViewRendererClientAdapter();
return webViewRendererClientAdapter != null
? webViewRendererClientAdapter.getSupportLibInvocationHandler()
: null;
}
@Override
public void setWebViewRendererClient(
/* WebViewRendererClient */ InvocationHandler webViewRendererClient) {
mSharedWebViewChromium.setWebViewRendererClientAdapter(webViewRendererClient != null
? new SupportLibWebViewRendererClientAdapter(webViewRendererClient)
: null);
}
}
......@@ -68,6 +68,7 @@ class SupportLibWebViewChromiumFactory implements WebViewProviderFactoryBoundary
Features.GET_WEB_VIEW_RENDERER,
Features.WEB_VIEW_RENDERER_TERMINATE,
Features.TRACING_CONTROLLER_BASIC_USAGE,
Features.WEB_VIEW_RENDERER_CLIENT_BASIC_USAGE + Features.DEV_SUFFIX,
};
// clang-format on
......
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.support_lib_glue;
import android.webkit.WebView;
import com.android.webview.chromium.SharedWebViewRendererClientAdapter;
import org.chromium.android_webview.AwRenderProcess;
import org.chromium.support_lib_boundary.WebViewRendererClientBoundaryInterface;
import org.chromium.support_lib_boundary.util.BoundaryInterfaceReflectionUtil;
import org.chromium.support_lib_boundary.util.Features;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
/**
* Support library glue renderer client callback dapter.
*
* A new instance of this class is created transiently for every shared library
* WebViewCompat call. Do not store state here.
*/
class SupportLibWebViewRendererClientAdapter extends SharedWebViewRendererClientAdapter {
private WebViewRendererClientBoundaryInterface mImpl;
private String[] mSupportedFeatures;
public SupportLibWebViewRendererClientAdapter(
/* WebViewRendererClient */ InvocationHandler invocationHandler) {
mImpl = BoundaryInterfaceReflectionUtil.castToSuppLibClass(
WebViewRendererClientBoundaryInterface.class, invocationHandler);
mSupportedFeatures = mImpl.getSupportedFeatures();
}
@Override
public /* WebViewRendererClient */ InvocationHandler getSupportLibInvocationHandler() {
return Proxy.getInvocationHandler(mImpl);
}
@Override
public void onRendererUnresponsive(final WebView webView, final AwRenderProcess renderProcess) {
if (!BoundaryInterfaceReflectionUtil.containsFeature(
mSupportedFeatures, Features.WEB_VIEW_RENDERER_CLIENT_BASIC_USAGE)) {
return;
}
mImpl.onRendererUnresponsive(webView,
BoundaryInterfaceReflectionUtil.createInvocationHandlerFor(
new SupportLibWebViewRendererAdapter(renderProcess)));
}
@Override
public void onRendererResponsive(final WebView webView, final AwRenderProcess renderProcess) {
if (!BoundaryInterfaceReflectionUtil.containsFeature(
mSupportedFeatures, Features.WEB_VIEW_RENDERER_CLIENT_BASIC_USAGE)) {
return;
}
mImpl.onRendererResponsive(webView,
BoundaryInterfaceReflectionUtil.createInvocationHandlerFor(
new SupportLibWebViewRendererAdapter(renderProcess)));
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment