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 @@ ...@@ -5,12 +5,14 @@
package org.chromium.weblayer_private; package org.chromium.weblayer_private;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageInfo;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.IBinder; import android.os.IBinder;
import android.support.v4.content.FileProvider; import android.support.v4.content.FileProvider;
import android.webkit.ValueCallback; import android.webkit.ValueCallback;
import org.chromium.base.BuildInfo;
import org.chromium.base.CommandLine; import org.chromium.base.CommandLine;
import org.chromium.base.ContentUriUtils; import org.chromium.base.ContentUriUtils;
import org.chromium.base.ContextUtils; import org.chromium.base.ContextUtils;
...@@ -72,7 +74,8 @@ public final class WebLayerImpl extends IWebLayer.Stub { ...@@ -72,7 +74,8 @@ public final class WebLayerImpl extends IWebLayer.Stub {
@Override @Override
public void initAndLoadAsync(IObjectWrapper appContextWrapper, 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 // TODO: The call to onResourcesLoaded() can be slow, we may need to parallelize this with
// other expensive startup tasks. // other expensive startup tasks.
R.onResourcesLoaded(resourcesPackageId); R.onResourcesLoaded(resourcesPackageId);
...@@ -80,7 +83,9 @@ public final class WebLayerImpl extends IWebLayer.Stub { ...@@ -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. // Wrap the app context so that it can be used to load WebLayer implementation classes.
Context appContext = ClassLoaderContextWrapperFactory.get( Context appContext = ClassLoaderContextWrapperFactory.get(
ObjectWrapper.unwrap(appContextWrapper, Context.class)); ObjectWrapper.unwrap(appContextWrapper, Context.class));
PackageInfo packageInfo = ObjectWrapper.unwrap(packageInfoWrapper, PackageInfo.class);
ContextUtils.initApplicationContext(appContext); ContextUtils.initApplicationContext(appContext);
BuildInfo.setBrowserPackageInfo(packageInfo);
ResourceBundle.setAvailablePakLocales(new String[] {}, LocaleConfig.UNCOMPRESSED_LOCALES); ResourceBundle.setAvailablePakLocales(new String[] {}, LocaleConfig.UNCOMPRESSED_LOCALES);
PathUtils.setPrivateDataDirectorySuffix(PRIVATE_DATA_DIRECTORY_SUFFIX); PathUtils.setPrivateDataDirectorySuffix(PRIVATE_DATA_DIRECTORY_SUFFIX);
......
...@@ -11,11 +11,15 @@ import org.chromium.weblayer_private.aidl.IBrowserFragment; ...@@ -11,11 +11,15 @@ import org.chromium.weblayer_private.aidl.IBrowserFragment;
import org.chromium.weblayer_private.aidl.IRemoteFragmentClient; import org.chromium.weblayer_private.aidl.IRemoteFragmentClient;
interface IWebLayer { interface IWebLayer {
// Initializes WebLayer and starts loading. It is expected that is called // Initializes WebLayer and starts loading.
// before anything else. |loadedCallback| is a ValueCallback that is called //
// when load completes. |appContext| is a Context that refers to the // It is expected that this method is called before anything else.
// Application using WebLayer. //
// @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, void initAndLoadAsync(in IObjectWrapper appContext,
in IObjectWrapper packageInfo,
in IObjectWrapper loadedCallback, in IObjectWrapper loadedCallback,
int resourcesPackageId) = 1; int resourcesPackageId) = 1;
......
...@@ -5,4 +5,4 @@ ...@@ -5,4 +5,4 @@
package org.chromium.weblayer_private.aidl; package org.chromium.weblayer_private.aidl;
/** Holds the current version number of WebLayer. */ /** 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,16 +72,12 @@ public final class WebLayer { ...@@ -72,16 +72,12 @@ public final class WebLayer {
* Loads assets for WebLayer and returns the package ID to use when calling * Loads assets for WebLayer and returns the package ID to use when calling
* R.onResourcesLoaded(). * R.onResourcesLoaded().
*/ */
private static int loadAssets(Context appContext) { private static int loadAssets(Context appContext, PackageInfo implPackageInfo)
throws ReflectiveOperationException {
WebViewDelegate delegate; WebViewDelegate delegate;
PackageInfo implPackageInfo;
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
// WebViewFactory, so we have to fake it. // 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"); Field packageInfo = WebViewFactory.class.getDeclaredField("sPackageInfo");
packageInfo.setAccessible(true); packageInfo.setAccessible(true);
packageInfo.set(null, implPackageInfo); packageInfo.set(null, implPackageInfo);
...@@ -91,9 +87,6 @@ public final class WebLayer { ...@@ -91,9 +87,6 @@ public final class WebLayer {
Constructor constructor = WebViewDelegate.class.getDeclaredConstructor(); Constructor constructor = WebViewDelegate.class.getDeclaredConstructor();
constructor.setAccessible(true); constructor.setAccessible(true);
delegate = (WebViewDelegate) constructor.newInstance(); delegate = (WebViewDelegate) constructor.newInstance();
} catch (Exception e) {
throw new AndroidRuntimeException(e);
}
delegate.addWebViewAssetPath(appContext); delegate.addWebViewAssetPath(appContext);
return delegate.getPackageId(appContext.getResources(), implPackageInfo.packageName); return delegate.getPackageId(appContext.getResources(), implPackageInfo.packageName);
} }
...@@ -111,12 +104,20 @@ public final class WebLayer { ...@@ -111,12 +104,20 @@ public final class WebLayer {
throws UnsupportedVersionException { throws UnsupportedVersionException {
ThreadCheck.ensureOnUiThread(); ThreadCheck.ensureOnUiThread();
if (sFuture == null) { if (sFuture == null) {
try {
// Just in case the app passed an Activity context. // Just in case the app passed an Activity context.
appContext = appContext.getApplicationContext(); appContext = appContext.getApplicationContext();
ClassLoader remoteClassLoader = createRemoteClassLoader(appContext); ClassLoader remoteClassLoader = createRemoteClassLoader(appContext);
IWebLayer iWebLayer = connectToWebLayerImplementation(remoteClassLoader); IWebLayer iWebLayer = connectToWebLayerImplementation(remoteClassLoader);
int resourcesPackageId = loadAssets(appContext); PackageInfo packageInfo = appContext.getPackageManager().getPackageInfo(
sFuture = new WebLayerLoadFuture(iWebLayer, appContext, resourcesPackageId); 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; return sFuture;
} }
...@@ -127,7 +128,8 @@ public final class WebLayer { ...@@ -127,7 +128,8 @@ public final class WebLayer {
private static final class WebLayerLoadFuture extends ListenableFuture<WebLayer> { private static final class WebLayerLoadFuture extends ListenableFuture<WebLayer> {
private final IWebLayer mIWebLayer; private final IWebLayer mIWebLayer;
WebLayerLoadFuture(IWebLayer iWebLayer, Context appContext, int resourcesPackageId) { WebLayerLoadFuture(IWebLayer iWebLayer, Context appContext, PackageInfo packageInfo,
int resourcesPackageId) {
mIWebLayer = iWebLayer; mIWebLayer = iWebLayer;
ValueCallback<Boolean> loadCallback = new ValueCallback<Boolean>() { ValueCallback<Boolean> loadCallback = new ValueCallback<Boolean>() {
@Override @Override
...@@ -139,7 +141,8 @@ public final class WebLayer { ...@@ -139,7 +141,8 @@ public final class WebLayer {
}; };
try { try {
iWebLayer.initAndLoadAsync(ObjectWrapper.wrap(appContext), iWebLayer.initAndLoadAsync(ObjectWrapper.wrap(appContext),
ObjectWrapper.wrap(loadCallback), resourcesPackageId); ObjectWrapper.wrap(packageInfo), ObjectWrapper.wrap(loadCallback),
resourcesPackageId);
} catch (RemoteException e) { } catch (RemoteException e) {
throw new APICallException(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