Commit 2f27c318 authored by Scott Violet's avatar Scott Violet Committed by Commit Bot

weblayer: supply appropriate context when creating Profile

This is necessary so that any resources that are loaded by
the implementation side come from the right place.

BUG=none
TEST=none

Change-Id: Ia493e5fcaf1e955ef621ca8b870a8c63145bab69
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1808304Reviewed-by: default avatarClark DuVall <cduvall@chromium.org>
Commit-Queue: Scott Violet <sky@chromium.org>
Cr-Commit-Position: refs/heads/master@{#697246}
parent f5bdc9f9
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
package org.chromium.weblayer_private; package org.chromium.weblayer_private;
import android.content.Context; import android.content.Context;
import android.content.ContextWrapper;
import android.content.res.Resources;
import android.view.Gravity; import android.view.Gravity;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.MotionEvent; import android.view.MotionEvent;
...@@ -60,9 +62,16 @@ public final class BrowserControllerImpl extends IBrowserController.Stub { ...@@ -60,9 +62,16 @@ public final class BrowserControllerImpl extends IBrowserController.Stub {
public void onScrollChanged(int lPix, int tPix, int oldlPix, int oldtPix) {} public void onScrollChanged(int lPix, int tPix, int oldlPix, int oldtPix) {}
} }
public BrowserControllerImpl(Context context, ProfileImpl profile) { public BrowserControllerImpl(Context clientContext, Context implContext, ProfileImpl profile) {
mProfile = profile; mProfile = profile;
Context context = new ContextWrapper(clientContext) {
@Override
public Resources getResources() {
// Always use resources from the implementation APK.
return implContext.getResources();
}
};
mWindowAndroid = new ActivityWindowAndroid(context); mWindowAndroid = new ActivityWindowAndroid(context);
mContentViewRenderView = new ContentViewRenderView(context); mContentViewRenderView = new ContentViewRenderView(context);
......
...@@ -32,8 +32,10 @@ public final class ProfileImpl extends IProfile.Stub { ...@@ -32,8 +32,10 @@ public final class ProfileImpl extends IProfile.Stub {
} }
@Override @Override
public IBrowserController createBrowserController(IObjectWrapper context) { public IBrowserController createBrowserController(
return new BrowserControllerImpl(ObjectWrapper.unwrap(context, Context.class), this); IObjectWrapper clientContext, IObjectWrapper implContext) {
return new BrowserControllerImpl(ObjectWrapper.unwrap(clientContext, Context.class),
ObjectWrapper.unwrap(implContext, Context.class), this);
} }
long getNativeProfile() { long getNativeProfile() {
......
...@@ -12,5 +12,11 @@ interface IProfile { ...@@ -12,5 +12,11 @@ interface IProfile {
void clearBrowsingData() = 1; void clearBrowsingData() = 1;
IBrowserController createBrowserController(in IObjectWrapper context) = 2; /**
* Creates a new IBrowserController.
* @param clientContext Context from the client
* @param implContext Context that refers to the weblayer implementation
*/
IBrowserController createBrowserController(in IObjectWrapper clientContext,
in IObjectWrapper implContext) = 2;
} }
...@@ -46,7 +46,8 @@ public final class Profile { ...@@ -46,7 +46,8 @@ public final class Profile {
public BrowserFragmentImpl createBrowserFragment(Context context) { public BrowserFragmentImpl createBrowserFragment(Context context) {
try { try {
return new BrowserFragmentImpl( return new BrowserFragmentImpl(
mImpl.createBrowserController(ObjectWrapper.wrap(context))); mImpl.createBrowserController(ObjectWrapper.wrap(context),
ObjectWrapper.wrap(WebLayer.getInstance().createRemoteContext())));
} catch (RemoteException e) { } catch (RemoteException e) {
throw new APICallException(e); throw new APICallException(e);
} }
......
...@@ -8,8 +8,10 @@ import android.app.Application; ...@@ -8,8 +8,10 @@ import android.app.Application;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.IBinder; import android.os.IBinder;
import android.os.RemoteException; import android.os.RemoteException;
import android.util.AndroidRuntimeException;
import android.webkit.WebViewDelegate; import android.webkit.WebViewDelegate;
import android.webkit.WebViewFactory; import android.webkit.WebViewFactory;
...@@ -29,6 +31,8 @@ public final class WebLayer { ...@@ -29,6 +31,8 @@ public final class WebLayer {
private static WebLayer sInstance; private static WebLayer sInstance;
private IWebLayer mImpl; private IWebLayer mImpl;
private Application mApplication;
public static WebLayer getInstance() { public static WebLayer getInstance() {
if (sInstance == null) { if (sInstance == null) {
sInstance = new WebLayer(); sInstance = new WebLayer();
...@@ -39,6 +43,7 @@ public final class WebLayer { ...@@ -39,6 +43,7 @@ public final class WebLayer {
WebLayer() {} WebLayer() {}
public void init(Application application) { public void init(Application application) {
mApplication = application;
try { try {
// TODO: Make asset loading work on L, where WebViewDelegate doesn't exist. // TODO: Make asset loading work on L, where WebViewDelegate doesn't exist.
// WebViewDelegate.addWebViewAssetPath() accesses the currently loaded package info from // WebViewDelegate.addWebViewAssetPath() accesses the currently loaded package info from
...@@ -56,8 +61,7 @@ public final class WebLayer { ...@@ -56,8 +61,7 @@ public final class WebLayer {
WebViewDelegate delegate = (WebViewDelegate) constructor.newInstance(); WebViewDelegate delegate = (WebViewDelegate) constructor.newInstance();
delegate.addWebViewAssetPath(application); delegate.addWebViewAssetPath(application);
Context remoteContext = application.createPackageContext( Context remoteContext = createRemoteContext();
PACKAGE_NAME, Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);
mImpl = IWebLayer.Stub.asInterface( mImpl = IWebLayer.Stub.asInterface(
(IBinder) remoteContext.getClassLoader() (IBinder) remoteContext.getClassLoader()
.loadClass("org.chromium.weblayer_private.WebLayerImpl") .loadClass("org.chromium.weblayer_private.WebLayerImpl")
...@@ -88,4 +92,16 @@ public final class WebLayer { ...@@ -88,4 +92,16 @@ public final class WebLayer {
throw new APICallException(e); throw new APICallException(e);
} }
} }
/**
* Creates a Context for the remote (weblayer implementation) side.
*/
Context createRemoteContext() {
try {
return mApplication.createPackageContext(
PACKAGE_NAME, Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);
} catch (NameNotFoundException e) {
throw new AndroidRuntimeException(e);
}
}
} }
...@@ -193,6 +193,9 @@ repack("support_pak") { ...@@ -193,6 +193,9 @@ repack("support_pak") {
sources += sources +=
[ "$root_gen_dir/ui/views/resources/views_resources_100_percent.pak" ] [ "$root_gen_dir/ui/views/resources/views_resources_100_percent.pak" ]
} }
if (is_android) {
deps += [ "//ui/android:ui_java_resources" ]
}
output = "$root_out_dir/weblayer_support.pak" output = "$root_out_dir/weblayer_support.pak"
} }
......
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