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