Commit 730d409d authored by Tobias Sargeant's avatar Tobias Sargeant Committed by Commit Bot

[aw] Add support library interface for WebViewRenderer

Also introduce infrastructure to support cases where the support library
and Aw* object need to be maintained in a 1:1 mapping.

Bug: 865062
Change-Id: I7b385c252aa6ce3335ec50f8926b241c14850771
Reviewed-on: https://chromium-review.googlesource.com/1185595
Commit-Queue: Tobias Sargeant <tobiasjs@chromium.org>
Reviewed-by: default avatarRichard Coles <torne@chromium.org>
Reviewed-by: default avatarNate Fischer <ntfschr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#586424}
parent 84f31599
...@@ -852,6 +852,7 @@ android_library("android_webview_java") { ...@@ -852,6 +852,7 @@ android_library("android_webview_java") {
"java/src/org/chromium/android_webview/AwServiceWorkerController.java", "java/src/org/chromium/android_webview/AwServiceWorkerController.java",
"java/src/org/chromium/android_webview/AwServiceWorkerSettings.java", "java/src/org/chromium/android_webview/AwServiceWorkerSettings.java",
"java/src/org/chromium/android_webview/AwSettings.java", "java/src/org/chromium/android_webview/AwSettings.java",
"java/src/org/chromium/android_webview/AwSupportLibIsomorphic.java",
"java/src/org/chromium/android_webview/AwSwitches.java", "java/src/org/chromium/android_webview/AwSwitches.java",
"java/src/org/chromium/android_webview/AwTokenBindingManager.java", "java/src/org/chromium/android_webview/AwTokenBindingManager.java",
"java/src/org/chromium/android_webview/AwTracingController.java", "java/src/org/chromium/android_webview/AwTracingController.java",
......
...@@ -8,6 +8,7 @@ import android.webkit.WebChromeClient; ...@@ -8,6 +8,7 @@ import android.webkit.WebChromeClient;
import android.webkit.WebViewClient; import android.webkit.WebViewClient;
import org.chromium.android_webview.AwContents; import org.chromium.android_webview.AwContents;
import org.chromium.android_webview.AwRenderProcess;
import org.chromium.android_webview.WebViewChromiumRunQueue; import org.chromium.android_webview.WebViewChromiumRunQueue;
import org.chromium.base.ThreadUtils; import org.chromium.base.ThreadUtils;
import org.chromium.content_public.browser.MessagePort; import org.chromium.content_public.browser.MessagePort;
...@@ -51,6 +52,14 @@ public class SharedWebViewChromium { ...@@ -51,6 +52,14 @@ public class SharedWebViewChromium {
return mWebChromeClient; return mWebChromeClient;
} }
public AwRenderProcess getRenderProcess() {
mAwInit.startYourEngines(true);
if (checkNeedsPost()) {
return mRunQueue.runOnUiThreadBlocking(() -> getRenderProcess());
}
return mAwContents.getRenderProcess();
}
public void setAwContentsOnUiThread(AwContents awContents) { public void setAwContentsOnUiThread(AwContents awContents) {
assert ThreadUtils.runningOnUiThread(); assert ThreadUtils.runningOnUiThread();
......
...@@ -10,7 +10,7 @@ import org.chromium.base.annotations.JNINamespace; ...@@ -10,7 +10,7 @@ import org.chromium.base.annotations.JNINamespace;
/** /**
*/ */
@JNINamespace("android_webview") @JNINamespace("android_webview")
public final class AwRenderProcess { public final class AwRenderProcess extends AwSupportLibIsomorphic {
private long mNativeRenderProcess; private long mNativeRenderProcess;
private AwRenderProcess() {} private AwRenderProcess() {}
......
// 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.android_webview;
/**
* Abstract base class for objects that are expected to be isomorphic
* (i.e. have a lazy 1:1 mapping for its entire lifetime) with a support
* library object.
*/
public abstract class AwSupportLibIsomorphic {
private Object mSupportLibObject;
public Object getSupportLibObject() {
return mSupportLibObject;
}
public void setSupportLibObject(Object supportLibObject) {
assert mSupportLibObject == null;
mSupportLibObject = supportLibObject;
}
}
...@@ -7,6 +7,7 @@ import("//build/config/android/rules.gni") ...@@ -7,6 +7,7 @@ import("//build/config/android/rules.gni")
android_library("support_lib_glue_java") { android_library("support_lib_glue_java") {
java_files = [ java_files = [
"java/src/org/chromium/support_lib_glue/IsomorphicAdapter.java",
"java/src/org/chromium/support_lib_glue/SupportLibReflectionUtil.java", "java/src/org/chromium/support_lib_glue/SupportLibReflectionUtil.java",
"java/src/org/chromium/support_lib_glue/SupportLibServiceWorkerClientAdapter.java", "java/src/org/chromium/support_lib_glue/SupportLibServiceWorkerClientAdapter.java",
"java/src/org/chromium/support_lib_glue/SupportLibServiceWorkerControllerAdapter.java", "java/src/org/chromium/support_lib_glue/SupportLibServiceWorkerControllerAdapter.java",
...@@ -17,6 +18,7 @@ android_library("support_lib_glue_java") { ...@@ -17,6 +18,7 @@ android_library("support_lib_glue_java") {
"java/src/org/chromium/support_lib_glue/SupportLibWebSettingsAdapter.java", "java/src/org/chromium/support_lib_glue/SupportLibWebSettingsAdapter.java",
"java/src/org/chromium/support_lib_glue/SupportLibWebViewChromium.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/SupportLibWebViewChromiumFactory.java",
"java/src/org/chromium/support_lib_glue/SupportLibWebViewRendererAdapter.java",
"java/src/org/chromium/support_lib_glue/SupportLibWebkitToCompatConverterAdapter.java", "java/src/org/chromium/support_lib_glue/SupportLibWebkitToCompatConverterAdapter.java",
] ]
......
...@@ -8,6 +8,7 @@ import("//build/config/android/rules.gni") ...@@ -8,6 +8,7 @@ import("//build/config/android/rules.gni")
android_library("boundary_interface_java") { android_library("boundary_interface_java") {
java_files = [ java_files = [
"src/org/chromium/support_lib_boundary/FeatureFlagHolderBoundaryInterface.java", "src/org/chromium/support_lib_boundary/FeatureFlagHolderBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/IsomorphicObjectBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/SafeBrowsingResponseBoundaryInterface.java", "src/org/chromium/support_lib_boundary/SafeBrowsingResponseBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/ServiceWorkerClientBoundaryInterface.java", "src/org/chromium/support_lib_boundary/ServiceWorkerClientBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/ServiceWorkerControllerBoundaryInterface.java", "src/org/chromium/support_lib_boundary/ServiceWorkerControllerBoundaryInterface.java",
...@@ -23,6 +24,7 @@ android_library("boundary_interface_java") { ...@@ -23,6 +24,7 @@ android_library("boundary_interface_java") {
"src/org/chromium/support_lib_boundary/WebViewClientBoundaryInterface.java", "src/org/chromium/support_lib_boundary/WebViewClientBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/WebViewProviderBoundaryInterface.java", "src/org/chromium/support_lib_boundary/WebViewProviderBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/WebViewProviderFactoryBoundaryInterface.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/WebkitToCompatConverterBoundaryInterface.java",
"src/org/chromium/support_lib_boundary/util/BoundaryInterfaceReflectionUtil.java", "src/org/chromium/support_lib_boundary/util/BoundaryInterfaceReflectionUtil.java",
"src/org/chromium/support_lib_boundary/util/Features.java", "src/org/chromium/support_lib_boundary/util/Features.java",
......
// 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 java.util.concurrent.Callable;
/**
* Boundary interface to be implemented by any type that needs to maintain an isomorphism (i.e.
* a 1:1 mapping) between the support library objects and their corresponding internal WebView
* objects.
*/
public interface IsomorphicObjectBoundaryInterface {
/**
* Get the peer object associated with this object.
*
* One of the pair of classes for which the corresponding objects
* need to maintain a lazy 1:1 mapping between support library and
* webview should implement this interface.
*
* The mapping is lazy in the sense that one object in the pair
* (the peer) may be created at an arbitrary point after the other,
* but once both objects exist their lifetimes become tied and the
* 1:1 mapping is maintained.
*
* Whether this interface should be implemented by the support library
* class or the webview class depends on which side can be created and
* exist independently. For example, AwRenderProcess objects are created
* by WebView before being passed to the support library, and thus
* SupportLibWebViewRendererAdapter should implement this interface.
*
* @param creationCallable A callable that can be used to construct an appropriate peer
* object, if one is required.
* @return The peer object associated with this object, which either exists already, or has
* been freshly created and recorded.
*/
Object getOrCreatePeer(Callable<Object> creationCallable) throws Exception;
}
...@@ -19,4 +19,5 @@ public interface WebViewProviderBoundaryInterface { ...@@ -19,4 +19,5 @@ public interface WebViewProviderBoundaryInterface {
void postMessageToMainFrame(/* WebMessage */ InvocationHandler message, Uri targetOrigin); void postMessageToMainFrame(/* WebMessage */ InvocationHandler message, Uri targetOrigin);
WebViewClient getWebViewClient(); WebViewClient getWebViewClient();
WebChromeClient getWebChromeClient(); WebChromeClient getWebChromeClient();
/* WebViewRenderer */ InvocationHandler getWebViewRenderer();
} }
// 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;
/**
* Boundary interface for WebViewRenderer.
*/
public interface WebViewRendererBoundaryInterface extends IsomorphicObjectBoundaryInterface {
boolean terminate();
}
...@@ -128,4 +128,10 @@ public class Features { ...@@ -128,4 +128,10 @@ public class Features {
// WebViewCompat.setProxyOverride // WebViewCompat.setProxyOverride
// WebViewCompat.clearProxyOverride // WebViewCompat.clearProxyOverride
public static final String PROXY_OVERRIDE = "PROXY_OVERRIDE"; public static final String PROXY_OVERRIDE = "PROXY_OVERRIDE";
// WebViewCompat.getWebViewRenderer
public static final String GET_WEB_VIEW_RENDERER = "GET_WEB_VIEW_RENDERER";
// WebViewRenderer.terminate
public static final String WEB_VIEW_RENDERER_TERMINATE = "WEB_VIEW_RENDERER_TERMINATE";
} }
// 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 org.chromium.android_webview.AwSupportLibIsomorphic;
import org.chromium.support_lib_boundary.IsomorphicObjectBoundaryInterface;
import java.util.concurrent.Callable;
/**
* Abstract base class for adapters whose objects are isomorphic
*/
abstract class IsomorphicAdapter implements IsomorphicObjectBoundaryInterface {
abstract AwSupportLibIsomorphic getPeeredObject();
@Override
public Object getOrCreatePeer(Callable<Object> creationCallable) throws Exception {
AwSupportLibIsomorphic peeredObject = getPeeredObject();
Object peer = peeredObject.getSupportLibObject();
if (peer == null) {
peeredObject.setSupportLibObject(peer = creationCallable.call());
}
return peer;
}
}
...@@ -70,4 +70,10 @@ class SupportLibWebViewChromium implements WebViewProviderBoundaryInterface { ...@@ -70,4 +70,10 @@ class SupportLibWebViewChromium implements WebViewProviderBoundaryInterface {
public WebChromeClient getWebChromeClient() { public WebChromeClient getWebChromeClient() {
return mSharedWebViewChromium.getWebChromeClient(); return mSharedWebViewChromium.getWebChromeClient();
} }
@Override
public /* WebViewRenderer */ InvocationHandler getWebViewRenderer() {
return BoundaryInterfaceReflectionUtil.createInvocationHandlerFor(
new SupportLibWebViewRendererAdapter(mSharedWebViewChromium.getRenderProcess()));
}
} }
...@@ -63,7 +63,9 @@ class SupportLibWebViewChromiumFactory implements WebViewProviderFactoryBoundary ...@@ -63,7 +63,9 @@ class SupportLibWebViewChromiumFactory implements WebViewProviderFactoryBoundary
Features.WEB_MESSAGE_CALLBACK_ON_MESSAGE, Features.WEB_MESSAGE_CALLBACK_ON_MESSAGE,
Features.GET_WEB_VIEW_CLIENT, Features.GET_WEB_VIEW_CLIENT,
Features.GET_WEB_CHROME_CLIENT, Features.GET_WEB_CHROME_CLIENT,
Features.PROXY_OVERRIDE Features.PROXY_OVERRIDE,
Features.GET_WEB_VIEW_RENDERER,
Features.WEB_VIEW_RENDERER_TERMINATE,
}; };
// clang-format on // 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 org.chromium.android_webview.AwRenderProcess;
import org.chromium.android_webview.AwSupportLibIsomorphic;
import org.chromium.support_lib_boundary.WebViewRendererBoundaryInterface;
/**
* Adapter between WebViewRendererBoundaryInterface and AwRenderProcess.
*/
class SupportLibWebViewRendererAdapter
extends IsomorphicAdapter implements WebViewRendererBoundaryInterface {
private AwRenderProcess mRenderer;
SupportLibWebViewRendererAdapter(AwRenderProcess renderer) {
mRenderer = renderer;
}
@Override
AwSupportLibIsomorphic getPeeredObject() {
return mRenderer;
}
@Override
public boolean terminate() {
return mRenderer.terminate();
}
}
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