| Index: android_webview/glue/java/src/com/android/webview/chromium/ResourcesContextWrapperFactory.java
|
| diff --git a/android_webview/glue/java/src/com/android/webview/chromium/ResourcesContextWrapperFactory.java b/android_webview/glue/java/src/com/android/webview/chromium/ResourcesContextWrapperFactory.java
|
| index a6e58a32079e9d6bb081434c933103b816896afd..a802246c634c015e01084013d6811c862e83d9a8 100644
|
| --- a/android_webview/glue/java/src/com/android/webview/chromium/ResourcesContextWrapperFactory.java
|
| +++ b/android_webview/glue/java/src/com/android/webview/chromium/ResourcesContextWrapperFactory.java
|
| @@ -11,87 +11,83 @@ import android.view.LayoutInflater;
|
|
|
| import org.chromium.base.annotations.SuppressFBWarnings;
|
|
|
| -import java.util.WeakHashMap;
|
| -
|
| /**
|
| * This class allows us to wrap the application context so that the WebView implementation can
|
| * correctly reference both org.chromium.* and application classes which is necessary to properly
|
| - * inflate UI. We keep a weak map from contexts to wrapped contexts to avoid constantly re-wrapping
|
| - * or doubly wrapping contexts.
|
| + * inflate UI.
|
| */
|
| public class ResourcesContextWrapperFactory {
|
| - private static WeakHashMap<Context, ContextWrapper> sCtxToWrapper =
|
| - new WeakHashMap<Context, ContextWrapper>();
|
| - private static final Object sLock = new Object();
|
| -
|
| private ResourcesContextWrapperFactory() {}
|
|
|
| public static Context get(Context ctx) {
|
| - ContextWrapper wrappedCtx;
|
| - synchronized (sLock) {
|
| - wrappedCtx = sCtxToWrapper.get(ctx);
|
| - if (wrappedCtx == null) {
|
| - wrappedCtx = createWrapper(ctx);
|
| - sCtxToWrapper.put(ctx, wrappedCtx);
|
| - }
|
| + // Avoid double-wrapping a context.
|
| + if (ctx instanceof WebViewContextWrapper) {
|
| + return ctx;
|
| }
|
| - return wrappedCtx;
|
| + return new WebViewContextWrapper(ctx);
|
| }
|
|
|
| - private static ContextWrapper createWrapper(final Context ctx) {
|
| - return new ContextWrapper(ctx) {
|
| - private Context mApplicationContext;
|
| + private static class WebViewContextWrapper extends ContextWrapper {
|
| + private Context mApplicationContext;
|
|
|
| - @SuppressFBWarnings("DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED")
|
| - @Override
|
| - public ClassLoader getClassLoader() {
|
| - final ClassLoader appCl = getBaseContext().getClassLoader();
|
| - final ClassLoader webViewCl = this.getClass().getClassLoader();
|
| - return new ClassLoader() {
|
| - @Override
|
| - protected Class<?> findClass(String name) throws ClassNotFoundException {
|
| - // First look in the WebViewProvider class loader.
|
| - try {
|
| - return webViewCl.loadClass(name);
|
| - } catch (ClassNotFoundException e) {
|
| - // Look in the app class loader; allowing it to throw
|
| - // ClassNotFoundException.
|
| - return appCl.loadClass(name);
|
| - }
|
| - }
|
| - };
|
| - }
|
| + public WebViewContextWrapper(Context base) {
|
| + super(base);
|
| + }
|
|
|
| - @Override
|
| - public Object getSystemService(String name) {
|
| - if (Context.LAYOUT_INFLATER_SERVICE.equals(name)) {
|
| - LayoutInflater i = (LayoutInflater) getBaseContext().getSystemService(name);
|
| - return i.cloneInContext(this);
|
| - } else {
|
| - return getBaseContext().getSystemService(name);
|
| + @SuppressFBWarnings("DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED")
|
| + @Override
|
| + public ClassLoader getClassLoader() {
|
| + final ClassLoader appCl = getBaseContext().getClassLoader();
|
| + final ClassLoader webViewCl = this.getClass().getClassLoader();
|
| + return new ClassLoader() {
|
| + @Override
|
| + protected Class<?> findClass(String name) throws ClassNotFoundException {
|
| + // First look in the WebViewProvider class loader.
|
| + try {
|
| + return webViewCl.loadClass(name);
|
| + } catch (ClassNotFoundException e) {
|
| + // Look in the app class loader; allowing it to throw
|
| + // ClassNotFoundException.
|
| + return appCl.loadClass(name);
|
| + }
|
| }
|
| + };
|
| + }
|
| +
|
| + @Override
|
| + public Object getSystemService(String name) {
|
| + if (Context.LAYOUT_INFLATER_SERVICE.equals(name)) {
|
| + LayoutInflater i = (LayoutInflater) getBaseContext().getSystemService(name);
|
| + return i.cloneInContext(this);
|
| + } else {
|
| + return getBaseContext().getSystemService(name);
|
| }
|
| + }
|
|
|
| - @Override
|
| - public Context getApplicationContext() {
|
| - if (mApplicationContext == null) {
|
| - mApplicationContext = get(ctx.getApplicationContext());
|
| + @Override
|
| + public Context getApplicationContext() {
|
| + if (mApplicationContext == null) {
|
| + Context appCtx = getBaseContext().getApplicationContext();
|
| + if (appCtx == getBaseContext()) {
|
| + mApplicationContext = this;
|
| + } else {
|
| + mApplicationContext = get(appCtx);
|
| }
|
| - return mApplicationContext;
|
| }
|
| + return mApplicationContext;
|
| + }
|
|
|
| - @Override
|
| - public void registerComponentCallbacks(ComponentCallbacks callback) {
|
| - // We have to override registerComponentCallbacks and unregisterComponentCallbacks
|
| - // since they call getApplicationContext().[un]registerComponentCallbacks()
|
| - // which causes us to go into a loop.
|
| - ctx.registerComponentCallbacks(callback);
|
| - }
|
| + @Override
|
| + public void registerComponentCallbacks(ComponentCallbacks callback) {
|
| + // We have to override registerComponentCallbacks and unregisterComponentCallbacks
|
| + // since they call getApplicationContext().[un]registerComponentCallbacks()
|
| + // which causes us to go into a loop.
|
| + getBaseContext().registerComponentCallbacks(callback);
|
| + }
|
|
|
| - @Override
|
| - public void unregisterComponentCallbacks(ComponentCallbacks callback) {
|
| - ctx.unregisterComponentCallbacks(callback);
|
| - }
|
| - };
|
| + @Override
|
| + public void unregisterComponentCallbacks(ComponentCallbacks callback) {
|
| + getBaseContext().unregisterComponentCallbacks(callback);
|
| + }
|
| }
|
| }
|
|
|