summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/webkit/WebViewFactory.java48
1 files changed, 42 insertions, 6 deletions
diff --git a/core/java/android/webkit/WebViewFactory.java b/core/java/android/webkit/WebViewFactory.java
index 73ae9109b517..2fc9b39d91da 100644
--- a/core/java/android/webkit/WebViewFactory.java
+++ b/core/java/android/webkit/WebViewFactory.java
@@ -16,14 +16,23 @@
package android.webkit;
+import android.os.Build;
+import android.os.StrictMode;
+import android.os.SystemProperties;
import android.util.Log;
+import dalvik.system.PathClassLoader;
+
/**
* Top level factory, used creating all the main WebView implementation classes.
*/
class WebViewFactory {
// Default Provider factory class name.
- private static final String DEFAULT_WEB_VIEW_FACTORY = "android.webkit.WebViewClassic$Factory";
+ // TODO: When the Chromium powered WebView is ready, it should be the default factory class.
+ private static final String DEFAULT_WEBVIEW_FACTORY = "android.webkit.WebViewClassic$Factory";
+ private static final String CHROMIUM_WEBVIEW_FACTORY =
+ "com.android.webviewchromium.WebViewChromiumFactoryProvider";
+ private static final String CHROMIUM_WEBVIEW_JAR = "/system/framework/webviewchromium.jar";
private static final String LOGTAG = "WebViewFactory";
@@ -38,18 +47,45 @@ class WebViewFactory {
// us honest and minimize usage of WebViewClassic internals when binding the proxy.
if (sProviderInstance != null) return sProviderInstance;
- sProviderInstance = getFactoryByName(DEFAULT_WEB_VIEW_FACTORY);
+ // For debug builds, we allow a system property to specify that we should use the
+ // Chromium powered WebView. This enables us to switch between implementations
+ // at runtime. For user (release) builds, don't allow this.
+ if (Build.IS_DEBUGGABLE && SystemProperties.getBoolean("webview.use_chromium", false)) {
+ StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
+ try {
+ sProviderInstance = loadChromiumProvider();
+ if (DEBUG) Log.v(LOGTAG, "Loaded Chromium provider: " + sProviderInstance);
+ } finally {
+ StrictMode.setThreadPolicy(oldPolicy);
+ }
+ }
+
if (sProviderInstance == null) {
- if (DEBUG) Log.v(LOGTAG, "Falling back to explicit linkage");
- sProviderInstance = new WebViewClassic.Factory();
+ if (DEBUG) Log.v(LOGTAG, "Falling back to default provider: "
+ + DEFAULT_WEBVIEW_FACTORY);
+ sProviderInstance = getFactoryByName(DEFAULT_WEBVIEW_FACTORY,
+ WebViewFactory.class.getClassLoader());
+ if (sProviderInstance == null) {
+ if (DEBUG) Log.v(LOGTAG, "Falling back to explicit linkage");
+ sProviderInstance = new WebViewClassic.Factory();
+ }
}
return sProviderInstance;
}
- private static WebViewFactoryProvider getFactoryByName(String providerName) {
+ // TODO: This allows us to have the legacy and Chromium WebView coexist for development
+ // and side-by-side testing. After transition, remove this when no longer required.
+ private static WebViewFactoryProvider loadChromiumProvider() {
+ ClassLoader clazzLoader = new PathClassLoader(CHROMIUM_WEBVIEW_JAR, null,
+ WebViewFactory.class.getClassLoader());
+ return getFactoryByName(CHROMIUM_WEBVIEW_FACTORY, clazzLoader);
+ }
+
+ private static WebViewFactoryProvider getFactoryByName(String providerName,
+ ClassLoader loader) {
try {
if (DEBUG) Log.v(LOGTAG, "attempt to load class " + providerName);
- Class<?> c = Class.forName(providerName);
+ Class<?> c = Class.forName(providerName, true, loader);
if (DEBUG) Log.v(LOGTAG, "instantiating factory");
return (WebViewFactoryProvider) c.newInstance();
} catch (ClassNotFoundException e) {