Commit 4d285050 authored by Changwan Ryu's avatar Changwan Ryu Committed by Commit Bot

Fix class verification errors around field access

There is no logic change - this just move the code around for
optimization.

This CL specifically fixes verification errors around field access.
Also, it avoids extra type conversion which was causing another
verification error.

See crbug.com/838702 for more information about run-time verification
issue.

Bug: 868250
Change-Id: I00c593e9526ddc3766d0c5b203ed38816c5c6da0
Reviewed-on: https://chromium-review.googlesource.com/1218522
Commit-Queue: Changwan Ryu <changwan@chromium.org>
Reviewed-by: default avatarNate Fischer <ntfschr@chromium.org>
Reviewed-by: default avatarBo <boliu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#590491}
parent 726d43f1
......@@ -6,6 +6,7 @@ package com.android.webview.chromium;
import android.annotation.TargetApi;
import android.os.Build;
import android.webkit.TracingController;
import android.webkit.WebViewDelegate;
import org.chromium.base.annotations.DoNotInline;
......@@ -25,9 +26,9 @@ public final class GlueApiHelperForP {
/**
* See {@link
* TracingControllerAdapter#TracingControllerAdapter(WebViewChromiumFactoryProvider,
* AwTracingController)}, which was added in N.
* AwTracingController)}, which was added in P.
*/
public static TracingControllerAdapter createTracingControllerAdapter(
public static TracingController createTracingControllerAdapter(
WebViewChromiumFactoryProvider provider, WebViewChromiumAwInit awInit) {
return new TracingControllerAdapter(provider, awInit.getAwTracingController());
}
......
......@@ -5,6 +5,7 @@
package com.android.webview.chromium;
import android.Manifest;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
......@@ -39,6 +40,7 @@ import org.chromium.base.ContextUtils;
import org.chromium.base.PathService;
import org.chromium.base.ThreadUtils;
import org.chromium.base.TraceEvent;
import org.chromium.base.annotations.DoNotInline;
import org.chromium.base.library_loader.LibraryLoader;
import org.chromium.base.library_loader.LibraryProcessType;
import org.chromium.base.library_loader.ProcessInitException;
......@@ -56,13 +58,27 @@ public class WebViewChromiumAwInit {
private static final String HTTP_AUTH_DATABASE_FILE = "http_auth.db";
/**
* This holds objects of classes that are defined in N and above to ensure that run-time class
* verification does not occur until it is actually used for N and above.
*/
@TargetApi(Build.VERSION_CODES.N)
@DoNotInline
private static class ObjectHolderForN {
public TokenBindingService mTokenBindingService;
}
// TODO(gsennton): store aw-objects instead of adapters here
// Initialization guarded by mLock.
private AwBrowserContext mBrowserContext;
private SharedStatics mSharedStatics;
private GeolocationPermissionsAdapter mGeolocationPermissions;
private CookieManagerAdapter mCookieManager;
private Object mTokenBindingManager;
@TargetApi(Build.VERSION_CODES.N)
private ObjectHolderForN mObjectHolderForN =
Build.VERSION.SDK_INT >= Build.VERSION_CODES.N ? new ObjectHolderForN() : null;
private WebIconDatabaseAdapter mWebIconDatabase;
private WebStorageAdapter mWebStorage;
private WebViewDatabaseAdapter mWebViewDatabase;
......@@ -371,13 +387,15 @@ public class WebViewChromiumAwInit {
return mServiceWorkerController;
}
@TargetApi(Build.VERSION_CODES.N)
public TokenBindingService getTokenBindingService() {
synchronized (mLock) {
if (mTokenBindingManager == null) {
mTokenBindingManager = GlueApiHelperForN.createTokenBindingManagerAdapter(mFactory);
if (mObjectHolderForN.mTokenBindingService == null) {
mObjectHolderForN.mTokenBindingService =
GlueApiHelperForN.createTokenBindingManagerAdapter(mFactory);
}
}
return (TokenBindingService) mTokenBindingManager;
return mObjectHolderForN.mTokenBindingService;
}
public android.webkit.WebIconDatabase getWebIconDatabase() {
......
......@@ -4,6 +4,7 @@
package com.android.webview.chromium;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
......@@ -43,6 +44,7 @@ import org.chromium.base.PackageUtils;
import org.chromium.base.PathUtils;
import org.chromium.base.StrictModeContext;
import org.chromium.base.ThreadUtils;
import org.chromium.base.annotations.DoNotInline;
import org.chromium.base.library_loader.NativeLibraries;
import org.chromium.base.metrics.CachedMetrics.TimesHistogramSample;
import org.chromium.components.autofill.AutofillProvider;
......@@ -68,6 +70,26 @@ public class WebViewChromiumFactoryProvider implements WebViewFactoryProvider {
private static final String SUPPORT_LIB_GLUE_AND_BOUNDARY_INTERFACE_PREFIX =
"org.chromium.support_lib_";
/**
* This holds objects of classes that are defined in N and above to ensure that run-time class
* verification does not occur until it is actually used for N and above.
*/
@TargetApi(Build.VERSION_CODES.N)
@DoNotInline
private static class ObjectHolderForN {
public ServiceWorkerController mServiceWorkerController;
}
/**
* This holds objects of classes that are defined in P and above to ensure that run-time class
* verification does not occur until it is actually used for P and above.
*/
@TargetApi(Build.VERSION_CODES.P)
@DoNotInline
private static class ObjectHolderForP {
public TracingController mTracingController;
}
private final static Object sSingletonLock = new Object();
private static WebViewChromiumFactoryProvider sSingleton;
......@@ -101,13 +123,19 @@ public class WebViewChromiumFactoryProvider implements WebViewFactoryProvider {
private SharedPreferences mWebViewPrefs;
private WebViewDelegate mWebViewDelegate;
private TracingController mTracingController;
boolean mShouldDisableThreadChecking;
private boolean mShouldDisableThreadChecking;
// Initialization guarded by mAwInit.getLock()
private Statics mStaticsAdapter;
private Object mServiceWorkerControllerAdapter;
@TargetApi(Build.VERSION_CODES.N)
private ObjectHolderForN mObjectHolderForN =
Build.VERSION.SDK_INT >= Build.VERSION_CODES.N ? new ObjectHolderForN() : null;
@TargetApi(Build.VERSION_CODES.P)
private ObjectHolderForP mObjectHolderForP =
Build.VERSION.SDK_INT >= Build.VERSION_CODES.P ? new ObjectHolderForP() : null;
/**
* Thread-safe way to set the one and only WebViewChromiumFactoryProvider.
......@@ -470,12 +498,12 @@ public class WebViewChromiumFactoryProvider implements WebViewFactoryProvider {
@Override
public ServiceWorkerController getServiceWorkerController() {
synchronized (mAwInit.getLock()) {
if (mServiceWorkerControllerAdapter == null) {
mServiceWorkerControllerAdapter =
if (mObjectHolderForN.mServiceWorkerController == null) {
mObjectHolderForN.mServiceWorkerController =
GlueApiHelperForN.createServiceWorkerControllerAdapter(mAwInit);
}
}
return (ServiceWorkerController) mServiceWorkerControllerAdapter;
return mObjectHolderForN.mServiceWorkerController;
}
@Override
......@@ -540,14 +568,14 @@ public class WebViewChromiumFactoryProvider implements WebViewFactoryProvider {
synchronized (mAwInit.getLock()) {
mAwInit.ensureChromiumStartedLocked(true);
// ensureChromiumStartedLocked() can release the lock on first call while
// waiting for startup. Hence check the mTracingControler here to ensure
// waiting for startup. Hence check the mTracingController here to ensure
// the singleton property.
if (mTracingController == null) {
mTracingController =
if (mObjectHolderForP.mTracingController == null) {
mObjectHolderForP.mTracingController =
GlueApiHelperForP.createTracingControllerAdapter(this, mAwInit);
}
}
return mTracingController;
return mObjectHolderForP.mTracingController;
}
private static class FilteredClassLoader extends ClassLoader {
......
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