WebViewChromiumFactoryProvider.java revision aa36c6b5770974fae04acef747292eaafa7aa6c4
146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)/* 246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * Copyright (C) 2012 The Android Open Source Project 346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License"); 546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * you may not use this file except in compliance with the License. 646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * You may obtain a copy of the License at 746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * http://www.apache.org/licenses/LICENSE-2.0 946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 1046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * Unless required by applicable law or agreed to in writing, software 1146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS, 1246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * See the License for the specific language governing permissions and 1446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * limitations under the License. 1546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 1646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 1746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)package com.android.webview.chromium; 1846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 190657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosibaimport android.content.pm.PackageManager; 200657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosibaimport android.content.res.Resources; 21b7f8bdb39f5ddfba3394d5335e728d9bf416f0caPrimiano Tucciimport android.app.ActivityManager; 2246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.app.ActivityThread; 23b7f8bdb39f5ddfba3394d5335e728d9bf416f0caPrimiano Tucciimport android.content.ComponentCallbacks2; 2446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.content.Context; 2536206a5214eb24ab619db0046d0dcba9be240c63Tao Baiimport android.content.Intent; 26009ed27511c4606dcd16b352489b2d3f70b4b513Kristian Monsenimport android.content.SharedPreferences; 2736206a5214eb24ab619db0046d0dcba9be240c63Tao Baiimport android.net.Uri; 28970a2065df4f96ceaa9bc38d82caea9221dfa4c9Jonathan Dixonimport android.os.Build; 29798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles)import android.os.FileUtils; 3046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Looper; 313688d4e395b6ce345514f15304b9c670ed1ab875Ben Murdochimport android.os.StrictMode; 326590bd55a007cac3c235987d4f7accf407f9c393Hui Shuimport android.os.SystemProperties; 336590bd55a007cac3c235987d4f7accf407f9c393Hui Shuimport android.os.Trace; 34fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdochimport android.util.Log; 3546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.CookieManager; 3646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.GeolocationPermissions; 3746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebIconDatabase; 3846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebStorage; 3946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebView; 4046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewDatabase; 41798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles)import android.webkit.WebViewFactory; 4246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewFactoryProvider; 4346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewProvider; 4446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 45aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsenimport org.chromium.android_webview.AwBrowserContext; 46f3e3e4e6b6c5798f435c1d14379edeb479e3b25dJonathan Dixonimport org.chromium.android_webview.AwBrowserProcess; 47a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixonimport org.chromium.android_webview.AwContents; 4815ecd3c837f088579316ee419bcc5528ce215228Selim Gurunimport org.chromium.android_webview.AwContentsStatics; 49d5f17bbd8703a56ac084a64b1ce2f673f67bd72dKristian Monsenimport org.chromium.android_webview.AwCookieManager; 509d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganovimport org.chromium.android_webview.AwDevToolsServer; 5109e718bac5900c84b8402b774d306dca7f7fdf09Selim Gurunimport org.chromium.android_webview.AwFormDatabase; 52009ed27511c4606dcd16b352489b2d3f70b4b513Kristian Monsenimport org.chromium.android_webview.AwGeolocationPermissions; 535d20093562806fbce9cc0d3eb4a411ed6c5ce1c0Bo Liuimport org.chromium.android_webview.AwQuotaManagerBridge; 540657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosibaimport org.chromium.android_webview.AwResource; 55d6b56ff89338d0b3a6ba0cb413b1fe559d6284e0Mikhail Naganovimport org.chromium.android_webview.AwSettings; 562fbdaa7353e16996e874ea99f050a7b857dd92c4Ben Murdochimport org.chromium.base.CommandLine; 57b7f8bdb39f5ddfba3394d5335e728d9bf416f0caPrimiano Tucciimport org.chromium.base.MemoryPressureListener; 5846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.base.PathService; 59798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles)import org.chromium.base.PathUtils; 60aa36c6b5770974fae04acef747292eaafa7aa6c4Vivek Galatageimport org.chromium.base.ResourceExtractor; 617b77b2fb0f7148bc31e23cabadb234231699ff93Jonathan Dixonimport org.chromium.base.ThreadUtils; 626590bd55a007cac3c235987d4f7accf407f9c393Hui Shuimport org.chromium.base.TraceEvent; 6354b3666a044d576394424822704d21dace02dc7cMarcin Kosibaimport org.chromium.base.library_loader.LibraryLoader; 6454b3666a044d576394424822704d21dace02dc7cMarcin Kosibaimport org.chromium.base.library_loader.ProcessInitException; 658be908c9c3af0debd0aeb0e4ff511dd16bcecf7bTorne (Richard Coles)import org.chromium.content.app.ContentMain; 6646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.ContentViewStatics; 6746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 68798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles)import java.io.File; 69fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdochimport java.lang.ref.WeakReference; 70fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdochimport java.util.ArrayList; 71fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch 7246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)public class WebViewChromiumFactoryProvider implements WebViewFactoryProvider { 7346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 746590bd55a007cac3c235987d4f7accf407f9c393Hui Shu private static final String TAG = "WebViewChromiumFactoryProvider"; 7557f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch 76009ed27511c4606dcd16b352489b2d3f70b4b513Kristian Monsen private static final String CHROMIUM_PREFS_NAME = "WebViewChromiumPrefs"; 77798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) private static final String VERSION_CODE_PREF = "lastVersionCodeUsed"; 787962d3fa1b66ed25aba03a2d48f6c47528d7d95cPrimiano Tucci private static final String COMMAND_LINE_FILE = "/data/local/tmp/webview-command-line"; 79009ed27511c4606dcd16b352489b2d3f70b4b513Kristian Monsen 8072db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // Guards accees to the other members, and is notifyAll() signalled on the UI thread 8172db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // when the chromium process has been started. 8272db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon private final Object mLock = new Object(); 8372db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon 8446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Initialization guarded by mLock. 85aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen private AwBrowserContext mBrowserContext; 86aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon private Statics mStaticMethods; 87aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon private GeolocationPermissionsAdapter mGeolocationPermissions; 88aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon private CookieManagerAdapter mCookieManager; 89aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon private WebIconDatabaseAdapter mWebIconDatabase; 90aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon private WebStorageAdapter mWebStorage; 91aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon private WebViewDatabaseAdapter mWebViewDatabase; 929d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov private AwDevToolsServer mDevToolsServer; 9346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 94fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch private ArrayList<WeakReference<WebViewChromium>> mWebViewsToStart = 95fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch new ArrayList<WeakReference<WebViewChromium>>(); 96fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch 979aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon // Read/write protected by mLock. 989aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon private boolean mStarted; 99f0f355514e4420755c15491fe3b21a2eeaa42654Jonathan Dixon 100e8a9ddd389a0313fee43c0df877b5cfe9d1ca445Selim Gurun private DataReductionProxyManager mProxyManager; 101798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) private SharedPreferences mWebViewPrefs; 102792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun 10311f7c1b02e49a6a8eaec26111f08edec45feb01aTorne (Richard Coles) public WebViewChromiumFactoryProvider() { 1047b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman if (Build.IS_DEBUGGABLE) { 1053688d4e395b6ce345514f15304b9c670ed1ab875Ben Murdoch // Suppress the StrictMode violation as this codepath is only hit on debugglable builds. 1063688d4e395b6ce345514f15304b9c670ed1ab875Ben Murdoch StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads(); 1077b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman CommandLine.initFromFile(COMMAND_LINE_FILE); 1083688d4e395b6ce345514f15304b9c670ed1ab875Ben Murdoch StrictMode.setThreadPolicy(oldPolicy); 1097b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman } else { 1107b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman CommandLine.init(null); 1117b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman } 1127b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman 1137b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman CommandLine cl = CommandLine.getInstance(); 1147b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman // TODO: currently in a relase build the DCHECKs only log. We either need to insall 1157b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman // a report handler with SetLogReportHandler to make them assert, or else compile 1167b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman // them out of the build altogether (b/8284203). Either way, so long they're 1177b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman // compiled in, we may as unconditionally enable them here. 1187b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman cl.appendSwitch("enable-dcheck"); 1197b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman 1206590bd55a007cac3c235987d4f7accf407f9c393Hui Shu ThreadUtils.setWillOverrideUiThread(); 121f3e3e4e6b6c5798f435c1d14379edeb479e3b25dJonathan Dixon // Load chromium library. 1224ad366c663de934ed292e813505f8c71aeadb649Torne (Richard Coles) Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "AwBrowserProcess.loadLibrary()"); 123f3e3e4e6b6c5798f435c1d14379edeb479e3b25dJonathan Dixon AwBrowserProcess.loadLibrary(); 1244ad366c663de934ed292e813505f8c71aeadb649Torne (Richard Coles) Trace.traceEnd(Trace.TRACE_TAG_WEBVIEW); 125a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon // Load glue-layer support library. 126a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon System.loadLibrary("webviewchromium_plat_support"); 127798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) 128798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) // Use shared preference to check for package downgrade. 129798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) mWebViewPrefs = ActivityThread.currentApplication().getSharedPreferences( 130798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) CHROMIUM_PREFS_NAME, Context.MODE_PRIVATE); 131798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) int lastVersion = mWebViewPrefs.getInt(VERSION_CODE_PREF, 0); 132798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) int currentVersion = WebViewFactory.getLoadedPackageInfo().versionCode; 133798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) if (lastVersion > currentVersion) { 134798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) // The WebView package has been downgraded since we last ran in this application. 135798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) // Delete the WebView data directory's contents. 136798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) String dataDir = PathUtils.getDataDirectory(ActivityThread.currentApplication()); 137798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) Log.i(TAG, "WebView package downgraded from " + lastVersion + " to " + currentVersion + 138798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) "; deleting contents of " + dataDir); 139798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) FileUtils.deleteContents(new File(dataDir)); 140798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) } 141798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) if (lastVersion != currentVersion) { 142798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) mWebViewPrefs.edit().putInt(VERSION_CODE_PREF, currentVersion).apply(); 143798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) } 144798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) // Now safe to use WebView data directory. 145f3e3e4e6b6c5798f435c1d14379edeb479e3b25dJonathan Dixon } 146f3e3e4e6b6c5798f435c1d14379edeb479e3b25dJonathan Dixon 147f3e3e4e6b6c5798f435c1d14379edeb479e3b25dJonathan Dixon private void initPlatSupportLibrary() { 1489aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon DrawGLFunctor.setChromiumAwDrawGLFunction(AwContents.getAwDrawGLFunction()); 1499aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon AwContents.setAwDrawSWFunctionTable(GraphicsUtils.getDrawSWFunctionTable()); 150c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu AwContents.setAwDrawGLFunctionTable(GraphicsUtils.getDrawGLFunctionTable()); 151a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon } 152a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 1536590bd55a007cac3c235987d4f7accf407f9c393Hui Shu private static void initTraceEvent() { 1546590bd55a007cac3c235987d4f7accf407f9c393Hui Shu syncATraceState(); 1556590bd55a007cac3c235987d4f7accf407f9c393Hui Shu SystemProperties.addChangeCallback(new Runnable() { 1566590bd55a007cac3c235987d4f7accf407f9c393Hui Shu @Override 1576590bd55a007cac3c235987d4f7accf407f9c393Hui Shu public void run() { 1586590bd55a007cac3c235987d4f7accf407f9c393Hui Shu syncATraceState(); 1596590bd55a007cac3c235987d4f7accf407f9c393Hui Shu } 1606590bd55a007cac3c235987d4f7accf407f9c393Hui Shu }); 1616590bd55a007cac3c235987d4f7accf407f9c393Hui Shu } 1626590bd55a007cac3c235987d4f7accf407f9c393Hui Shu 1636590bd55a007cac3c235987d4f7accf407f9c393Hui Shu private static void syncATraceState() { 1646590bd55a007cac3c235987d4f7accf407f9c393Hui Shu long enabledFlags = SystemProperties.getLong("debug.atrace.tags.enableflags", 0); 1656590bd55a007cac3c235987d4f7accf407f9c393Hui Shu TraceEvent.setATraceEnabled((enabledFlags & Trace.TRACE_TAG_WEBVIEW) != 0); 1666590bd55a007cac3c235987d4f7accf407f9c393Hui Shu } 1676590bd55a007cac3c235987d4f7accf407f9c393Hui Shu 168fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch private void ensureChromiumStartedLocked(boolean onMainThread) { 16946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) assert Thread.holdsLock(mLock); 17046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 17172db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon if (mStarted) { // Early-out for the common case. 17272db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon return; 17372db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } 17472db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon 175fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch Looper looper = !onMainThread ? Looper.myLooper() : Looper.getMainLooper(); 17657f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch Log.v(TAG, "Binding Chromium to " + 17757f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch (Looper.getMainLooper().equals(looper) ? "main":"background") + 17857f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch " looper " + looper); 179fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch ThreadUtils.setUiThread(looper); 180fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch 18172db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon if (ThreadUtils.runningOnUiThread()) { 18272db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon startChromiumLocked(); 1839aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon return; 1849aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon } 1853053d8bc3be48b0cbc6f33e1975c03a10ac303a5Jonathan Dixon 18672db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // We must post to the UI thread to cover the case that the user has invoked Chromium 18772db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // startup by using the (thread-safe) CookieManager rather than creating a WebView. 18872db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon ThreadUtils.postOnUiThread(new Runnable() { 1897b77b2fb0f7148bc31e23cabadb234231699ff93Jonathan Dixon @Override 1907b77b2fb0f7148bc31e23cabadb234231699ff93Jonathan Dixon public void run() { 19172db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon synchronized (mLock) { 19272db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon startChromiumLocked(); 193970a2065df4f96ceaa9bc38d82caea9221dfa4c9Jonathan Dixon } 19472db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } 19572db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon }); 19672db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon while (!mStarted) { 19772db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon try { 198e8a9ddd389a0313fee43c0df877b5cfe9d1ca445Selim Gurun // Important: wait() releases |mLock| the UI thread can take it :-) 19972db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon mLock.wait(); 20072db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } catch (InterruptedException e) { 20172db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // Keep trying... eventually the UI thread will process the task we sent it. 20272db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } 20372db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } 20472db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } 205970a2065df4f96ceaa9bc38d82caea9221dfa4c9Jonathan Dixon 20672db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon private void startChromiumLocked() { 20772db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon assert Thread.holdsLock(mLock) && ThreadUtils.runningOnUiThread(); 2081e5325bde6fb074ce556a4e2833114d890ed21f3Jonathan Dixon 20972db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // The post-condition of this method is everything is ready, so notify now to cover all 21072db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // return paths. (Other threads will not wake-up until we release |mLock|, whatever). 21172db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon mLock.notifyAll(); 212970a2065df4f96ceaa9bc38d82caea9221dfa4c9Jonathan Dixon 21372db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon if (mStarted) { 21472db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon return; 21572db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } 2169aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon 21772db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // We don't need to extract any paks because for WebView, they are 21872db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // in the system image. 21972db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon ResourceExtractor.setMandatoryPaksToExtract(""); 22072db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon 22172db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon try { 22272db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon LibraryLoader.ensureInitialized(); 22372db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } catch(ProcessInitException e) { 22472db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon throw new RuntimeException("Error initializing WebView library", e); 22572db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } 22672db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon 22772db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon PathService.override(PathService.DIR_MODULE, "/system/lib/"); 22872db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // TODO: DIR_RESOURCE_PAKS_ANDROID needs to live somewhere sensible, 22972db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // inlined here for simplicity setting up the HTMLViewer demo. Unfortunately 23072db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // it can't go into base.PathService, as the native constant it refers to 23172db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // lives in the ui/ layer. See ui/base/ui_base_paths.h 23272db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon final int DIR_RESOURCE_PAKS_ANDROID = 3003; 23372db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon PathService.override(DIR_RESOURCE_PAKS_ANDROID, 23472db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon "/system/framework/webview/paks"); 23572db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon 236998d67697ebc5fd0efcd6ed39531e556d788c50fYuncheol Heo // Make sure that ResourceProvider is initialized before starting the browser process. 2370657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosiba setUpResources(ActivityThread.currentApplication()); 23872db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon initPlatSupportLibrary(); 2395cb1bc4fabdd9d08806bd9f3d9c92f872144d276Bo Liu AwBrowserProcess.start(ActivityThread.currentApplication()); 2409d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov 2419d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov if (Build.IS_DEBUGGABLE) { 2429d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov setWebContentsDebuggingEnabled(true); 2439d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov } 2446590bd55a007cac3c235987d4f7accf407f9c393Hui Shu 2456590bd55a007cac3c235987d4f7accf407f9c393Hui Shu initTraceEvent(); 2469aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon mStarted = true; 247fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch 248fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch for (WeakReference<WebViewChromium> wvc : mWebViewsToStart) { 249fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch WebViewChromium w = wvc.get(); 250fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch if (w != null) { 251fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch w.startYourEngine(); 252fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch } 253fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch } 254fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch mWebViewsToStart.clear(); 255fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch mWebViewsToStart = null; 256792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun 257e8a9ddd389a0313fee43c0df877b5cfe9d1ca445Selim Gurun // Start listening for data reduction proxy setting changes. 258e8a9ddd389a0313fee43c0df877b5cfe9d1ca445Selim Gurun mProxyManager = new DataReductionProxyManager(); 259e8a9ddd389a0313fee43c0df877b5cfe9d1ca445Selim Gurun mProxyManager.start(ActivityThread.currentApplication()); 2605dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun } 2615dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun 26257f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch boolean hasStarted() { 26357f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch return mStarted; 26457f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 26557f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch 26657f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch void startYourEngines(boolean onMainThread) { 26757f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch synchronized (mLock) { 26857f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch ensureChromiumStartedLocked(onMainThread); 26957f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch 27057f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 27157f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 27257f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch 27357f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch AwBrowserContext getBrowserContext() { 27457f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch synchronized (mLock) { 27557f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch return getBrowserContextLocked(); 27657f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 27757f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 27857f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch 27957f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch private AwBrowserContext getBrowserContextLocked() { 28057f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch assert Thread.holdsLock(mLock); 28157f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch assert mStarted; 28257f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch if (mBrowserContext == null) { 283798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) mBrowserContext = new AwBrowserContext(mWebViewPrefs); 28457f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 28557f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch return mBrowserContext; 28657f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 28757f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch 28857f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch private void setWebContentsDebuggingEnabled(boolean enable) { 28957f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch if (Looper.myLooper() != ThreadUtils.getUiThreadLooper()) { 29057f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch throw new RuntimeException( 29157f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch "Toggling of Web Contents Debugging must be done on the UI thread"); 29257f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 29357f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch if (mDevToolsServer == null) { 29457f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch if (!enable) return; 29557f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch mDevToolsServer = new AwDevToolsServer(); 29657f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 29757f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch mDevToolsServer.setRemoteDebuggingEnabled(enable); 29857f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 29957f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch 3000657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosiba private void setUpResources(Context ctx) { 3010657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosiba ResourceRewriter.rewriteRValues(ctx); 3020657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosiba 3030657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosiba AwResource.setResources(ctx.getResources()); 304e0ef2965a44761b31eeae5868811262d566a8641Marcin Kosiba AwResource.setErrorPageResources(android.R.raw.loaderror, 305e0ef2965a44761b31eeae5868811262d566a8641Marcin Kosiba android.R.raw.nodomain); 3060657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosiba AwResource.setDefaultTextEncoding( 307e0ef2965a44761b31eeae5868811262d566a8641Marcin Kosiba android.R.string.config_webSettingsDefaultTextEncoding); 3080657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosiba AwResource.setConfigKeySystemUuidMapping( 309e0ef2965a44761b31eeae5868811262d566a8641Marcin Kosiba android.R.array.config_keySystemUuidMapping); 3100657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosiba } 31157f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch 31246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 31346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public Statics getStatics() { 31446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) synchronized (mLock) { 31546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (mStaticMethods == null) { 3169aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon // TODO: Optimization potential: most these methods only need the native library 317f3e3e4e6b6c5798f435c1d14379edeb479e3b25dJonathan Dixon // loaded and initialized, not the entire browser process started. 318f3e3e4e6b6c5798f435c1d14379edeb479e3b25dJonathan Dixon // See also http://b/7009882 319fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch ensureChromiumStartedLocked(true); 32046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mStaticMethods = new WebViewFactoryProvider.Statics() { 32146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 32246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public String findAddress(String addr) { 32346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return ContentViewStatics.findAddress(addr); 32446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 32546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 32646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 32746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public String getDefaultUserAgent(Context context) { 328d6b56ff89338d0b3a6ba0cb413b1fe559d6284e0Mikhail Naganov return AwSettings.getDefaultUserAgent(); 32946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 330b7f8bdb39f5ddfba3394d5335e728d9bf416f0caPrimiano Tucci 331b7f8bdb39f5ddfba3394d5335e728d9bf416f0caPrimiano Tucci @Override 3329d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov public void setWebContentsDebuggingEnabled(boolean enable) { 3339d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov // Web Contents debugging is always enabled on debug builds. 3349d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov if (!Build.IS_DEBUGGABLE) { 3359d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov WebViewChromiumFactoryProvider.this. 3369d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov setWebContentsDebuggingEnabled(enable); 3379d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov } 3389d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov } 3399d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov 34015ecd3c837f088579316ee419bcc5528ce215228Selim Gurun // TODO enable after L release to AOSP 34115ecd3c837f088579316ee419bcc5528ce215228Selim Gurun //@Override 34215ecd3c837f088579316ee419bcc5528ce215228Selim Gurun public void clearClientCertPreferences(Runnable onCleared) { 34315ecd3c837f088579316ee419bcc5528ce215228Selim Gurun AwContentsStatics.clearClientCertPreferences(onCleared); 34415ecd3c837f088579316ee419bcc5528ce215228Selim Gurun } 34515ecd3c837f088579316ee419bcc5528ce215228Selim Gurun 3469d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov @Override 347b7f8bdb39f5ddfba3394d5335e728d9bf416f0caPrimiano Tucci public void freeMemoryForTests() { 34817cd884446d243f8ef74b99ef9d617699953419aPrimiano Tucci if (ActivityManager.isRunningInTestHarness()) { 34917cd884446d243f8ef74b99ef9d617699953419aPrimiano Tucci MemoryPressureListener.maybeNotifyMemoryPresure( 35017cd884446d243f8ef74b99ef9d617699953419aPrimiano Tucci ComponentCallbacks2.TRIM_MEMORY_COMPLETE); 35117cd884446d243f8ef74b99ef9d617699953419aPrimiano Tucci } 352b7f8bdb39f5ddfba3394d5335e728d9bf416f0caPrimiano Tucci } 3535dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun 354086910f44494b4677dc0f5d66045b0d55743e5fbBo Liu // TODO: Add @Override. 355086910f44494b4677dc0f5d66045b0d55743e5fbBo Liu public void enableSlowWholeDocumentDraw() { 356086910f44494b4677dc0f5d66045b0d55743e5fbBo Liu WebViewChromium.enableSlowWholeDocumentDraw(); 357086910f44494b4677dc0f5d66045b0d55743e5fbBo Liu } 35836206a5214eb24ab619db0046d0dcba9be240c63Tao Bai 35936206a5214eb24ab619db0046d0dcba9be240c63Tao Bai @Override 36036206a5214eb24ab619db0046d0dcba9be240c63Tao Bai public Uri[] parseFileChooserResult(int resultCode, Intent intent) { 36136206a5214eb24ab619db0046d0dcba9be240c63Tao Bai return FileChooserParamsAdapter.parseFileChooserResult(resultCode, intent); 36236206a5214eb24ab619db0046d0dcba9be240c63Tao Bai } 36346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) }; 36446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 36546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 36646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return mStaticMethods; 36746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 36846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 36946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 37046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public WebViewProvider createWebView(WebView webView, WebView.PrivateAccess privateAccess) { 371fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch WebViewChromium wvc = new WebViewChromium(this, webView, privateAccess); 372fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch 373fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch synchronized (mLock) { 374fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch if (mWebViewsToStart != null) { 375fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch mWebViewsToStart.add(new WeakReference<WebViewChromium>(wvc)); 376fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch } 377fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch } 3780657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosiba 379fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch return wvc; 380fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch } 381fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch 38246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 38346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public GeolocationPermissions getGeolocationPermissions() { 384009ed27511c4606dcd16b352489b2d3f70b4b513Kristian Monsen synchronized (mLock) { 385aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon if (mGeolocationPermissions == null) { 386fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch ensureChromiumStartedLocked(true); 38750a184c1e058bc62f659fb80e09e7507ef13d6c9Jonathan Dixon mGeolocationPermissions = new GeolocationPermissionsAdapter( 388aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen getBrowserContextLocked().getGeolocationPermissions()); 389009ed27511c4606dcd16b352489b2d3f70b4b513Kristian Monsen } 390009ed27511c4606dcd16b352489b2d3f70b4b513Kristian Monsen } 391ff2704e614eb490baea0acb5c8ab22e061033694Kristian Monsen return mGeolocationPermissions; 39246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 39346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 39446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 39546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public CookieManager getCookieManager() { 39646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) synchronized (mLock) { 397aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon if (mCookieManager == null) { 3988be908c9c3af0debd0aeb0e4ff511dd16bcecf7bTorne (Richard Coles) if (!mStarted) { 3998be908c9c3af0debd0aeb0e4ff511dd16bcecf7bTorne (Richard Coles) // We can use CookieManager without starting Chromium; the native code 4008be908c9c3af0debd0aeb0e4ff511dd16bcecf7bTorne (Richard Coles) // will bring up just the parts it needs to make this work on a temporary 4018be908c9c3af0debd0aeb0e4ff511dd16bcecf7bTorne (Richard Coles) // basis until Chromium is started for real. The temporary cookie manager 4028be908c9c3af0debd0aeb0e4ff511dd16bcecf7bTorne (Richard Coles) // needs the application context to have been set. 4038be908c9c3af0debd0aeb0e4ff511dd16bcecf7bTorne (Richard Coles) ContentMain.initApplicationContext(ActivityThread.currentApplication()); 4048be908c9c3af0debd0aeb0e4ff511dd16bcecf7bTorne (Richard Coles) } 405d5f17bbd8703a56ac084a64b1ce2f673f67bd72dKristian Monsen mCookieManager = new CookieManagerAdapter(new AwCookieManager()); 40646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 40746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 408aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon return mCookieManager; 40946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 41046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 41146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 41246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public WebIconDatabase getWebIconDatabase() { 413aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon synchronized (mLock) { 414aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon if (mWebIconDatabase == null) { 415fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch ensureChromiumStartedLocked(true); 416aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon mWebIconDatabase = new WebIconDatabaseAdapter(); 417aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon } 418aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon } 419aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon return mWebIconDatabase; 42046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 42146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 42246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 42346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public WebStorage getWebStorage() { 424aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon synchronized (mLock) { 425aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon if (mWebStorage == null) { 426fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch ensureChromiumStartedLocked(true); 4275d20093562806fbce9cc0d3eb4a411ed6c5ce1c0Bo Liu mWebStorage = new WebStorageAdapter(AwQuotaManagerBridge.getInstance()); 428aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon } 429aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon } 430aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon return mWebStorage; 43146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 43246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 43346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 43446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public WebViewDatabase getWebViewDatabase(Context context) { 43546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) synchronized (mLock) { 436aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon if (mWebViewDatabase == null) { 437fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch ensureChromiumStartedLocked(true); 43872db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon AwBrowserContext browserContext = getBrowserContextLocked(); 439a6f2939f98aeaf67533a7fd3f5c999f207451f1cSelim Gurun mWebViewDatabase = new WebViewDatabaseAdapter( 440a6f2939f98aeaf67533a7fd3f5c999f207451f1cSelim Gurun browserContext.getFormDatabase(), 441a6f2939f98aeaf67533a7fd3f5c999f207451f1cSelim Gurun browserContext.getHttpAuthDatabase(context)); 442aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon } 44346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 444aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon return mWebViewDatabase; 44546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 44646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)} 447