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

[remoteobjects] Add useMojo parameter to JavascriptInjector

This CL adds |useMojo| parameter to JavascriptInjector that would
default to false and using RemoteObjectInjector method in
JavascriptInjectorImpl#addPossiblyUnsafeInterface() if useMojo is
true. We will add useMojo for the rest of the code when
RemoteObjectInjector#removeInterface is implemented and it is
available for JavascriptInjectorImpl.

This change adds usage of mojom interfaces and methods, and the
binary size increase is caused by generated Java bindings. Java
bindings improvements (including size optimizations) are captured
in https://bugs.chromium.org/u/2764092486/hotlists/java-bindings.

Bug: 1105927
Binary-Size: Size increase is unavoidable (see above).
Change-Id: I5d9c6d83084b3a72812382e5cbe8011a37e938e9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2331988Reviewed-by: default avatarBo <boliu@chromium.org>
Reviewed-by: default avatarOksana Zhuravlova <oksamyt@chromium.org>
Commit-Queue: Miyoung Shin <myid.shin@igalia.com>
Cr-Commit-Position: refs/heads/master@{#797683}
parent ed24e402
......@@ -10,6 +10,7 @@ import org.chromium.base.UserData;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.content.browser.remoteobjects.RemoteObjectInjector;
import org.chromium.content.browser.webcontents.WebContentsImpl;
import org.chromium.content.browser.webcontents.WebContentsImpl.UserDataFactory;
import org.chromium.content_public.browser.JavascriptInjector;
......@@ -34,20 +35,37 @@ public class JavascriptInjectorImpl implements JavascriptInjector, UserData {
private final Set<Object> mRetainedObjects = new HashSet<>();
private final Map<String, Pair<Object, Class>> mInjectedObjects = new HashMap<>();
private long mNativePtr;
private RemoteObjectInjector mInjector;
private Boolean mUseMojo;
/**
* @param webContents {@link WebContents} object.
* @param useMojo Whether to use {@link RemoteObjectInjector} methods
* @return {@link JavascriptInjector} object used for the give WebContents.
* Creates one if not present.
*/
public static JavascriptInjector fromWebContents(WebContents webContents) {
return ((WebContentsImpl) webContents)
.getOrSetUserData(JavascriptInjectorImpl.class, UserDataFactoryLazyHolder.INSTANCE);
public static JavascriptInjector fromWebContents(WebContents webContents, boolean useMojo) {
JavascriptInjectorImpl javascriptInjector =
((WebContentsImpl) webContents)
.getOrSetUserData(
JavascriptInjectorImpl.class, UserDataFactoryLazyHolder.INSTANCE);
javascriptInjector.setUseMojo(useMojo);
return javascriptInjector;
}
public JavascriptInjectorImpl(WebContents webContents) {
mNativePtr = JavascriptInjectorImplJni.get().init(
JavascriptInjectorImpl.this, webContents, mRetainedObjects);
mInjector = new RemoteObjectInjector(webContents);
webContents.addObserver(mInjector);
}
public void setUseMojo(boolean useMojo) {
if (mUseMojo == null) {
mUseMojo = useMojo;
} else {
assert mUseMojo == useMojo;
}
}
@CalledByNative
......@@ -62,15 +80,21 @@ public class JavascriptInjectorImpl implements JavascriptInjector, UserData {
@Override
public void setAllowInspection(boolean allow) {
if (mNativePtr != 0)
if (mNativePtr != 0) {
JavascriptInjectorImplJni.get().setAllowInspection(
mNativePtr, JavascriptInjectorImpl.this, allow);
}
}
@Override
public void addPossiblyUnsafeInterface(
Object object, String name, Class<? extends Annotation> requiredAnnotation) {
if (mNativePtr != 0 && object != null) {
if (object == null) return;
assert mUseMojo != null;
if (mUseMojo) {
mInjector.addInterface(object, name);
} else if (mNativePtr != 0) {
mInjectedObjects.put(name, new Pair<Object, Class>(object, requiredAnnotation));
JavascriptInjectorImplJni.get().addInterface(
mNativePtr, JavascriptInjectorImpl.this, object, name, requiredAnnotation);
......@@ -80,9 +104,10 @@ public class JavascriptInjectorImpl implements JavascriptInjector, UserData {
@Override
public void removeInterface(String name) {
mInjectedObjects.remove(name);
if (mNativePtr != 0)
if (mNativePtr != 0) {
JavascriptInjectorImplJni.get().removeInterface(
mNativePtr, JavascriptInjectorImpl.this, name);
}
}
@NativeMethods
......
......@@ -22,7 +22,17 @@ public interface JavascriptInjector {
* Creates one if not present.
*/
static JavascriptInjector fromWebContents(WebContents webContents) {
return JavascriptInjectorImpl.fromWebContents(webContents);
return fromWebContents(webContents, false);
}
/**
* @param webContents {@link WebContents} object.
* @param useMojo Whether to use {@link RemoteObjectInjector} methods
* @return {@link JavascriptInjector} object used for the give WebContents.
* Creates one if not present.
*/
static JavascriptInjector fromWebContents(WebContents webContents, boolean useMojo) {
return JavascriptInjectorImpl.fromWebContents(webContents, useMojo);
}
/**
......
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