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; 22b7f8bdb39f5ddfba3394d5335e728d9bf416f0caPrimiano Tucciimport android.content.ComponentCallbacks2; 2346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.content.Context; 2436206a5214eb24ab619db0046d0dcba9be240c63Tao Baiimport android.content.Intent; 25009ed27511c4606dcd16b352489b2d3f70b4b513Kristian Monsenimport android.content.SharedPreferences; 2636206a5214eb24ab619db0046d0dcba9be240c63Tao Baiimport android.net.Uri; 27970a2065df4f96ceaa9bc38d82caea9221dfa4c9Jonathan Dixonimport android.os.Build; 2846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Looper; 293688d4e395b6ce345514f15304b9c670ed1ab875Ben Murdochimport android.os.StrictMode; 30fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdochimport android.util.Log; 3146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.CookieManager; 3246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.GeolocationPermissions; 3346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebIconDatabase; 3446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebStorage; 3546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebView; 3646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewDatabase; 37798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles)import android.webkit.WebViewFactory; 3846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewFactoryProvider; 3946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewProvider; 4046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 4145702509d4752478188935eaf442c549c2c220beIgnacio Sollaimport com.android.webview.chromium.WebViewDelegateFactory.WebViewDelegate; 4245702509d4752478188935eaf442c549c2c220beIgnacio Solla 43aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsenimport org.chromium.android_webview.AwBrowserContext; 44f3e3e4e6b6c5798f435c1d14379edeb479e3b25dJonathan Dixonimport org.chromium.android_webview.AwBrowserProcess; 45a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixonimport org.chromium.android_webview.AwContents; 4615ecd3c837f088579316ee419bcc5528ce215228Selim Gurunimport org.chromium.android_webview.AwContentsStatics; 47d5f17bbd8703a56ac084a64b1ce2f673f67bd72dKristian Monsenimport org.chromium.android_webview.AwCookieManager; 489d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganovimport org.chromium.android_webview.AwDevToolsServer; 4909e718bac5900c84b8402b774d306dca7f7fdf09Selim Gurunimport org.chromium.android_webview.AwFormDatabase; 50009ed27511c4606dcd16b352489b2d3f70b4b513Kristian Monsenimport org.chromium.android_webview.AwGeolocationPermissions; 515d20093562806fbce9cc0d3eb4a411ed6c5ce1c0Bo Liuimport org.chromium.android_webview.AwQuotaManagerBridge; 520657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosibaimport org.chromium.android_webview.AwResource; 53d6b56ff89338d0b3a6ba0cb413b1fe559d6284e0Mikhail Naganovimport org.chromium.android_webview.AwSettings; 542fbdaa7353e16996e874ea99f050a7b857dd92c4Ben Murdochimport org.chromium.base.CommandLine; 55b7f8bdb39f5ddfba3394d5335e728d9bf416f0caPrimiano Tucciimport org.chromium.base.MemoryPressureListener; 5646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.base.PathService; 57798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles)import org.chromium.base.PathUtils; 58aa36c6b5770974fae04acef747292eaafa7aa6c4Vivek Galatageimport org.chromium.base.ResourceExtractor; 597b77b2fb0f7148bc31e23cabadb234231699ff93Jonathan Dixonimport org.chromium.base.ThreadUtils; 606590bd55a007cac3c235987d4f7accf407f9c393Hui Shuimport org.chromium.base.TraceEvent; 6154b3666a044d576394424822704d21dace02dc7cMarcin Kosibaimport org.chromium.base.library_loader.LibraryLoader; 6254b3666a044d576394424822704d21dace02dc7cMarcin Kosibaimport org.chromium.base.library_loader.ProcessInitException; 638be908c9c3af0debd0aeb0e4ff511dd16bcecf7bTorne (Richard Coles)import org.chromium.content.app.ContentMain; 6446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.ContentViewStatics; 6546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 66798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles)import java.io.File; 67fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdochimport java.lang.ref.WeakReference; 68fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdochimport java.util.ArrayList; 69fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch 7046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)public class WebViewChromiumFactoryProvider implements WebViewFactoryProvider { 7146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 726590bd55a007cac3c235987d4f7accf407f9c393Hui Shu private static final String TAG = "WebViewChromiumFactoryProvider"; 7357f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch 74009ed27511c4606dcd16b352489b2d3f70b4b513Kristian Monsen private static final String CHROMIUM_PREFS_NAME = "WebViewChromiumPrefs"; 75798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) private static final String VERSION_CODE_PREF = "lastVersionCodeUsed"; 767962d3fa1b66ed25aba03a2d48f6c47528d7d95cPrimiano Tucci private static final String COMMAND_LINE_FILE = "/data/local/tmp/webview-command-line"; 77009ed27511c4606dcd16b352489b2d3f70b4b513Kristian Monsen 7872db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // Guards accees to the other members, and is notifyAll() signalled on the UI thread 7972db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // when the chromium process has been started. 8072db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon private final Object mLock = new Object(); 8172db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon 8246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Initialization guarded by mLock. 83aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen private AwBrowserContext mBrowserContext; 84aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon private Statics mStaticMethods; 85aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon private GeolocationPermissionsAdapter mGeolocationPermissions; 86aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon private CookieManagerAdapter mCookieManager; 87aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon private WebIconDatabaseAdapter mWebIconDatabase; 88aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon private WebStorageAdapter mWebStorage; 89aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon private WebViewDatabaseAdapter mWebViewDatabase; 909d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov private AwDevToolsServer mDevToolsServer; 9146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 92fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch private ArrayList<WeakReference<WebViewChromium>> mWebViewsToStart = 93fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch new ArrayList<WeakReference<WebViewChromium>>(); 94fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch 959aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon // Read/write protected by mLock. 969aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon private boolean mStarted; 97f0f355514e4420755c15491fe3b21a2eeaa42654Jonathan Dixon 98798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) private SharedPreferences mWebViewPrefs; 9945702509d4752478188935eaf442c549c2c220beIgnacio Solla private WebViewDelegate mWebViewDelegate; 100792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun 10145702509d4752478188935eaf442c549c2c220beIgnacio Solla /** 10245702509d4752478188935eaf442c549c2c220beIgnacio Solla * Constructor called by the API 21 version of {@link WebViewFactory} and earlier. 10345702509d4752478188935eaf442c549c2c220beIgnacio Solla */ 10411f7c1b02e49a6a8eaec26111f08edec45feb01aTorne (Richard Coles) public WebViewChromiumFactoryProvider() { 10545702509d4752478188935eaf442c549c2c220beIgnacio Solla initialize(WebViewDelegateFactory.createApi21CompatibilityDelegate()); 10645702509d4752478188935eaf442c549c2c220beIgnacio Solla } 10745702509d4752478188935eaf442c549c2c220beIgnacio Solla 10845702509d4752478188935eaf442c549c2c220beIgnacio Solla /** 10945702509d4752478188935eaf442c549c2c220beIgnacio Solla * Constructor called by the API 22 version of {@link WebViewFactory} and later. 11045702509d4752478188935eaf442c549c2c220beIgnacio Solla */ 11145702509d4752478188935eaf442c549c2c220beIgnacio Solla public WebViewChromiumFactoryProvider(android.webkit.WebViewDelegate delegate) { 11245702509d4752478188935eaf442c549c2c220beIgnacio Solla initialize(WebViewDelegateFactory.createProxyDelegate(delegate)); 11345702509d4752478188935eaf442c549c2c220beIgnacio Solla } 11445702509d4752478188935eaf442c549c2c220beIgnacio Solla 11545702509d4752478188935eaf442c549c2c220beIgnacio Solla private void initialize(WebViewDelegate webViewDelegate) { 11645702509d4752478188935eaf442c549c2c220beIgnacio Solla mWebViewDelegate = webViewDelegate; 117bf95f761ba3d2dee0ee98b7204d289f35c4f478dIgnacio Solla if (isBuildDebuggable()) { 1183688d4e395b6ce345514f15304b9c670ed1ab875Ben Murdoch // Suppress the StrictMode violation as this codepath is only hit on debugglable builds. 1193688d4e395b6ce345514f15304b9c670ed1ab875Ben Murdoch StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads(); 1207b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman CommandLine.initFromFile(COMMAND_LINE_FILE); 1213688d4e395b6ce345514f15304b9c670ed1ab875Ben Murdoch StrictMode.setThreadPolicy(oldPolicy); 1227b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman } else { 1237b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman CommandLine.init(null); 1247b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman } 1257b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman 1267b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman CommandLine cl = CommandLine.getInstance(); 1277b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman // TODO: currently in a relase build the DCHECKs only log. We either need to insall 1287b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman // a report handler with SetLogReportHandler to make them assert, or else compile 1297b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman // them out of the build altogether (b/8284203). Either way, so long they're 1307b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman // compiled in, we may as unconditionally enable them here. 1317b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman cl.appendSwitch("enable-dcheck"); 1327b7d30a245af5508acc1169699e4f7ab05af13b9Hector Dearman 1336590bd55a007cac3c235987d4f7accf407f9c393Hui Shu ThreadUtils.setWillOverrideUiThread(); 134f3e3e4e6b6c5798f435c1d14379edeb479e3b25dJonathan Dixon // Load chromium library. 135f3e3e4e6b6c5798f435c1d14379edeb479e3b25dJonathan Dixon AwBrowserProcess.loadLibrary(); 136a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon // Load glue-layer support library. 137a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon System.loadLibrary("webviewchromium_plat_support"); 138798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) 139798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) // Use shared preference to check for package downgrade. 14045702509d4752478188935eaf442c549c2c220beIgnacio Solla mWebViewPrefs = mWebViewDelegate.getApplication().getSharedPreferences( 141798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) CHROMIUM_PREFS_NAME, Context.MODE_PRIVATE); 142798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) int lastVersion = mWebViewPrefs.getInt(VERSION_CODE_PREF, 0); 143798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) int currentVersion = WebViewFactory.getLoadedPackageInfo().versionCode; 144798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) if (lastVersion > currentVersion) { 145798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) // The WebView package has been downgraded since we last ran in this application. 146798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) // Delete the WebView data directory's contents. 14745702509d4752478188935eaf442c549c2c220beIgnacio Solla String dataDir = PathUtils.getDataDirectory(mWebViewDelegate.getApplication()); 148798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) Log.i(TAG, "WebView package downgraded from " + lastVersion + " to " + currentVersion + 149798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) "; deleting contents of " + dataDir); 1505112943866a77868d1987617ed1320e73e2a9ce4Ignacio Solla deleteContents(new File(dataDir)); 151798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) } 152798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) if (lastVersion != currentVersion) { 153798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) mWebViewPrefs.edit().putInt(VERSION_CODE_PREF, currentVersion).apply(); 154798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) } 155798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) // Now safe to use WebView data directory. 156f3e3e4e6b6c5798f435c1d14379edeb479e3b25dJonathan Dixon } 157f3e3e4e6b6c5798f435c1d14379edeb479e3b25dJonathan Dixon 158bf95f761ba3d2dee0ee98b7204d289f35c4f478dIgnacio Solla private static boolean isBuildDebuggable() { 159bf95f761ba3d2dee0ee98b7204d289f35c4f478dIgnacio Solla return !Build.TYPE.equals("user"); 160bf95f761ba3d2dee0ee98b7204d289f35c4f478dIgnacio Solla } 161bf95f761ba3d2dee0ee98b7204d289f35c4f478dIgnacio Solla 1625112943866a77868d1987617ed1320e73e2a9ce4Ignacio Solla private static void deleteContents(File dir) { 1635112943866a77868d1987617ed1320e73e2a9ce4Ignacio Solla File[] files = dir.listFiles(); 1645112943866a77868d1987617ed1320e73e2a9ce4Ignacio Solla if (files != null) { 1655112943866a77868d1987617ed1320e73e2a9ce4Ignacio Solla for (File file : files) { 1665112943866a77868d1987617ed1320e73e2a9ce4Ignacio Solla if (file.isDirectory()) { 1675112943866a77868d1987617ed1320e73e2a9ce4Ignacio Solla deleteContents(file); 1685112943866a77868d1987617ed1320e73e2a9ce4Ignacio Solla } 1695112943866a77868d1987617ed1320e73e2a9ce4Ignacio Solla if (!file.delete()) { 1705112943866a77868d1987617ed1320e73e2a9ce4Ignacio Solla Log.w(TAG, "Failed to delete " + file); 1715112943866a77868d1987617ed1320e73e2a9ce4Ignacio Solla } 1725112943866a77868d1987617ed1320e73e2a9ce4Ignacio Solla } 1735112943866a77868d1987617ed1320e73e2a9ce4Ignacio Solla } 1745112943866a77868d1987617ed1320e73e2a9ce4Ignacio Solla } 1755112943866a77868d1987617ed1320e73e2a9ce4Ignacio Solla 176f3e3e4e6b6c5798f435c1d14379edeb479e3b25dJonathan Dixon private void initPlatSupportLibrary() { 1779aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon DrawGLFunctor.setChromiumAwDrawGLFunction(AwContents.getAwDrawGLFunction()); 1789aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon AwContents.setAwDrawSWFunctionTable(GraphicsUtils.getDrawSWFunctionTable()); 179c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu AwContents.setAwDrawGLFunctionTable(GraphicsUtils.getDrawGLFunctionTable()); 180a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon } 181a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 182fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch private void ensureChromiumStartedLocked(boolean onMainThread) { 18346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) assert Thread.holdsLock(mLock); 18446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 18572db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon if (mStarted) { // Early-out for the common case. 18672db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon return; 18772db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } 18872db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon 189fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch Looper looper = !onMainThread ? Looper.myLooper() : Looper.getMainLooper(); 19057f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch Log.v(TAG, "Binding Chromium to " + 19157f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch (Looper.getMainLooper().equals(looper) ? "main":"background") + 19257f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch " looper " + looper); 193fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch ThreadUtils.setUiThread(looper); 194fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch 19572db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon if (ThreadUtils.runningOnUiThread()) { 19672db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon startChromiumLocked(); 1979aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon return; 1989aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon } 1993053d8bc3be48b0cbc6f33e1975c03a10ac303a5Jonathan Dixon 20072db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // We must post to the UI thread to cover the case that the user has invoked Chromium 20172db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // startup by using the (thread-safe) CookieManager rather than creating a WebView. 20272db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon ThreadUtils.postOnUiThread(new Runnable() { 2037b77b2fb0f7148bc31e23cabadb234231699ff93Jonathan Dixon @Override 2047b77b2fb0f7148bc31e23cabadb234231699ff93Jonathan Dixon public void run() { 20572db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon synchronized (mLock) { 20672db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon startChromiumLocked(); 207970a2065df4f96ceaa9bc38d82caea9221dfa4c9Jonathan Dixon } 20872db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } 20972db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon }); 21072db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon while (!mStarted) { 21172db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon try { 212e8a9ddd389a0313fee43c0df877b5cfe9d1ca445Selim Gurun // Important: wait() releases |mLock| the UI thread can take it :-) 21372db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon mLock.wait(); 21472db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } catch (InterruptedException e) { 21572db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // Keep trying... eventually the UI thread will process the task we sent it. 21672db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } 21772db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } 21872db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } 219970a2065df4f96ceaa9bc38d82caea9221dfa4c9Jonathan Dixon 22072db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon private void startChromiumLocked() { 22172db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon assert Thread.holdsLock(mLock) && ThreadUtils.runningOnUiThread(); 2221e5325bde6fb074ce556a4e2833114d890ed21f3Jonathan Dixon 22372db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // The post-condition of this method is everything is ready, so notify now to cover all 22472db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // return paths. (Other threads will not wake-up until we release |mLock|, whatever). 22572db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon mLock.notifyAll(); 226970a2065df4f96ceaa9bc38d82caea9221dfa4c9Jonathan Dixon 22772db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon if (mStarted) { 22872db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon return; 22972db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } 2309aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon 23172db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // We don't need to extract any paks because for WebView, they are 23272db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // in the system image. 23372db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon ResourceExtractor.setMandatoryPaksToExtract(""); 23472db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon 23572db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon try { 23672db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon LibraryLoader.ensureInitialized(); 23772db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } catch(ProcessInitException e) { 23872db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon throw new RuntimeException("Error initializing WebView library", e); 23972db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } 24072db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon 24172db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon PathService.override(PathService.DIR_MODULE, "/system/lib/"); 24272db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // TODO: DIR_RESOURCE_PAKS_ANDROID needs to live somewhere sensible, 24372db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // inlined here for simplicity setting up the HTMLViewer demo. Unfortunately 24472db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // it can't go into base.PathService, as the native constant it refers to 24572db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // lives in the ui/ layer. See ui/base/ui_base_paths.h 24672db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon final int DIR_RESOURCE_PAKS_ANDROID = 3003; 24772db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon PathService.override(DIR_RESOURCE_PAKS_ANDROID, 24872db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon "/system/framework/webview/paks"); 24972db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon 250998d67697ebc5fd0efcd6ed39531e556d788c50fYuncheol Heo // Make sure that ResourceProvider is initialized before starting the browser process. 25145702509d4752478188935eaf442c549c2c220beIgnacio Solla setUpResources(mWebViewDelegate.getApplication()); 25272db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon initPlatSupportLibrary(); 25345702509d4752478188935eaf442c549c2c220beIgnacio Solla AwBrowserProcess.start(mWebViewDelegate.getApplication()); 2549d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov 2550dd72dc2dac5ee57fd597f172e5015650312a700Ignacio Solla if (isBuildDebuggable()) { 2569d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov setWebContentsDebuggingEnabled(true); 2579d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov } 2586590bd55a007cac3c235987d4f7accf407f9c393Hui Shu 25945702509d4752478188935eaf442c549c2c220beIgnacio Solla TraceEvent.setATraceEnabled(mWebViewDelegate.isTraceTagEnabled()); 26045702509d4752478188935eaf442c549c2c220beIgnacio Solla mWebViewDelegate.setOnTraceEnabledChangeListener( 26145702509d4752478188935eaf442c549c2c220beIgnacio Solla new WebViewDelegate.OnTraceEnabledChangeListener() { 26245702509d4752478188935eaf442c549c2c220beIgnacio Solla @Override 26345702509d4752478188935eaf442c549c2c220beIgnacio Solla public void onTraceEnabledChange(boolean enabled) { 26445702509d4752478188935eaf442c549c2c220beIgnacio Solla TraceEvent.setATraceEnabled(enabled); 26545702509d4752478188935eaf442c549c2c220beIgnacio Solla } 26645702509d4752478188935eaf442c549c2c220beIgnacio Solla }); 2679aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon mStarted = true; 268fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch 269fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch for (WeakReference<WebViewChromium> wvc : mWebViewsToStart) { 270fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch WebViewChromium w = wvc.get(); 271fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch if (w != null) { 272fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch w.startYourEngine(); 273fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch } 274fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch } 275fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch mWebViewsToStart.clear(); 276fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch mWebViewsToStart = null; 2775dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun } 2785dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun 27957f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch boolean hasStarted() { 28057f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch return mStarted; 28157f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 28257f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch 28357f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch void startYourEngines(boolean onMainThread) { 28457f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch synchronized (mLock) { 28557f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch ensureChromiumStartedLocked(onMainThread); 28657f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch 28757f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 28857f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 28957f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch 29057f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch AwBrowserContext getBrowserContext() { 29157f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch synchronized (mLock) { 29257f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch return getBrowserContextLocked(); 29357f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 29457f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 29557f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch 29657f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch private AwBrowserContext getBrowserContextLocked() { 29757f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch assert Thread.holdsLock(mLock); 29857f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch assert mStarted; 29957f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch if (mBrowserContext == null) { 300798eef952efe49826b17dcf9f3bf27e4731188cfTorne (Richard Coles) mBrowserContext = new AwBrowserContext(mWebViewPrefs); 30157f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 30257f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch return mBrowserContext; 30357f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 30457f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch 30557f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch private void setWebContentsDebuggingEnabled(boolean enable) { 30657f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch if (Looper.myLooper() != ThreadUtils.getUiThreadLooper()) { 30757f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch throw new RuntimeException( 30857f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch "Toggling of Web Contents Debugging must be done on the UI thread"); 30957f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 31057f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch if (mDevToolsServer == null) { 31157f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch if (!enable) return; 31257f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch mDevToolsServer = new AwDevToolsServer(); 31357f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 31457f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch mDevToolsServer.setRemoteDebuggingEnabled(enable); 31557f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 31657f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch 31745702509d4752478188935eaf442c549c2c220beIgnacio Solla private void setUpResources(Context context) { 31845702509d4752478188935eaf442c549c2c220beIgnacio Solla // The resources are always called com.android.webview even if the manifest has had the 31945702509d4752478188935eaf442c549c2c220beIgnacio Solla // package renamed. 32045702509d4752478188935eaf442c549c2c220beIgnacio Solla ResourceRewriter.rewriteRValues( 32145702509d4752478188935eaf442c549c2c220beIgnacio Solla mWebViewDelegate.getPackageId(context.getResources(), "com.android.webview")); 3220657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosiba 32345702509d4752478188935eaf442c549c2c220beIgnacio Solla AwResource.setResources(context.getResources()); 324e0ef2965a44761b31eeae5868811262d566a8641Marcin Kosiba AwResource.setErrorPageResources(android.R.raw.loaderror, 325e0ef2965a44761b31eeae5868811262d566a8641Marcin Kosiba android.R.raw.nodomain); 3260657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosiba AwResource.setConfigKeySystemUuidMapping( 327e0ef2965a44761b31eeae5868811262d566a8641Marcin Kosiba android.R.array.config_keySystemUuidMapping); 3280657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosiba } 32957f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch 33046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 33146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public Statics getStatics() { 33246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) synchronized (mLock) { 33346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (mStaticMethods == null) { 3349aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon // TODO: Optimization potential: most these methods only need the native library 335f3e3e4e6b6c5798f435c1d14379edeb479e3b25dJonathan Dixon // loaded and initialized, not the entire browser process started. 336f3e3e4e6b6c5798f435c1d14379edeb479e3b25dJonathan Dixon // See also http://b/7009882 337fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch ensureChromiumStartedLocked(true); 33846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mStaticMethods = new WebViewFactoryProvider.Statics() { 33946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 34046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public String findAddress(String addr) { 34146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return ContentViewStatics.findAddress(addr); 34246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 34346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 34446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 34546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public String getDefaultUserAgent(Context context) { 346d6b56ff89338d0b3a6ba0cb413b1fe559d6284e0Mikhail Naganov return AwSettings.getDefaultUserAgent(); 34746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 348b7f8bdb39f5ddfba3394d5335e728d9bf416f0caPrimiano Tucci 349b7f8bdb39f5ddfba3394d5335e728d9bf416f0caPrimiano Tucci @Override 3509d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov public void setWebContentsDebuggingEnabled(boolean enable) { 3519d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov // Web Contents debugging is always enabled on debug builds. 3520dd72dc2dac5ee57fd597f172e5015650312a700Ignacio Solla if (!isBuildDebuggable()) { 3539d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov WebViewChromiumFactoryProvider.this. 3549d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov setWebContentsDebuggingEnabled(enable); 3559d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov } 3569d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov } 3579d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov 35815ecd3c837f088579316ee419bcc5528ce215228Selim Gurun // TODO enable after L release to AOSP 35915ecd3c837f088579316ee419bcc5528ce215228Selim Gurun //@Override 36015ecd3c837f088579316ee419bcc5528ce215228Selim Gurun public void clearClientCertPreferences(Runnable onCleared) { 36115ecd3c837f088579316ee419bcc5528ce215228Selim Gurun AwContentsStatics.clearClientCertPreferences(onCleared); 36215ecd3c837f088579316ee419bcc5528ce215228Selim Gurun } 36315ecd3c837f088579316ee419bcc5528ce215228Selim Gurun 3649d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov @Override 365b7f8bdb39f5ddfba3394d5335e728d9bf416f0caPrimiano Tucci public void freeMemoryForTests() { 36617cd884446d243f8ef74b99ef9d617699953419aPrimiano Tucci if (ActivityManager.isRunningInTestHarness()) { 36717cd884446d243f8ef74b99ef9d617699953419aPrimiano Tucci MemoryPressureListener.maybeNotifyMemoryPresure( 36817cd884446d243f8ef74b99ef9d617699953419aPrimiano Tucci ComponentCallbacks2.TRIM_MEMORY_COMPLETE); 36917cd884446d243f8ef74b99ef9d617699953419aPrimiano Tucci } 370b7f8bdb39f5ddfba3394d5335e728d9bf416f0caPrimiano Tucci } 3715dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun 372086910f44494b4677dc0f5d66045b0d55743e5fbBo Liu // TODO: Add @Override. 373086910f44494b4677dc0f5d66045b0d55743e5fbBo Liu public void enableSlowWholeDocumentDraw() { 374086910f44494b4677dc0f5d66045b0d55743e5fbBo Liu WebViewChromium.enableSlowWholeDocumentDraw(); 375086910f44494b4677dc0f5d66045b0d55743e5fbBo Liu } 37636206a5214eb24ab619db0046d0dcba9be240c63Tao Bai 37736206a5214eb24ab619db0046d0dcba9be240c63Tao Bai @Override 37836206a5214eb24ab619db0046d0dcba9be240c63Tao Bai public Uri[] parseFileChooserResult(int resultCode, Intent intent) { 37936206a5214eb24ab619db0046d0dcba9be240c63Tao Bai return FileChooserParamsAdapter.parseFileChooserResult(resultCode, intent); 38036206a5214eb24ab619db0046d0dcba9be240c63Tao Bai } 38146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) }; 38246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 38346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 38446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return mStaticMethods; 38546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 38646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 38746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 38846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public WebViewProvider createWebView(WebView webView, WebView.PrivateAccess privateAccess) { 389fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch WebViewChromium wvc = new WebViewChromium(this, webView, privateAccess); 390fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch 391fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch synchronized (mLock) { 392fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch if (mWebViewsToStart != null) { 393fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch mWebViewsToStart.add(new WeakReference<WebViewChromium>(wvc)); 394fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch } 395fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch } 3960657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosiba 397fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch return wvc; 398fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch } 399fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch 40046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 40146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public GeolocationPermissions getGeolocationPermissions() { 402009ed27511c4606dcd16b352489b2d3f70b4b513Kristian Monsen synchronized (mLock) { 403aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon if (mGeolocationPermissions == null) { 404fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch ensureChromiumStartedLocked(true); 40550a184c1e058bc62f659fb80e09e7507ef13d6c9Jonathan Dixon mGeolocationPermissions = new GeolocationPermissionsAdapter( 406aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen getBrowserContextLocked().getGeolocationPermissions()); 407009ed27511c4606dcd16b352489b2d3f70b4b513Kristian Monsen } 408009ed27511c4606dcd16b352489b2d3f70b4b513Kristian Monsen } 409ff2704e614eb490baea0acb5c8ab22e061033694Kristian Monsen return mGeolocationPermissions; 41046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 41146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 41246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 41346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public CookieManager getCookieManager() { 41446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) synchronized (mLock) { 415aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon if (mCookieManager == null) { 4168be908c9c3af0debd0aeb0e4ff511dd16bcecf7bTorne (Richard Coles) if (!mStarted) { 4178be908c9c3af0debd0aeb0e4ff511dd16bcecf7bTorne (Richard Coles) // We can use CookieManager without starting Chromium; the native code 4188be908c9c3af0debd0aeb0e4ff511dd16bcecf7bTorne (Richard Coles) // will bring up just the parts it needs to make this work on a temporary 4198be908c9c3af0debd0aeb0e4ff511dd16bcecf7bTorne (Richard Coles) // basis until Chromium is started for real. The temporary cookie manager 4208be908c9c3af0debd0aeb0e4ff511dd16bcecf7bTorne (Richard Coles) // needs the application context to have been set. 42145702509d4752478188935eaf442c549c2c220beIgnacio Solla ContentMain.initApplicationContext(mWebViewDelegate.getApplication()); 4228be908c9c3af0debd0aeb0e4ff511dd16bcecf7bTorne (Richard Coles) } 423d5f17bbd8703a56ac084a64b1ce2f673f67bd72dKristian Monsen mCookieManager = new CookieManagerAdapter(new AwCookieManager()); 42446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 42546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 426aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon return mCookieManager; 42746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 42846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 42946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 43046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public WebIconDatabase getWebIconDatabase() { 431aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon synchronized (mLock) { 432aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon if (mWebIconDatabase == null) { 433fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch ensureChromiumStartedLocked(true); 434aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon mWebIconDatabase = new WebIconDatabaseAdapter(); 435aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon } 436aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon } 437aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon return mWebIconDatabase; 43846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 43946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 44046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 44146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public WebStorage getWebStorage() { 442aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon synchronized (mLock) { 443aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon if (mWebStorage == null) { 444fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch ensureChromiumStartedLocked(true); 4455d20093562806fbce9cc0d3eb4a411ed6c5ce1c0Bo Liu mWebStorage = new WebStorageAdapter(AwQuotaManagerBridge.getInstance()); 446aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon } 447aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon } 448aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon return mWebStorage; 44946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 45046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 45146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 45246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public WebViewDatabase getWebViewDatabase(Context context) { 45346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) synchronized (mLock) { 454aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon if (mWebViewDatabase == null) { 455fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch ensureChromiumStartedLocked(true); 45672db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon AwBrowserContext browserContext = getBrowserContextLocked(); 457a6f2939f98aeaf67533a7fd3f5c999f207451f1cSelim Gurun mWebViewDatabase = new WebViewDatabaseAdapter( 458a6f2939f98aeaf67533a7fd3f5c999f207451f1cSelim Gurun browserContext.getFormDatabase(), 459a6f2939f98aeaf67533a7fd3f5c999f207451f1cSelim Gurun browserContext.getHttpAuthDatabase(context)); 460aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon } 46146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 462aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon return mWebViewDatabase; 46346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 46445702509d4752478188935eaf442c549c2c220beIgnacio Solla 46545702509d4752478188935eaf442c549c2c220beIgnacio Solla WebViewDelegate getWebViewDelegate() { 46645702509d4752478188935eaf442c549c2c220beIgnacio Solla return mWebViewDelegate; 46745702509d4752478188935eaf442c549c2c220beIgnacio Solla } 46846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)} 469