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