WebViewChromiumFactoryProvider.java revision 5cb1bc4fabdd9d08806bd9f3d9c92f872144d276
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; 23792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurunimport android.content.BroadcastReceiver; 24b7f8bdb39f5ddfba3394d5335e728d9bf416f0caPrimiano Tucciimport android.content.ComponentCallbacks2; 2546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.content.Context; 26792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurunimport android.content.Intent; 27792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurunimport android.content.IntentFilter; 28009ed27511c4606dcd16b352489b2d3f70b4b513Kristian Monsenimport android.content.SharedPreferences; 29970a2065df4f96ceaa9bc38d82caea9221dfa4c9Jonathan Dixonimport android.os.Build; 3046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Looper; 316590bd55a007cac3c235987d4f7accf407f9c393Hui Shuimport android.os.SystemProperties; 326590bd55a007cac3c235987d4f7accf407f9c393Hui Shuimport android.os.Trace; 33792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurunimport android.provider.Settings; 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; 4146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewFactoryProvider; 4246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewProvider; 4346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 44aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsenimport org.chromium.android_webview.AwBrowserContext; 45f3e3e4e6b6c5798f435c1d14379edeb479e3b25dJonathan Dixonimport org.chromium.android_webview.AwBrowserProcess; 46a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixonimport org.chromium.android_webview.AwContents; 4715ecd3c837f088579316ee419bcc5528ce215228Selim Gurunimport org.chromium.android_webview.AwContentsStatics; 48d5f17bbd8703a56ac084a64b1ce2f673f67bd72dKristian Monsenimport org.chromium.android_webview.AwCookieManager; 499d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganovimport org.chromium.android_webview.AwDevToolsServer; 5009e718bac5900c84b8402b774d306dca7f7fdf09Selim Gurunimport org.chromium.android_webview.AwFormDatabase; 51009ed27511c4606dcd16b352489b2d3f70b4b513Kristian Monsenimport org.chromium.android_webview.AwGeolocationPermissions; 525d20093562806fbce9cc0d3eb4a411ed6c5ce1c0Bo Liuimport org.chromium.android_webview.AwQuotaManagerBridge; 530657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosibaimport org.chromium.android_webview.AwResource; 54d6b56ff89338d0b3a6ba0cb413b1fe559d6284e0Mikhail Naganovimport org.chromium.android_webview.AwSettings; 552fbdaa7353e16996e874ea99f050a7b857dd92c4Ben Murdochimport org.chromium.base.CommandLine; 56b7f8bdb39f5ddfba3394d5335e728d9bf416f0caPrimiano Tucciimport org.chromium.base.MemoryPressureListener; 5746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.base.PathService; 587b77b2fb0f7148bc31e23cabadb234231699ff93Jonathan Dixonimport org.chromium.base.ThreadUtils; 596590bd55a007cac3c235987d4f7accf407f9c393Hui Shuimport org.chromium.base.TraceEvent; 6054b3666a044d576394424822704d21dace02dc7cMarcin Kosibaimport org.chromium.base.library_loader.LibraryLoader; 6154b3666a044d576394424822704d21dace02dc7cMarcin Kosibaimport org.chromium.base.library_loader.ProcessInitException; 628be908c9c3af0debd0aeb0e4ff511dd16bcecf7bTorne (Richard Coles)import org.chromium.content.app.ContentMain; 6346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.ContentViewStatics; 6446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.ResourceExtractor; 6546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 66fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdochimport java.lang.ref.WeakReference; 67fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdochimport java.util.ArrayList; 68fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch 6946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)public class WebViewChromiumFactoryProvider implements WebViewFactoryProvider { 7046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 71792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun /* 72792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun * Listen for DataReductionProxySetting changes and take action. 73792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun */ 74792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun private static final class DataReductionProxySettingListener extends BroadcastReceiver { 75792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun @Override 76792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun public void onReceive(Context context, Intent intent) { 770039eda3e19cd0995aa62d2b856645813a6ff611Selim Gurun EnableDataReductionProxyIfNecessary(context); 78792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun } 79792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun } 80792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun 816590bd55a007cac3c235987d4f7accf407f9c393Hui Shu private static final String TAG = "WebViewChromiumFactoryProvider"; 8257f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch 83009ed27511c4606dcd16b352489b2d3f70b4b513Kristian Monsen private static final String CHROMIUM_PREFS_NAME = "WebViewChromiumPrefs"; 847962d3fa1b66ed25aba03a2d48f6c47528d7d95cPrimiano Tucci private static final String COMMAND_LINE_FILE = "/data/local/tmp/webview-command-line"; 85009ed27511c4606dcd16b352489b2d3f70b4b513Kristian Monsen 8672db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // Guards accees to the other members, and is notifyAll() signalled on the UI thread 8772db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // when the chromium process has been started. 8872db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon private final Object mLock = new Object(); 8972db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon 9046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Initialization guarded by mLock. 91aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen private AwBrowserContext mBrowserContext; 92aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon private Statics mStaticMethods; 93aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon private GeolocationPermissionsAdapter mGeolocationPermissions; 94aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon private CookieManagerAdapter mCookieManager; 95aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon private WebIconDatabaseAdapter mWebIconDatabase; 96aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon private WebStorageAdapter mWebStorage; 97aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon private WebViewDatabaseAdapter mWebViewDatabase; 989d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov private AwDevToolsServer mDevToolsServer; 9946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 100fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch private ArrayList<WeakReference<WebViewChromium>> mWebViewsToStart = 101fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch new ArrayList<WeakReference<WebViewChromium>>(); 102fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch 1039aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon // Read/write protected by mLock. 1049aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon private boolean mStarted; 105f0f355514e4420755c15491fe3b21a2eeaa42654Jonathan Dixon 106792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun private DataReductionProxySettingListener mProxySettingListener; 1075dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun // TODO(sgurun) Temporary. Remove this after a corresponding CL to keep this state in 1085dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun // AwContentsStatics is merged to M37. 1095dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun private static boolean sOptedOutDataReductionProxy = false; 110792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun 11111f7c1b02e49a6a8eaec26111f08edec45feb01aTorne (Richard Coles) public WebViewChromiumFactoryProvider() { 1126590bd55a007cac3c235987d4f7accf407f9c393Hui Shu ThreadUtils.setWillOverrideUiThread(); 113f3e3e4e6b6c5798f435c1d14379edeb479e3b25dJonathan Dixon // Load chromium library. 114f3e3e4e6b6c5798f435c1d14379edeb479e3b25dJonathan Dixon AwBrowserProcess.loadLibrary(); 115a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon // Load glue-layer support library. 116a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon System.loadLibrary("webviewchromium_plat_support"); 117f3e3e4e6b6c5798f435c1d14379edeb479e3b25dJonathan Dixon } 118f3e3e4e6b6c5798f435c1d14379edeb479e3b25dJonathan Dixon 119f3e3e4e6b6c5798f435c1d14379edeb479e3b25dJonathan Dixon private void initPlatSupportLibrary() { 1209aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon DrawGLFunctor.setChromiumAwDrawGLFunction(AwContents.getAwDrawGLFunction()); 1219aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon AwContents.setAwDrawSWFunctionTable(GraphicsUtils.getDrawSWFunctionTable()); 122c5cde8c18df853e11d1ec528508fd0fe2e742d5cKaan Baloglu AwContents.setAwDrawGLFunctionTable(GraphicsUtils.getDrawGLFunctionTable()); 123a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon } 124a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon 1256590bd55a007cac3c235987d4f7accf407f9c393Hui Shu private static void initTraceEvent() { 1266590bd55a007cac3c235987d4f7accf407f9c393Hui Shu syncATraceState(); 1276590bd55a007cac3c235987d4f7accf407f9c393Hui Shu SystemProperties.addChangeCallback(new Runnable() { 1286590bd55a007cac3c235987d4f7accf407f9c393Hui Shu @Override 1296590bd55a007cac3c235987d4f7accf407f9c393Hui Shu public void run() { 1306590bd55a007cac3c235987d4f7accf407f9c393Hui Shu syncATraceState(); 1316590bd55a007cac3c235987d4f7accf407f9c393Hui Shu } 1326590bd55a007cac3c235987d4f7accf407f9c393Hui Shu }); 1336590bd55a007cac3c235987d4f7accf407f9c393Hui Shu } 1346590bd55a007cac3c235987d4f7accf407f9c393Hui Shu 1356590bd55a007cac3c235987d4f7accf407f9c393Hui Shu private static void syncATraceState() { 1366590bd55a007cac3c235987d4f7accf407f9c393Hui Shu long enabledFlags = SystemProperties.getLong("debug.atrace.tags.enableflags", 0); 1376590bd55a007cac3c235987d4f7accf407f9c393Hui Shu TraceEvent.setATraceEnabled((enabledFlags & Trace.TRACE_TAG_WEBVIEW) != 0); 1386590bd55a007cac3c235987d4f7accf407f9c393Hui Shu } 1396590bd55a007cac3c235987d4f7accf407f9c393Hui Shu 140fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch private void ensureChromiumStartedLocked(boolean onMainThread) { 14146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) assert Thread.holdsLock(mLock); 14246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 14372db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon if (mStarted) { // Early-out for the common case. 14472db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon return; 14572db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } 14672db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon 147fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch Looper looper = !onMainThread ? Looper.myLooper() : Looper.getMainLooper(); 14857f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch Log.v(TAG, "Binding Chromium to " + 14957f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch (Looper.getMainLooper().equals(looper) ? "main":"background") + 15057f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch " looper " + looper); 151fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch ThreadUtils.setUiThread(looper); 152fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch 15372db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon if (ThreadUtils.runningOnUiThread()) { 15472db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon startChromiumLocked(); 1559aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon return; 1569aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon } 1573053d8bc3be48b0cbc6f33e1975c03a10ac303a5Jonathan Dixon 15872db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // We must post to the UI thread to cover the case that the user has invoked Chromium 15972db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // startup by using the (thread-safe) CookieManager rather than creating a WebView. 16072db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon ThreadUtils.postOnUiThread(new Runnable() { 1617b77b2fb0f7148bc31e23cabadb234231699ff93Jonathan Dixon @Override 1627b77b2fb0f7148bc31e23cabadb234231699ff93Jonathan Dixon public void run() { 16372db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon synchronized (mLock) { 16472db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon startChromiumLocked(); 165970a2065df4f96ceaa9bc38d82caea9221dfa4c9Jonathan Dixon } 16672db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } 16772db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon }); 16872db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon while (!mStarted) { 16972db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon try { 17072db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // Important: wait() releases |mLock| so the UI thread can take it :-) 17172db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon mLock.wait(); 17272db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } catch (InterruptedException e) { 17372db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // Keep trying... eventually the UI thread will process the task we sent it. 17472db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } 17572db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } 17672db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } 177970a2065df4f96ceaa9bc38d82caea9221dfa4c9Jonathan Dixon 17872db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon private void startChromiumLocked() { 17972db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon assert Thread.holdsLock(mLock) && ThreadUtils.runningOnUiThread(); 1801e5325bde6fb074ce556a4e2833114d890ed21f3Jonathan Dixon 18172db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // The post-condition of this method is everything is ready, so notify now to cover all 18272db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // return paths. (Other threads will not wake-up until we release |mLock|, whatever). 18372db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon mLock.notifyAll(); 184970a2065df4f96ceaa9bc38d82caea9221dfa4c9Jonathan Dixon 18572db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon if (mStarted) { 18672db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon return; 18772db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } 1889aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon 18972db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon if (Build.IS_DEBUGGABLE) { 19072db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon CommandLine.initFromFile(COMMAND_LINE_FILE); 19172db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } else { 19272db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon CommandLine.init(null); 19372db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } 1947b77b2fb0f7148bc31e23cabadb234231699ff93Jonathan Dixon 19572db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon CommandLine cl = CommandLine.getInstance(); 19672db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // TODO: currently in a relase build the DCHECKs only log. We either need to insall 19772db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // a report handler with SetLogReportHandler to make them assert, or else compile 19872db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // them out of the build altogether (b/8284203). Either way, so long they're 19972db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // compiled in, we may as unconditionally enable them here. 20072db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon cl.appendSwitch("enable-dcheck"); 20172db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon 20272db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // TODO: Remove when GL is supported by default in the upstream code. 20372db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon if (!cl.hasSwitch("disable-webview-gl-mode")) { 20472db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon cl.appendSwitch("testing-webview-gl-mode"); 20572db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } 20672db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon 20772db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // We don't need to extract any paks because for WebView, they are 20872db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // in the system image. 20972db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon ResourceExtractor.setMandatoryPaksToExtract(""); 21072db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon 21172db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon try { 21272db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon LibraryLoader.ensureInitialized(); 21372db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } catch(ProcessInitException e) { 21472db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon throw new RuntimeException("Error initializing WebView library", e); 21572db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon } 21672db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon 21772db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon PathService.override(PathService.DIR_MODULE, "/system/lib/"); 21872db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // TODO: DIR_RESOURCE_PAKS_ANDROID needs to live somewhere sensible, 21972db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // inlined here for simplicity setting up the HTMLViewer demo. Unfortunately 22072db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // it can't go into base.PathService, as the native constant it refers to 22172db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon // lives in the ui/ layer. See ui/base/ui_base_paths.h 22272db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon final int DIR_RESOURCE_PAKS_ANDROID = 3003; 22372db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon PathService.override(DIR_RESOURCE_PAKS_ANDROID, 22472db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon "/system/framework/webview/paks"); 22572db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon 226998d67697ebc5fd0efcd6ed39531e556d788c50fYuncheol Heo // Make sure that ResourceProvider is initialized before starting the browser process. 2270657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosiba setUpResources(ActivityThread.currentApplication()); 22872db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon initPlatSupportLibrary(); 2295cb1bc4fabdd9d08806bd9f3d9c92f872144d276Bo Liu AwBrowserProcess.start(ActivityThread.currentApplication()); 2309d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov 2319d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov if (Build.IS_DEBUGGABLE) { 2329d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov setWebContentsDebuggingEnabled(true); 2339d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov } 2346590bd55a007cac3c235987d4f7accf407f9c393Hui Shu 2356590bd55a007cac3c235987d4f7accf407f9c393Hui Shu initTraceEvent(); 2369aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon mStarted = true; 237fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch 238fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch for (WeakReference<WebViewChromium> wvc : mWebViewsToStart) { 239fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch WebViewChromium w = wvc.get(); 240fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch if (w != null) { 241fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch w.startYourEngine(); 242fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch } 243fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch } 244fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch mWebViewsToStart.clear(); 245fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch mWebViewsToStart = null; 246792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun 247792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun // starts listening for data reduction proxy setting changes. 2480039eda3e19cd0995aa62d2b856645813a6ff611Selim Gurun initDataReductionProxySettingListener(ActivityThread.currentApplication()); 249792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun } 250792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun 2510039eda3e19cd0995aa62d2b856645813a6ff611Selim Gurun private void initDataReductionProxySettingListener(Context context) { 2520039eda3e19cd0995aa62d2b856645813a6ff611Selim Gurun EnableDataReductionProxyIfNecessary(context); 253792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun IntentFilter filter = new IntentFilter(); 254792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun filter.addAction(WebView.DATA_REDUCTION_PROXY_SETTING_CHANGED); 255792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun mProxySettingListener = new DataReductionProxySettingListener(); 256792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun context.registerReceiver(mProxySettingListener, filter); 257792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun } 258792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun 2590039eda3e19cd0995aa62d2b856645813a6ff611Selim Gurun private static void EnableDataReductionProxyIfNecessary(Context context) { 2600039eda3e19cd0995aa62d2b856645813a6ff611Selim Gurun boolean enabled = isDataReductionProxyEnabled(context); 2610039eda3e19cd0995aa62d2b856645813a6ff611Selim Gurun if (enabled) { 2620039eda3e19cd0995aa62d2b856645813a6ff611Selim Gurun // Re-read the key in case it was updated. 2630039eda3e19cd0995aa62d2b856645813a6ff611Selim Gurun String key = Settings.Secure.getString(context.getContentResolver(), 2640039eda3e19cd0995aa62d2b856645813a6ff611Selim Gurun Settings.Global.WEBVIEW_DATA_REDUCTION_PROXY_KEY); 2650039eda3e19cd0995aa62d2b856645813a6ff611Selim Gurun if (key == null || key.isEmpty()) { 2660039eda3e19cd0995aa62d2b856645813a6ff611Selim Gurun Log.w(TAG, "No DRP key available"); 2670039eda3e19cd0995aa62d2b856645813a6ff611Selim Gurun return; 2680039eda3e19cd0995aa62d2b856645813a6ff611Selim Gurun } 2690039eda3e19cd0995aa62d2b856645813a6ff611Selim Gurun // Set the data reduction proxy key. 2700039eda3e19cd0995aa62d2b856645813a6ff611Selim Gurun AwContentsStatics.setDataReductionProxyKey(key); 2710039eda3e19cd0995aa62d2b856645813a6ff611Selim Gurun } 2720039eda3e19cd0995aa62d2b856645813a6ff611Selim Gurun AwContentsStatics.setDataReductionProxyEnabled(enabled); 2730039eda3e19cd0995aa62d2b856645813a6ff611Selim Gurun } 2740039eda3e19cd0995aa62d2b856645813a6ff611Selim Gurun 275792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun private static boolean isDataReductionProxyEnabled(Context context) { 2765dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun if (sOptedOutDataReductionProxy) { 2775dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun return false; 2785dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun } 279792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun return Settings.Secure.getInt(context.getContentResolver(), 280792352e52b0df504e9f16c1e3ccdc211922cf79eSelim Gurun Settings.Secure.WEBVIEW_DATA_REDUCTION_PROXY, 0) != 0; 28146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 28246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 2835dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun // TODO(sgurun) Temporary. Remove this logic after a corresponding CL to have this logic 2845dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun // in AwContentsStatics is merged to M37. 2855dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun private static void optOutDataReductionProxy() { 2865dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun if (!sOptedOutDataReductionProxy) { 2875dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun sOptedOutDataReductionProxy = true; 2885dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun AwContentsStatics.setDataReductionProxyEnabled(false); 2895dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun } 2905dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun } 2915dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun 29257f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch boolean hasStarted() { 29357f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch return mStarted; 29457f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 29557f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch 29657f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch void startYourEngines(boolean onMainThread) { 29757f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch synchronized (mLock) { 29857f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch ensureChromiumStartedLocked(onMainThread); 29957f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch 30057f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 30157f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 30257f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch 30357f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch AwBrowserContext getBrowserContext() { 30457f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch synchronized (mLock) { 30557f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch return getBrowserContextLocked(); 30657f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 30757f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 30857f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch 30957f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch private AwBrowserContext getBrowserContextLocked() { 31057f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch assert Thread.holdsLock(mLock); 31157f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch assert mStarted; 31257f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch if (mBrowserContext == null) { 31357f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch mBrowserContext = new AwBrowserContext( 31457f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch ActivityThread.currentApplication().getSharedPreferences( 31557f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch CHROMIUM_PREFS_NAME, Context.MODE_PRIVATE)); 31657f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 31757f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch return mBrowserContext; 31857f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 31957f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch 32057f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch private void setWebContentsDebuggingEnabled(boolean enable) { 32157f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch if (Looper.myLooper() != ThreadUtils.getUiThreadLooper()) { 32257f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch throw new RuntimeException( 32357f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch "Toggling of Web Contents Debugging must be done on the UI thread"); 32457f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 32557f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch if (mDevToolsServer == null) { 32657f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch if (!enable) return; 32757f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch mDevToolsServer = new AwDevToolsServer(); 32857f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 32957f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch mDevToolsServer.setRemoteDebuggingEnabled(enable); 33057f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch } 33157f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch 3320657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosiba private void setUpResources(Context ctx) { 3330657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosiba ResourceRewriter.rewriteRValues(ctx); 3340657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosiba 3350657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosiba AwResource.setResources(ctx.getResources()); 336e0ef2965a44761b31eeae5868811262d566a8641Marcin Kosiba AwResource.setErrorPageResources(android.R.raw.loaderror, 337e0ef2965a44761b31eeae5868811262d566a8641Marcin Kosiba android.R.raw.nodomain); 3380657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosiba AwResource.setDefaultTextEncoding( 339e0ef2965a44761b31eeae5868811262d566a8641Marcin Kosiba android.R.string.config_webSettingsDefaultTextEncoding); 3400657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosiba AwResource.setConfigKeySystemUuidMapping( 341e0ef2965a44761b31eeae5868811262d566a8641Marcin Kosiba android.R.array.config_keySystemUuidMapping); 3420657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosiba } 34357f39b97561187c13c4903afdae51c3c9c1cc209Ben Murdoch 34446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 34546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public Statics getStatics() { 34646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) synchronized (mLock) { 34746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (mStaticMethods == null) { 3489aa44b4e29be9f4b271edb3f4d438d806d4cc176Jonathan Dixon // TODO: Optimization potential: most these methods only need the native library 349f3e3e4e6b6c5798f435c1d14379edeb479e3b25dJonathan Dixon // loaded and initialized, not the entire browser process started. 350f3e3e4e6b6c5798f435c1d14379edeb479e3b25dJonathan Dixon // See also http://b/7009882 351fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch ensureChromiumStartedLocked(true); 35246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mStaticMethods = new WebViewFactoryProvider.Statics() { 35346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 35446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public String findAddress(String addr) { 35546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return ContentViewStatics.findAddress(addr); 35646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 35746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 35846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 35946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public String getDefaultUserAgent(Context context) { 360d6b56ff89338d0b3a6ba0cb413b1fe559d6284e0Mikhail Naganov return AwSettings.getDefaultUserAgent(); 36146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 362b7f8bdb39f5ddfba3394d5335e728d9bf416f0caPrimiano Tucci 363b7f8bdb39f5ddfba3394d5335e728d9bf416f0caPrimiano Tucci @Override 3649d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov public void setWebContentsDebuggingEnabled(boolean enable) { 3659d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov // Web Contents debugging is always enabled on debug builds. 3669d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov if (!Build.IS_DEBUGGABLE) { 3679d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov WebViewChromiumFactoryProvider.this. 3689d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov setWebContentsDebuggingEnabled(enable); 3699d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov } 3709d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov } 3719d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov 37215ecd3c837f088579316ee419bcc5528ce215228Selim Gurun // TODO enable after L release to AOSP 37315ecd3c837f088579316ee419bcc5528ce215228Selim Gurun //@Override 37415ecd3c837f088579316ee419bcc5528ce215228Selim Gurun public void clearClientCertPreferences(Runnable onCleared) { 37515ecd3c837f088579316ee419bcc5528ce215228Selim Gurun AwContentsStatics.clearClientCertPreferences(onCleared); 37615ecd3c837f088579316ee419bcc5528ce215228Selim Gurun } 37715ecd3c837f088579316ee419bcc5528ce215228Selim Gurun 3789d0315cd966ad486abfcb51afa6692249461d14cMikhail Naganov @Override 379b7f8bdb39f5ddfba3394d5335e728d9bf416f0caPrimiano Tucci public void freeMemoryForTests() { 38017cd884446d243f8ef74b99ef9d617699953419aPrimiano Tucci if (ActivityManager.isRunningInTestHarness()) { 38117cd884446d243f8ef74b99ef9d617699953419aPrimiano Tucci MemoryPressureListener.maybeNotifyMemoryPresure( 38217cd884446d243f8ef74b99ef9d617699953419aPrimiano Tucci ComponentCallbacks2.TRIM_MEMORY_COMPLETE); 38317cd884446d243f8ef74b99ef9d617699953419aPrimiano Tucci } 384b7f8bdb39f5ddfba3394d5335e728d9bf416f0caPrimiano Tucci } 3855dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun 3865dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun @Override 3875dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun public void optOutDataReductionProxy() { 3885dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun // TODO(sgurun) Normally I would route this through AwContentsStatics, 3895dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun // however we need to merge it to M37. Due to a conflict in API deadlines vs. M37, wil 3905dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun // route it from WebViewChromiumFactoryProvider for now. 3915dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun WebViewChromiumFactoryProvider.this.optOutDataReductionProxy(); 3925dfb0b18b1e1c948cc8619b213d8bf528ec17055Selim Gurun } 393086910f44494b4677dc0f5d66045b0d55743e5fbBo Liu 394086910f44494b4677dc0f5d66045b0d55743e5fbBo Liu // TODO: Add @Override. 395086910f44494b4677dc0f5d66045b0d55743e5fbBo Liu public void enableSlowWholeDocumentDraw() { 396086910f44494b4677dc0f5d66045b0d55743e5fbBo Liu WebViewChromium.enableSlowWholeDocumentDraw(); 397086910f44494b4677dc0f5d66045b0d55743e5fbBo Liu } 39846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) }; 39946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 40046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 40146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return mStaticMethods; 40246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 40346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 40446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 40546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public WebViewProvider createWebView(WebView webView, WebView.PrivateAccess privateAccess) { 406fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch WebViewChromium wvc = new WebViewChromium(this, webView, privateAccess); 407fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch 408fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch synchronized (mLock) { 409fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch if (mWebViewsToStart != null) { 410fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch mWebViewsToStart.add(new WeakReference<WebViewChromium>(wvc)); 411fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch } 412fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch } 4130657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosiba 414fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch return wvc; 415fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch } 416fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch 41746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 41846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public GeolocationPermissions getGeolocationPermissions() { 419009ed27511c4606dcd16b352489b2d3f70b4b513Kristian Monsen synchronized (mLock) { 420aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon if (mGeolocationPermissions == null) { 421fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch ensureChromiumStartedLocked(true); 42250a184c1e058bc62f659fb80e09e7507ef13d6c9Jonathan Dixon mGeolocationPermissions = new GeolocationPermissionsAdapter( 423aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen getBrowserContextLocked().getGeolocationPermissions()); 424009ed27511c4606dcd16b352489b2d3f70b4b513Kristian Monsen } 425009ed27511c4606dcd16b352489b2d3f70b4b513Kristian Monsen } 426ff2704e614eb490baea0acb5c8ab22e061033694Kristian Monsen return mGeolocationPermissions; 42746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 42846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 42946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 43046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public CookieManager getCookieManager() { 43146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) synchronized (mLock) { 432aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon if (mCookieManager == null) { 4338be908c9c3af0debd0aeb0e4ff511dd16bcecf7bTorne (Richard Coles) if (!mStarted) { 4348be908c9c3af0debd0aeb0e4ff511dd16bcecf7bTorne (Richard Coles) // We can use CookieManager without starting Chromium; the native code 4358be908c9c3af0debd0aeb0e4ff511dd16bcecf7bTorne (Richard Coles) // will bring up just the parts it needs to make this work on a temporary 4368be908c9c3af0debd0aeb0e4ff511dd16bcecf7bTorne (Richard Coles) // basis until Chromium is started for real. The temporary cookie manager 4378be908c9c3af0debd0aeb0e4ff511dd16bcecf7bTorne (Richard Coles) // needs the application context to have been set. 4388be908c9c3af0debd0aeb0e4ff511dd16bcecf7bTorne (Richard Coles) ContentMain.initApplicationContext(ActivityThread.currentApplication()); 4398be908c9c3af0debd0aeb0e4ff511dd16bcecf7bTorne (Richard Coles) } 440d5f17bbd8703a56ac084a64b1ce2f673f67bd72dKristian Monsen mCookieManager = new CookieManagerAdapter(new AwCookieManager()); 44146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 44246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 443aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon return mCookieManager; 44446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 44546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 44646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 44746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public WebIconDatabase getWebIconDatabase() { 448aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon synchronized (mLock) { 449aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon if (mWebIconDatabase == null) { 450fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch ensureChromiumStartedLocked(true); 451aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon mWebIconDatabase = new WebIconDatabaseAdapter(); 452aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon } 453aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon } 454aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon return mWebIconDatabase; 45546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 45646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 45746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 45846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public WebStorage getWebStorage() { 459aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon synchronized (mLock) { 460aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon if (mWebStorage == null) { 461fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch ensureChromiumStartedLocked(true); 4625d20093562806fbce9cc0d3eb4a411ed6c5ce1c0Bo Liu mWebStorage = new WebStorageAdapter(AwQuotaManagerBridge.getInstance()); 463aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon } 464aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon } 465aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon return mWebStorage; 46646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 46746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 46846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 46946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public WebViewDatabase getWebViewDatabase(Context context) { 47046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) synchronized (mLock) { 471aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon if (mWebViewDatabase == null) { 472fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch ensureChromiumStartedLocked(true); 47372db47d0508d6733072c38ee44883ecfaf612ca6Jonathan Dixon AwBrowserContext browserContext = getBrowserContextLocked(); 474a6f2939f98aeaf67533a7fd3f5c999f207451f1cSelim Gurun mWebViewDatabase = new WebViewDatabaseAdapter( 475a6f2939f98aeaf67533a7fd3f5c999f207451f1cSelim Gurun browserContext.getFormDatabase(), 476a6f2939f98aeaf67533a7fd3f5c999f207451f1cSelim Gurun browserContext.getHttpAuthDatabase(context)); 477aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon } 47846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 479aadb04e4198e1f0dce390e9434cb189603b8e713Jonathan Dixon return mWebViewDatabase; 48046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 48146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)} 482