Commit 70fec625 authored by Tobias Sargeant's avatar Tobias Sargeant Committed by Commit Bot

[weblayer] Pass PackageInfo over aidl to WeblayerImpl

This enables us to set the browser package info during intialization
without having to reflect to look up the object again.

Change-Id: I2a66494dde72a1d6c64140e9ac68b310f970be50
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1879887Reviewed-by: default avatarRichard Coles <torne@chromium.org>
Commit-Queue: Tobias Sargeant <tobiasjs@chromium.org>
Cr-Commit-Position: refs/heads/master@{#709289}
parent c3b293be
......@@ -5,12 +5,14 @@
package org.chromium.weblayer_private;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v4.content.FileProvider;
import android.webkit.ValueCallback;
import org.chromium.base.BuildInfo;
import org.chromium.base.CommandLine;
import org.chromium.base.ContentUriUtils;
import org.chromium.base.ContextUtils;
......@@ -72,7 +74,8 @@ public final class WebLayerImpl extends IWebLayer.Stub {
@Override
public void initAndLoadAsync(IObjectWrapper appContextWrapper,
IObjectWrapper loadedCallbackWrapper, int resourcesPackageId) {
IObjectWrapper packageInfoWrapper, IObjectWrapper loadedCallbackWrapper,
int resourcesPackageId) {
// TODO: The call to onResourcesLoaded() can be slow, we may need to parallelize this with
// other expensive startup tasks.
R.onResourcesLoaded(resourcesPackageId);
......@@ -80,7 +83,9 @@ public final class WebLayerImpl extends IWebLayer.Stub {
// Wrap the app context so that it can be used to load WebLayer implementation classes.
Context appContext = ClassLoaderContextWrapperFactory.get(
ObjectWrapper.unwrap(appContextWrapper, Context.class));
PackageInfo packageInfo = ObjectWrapper.unwrap(packageInfoWrapper, PackageInfo.class);
ContextUtils.initApplicationContext(appContext);
BuildInfo.setBrowserPackageInfo(packageInfo);
ResourceBundle.setAvailablePakLocales(new String[] {}, LocaleConfig.UNCOMPRESSED_LOCALES);
PathUtils.setPrivateDataDirectorySuffix(PRIVATE_DATA_DIRECTORY_SUFFIX);
......
......@@ -11,11 +11,15 @@ import org.chromium.weblayer_private.aidl.IBrowserFragment;
import org.chromium.weblayer_private.aidl.IRemoteFragmentClient;
interface IWebLayer {
// Initializes WebLayer and starts loading. It is expected that is called
// before anything else. |loadedCallback| is a ValueCallback that is called
// when load completes. |appContext| is a Context that refers to the
// Application using WebLayer.
// Initializes WebLayer and starts loading.
//
// It is expected that this method is called before anything else.
//
// @param appContext A Context that refers to the Application using WebLayer.
// @param packageInfo The PackageInfo for the package from which WebLayer is loaded.
// @param loadedCallback A ValueCallback that will be called when load completes.
void initAndLoadAsync(in IObjectWrapper appContext,
in IObjectWrapper packageInfo,
in IObjectWrapper loadedCallback,
int resourcesPackageId) = 1;
......
......@@ -5,4 +5,4 @@
package org.chromium.weblayer_private.aidl;
/** Holds the current version number of WebLayer. */
public final class WebLayerVersion { public static int sVersionNumber = 1; }
public final class WebLayerVersion { public static int sVersionNumber = 2; }
......@@ -72,28 +72,21 @@ public final class WebLayer {
* Loads assets for WebLayer and returns the package ID to use when calling
* R.onResourcesLoaded().
*/
private static int loadAssets(Context appContext) {
private static int loadAssets(Context appContext, PackageInfo implPackageInfo)
throws ReflectiveOperationException {
WebViewDelegate delegate;
PackageInfo implPackageInfo;
try {
// TODO: Make asset loading work on L, where WebViewDelegate doesn't exist.
// WebViewDelegate.addWebViewAssetPath() accesses the currently loaded package info from
// WebViewFactory, so we have to fake it.
implPackageInfo =
appContext.getPackageManager().getPackageInfo(getImplPackageName(appContext),
PackageManager.GET_SHARED_LIBRARY_FILES | PackageManager.GET_META_DATA);
Field packageInfo = WebViewFactory.class.getDeclaredField("sPackageInfo");
packageInfo.setAccessible(true);
packageInfo.set(null, implPackageInfo);
// TODO(torne): Figure out how to load assets for production.
// Load assets using the WebViewDelegate.
Constructor constructor = WebViewDelegate.class.getDeclaredConstructor();
constructor.setAccessible(true);
delegate = (WebViewDelegate) constructor.newInstance();
} catch (Exception e) {
throw new AndroidRuntimeException(e);
}
// TODO: Make asset loading work on L, where WebViewDelegate doesn't exist.
// WebViewDelegate.addWebViewAssetPath() accesses the currently loaded package info from
// WebViewFactory, so we have to fake it.
Field packageInfo = WebViewFactory.class.getDeclaredField("sPackageInfo");
packageInfo.setAccessible(true);
packageInfo.set(null, implPackageInfo);
// TODO(torne): Figure out how to load assets for production.
// Load assets using the WebViewDelegate.
Constructor constructor = WebViewDelegate.class.getDeclaredConstructor();
constructor.setAccessible(true);
delegate = (WebViewDelegate) constructor.newInstance();
delegate.addWebViewAssetPath(appContext);
return delegate.getPackageId(appContext.getResources(), implPackageInfo.packageName);
}
......@@ -111,12 +104,20 @@ public final class WebLayer {
throws UnsupportedVersionException {
ThreadCheck.ensureOnUiThread();
if (sFuture == null) {
// Just in case the app passed an Activity context.
appContext = appContext.getApplicationContext();
ClassLoader remoteClassLoader = createRemoteClassLoader(appContext);
IWebLayer iWebLayer = connectToWebLayerImplementation(remoteClassLoader);
int resourcesPackageId = loadAssets(appContext);
sFuture = new WebLayerLoadFuture(iWebLayer, appContext, resourcesPackageId);
try {
// Just in case the app passed an Activity context.
appContext = appContext.getApplicationContext();
ClassLoader remoteClassLoader = createRemoteClassLoader(appContext);
IWebLayer iWebLayer = connectToWebLayerImplementation(remoteClassLoader);
PackageInfo packageInfo = appContext.getPackageManager().getPackageInfo(
getImplPackageName(appContext),
PackageManager.GET_SHARED_LIBRARY_FILES | PackageManager.GET_META_DATA);
int resourcesPackageId = loadAssets(appContext, packageInfo);
sFuture = new WebLayerLoadFuture(
iWebLayer, appContext, packageInfo, resourcesPackageId);
} catch (Exception e) {
throw new AndroidRuntimeException(e);
}
}
return sFuture;
}
......@@ -127,7 +128,8 @@ public final class WebLayer {
private static final class WebLayerLoadFuture extends ListenableFuture<WebLayer> {
private final IWebLayer mIWebLayer;
WebLayerLoadFuture(IWebLayer iWebLayer, Context appContext, int resourcesPackageId) {
WebLayerLoadFuture(IWebLayer iWebLayer, Context appContext, PackageInfo packageInfo,
int resourcesPackageId) {
mIWebLayer = iWebLayer;
ValueCallback<Boolean> loadCallback = new ValueCallback<Boolean>() {
@Override
......@@ -139,7 +141,8 @@ public final class WebLayer {
};
try {
iWebLayer.initAndLoadAsync(ObjectWrapper.wrap(appContext),
ObjectWrapper.wrap(loadCallback), resourcesPackageId);
ObjectWrapper.wrap(packageInfo), ObjectWrapper.wrap(loadCallback),
resourcesPackageId);
} catch (RemoteException e) {
throw new APICallException(e);
}
......
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