Commit a401db91 authored by Oksana Zhuravlova's avatar Oksana Zhuravlova Committed by Commit Bot

[remoteobjects] Inject objects on frame creation

This change implements RemoteObjectInjector#renderFrameCreated to inject
all requested objects into a newly created frame. To get the
RenderFrameHost from render process id and frame id,
a new WebContents JNI method is exposed.

Bug: 1105935,1107555
Change-Id: I3b9119deb64c75550f41a4aeab81ced245613a29
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2337498Reviewed-by: default avatarShimi Zhang <ctzsm@chromium.org>
Reviewed-by: default avatarBo <boliu@chromium.org>
Commit-Queue: Oksana Zhuravlova <oksamyt@chromium.org>
Cr-Commit-Position: refs/heads/master@{#797050}
parent 0559fb62
......@@ -281,6 +281,17 @@ ScopedJavaLocalRef<jobject> WebContentsAndroid::GetFocusedFrame(
return rfh->GetJavaRenderFrameHost();
}
ScopedJavaLocalRef<jobject> WebContentsAndroid::GetRenderFrameHostFromId(
JNIEnv* env,
jint render_process_id,
jint render_frame_id) const {
RenderFrameHost* rfh =
RenderFrameHost::FromID(render_process_id, render_frame_id);
if (!rfh)
return nullptr;
return rfh->GetJavaRenderFrameHost();
}
ScopedJavaLocalRef<jstring> WebContentsAndroid::GetTitle(
JNIEnv* env,
const JavaParamRef<jobject>& obj) const {
......
......@@ -59,6 +59,10 @@ class CONTENT_EXPORT WebContentsAndroid {
base::android::ScopedJavaLocalRef<jobject> GetFocusedFrame(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) const;
base::android::ScopedJavaLocalRef<jobject> GetRenderFrameHostFromId(
JNIEnv* env,
jint render_process_id,
jint render_frame_id) const;
base::android::ScopedJavaLocalRef<jstring> GetTitle(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) const;
......
......@@ -51,11 +51,20 @@ public final class RemoteObjectInjector extends WebContentsObserver {
@Override
public void renderFrameCreated(int renderProcessId, int renderFrameId) {
// TODO(crbug.com/1105935): replicate the necessary logic from
// GinJavaBridgeDispatcherHost::RenderFrameCreated().
if (mInjectedObjects.isEmpty()) return;
// TODO(crbug.com/1107555): get the RenderFrameHost
// from renderProcessId and renderFrameId.
WebContents webContents = mWebContents.get();
if (webContents == null) return;
RenderFrameHost frameHost =
webContents.getRenderFrameHostFromId(renderProcessId, renderFrameId);
if (frameHost == null) return;
for (Map.Entry<String, Pair<Object, Class<? extends Annotation>>> entry :
mInjectedObjects.entrySet()) {
addInterfaceForFrame(
frameHost, entry.getKey(), entry.getValue().first, entry.getValue().second);
}
}
public void addInterface(Object object, String name) {
......@@ -69,10 +78,10 @@ public final class RemoteObjectInjector extends WebContentsObserver {
// TODO(crbug.com/1105935): the objects need to be injected into all frames, not just the
// main one.
addInterfaceForFrame(webContents.getMainFrame(), object, name, requiredAnnotation);
addInterfaceForFrame(webContents.getMainFrame(), name, object, requiredAnnotation);
}
private void addInterfaceForFrame(RenderFrameHost frameHost, Object object, String name,
private void addInterfaceForFrame(RenderFrameHost frameHost, String name, Object object,
Class<? extends Annotation> requiredAnnotation) {
RemoteObjectGatewayHelper helper =
getRemoteObjectGatewayHelperForFrame(frameHost, requiredAnnotation);
......
......@@ -384,6 +384,13 @@ public class WebContentsImpl implements WebContents, RenderFrameHostDelegate, Wi
mNativeWebContentsAndroid, WebContentsImpl.this);
}
@Override
public RenderFrameHost getRenderFrameHostFromId(int renderProcessId, int renderFrameId) {
checkNotDestroyed();
return WebContentsImplJni.get().getRenderFrameHostFromId(
mNativeWebContentsAndroid, renderProcessId, renderFrameId);
}
@Override
public @Nullable RenderWidgetHostViewImpl getRenderWidgetHostView() {
if (mNativeWebContentsAndroid == 0) return null;
......@@ -1052,6 +1059,8 @@ public class WebContentsImpl implements WebContents, RenderFrameHostDelegate, Wi
long nativeWebContentsAndroid, WebContentsImpl caller, WindowAndroid windowAndroid);
RenderFrameHost getMainFrame(long nativeWebContentsAndroid, WebContentsImpl caller);
RenderFrameHost getFocusedFrame(long nativeWebContentsAndroid, WebContentsImpl caller);
RenderFrameHost getRenderFrameHostFromId(
long nativeWebContentsAndroid, int renderProcessId, int renderFrameId);
RenderWidgetHostViewImpl getRenderWidgetHostView(
long nativeWebContentsAndroid, WebContentsImpl caller);
WebContentsImpl[] getInnerWebContents(
......
......@@ -148,6 +148,13 @@ public interface WebContents extends Parcelable {
@Nullable
RenderFrameHost getFocusedFrame();
/**
* @return The frame associated with renderProcessId and renderFrameId. Will be null if the IDs
* do not correspond to a live RenderFrameHost.
*/
@Nullable
RenderFrameHost getRenderFrameHostFromId(int renderProcessId, int renderFrameId);
/**
* @return The root level view from the renderer, or {@code null} in some cases where there is
* none.
......
......@@ -33,9 +33,8 @@ public abstract class WebContentsObserver {
* Called when a RenderFrame for renderFrameHost is created in the
* renderer process.
* To avoid creating a RenderFrameHost object without necessity, only process id and frame id
* are passed.
* TODO(crbug.com/1107555): expose a C++ method to get a Java RenderFrameHost by process id and
* frame id.
* are passed. Call WebContents#getRenderFrameHostFromId() to get the RenderFrameHostImpl object
* if needed.
*/
public void renderFrameCreated(int renderProcessId, int renderFrameId) {}
......
......@@ -90,6 +90,11 @@ public class MockWebContents implements WebContents {
return null;
}
@Override
public RenderFrameHost getRenderFrameHostFromId(int renderProcessId, int renderFrameId) {
return null;
}
@Override
@Nullable
public RenderWidgetHostView getRenderWidgetHostView() {
......
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