Commit fd90ede4 authored by Miyoung Shin's avatar Miyoung Shin Committed by Commit Bot

[remoteobjects] Inject/Remove the objects into all frames

This CL injects and removes the objects into all frames in
RemoteObjectInjector#addInterface and set an allow of inspection
to all frames.

Bug: 1105935
Change-Id: Ica6bba74e7f5c5f5eada272979bd15b690d6a254
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2532141
Commit-Queue: Miyoung Shin <myid.shin@igalia.com>
Reviewed-by: default avatarBo <boliu@chromium.org>
Reviewed-by: default avatarOksana Zhuravlova <oksamyt@chromium.org>
Cr-Commit-Position: refs/heads/master@{#828124}
parent 93cc91b2
...@@ -291,6 +291,19 @@ ScopedJavaLocalRef<jobject> WebContentsAndroid::GetRenderFrameHostFromId( ...@@ -291,6 +291,19 @@ ScopedJavaLocalRef<jobject> WebContentsAndroid::GetRenderFrameHostFromId(
return rfh->GetJavaRenderFrameHost(); return rfh->GetJavaRenderFrameHost();
} }
ScopedJavaLocalRef<jobjectArray> WebContentsAndroid::GetAllRenderFrameHosts(
JNIEnv* env,
const JavaParamRef<jobject>& obj) const {
std::vector<RenderFrameHost*> frames = web_contents_->GetAllFrames();
ScopedJavaLocalRef<jobjectArray> jframes =
Java_WebContentsImpl_createRenderFrameHostArray(env, frames.size());
for (size_t i = 0; i < frames.size(); i++) {
Java_WebContentsImpl_addRenderFrameHostToArray(
env, jframes, i, frames[i]->GetJavaRenderFrameHost());
}
return jframes;
}
ScopedJavaLocalRef<jstring> WebContentsAndroid::GetTitle( ScopedJavaLocalRef<jstring> WebContentsAndroid::GetTitle(
JNIEnv* env, JNIEnv* env,
const JavaParamRef<jobject>& obj) const { const JavaParamRef<jobject>& obj) const {
......
...@@ -63,6 +63,9 @@ class CONTENT_EXPORT WebContentsAndroid { ...@@ -63,6 +63,9 @@ class CONTENT_EXPORT WebContentsAndroid {
JNIEnv* env, JNIEnv* env,
jint render_process_id, jint render_process_id,
jint render_frame_id) const; jint render_frame_id) const;
base::android::ScopedJavaLocalRef<jobjectArray> GetAllRenderFrameHosts(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) 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;
......
...@@ -6,6 +6,7 @@ package org.chromium.content.browser.remoteobjects; ...@@ -6,6 +6,7 @@ package org.chromium.content.browser.remoteobjects;
import org.chromium.blink.mojom.RemoteObjectGateway; import org.chromium.blink.mojom.RemoteObjectGateway;
import org.chromium.blink.mojom.RemoteObjectGatewayFactory; import org.chromium.blink.mojom.RemoteObjectGatewayFactory;
import org.chromium.content.browser.webcontents.WebContentsImpl;
import org.chromium.content_public.browser.RenderFrameHost; import org.chromium.content_public.browser.RenderFrameHost;
import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContents;
import org.chromium.content_public.browser.WebContentsObserver; import org.chromium.content_public.browser.WebContentsObserver;
...@@ -16,6 +17,7 @@ import org.chromium.mojo.system.impl.CoreImpl; ...@@ -16,6 +17,7 @@ import org.chromium.mojo.system.impl.CoreImpl;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
...@@ -85,7 +87,7 @@ public final class RemoteObjectInjector extends WebContentsObserver { ...@@ -85,7 +87,7 @@ public final class RemoteObjectInjector extends WebContentsObserver {
public void addInterface( public void addInterface(
Object object, String name, Class<? extends Annotation> requiredAnnotation) { Object object, String name, Class<? extends Annotation> requiredAnnotation) {
WebContents webContents = mWebContents.get(); WebContentsImpl webContents = (WebContentsImpl) mWebContents.get();
if (webContents == null) return; if (webContents == null) return;
Pair<Object, Class<? extends Annotation>> value = mInjectedObjects.get(name); Pair<Object, Class<? extends Annotation>> value = mInjectedObjects.get(name);
...@@ -100,32 +102,35 @@ public final class RemoteObjectInjector extends WebContentsObserver { ...@@ -100,32 +102,35 @@ public final class RemoteObjectInjector extends WebContentsObserver {
mInjectedObjects.put(name, new Pair<>(object, requiredAnnotation)); mInjectedObjects.put(name, new Pair<>(object, requiredAnnotation));
// TODO(crbug.com/1105935): the objects need to be injected into all frames, not just the List<RenderFrameHost> frames = webContents.getAllRenderFrameHosts();
// main one. for (RenderFrameHost frame : frames) {
addInterfaceForFrame(webContents.getMainFrame(), name, object, requiredAnnotation); addInterfaceForFrame(frame, name, object, requiredAnnotation);
}
} }
public void removeInterface(String name) { public void removeInterface(String name) {
WebContents webContents = mWebContents.get(); WebContentsImpl webContents = (WebContentsImpl) mWebContents.get();
if (webContents == null) return; if (webContents == null) return;
Pair<Object, Class<? extends Annotation>> value = mInjectedObjects.remove(name); Pair<Object, Class<? extends Annotation>> value = mInjectedObjects.remove(name);
if (value == null) return; if (value == null) return;
// TODO(crbug.com/1105935): the objects need to be removed from all frames, not just the List<RenderFrameHost> frames = webContents.getAllRenderFrameHosts();
// main one. for (RenderFrameHost frame : frames) {
removeInterfaceForFrame(webContents.getMainFrame(), name, value.first); removeInterfaceForFrame(frame, name, value.first);
}
} }
public void setAllowInspection(boolean allow) { public void setAllowInspection(boolean allow) {
WebContents webContents = mWebContents.get(); WebContentsImpl webContents = (WebContentsImpl) mWebContents.get();
if (webContents == null) return; if (webContents == null) return;
mAllowInspection = allow; mAllowInspection = allow;
// TODO(crbug.com/1105935): the objects host needs to update the allow status from all List<RenderFrameHost> frames = webContents.getAllRenderFrameHosts();
// frames, not just the main one. for (RenderFrameHost frame : frames) {
setAllowInspectionForFrame(webContents.getMainFrame()); setAllowInspectionForFrame(frame);
}
} }
private void addInterfaceForFrame(RenderFrameHost frameHost, String name, Object object, private void addInterfaceForFrame(RenderFrameHost frameHost, String name, Object object,
......
...@@ -391,6 +391,24 @@ public class WebContentsImpl implements WebContents, RenderFrameHostDelegate, Wi ...@@ -391,6 +391,24 @@ public class WebContentsImpl implements WebContents, RenderFrameHostDelegate, Wi
mNativeWebContentsAndroid, renderProcessId, renderFrameId); mNativeWebContentsAndroid, renderProcessId, renderFrameId);
} }
public List<RenderFrameHost> getAllRenderFrameHosts() {
checkNotDestroyed();
RenderFrameHost[] frames = WebContentsImplJni.get().getAllRenderFrameHosts(
mNativeWebContentsAndroid, WebContentsImpl.this);
return Collections.unmodifiableList(Arrays.asList(frames));
}
@CalledByNative
private static RenderFrameHost[] createRenderFrameHostArray(int size) {
return new RenderFrameHost[size];
}
@CalledByNative
private static void addRenderFrameHostToArray(
RenderFrameHost[] frames, int index, RenderFrameHost frame) {
frames[index] = frame;
}
@Override @Override
public @Nullable RenderWidgetHostViewImpl getRenderWidgetHostView() { public @Nullable RenderWidgetHostViewImpl getRenderWidgetHostView() {
if (mNativeWebContentsAndroid == 0) return null; if (mNativeWebContentsAndroid == 0) return null;
...@@ -1061,6 +1079,8 @@ public class WebContentsImpl implements WebContents, RenderFrameHostDelegate, Wi ...@@ -1061,6 +1079,8 @@ public class WebContentsImpl implements WebContents, RenderFrameHostDelegate, Wi
RenderFrameHost getFocusedFrame(long nativeWebContentsAndroid, WebContentsImpl caller); RenderFrameHost getFocusedFrame(long nativeWebContentsAndroid, WebContentsImpl caller);
RenderFrameHost getRenderFrameHostFromId( RenderFrameHost getRenderFrameHostFromId(
long nativeWebContentsAndroid, int renderProcessId, int renderFrameId); long nativeWebContentsAndroid, int renderProcessId, int renderFrameId);
RenderFrameHost[] getAllRenderFrameHosts(
long nativeWebContentsAndroid, WebContentsImpl caller);
RenderWidgetHostViewImpl getRenderWidgetHostView( RenderWidgetHostViewImpl getRenderWidgetHostView(
long nativeWebContentsAndroid, WebContentsImpl caller); long nativeWebContentsAndroid, WebContentsImpl caller);
WebContentsImpl[] getInnerWebContents( WebContentsImpl[] getInnerWebContents(
......
...@@ -75,6 +75,7 @@ public class JavaBridgeChildFrameTest { ...@@ -75,6 +75,7 @@ public class JavaBridgeChildFrameTest {
mActivityTestRule.injectObjectAndReload(mTestController, "testController"); mActivityTestRule.injectObjectAndReload(mTestController, "testController");
} }
// TODO(crbug.com/1116744): Fix flakiness when using MojoTestParams.
@Test @Test
@SmallTest @SmallTest
@Feature({"AndroidWebView", "Android-JavaBridge"}) @Feature({"AndroidWebView", "Android-JavaBridge"})
...@@ -118,6 +119,7 @@ public class JavaBridgeChildFrameTest { ...@@ -118,6 +119,7 @@ public class JavaBridgeChildFrameTest {
// Verify that parent page and child frame each has own JS wrapper object. // Verify that parent page and child frame each has own JS wrapper object.
// Failing to do so exposes parent's context to the child. // Failing to do so exposes parent's context to the child.
// TODO(crbug.com/1116744): Fix flakiness when using MojoTestParams.
@Test @Test
@SmallTest @SmallTest
@Feature({"AndroidWebView", "Android-JavaBridge"}) @Feature({"AndroidWebView", "Android-JavaBridge"})
......
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