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( ...@@ -281,6 +281,17 @@ ScopedJavaLocalRef<jobject> WebContentsAndroid::GetFocusedFrame(
return rfh->GetJavaRenderFrameHost(); 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( ScopedJavaLocalRef<jstring> WebContentsAndroid::GetTitle(
JNIEnv* env, JNIEnv* env,
const JavaParamRef<jobject>& obj) const { const JavaParamRef<jobject>& obj) const {
......
...@@ -59,6 +59,10 @@ class CONTENT_EXPORT WebContentsAndroid { ...@@ -59,6 +59,10 @@ class CONTENT_EXPORT WebContentsAndroid {
base::android::ScopedJavaLocalRef<jobject> GetFocusedFrame( base::android::ScopedJavaLocalRef<jobject> GetFocusedFrame(
JNIEnv* env, JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) const; 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( base::android::ScopedJavaLocalRef<jstring> GetTitle(
JNIEnv* env, JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) const; const base::android::JavaParamRef<jobject>& obj) const;
......
...@@ -51,11 +51,20 @@ public final class RemoteObjectInjector extends WebContentsObserver { ...@@ -51,11 +51,20 @@ public final class RemoteObjectInjector extends WebContentsObserver {
@Override @Override
public void renderFrameCreated(int renderProcessId, int renderFrameId) { public void renderFrameCreated(int renderProcessId, int renderFrameId) {
// TODO(crbug.com/1105935): replicate the necessary logic from if (mInjectedObjects.isEmpty()) return;
// GinJavaBridgeDispatcherHost::RenderFrameCreated().
// TODO(crbug.com/1107555): get the RenderFrameHost WebContents webContents = mWebContents.get();
// from renderProcessId and renderFrameId. 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) { public void addInterface(Object object, String name) {
...@@ -69,10 +78,10 @@ public final class RemoteObjectInjector extends WebContentsObserver { ...@@ -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 // TODO(crbug.com/1105935): the objects need to be injected into all frames, not just the
// main one. // 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) { Class<? extends Annotation> requiredAnnotation) {
RemoteObjectGatewayHelper helper = RemoteObjectGatewayHelper helper =
getRemoteObjectGatewayHelperForFrame(frameHost, requiredAnnotation); getRemoteObjectGatewayHelperForFrame(frameHost, requiredAnnotation);
......
...@@ -384,6 +384,13 @@ public class WebContentsImpl implements WebContents, RenderFrameHostDelegate, Wi ...@@ -384,6 +384,13 @@ public class WebContentsImpl implements WebContents, RenderFrameHostDelegate, Wi
mNativeWebContentsAndroid, WebContentsImpl.this); mNativeWebContentsAndroid, WebContentsImpl.this);
} }
@Override
public RenderFrameHost getRenderFrameHostFromId(int renderProcessId, int renderFrameId) {
checkNotDestroyed();
return WebContentsImplJni.get().getRenderFrameHostFromId(
mNativeWebContentsAndroid, renderProcessId, renderFrameId);
}
@Override @Override
public @Nullable RenderWidgetHostViewImpl getRenderWidgetHostView() { public @Nullable RenderWidgetHostViewImpl getRenderWidgetHostView() {
if (mNativeWebContentsAndroid == 0) return null; if (mNativeWebContentsAndroid == 0) return null;
...@@ -1052,6 +1059,8 @@ public class WebContentsImpl implements WebContents, RenderFrameHostDelegate, Wi ...@@ -1052,6 +1059,8 @@ public class WebContentsImpl implements WebContents, RenderFrameHostDelegate, Wi
long nativeWebContentsAndroid, WebContentsImpl caller, WindowAndroid windowAndroid); long nativeWebContentsAndroid, WebContentsImpl caller, WindowAndroid windowAndroid);
RenderFrameHost getMainFrame(long nativeWebContentsAndroid, WebContentsImpl caller); RenderFrameHost getMainFrame(long nativeWebContentsAndroid, WebContentsImpl caller);
RenderFrameHost getFocusedFrame(long nativeWebContentsAndroid, WebContentsImpl caller); RenderFrameHost getFocusedFrame(long nativeWebContentsAndroid, WebContentsImpl caller);
RenderFrameHost getRenderFrameHostFromId(
long nativeWebContentsAndroid, int renderProcessId, int renderFrameId);
RenderWidgetHostViewImpl getRenderWidgetHostView( RenderWidgetHostViewImpl getRenderWidgetHostView(
long nativeWebContentsAndroid, WebContentsImpl caller); long nativeWebContentsAndroid, WebContentsImpl caller);
WebContentsImpl[] getInnerWebContents( WebContentsImpl[] getInnerWebContents(
......
...@@ -148,6 +148,13 @@ public interface WebContents extends Parcelable { ...@@ -148,6 +148,13 @@ public interface WebContents extends Parcelable {
@Nullable @Nullable
RenderFrameHost getFocusedFrame(); 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 * @return The root level view from the renderer, or {@code null} in some cases where there is
* none. * none.
......
...@@ -33,9 +33,8 @@ public abstract class WebContentsObserver { ...@@ -33,9 +33,8 @@ public abstract class WebContentsObserver {
* Called when a RenderFrame for renderFrameHost is created in the * Called when a RenderFrame for renderFrameHost is created in the
* renderer process. * renderer process.
* To avoid creating a RenderFrameHost object without necessity, only process id and frame id * To avoid creating a RenderFrameHost object without necessity, only process id and frame id
* are passed. * are passed. Call WebContents#getRenderFrameHostFromId() to get the RenderFrameHostImpl object
* TODO(crbug.com/1107555): expose a C++ method to get a Java RenderFrameHost by process id and * if needed.
* frame id.
*/ */
public void renderFrameCreated(int renderProcessId, int renderFrameId) {} public void renderFrameCreated(int renderProcessId, int renderFrameId) {}
......
...@@ -90,6 +90,11 @@ public class MockWebContents implements WebContents { ...@@ -90,6 +90,11 @@ public class MockWebContents implements WebContents {
return null; return null;
} }
@Override
public RenderFrameHost getRenderFrameHostFromId(int renderProcessId, int renderFrameId) {
return null;
}
@Override @Override
@Nullable @Nullable
public RenderWidgetHostView getRenderWidgetHostView() { 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