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)
1946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.content.res.Configuration;
2046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.graphics.Bitmap;
2146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.graphics.Canvas;
2246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.graphics.Paint;
2346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.graphics.Picture;
2446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.graphics.Rect;
2546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.graphics.drawable.Drawable;
2646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.net.http.SslCertificate;
2746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Build;
2846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Bundle;
2930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdochimport android.os.Looper;
3046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Message;
31412d84be859ce0eb91baf2f9afe5e6326a15d76aSelim Gurunimport android.print.PrintDocumentAdapter;
3219bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixonimport android.text.TextUtils;
33efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdochimport android.util.Base64;
34e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixonimport android.util.Log;
35a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixonimport android.view.HardwareCanvas;
3646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.KeyEvent;
3746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.MotionEvent;
3846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.View;
3946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.ViewGroup;
4046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.accessibility.AccessibilityEvent;
4146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.accessibility.AccessibilityNodeInfo;
425c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdochimport android.view.accessibility.AccessibilityNodeProvider;
4346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.inputmethod.EditorInfo;
4446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.inputmethod.InputConnection;
4546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.DownloadListener;
466d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdochimport android.webkit.FindActionModeCallback;
477db34d3dcaac936566f912e1b0b21f3f103029ffJonathan Dixonimport android.webkit.JavascriptInterface;
4846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.ValueCallback;
4946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebBackForwardList;
5046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebChromeClient;
5146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebSettings;
5246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebView;
5346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewClient;
5446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewProvider;
5533e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdochimport android.widget.TextView;
5646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
57aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsenimport org.chromium.android_webview.AwBrowserContext;
5846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.AwContents;
59ffabf2e121746d06b9930b1ae8fea243c4f5cb9dMikhail Naganovimport org.chromium.android_webview.AwLayoutSizer;
60a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurunimport org.chromium.android_webview.AwPdfExportAttributes;
61412d84be859ce0eb91baf2f9afe5e6326a15d76aSelim Gurunimport org.chromium.android_webview.AwPrintDocumentAdapter;
6230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdochimport org.chromium.android_webview.AwSettings;
63a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsenimport org.chromium.base.ThreadUtils;
6446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.LoadUrlParams;
6546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.net.NetworkChangeNotifier;
6646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
6746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.io.BufferedWriter;
6846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.io.File;
69ea844f60b1b559788566fe6e004b1eeca53a8039Jonathan Dixonimport java.lang.annotation.Annotation;
702c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsenimport java.util.concurrent.Callable;
7130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdochimport java.util.concurrent.ConcurrentLinkedQueue;
724fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsenimport java.util.concurrent.FutureTask;
734fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsenimport java.util.concurrent.TimeUnit;
74b8281877c710018a3bc8066be17b1e11822be015Selim Gurunimport java.util.HashMap;
7546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.util.Map;
7630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdochimport java.util.Queue;
7746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
7846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)/**
7946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * This class is the delegate to which WebViewProxy forwards all API calls.
8046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) *
811cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon * Most of the actual functionality is implemented by AwContents (or ContentViewCore within
821cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon * it). This class also contains WebView-specific APIs that require the creation of other
831cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon * adapters (otherwise org.chromium.content would depend on the webview.chromium package)
841cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon * and a small set of no-op deprecated APIs.
8546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */
8646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)class WebViewChromium implements WebViewProvider,
8746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)          WebViewProvider.ScrollDelegate, WebViewProvider.ViewDelegate {
88e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon
8930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch    private class WebViewChromiumRunQueue {
9030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        public WebViewChromiumRunQueue() {
9130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mQueue = new ConcurrentLinkedQueue<Runnable>();
9230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        }
9330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch
9430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        public void addTask(Runnable task) {
9530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mQueue.add(task);
9630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            if (mFactory.hasStarted()) {
9730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                ThreadUtils.runOnUiThread(new Runnable() {
9830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                    @Override
9930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                    public void run() {
10030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                        drainQueue();
10130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                    }
10230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                });
10330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            }
10430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        }
10530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch
10630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        public void drainQueue() {
10730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            if (mQueue == null || mQueue.isEmpty()) {
10830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                return;
10930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            }
11030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch
11130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            Runnable task = mQueue.poll();
11230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            while(task != null) {
11330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                task.run();
11430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                task = mQueue.poll();
11530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            }
11630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        }
11730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch
11830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        private Queue<Runnable> mQueue;
11930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch    }
12030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch
12130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch    private WebViewChromiumRunQueue mRunQueue;
12230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch
123e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon    private static final String TAG = WebViewChromium.class.getSimpleName();
124e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon
12546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The WebView that this WebViewChromium is the provider for.
12646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    WebView mWebView;
12746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // Lets us access protected View-derived methods on the WebView instance we're backing.
12846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    WebView.PrivateAccess mWebViewPrivate;
12946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The client adapter class.
13046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebViewContentsClientAdapter mContentsClientAdapter;
13146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
13246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // Variables for functionality provided by this adapter ---------------------------------------
13330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch    private ContentSettingsAdapter mWebSettings;
1343949435b480cb71106f65b237025da359cf8a8caBen Murdoch    // The WebView wrapper for ContentViewCore and required browser compontents.
13546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private AwContents mAwContents;
136a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    // Non-null if this webview is using the GL accelerated draw path.
137a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    private DrawGLFunctor mGLfunctor;
13846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
139c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu    private final WebView.HitTestResult mHitTestResult;
140c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu
1416ef347a29d692df672aaf59ee4926a476288476aBen Murdoch    private final int mAppTargetSdkVersion;
1426ef347a29d692df672aaf59ee4926a476288476aBen Murdoch
14330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch    private WebViewChromiumFactoryProvider mFactory;
14430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch
1454fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen    // This does not touch any global / non-threadsafe state, but note that
1464fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen    // init is ofter called right after and is NOT threadsafe.
14730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch    public WebViewChromium(WebViewChromiumFactoryProvider factory, WebView webView,
14830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            WebView.PrivateAccess webViewPrivate) {
14946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebView = webView;
15046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewPrivate = webViewPrivate;
151c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mHitTestResult = new WebView.HitTestResult();
1526ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        mAppTargetSdkVersion = mWebView.getContext().getApplicationInfo().targetSdkVersion;
15330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory = factory;
15430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mRunQueue = new WebViewChromiumRunQueue();
15546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
15646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
1571ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch    static void completeWindowCreation(WebView parent, WebView child) {
1581ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch        AwContents parentContents = ((WebViewChromium) parent.getWebViewProvider()).mAwContents;
159bbfef40e5fc625f4821f012fae7f16468b7308cfJonathan Dixon        AwContents childContents =
160bbfef40e5fc625f4821f012fae7f16468b7308cfJonathan Dixon                child == null ? null : ((WebViewChromium) child.getWebViewProvider()).mAwContents;
1611ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch        parentContents.supplyContentsForPopup(childContents);
16246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
16346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
16430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch    private <T> T runBlockingFuture(FutureTask<T> task) {
16530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (!mFactory.hasStarted()) throw new RuntimeException("Must be started before we block!");
1664fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen        if (ThreadUtils.runningOnUiThread()) {
1674fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen            throw new IllegalStateException("This method should only be called off the UI thread");
1684fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen        }
16930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mRunQueue.addTask(task);
1704fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen        try {
1712c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return task.get(4, TimeUnit.SECONDS);
17230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        } catch (java.util.concurrent.TimeoutException e) {
1732c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            throw new RuntimeException("Probable deadlock detected due to WebView API being called "
1742c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    + "on incorrect thread while the UI thread is blocked.", e);
17530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        } catch (Exception e) {
17630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            throw new RuntimeException(e);
1774fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen        }
1784fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen    }
1794fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen
1802c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    // We have a 4 second timeout to try to detect deadlocks to detect and aid in debuggin
1812c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    // deadlocks.
1822c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    // Do not call this method while on the UI thread!
1832c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    private void runVoidTaskOnUiThreadBlocking(Runnable r) {
1842c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        FutureTask<Void> task = new FutureTask<Void>(r, null);
1852c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        runBlockingFuture(task);
1862c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    }
1872c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen
18830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch    private <T> T runOnUiThreadBlocking(Callable<T> c) {
1892c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        return runBlockingFuture(new FutureTask<T>(c));
1902c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    }
1912c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen
19246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebViewProvider methods --------------------------------------------------------------------
19346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
19446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
19530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch    // BUG=6790250 |javaScriptInterfaces| was only ever used by the obsolete DumpRenderTree
19630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch    // so is ignored. TODO: remove it from WebViewProvider.
1974fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen    public void init(final Map<String, Object> javaScriptInterfaces,
1984fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen            final boolean privateBrowsing) {
1994dcabaef9151384b571327b62234409b31caef38Jonathan Dixon        if (privateBrowsing) {
20030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mFactory.startYourEngines(true);
2014dcabaef9151384b571327b62234409b31caef38Jonathan Dixon            final String msg = "Private browsing is not supported in WebView.";
20230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            if (mAppTargetSdkVersion >= Build.VERSION_CODES.KITKAT) {
2034dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                throw new IllegalArgumentException(msg);
2044dcabaef9151384b571327b62234409b31caef38Jonathan Dixon            } else {
2054dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                Log.w(TAG, msg);
20633e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdoch                TextView warningLabel = new TextView(mWebView.getContext());
20733e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdoch                warningLabel.setText(mWebView.getContext().getString(
20833e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdoch                        com.android.internal.R.string.webviewchromium_private_browsing_warning));
20933e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdoch                mWebView.addView(warningLabel);
2104dcabaef9151384b571327b62234409b31caef38Jonathan Dixon            }
2114dcabaef9151384b571327b62234409b31caef38Jonathan Dixon        }
2124dcabaef9151384b571327b62234409b31caef38Jonathan Dixon
213916f857e0af25e8b179f60f532065386607567d7Jonathan Dixon        // We will defer real initialization until we know which thread to do it on, unless:
214916f857e0af25e8b179f60f532065386607567d7Jonathan Dixon        // - we are on the main thread already (common case),
215916f857e0af25e8b179f60f532065386607567d7Jonathan Dixon        // - the app is targeting >= JB MR2, in which case checkThread enforces that all usage
216916f857e0af25e8b179f60f532065386607567d7Jonathan Dixon        //   comes from a single thread. (Note in JB MR2 this exception was in WebView.java).
217916f857e0af25e8b179f60f532065386607567d7Jonathan Dixon        if (mAppTargetSdkVersion >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
218916f857e0af25e8b179f60f532065386607567d7Jonathan Dixon            mFactory.startYourEngines(false);
219916f857e0af25e8b179f60f532065386607567d7Jonathan Dixon            checkThread();
220916f857e0af25e8b179f60f532065386607567d7Jonathan Dixon        } else if (!mFactory.hasStarted()) {
22130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            if (Looper.myLooper() == Looper.getMainLooper()) {
22230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                mFactory.startYourEngines(true);
22330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            }
22430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        }
22530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch
22630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        final boolean isAccessFromFileURLsGrantedByDefault =
22730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                mAppTargetSdkVersion < Build.VERSION_CODES.JELLY_BEAN;
22830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        final boolean areLegacyQuirksEnabled =
22930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                mAppTargetSdkVersion < Build.VERSION_CODES.KITKAT;
23054bae732019ac13327c0a68a6f8a82548d73ea9eBen Murdoch
23130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mContentsClientAdapter = new WebViewContentsClientAdapter(mWebView);
23230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mWebSettings = new ContentSettingsAdapter(new AwSettings(
23330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                mWebView.getContext(), isAccessFromFileURLsGrantedByDefault,
23430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                areLegacyQuirksEnabled));
23530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch
23630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mRunQueue.addTask(new Runnable() {
23730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                @Override
23830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                public void run() {
23930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                    initForReal();
24030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                    if (privateBrowsing) {
24130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                        // Intentionally irreversibly disable the webview instance, so that private
24230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                        // user data cannot leak through misuse of a non-privateBrowing WebView
24330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                        // instance. Can't just null out mAwContents as we never null-check it
24430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                        // before use.
24530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                        destroy();
24630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                    }
24730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                }
24830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        });
24930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch    }
25030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch
25130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch    private void initForReal() {
25230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mAwContents = new AwContents(mFactory.getBrowserContext(), mWebView,
25330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                new InternalAccessAdapter(), mContentsClientAdapter, new AwLayoutSizer(),
25430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                mWebSettings.getAwSettings());
25554bae732019ac13327c0a68a6f8a82548d73ea9eBen Murdoch
25654bae732019ac13327c0a68a6f8a82548d73ea9eBen Murdoch        if (mAppTargetSdkVersion >= Build.VERSION_CODES.KITKAT) {
25754bae732019ac13327c0a68a6f8a82548d73ea9eBen Murdoch            // On KK and above, favicons are automatically downloaded as the method
25854bae732019ac13327c0a68a6f8a82548d73ea9eBen Murdoch            // old apps use to enable that behavior is deprecated.
25954bae732019ac13327c0a68a6f8a82548d73ea9eBen Murdoch            AwContents.setShouldDownloadFavicons();
26054bae732019ac13327c0a68a6f8a82548d73ea9eBen Murdoch        }
26130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch    }
26230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch
26330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch    void startYourEngine() {
26430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mRunQueue.drainQueue();
26546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
26646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
26757b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen    private RuntimeException createThreadException() {
2681a692d93c0172dc09a316bbf9a54896f1d40234fKristian Monsen        return new IllegalStateException(
2691a692d93c0172dc09a316bbf9a54896f1d40234fKristian Monsen                "Calling View methods on another thread than the UI thread.");
27057b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen    }
27157b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen
27230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch    private boolean checkNeedsPost() {
27330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        boolean needsPost = !mFactory.hasStarted() || !ThreadUtils.runningOnUiThread();
27430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (!needsPost && mAwContents == null) {
27530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            throw new IllegalStateException(
27630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                    "AwContents must be created if we are not posting!");
27730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        }
27830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        return needsPost;
27930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch    }
28030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch
28162389e2d66a99e936652092333782947e363241dKristian Monsen    //  Intentionally not static, as no need to check thread on static methods
28262389e2d66a99e936652092333782947e363241dKristian Monsen    private void checkThread() {
28362389e2d66a99e936652092333782947e363241dKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
28457b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            final RuntimeException threadViolation = createThreadException();
28557b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
28657b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                @Override
28757b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                public void run() {
28857b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                    throw threadViolation;
28957b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                }
29057b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            });
291ab73853ea633a4ada353f5a2321c6bf0e6c108e5Kristian Monsen            throw createThreadException();
29262389e2d66a99e936652092333782947e363241dKristian Monsen        }
29362389e2d66a99e936652092333782947e363241dKristian Monsen    }
29462389e2d66a99e936652092333782947e363241dKristian Monsen
29546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
29681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void setHorizontalScrollbarOverlay(final boolean overlay) {
29730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
29830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
29981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
30081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
30181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    setHorizontalScrollbarOverlay(overlay);
30281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
30381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
30481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
30581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
306bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        mAwContents.setHorizontalScrollbarOverlay(overlay);
30746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
30846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
30946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
31081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void setVerticalScrollbarOverlay(final boolean overlay) {
31130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
31230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
31381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
31481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
31581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    setVerticalScrollbarOverlay(overlay);
31681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
31781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
31881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
31981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
320bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        mAwContents.setVerticalScrollbarOverlay(overlay);
32146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
32246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
32346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
32446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean overlayHorizontalScrollbar() {
32530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
32630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
3272c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
3282c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
3292c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
3302c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return overlayHorizontalScrollbar();
3312c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
3322c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
3332c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
3342c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
335bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        return mAwContents.overlayHorizontalScrollbar();
33646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
33746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
33846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
33946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean overlayVerticalScrollbar() {
34030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
34130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
3422c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
3432c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
3442c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
3452c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return overlayVerticalScrollbar();
3462c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
3472c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
3482c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
3492c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
350bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        return mAwContents.overlayVerticalScrollbar();
35146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
35246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
35346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
35446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int getVisibleTitleHeight() {
35546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // This is deprecated in WebView and should always return 0.
35646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return 0;
35746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
35846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
35946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
36046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public SslCertificate getCertificate() {
36130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(true);
36230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
3632c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            SslCertificate ret = runOnUiThreadBlocking(new Callable<SslCertificate>() {
3642c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
3652c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public SslCertificate call() {
3662c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return getCertificate();
3672c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
3682c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
3692c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
3702c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
37146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mAwContents.getCertificate();
37246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
37346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
37446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
37546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setCertificate(SslCertificate certificate) {
37681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        // intentional no-op
37746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
37846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
37946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
38046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void savePassword(String host, String username, String password) {
381adc6c4d74c77a617100bdfeb174ab0c314b24ea8Selim Gurun        // This is a deprecated API: intentional no-op.
38246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
38346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
38446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
38581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void setHttpAuthUsernamePassword(final String host, final String realm,
38681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            final String username, final String password) {
38730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
38830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
38981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
39081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
39181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    setHttpAuthUsernamePassword(host, realm, username, password);
39281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
39381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
39481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
39581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
39646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.setHttpAuthUsernamePassword(host, realm, username, password);
39746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
39846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
39946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
4002c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public String[] getHttpAuthUsernamePassword(final String host, final String realm) {
40130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(true);
40230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
4032c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            String[] ret = runOnUiThreadBlocking(new Callable<String[]>() {
4042c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
4052c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public String[] call() {
4062c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return getHttpAuthUsernamePassword(host, realm);
4072c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
4082c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
4092c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
4102c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
41146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mAwContents.getHttpAuthUsernamePassword(host, realm);
41246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
41346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
41446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
41546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void destroy() {
41630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
41730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
418370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen                @Override
419370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen                public void run() {
420370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen                    destroy();
421370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen                }
422370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen            });
423370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen            return;
424370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen        }
425370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen
4263949435b480cb71106f65b237025da359cf8a8caBen Murdoch        mAwContents.destroy();
427a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon        if (mGLfunctor != null) {
428a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon            mGLfunctor.destroy();
429a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon            mGLfunctor = null;
430a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon        }
43146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
43246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
43346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
43481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void setNetworkAvailable(final boolean networkUp) {
4350363422b19ca6263dbfbcd0d9daa6d1abe5c6892Ben Murdoch        // Note that this purely toggles the JS navigator.online property.
4360363422b19ca6263dbfbcd0d9daa6d1abe5c6892Ben Murdoch        // It does not in affect chromium or network stack state in any way.
43730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
43830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
43981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
44081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
44181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    setNetworkAvailable(networkUp);
44281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
44381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
44481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
44581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
4460363422b19ca6263dbfbcd0d9daa6d1abe5c6892Ben Murdoch        mAwContents.setNetworkAvailable(networkUp);
44746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
44846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
44946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
4502c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public WebBackForwardList saveState(final Bundle outState) {
45130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(true);
45230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
4532c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            WebBackForwardList ret = runOnUiThreadBlocking(new Callable<WebBackForwardList>() {
4542c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
4552c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public WebBackForwardList call() {
4562c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return saveState(outState);
4572c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
4582c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
4592c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
4602c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
461a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        if (outState == null) return null;
462a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        if (!mAwContents.saveState(outState)) return null;
463a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        return copyBackForwardList();
46446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
46546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
46646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
46746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean savePicture(Bundle b, File dest) {
4689405536501747e2d7b4fc46a33e5f0a1e7fd47acJonathan Dixon        // Intentional no-op: hidden method on WebView.
46946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
47046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
47146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
47246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
47346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean restorePicture(Bundle b, File src) {
4749405536501747e2d7b4fc46a33e5f0a1e7fd47acJonathan Dixon        // Intentional no-op: hidden method on WebView.
47546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
47646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
47746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
47846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
4792c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public WebBackForwardList restoreState(final Bundle inState) {
48030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(true);
48130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
4822c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            WebBackForwardList ret = runOnUiThreadBlocking(new Callable<WebBackForwardList>() {
4832c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
4842c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public WebBackForwardList call() {
4852c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return restoreState(inState);
4862c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
4872c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
4882c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
4892c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
490a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        if (inState == null) return null;
491a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        if (!mAwContents.restoreState(inState)) return null;
492a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        return copyBackForwardList();
49346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
49446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
49546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
49630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch    public void loadUrl(final String url, Map<String, String> additionalHttpHeaders) {
49746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // TODO: We may actually want to do some sanity checks here (like filter about://chrome).
4986ef347a29d692df672aaf59ee4926a476288476aBen Murdoch
4996ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        // For backwards compatibility, apps targeting less than K will have JS URLs evaluated
5006ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        // directly and any result of the evaluation will not replace the current page content.
5016ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        // Matching Chrome behavior more closely; apps targetting >= K that load a JS URL will
5026ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        // have the result of that URL replace the content of the current page.
5036ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        final String JAVASCRIPT_SCHEME = "javascript:";
5049cd49cbc245e07e8e8c360fd22821a2918f99eaeChet Haase        if (mAppTargetSdkVersion < Build.VERSION_CODES.KITKAT &&
50541618b2aeb0a500c740a75871a8f614cb6543362Kristian Monsen                url != null && url.startsWith(JAVASCRIPT_SCHEME)) {
50630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mFactory.startYourEngines(true);
50730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            if (checkNeedsPost()) {
50830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                mRunQueue.addTask(new Runnable() {
50930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                    @Override
51030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                    public void run() {
51130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                        mAwContents.evaluateJavaScriptEvenIfNotYetNavigated(
51230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                                url.substring(JAVASCRIPT_SCHEME.length()));
51330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                    }
51430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                });
51530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            } else {
51630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                mAwContents.evaluateJavaScriptEvenIfNotYetNavigated(
51730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch                        url.substring(JAVASCRIPT_SCHEME.length()));
51830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            }
5196ef347a29d692df672aaf59ee4926a476288476aBen Murdoch            return;
5206ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        }
5216ef347a29d692df672aaf59ee4926a476288476aBen Murdoch
52246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        LoadUrlParams params = new LoadUrlParams(url);
52346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (additionalHttpHeaders != null) params.setExtraHeaders(additionalHttpHeaders);
524a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        loadUrlOnUiThread(params);
52546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
52646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
52746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
52846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void loadUrl(String url) {
52941618b2aeb0a500c740a75871a8f614cb6543362Kristian Monsen        // Early out to match old WebView implementation
53041618b2aeb0a500c740a75871a8f614cb6543362Kristian Monsen        if (url == null) {
53141618b2aeb0a500c740a75871a8f614cb6543362Kristian Monsen            return;
53241618b2aeb0a500c740a75871a8f614cb6543362Kristian Monsen        }
53346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        loadUrl(url, null);
53446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
53546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
53646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
53746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void postUrl(String url, byte[] postData) {
538b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        LoadUrlParams params = LoadUrlParams.createLoadHttpPostParams(url, postData);
539b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        Map<String,String> headers = new HashMap<String,String>();
540b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        headers.put("Content-Type", "application/x-www-form-urlencoded");
541b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        params.setExtraHeaders(headers);
542b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        loadUrlOnUiThread(params);
54346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
54446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
54519bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon    private static String fixupMimeType(String mimeType) {
54619bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        return TextUtils.isEmpty(mimeType) ? "text/html" : mimeType;
54719bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon    }
54819bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon
54919bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon    private static String fixupData(String data) {
55019bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        return TextUtils.isEmpty(data) ? "" : data;
55119bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon    }
55219bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon
55319bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon    private static String fixupBase(String url) {
55419bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        return TextUtils.isEmpty(url) ? "about:blank" : url;
55519bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon    }
55619bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon
55719bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon    private static String fixupHistory(String url) {
55819bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        return TextUtils.isEmpty(url) ? "about:blank" : url;
55919bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon    }
56019bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon
56146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private static boolean isBase64Encoded(String encoding) {
56246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return "base64".equals(encoding);
56346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
56446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
56546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
56646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void loadData(String data, String mimeType, String encoding) {
567a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        loadUrlOnUiThread(LoadUrlParams.createLoadDataParams(
56819bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon                fixupData(data), fixupMimeType(mimeType), isBase64Encoded(encoding)));
56946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
57046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
57146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
57246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding,
573efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            String historyUrl) {
57419bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        data = fixupData(data);
57519bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        mimeType = fixupMimeType(mimeType);
576efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch        LoadUrlParams loadUrlParams;
57719bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        baseUrl = fixupBase(baseUrl);
57819bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        historyUrl = fixupHistory(historyUrl);
579efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch
58019bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        if (baseUrl.startsWith("data:")) {
581efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // For backwards compatibility with WebViewClassic, we use the value of |encoding|
582efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // as the charset, as long as it's not "base64".
583efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            boolean isBase64 = isBase64Encoded(encoding);
584efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            loadUrlParams = LoadUrlParams.createLoadDataParamsWithBaseUrl(
585efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                    data, mimeType, isBase64, baseUrl, historyUrl, isBase64 ? null : encoding);
586efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch        } else {
587efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // When loading data with a non-data: base URL, the classic WebView would effectively
588efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // "dump" that string of data into the WebView without going through regular URL
589efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // loading steps such as decoding URL-encoded entities. We achieve this same behavior by
590efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // base64 encoding the data that is passed here and then loading that as a data: URL.
591efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            try {
592efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                loadUrlParams = LoadUrlParams.createLoadDataParamsWithBaseUrl(
593efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                        Base64.encodeToString(data.getBytes("utf-8"), Base64.DEFAULT), mimeType,
594efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                        true, baseUrl, historyUrl, "utf-8");
595efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            } catch (java.io.UnsupportedEncodingException e) {
596efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                Log.wtf(TAG, "Unable to load data string " + data, e);
597efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                return;
598efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            }
599efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch        }
600a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        loadUrlOnUiThread(loadUrlParams);
601a622984698ea393f81ce968ec87bab75087af7dcKristian Monsen
602a622984698ea393f81ce968ec87bab75087af7dcKristian Monsen        // Data url's with a base url will be resolved in Blink, and not cause an onPageStarted
603a622984698ea393f81ce968ec87bab75087af7dcKristian Monsen        // event to be sent. Sending the callback directly from here.
604a622984698ea393f81ce968ec87bab75087af7dcKristian Monsen        final String finalBaseUrl = loadUrlParams.getBaseUrl();
605a622984698ea393f81ce968ec87bab75087af7dcKristian Monsen        ThreadUtils.postOnUiThread(new Runnable() {
606a622984698ea393f81ce968ec87bab75087af7dcKristian Monsen            @Override
607a622984698ea393f81ce968ec87bab75087af7dcKristian Monsen            public void run() {
608a622984698ea393f81ce968ec87bab75087af7dcKristian Monsen                mContentsClientAdapter.onPageStarted(finalBaseUrl);
609a622984698ea393f81ce968ec87bab75087af7dcKristian Monsen            }
610a622984698ea393f81ce968ec87bab75087af7dcKristian Monsen        });
611a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen    }
612a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen
613a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen    private void loadUrlOnUiThread(final LoadUrlParams loadUrlParams) {
61430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        // This is the last point that we can delay starting the Chromium backend up
61530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        // and if the app has not caused us to bind the Chromium UI thread to a background thread
61630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        // we now bind Chromium's notion of the UI thread to the app main thread.
61730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(true);
61830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
619a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen            // Disallowed in WebView API for apps targetting a new SDK
620a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen            assert mAppTargetSdkVersion < Build.VERSION_CODES.JELLY_BEAN_MR2;
62130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
622a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen                @Override
623a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen                public void run() {
624a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen                    mAwContents.loadUrl(loadUrlParams);
625a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen                }
626a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen            });
62730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            return;
628a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        }
62930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mAwContents.loadUrl(loadUrlParams);
63046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
63146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
6326ef347a29d692df672aaf59ee4926a476288476aBen Murdoch    public void evaluateJavaScript(String script, ValueCallback<String> resultCallback) {
63362389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
6346ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        mAwContents.evaluateJavaScript(script, resultCallback);
6356ef347a29d692df672aaf59ee4926a476288476aBen Murdoch    }
6366ef347a29d692df672aaf59ee4926a476288476aBen Murdoch
63746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
63846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void saveWebArchive(String filename) {
63946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        saveWebArchive(filename, false, null);
64046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
64146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
64246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
64381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void saveWebArchive(final String basename, final boolean autoname,
64481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            final ValueCallback<String> callback) {
64530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
64630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
64781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
64881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
64981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    saveWebArchive(basename, autoname, callback);
65081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
65181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
65281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
65381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
65446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.saveWebArchive(basename, autoname, callback);
65546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
65646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
65746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
65846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void stopLoading() {
65930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
66030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
66119af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen                @Override
66219af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen                public void run() {
66319af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen                    stopLoading();
66419af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen                }
66519af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen            });
66619af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen            return;
66719af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen        }
66819af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen
6697cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.stopLoading();
67046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
67146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
67246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
67346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void reload() {
67430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
67530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
67681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
67781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
67881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    reload();
67981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
68081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
68181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
68281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
6837cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.reload();
68446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
68546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
68646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
68746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean canGoBack() {
68830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(true);
68930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
6902c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            Boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
6912c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
6922c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
6932c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return canGoBack();
6942c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
6952c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
6962c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
6972c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
6987cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canGoBack();
69946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
70046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
70146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
70246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void goBack() {
70330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
70430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
70581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
70681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
70781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    goBack();
70881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
70981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
71081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
71181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
7127cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.goBack();
71346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
71446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
71546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
71646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean canGoForward() {
71730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(true);
71830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
7192c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            Boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
7202c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
7212c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
7222c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return canGoForward();
7232c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
7242c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
7252c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
7262c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
7277cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canGoForward();
72846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
72946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
73046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
73146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void goForward() {
73230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
73330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
73481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
73581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
73681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    goForward();
73781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
73881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
73981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
74081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
7417cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.goForward();
74246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
74346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
74446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
7452c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean canGoBackOrForward(final int steps) {
74630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(true);
74730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
7482c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            Boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
7492c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
7502c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
7512c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return canGoBackOrForward(steps);
7522c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
7532c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
7542c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
7552c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
7567cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canGoBackOrForward(steps);
75746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
75846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
75946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
76081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void goBackOrForward(final int steps) {
76130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
76230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
76381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
76481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
76581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    goBackOrForward(steps);
76681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
76781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
76881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
76981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
7707cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.goBackOrForward(steps);
77146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
77246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
77346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
77446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean isPrivateBrowsingEnabled() {
7756d58f78e7fc0412a58b163559cb8e9c4af5c6fe1Jonathan Dixon        // Not supported in this WebView implementation.
77646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
77746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
77846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
77946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
7802c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean pageUp(final boolean top) {
78130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(true);
78230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
7832c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            Boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
7842c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
7852c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
7862c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return pageUp(top);
7872c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
7882c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
7892c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
7902c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
7917cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.pageUp(top);
79246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
79346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
79446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
7952c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean pageDown(final boolean bottom) {
79630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(true);
79730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
7982c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            Boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
7992c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
8002c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
8012c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return pageDown(bottom);
8022c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
8032c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
8042c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
8052c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
8067cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.pageDown(bottom);
80746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
80846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
80946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
81046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearView() {
81130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
81230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
81381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
81481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
81581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    clearView();
81681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
81781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
81881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
81981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
820d21b8fe00b21742cc36929cb02eef6ad25946512Kristian Monsen        mAwContents.clearView();
82146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
82246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
82346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
82446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public Picture capturePicture() {
82530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(true);
82630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
8272c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            Picture ret = runOnUiThreadBlocking(new Callable<Picture>() {
8282c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
8292c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Picture call() {
8302c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return capturePicture();
8312c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
8322c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
8332c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
8342c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
8359c5a40623b62737244deb2d04a98830d7ffa8404Leandro Gracia Gil        return mAwContents.capturePicture();
83646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
83746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
83846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
839412d84be859ce0eb91baf2f9afe5e6326a15d76aSelim Gurun    public PrintDocumentAdapter createPrintDocumentAdapter() {
84062389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
841412d84be859ce0eb91baf2f9afe5e6326a15d76aSelim Gurun        return new AwPrintDocumentAdapter(mAwContents.getPdfExporter());
842a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun    }
843a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun
84449a1a6f9f27b63687edc1d98f842627d4719a327Selim Gurun    @Override
84546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public float getScale() {
846fa62be4cdc2630566ee179843393d4a6f9893966Kristian Monsen        // No checkThread() as it is mostly thread safe (workaround for b/10652991).
84730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(true);
8483520eb778d668dc76ca4541c69abd568b9d02691Mikhail Naganov        return mAwContents.getScale();
84946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
85046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
85146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
85281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void setInitialScale(final int scaleInPercent) {
85330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        // No checkThread() as it is thread safe
85430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mWebSettings.getAwSettings().setInitialPageScale(scaleInPercent);
85546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
85646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
85746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
85846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void invokeZoomPicker() {
85930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
86030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
86181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
86281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
86381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    invokeZoomPicker();
86481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
86581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
86681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
86781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
8687cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.invokeZoomPicker();
86946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
87046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
87146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
87246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebView.HitTestResult getHitTestResult() {
87330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(true);
87430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
8752c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            WebView.HitTestResult ret = runOnUiThreadBlocking(
8762c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    new Callable<WebView.HitTestResult>() {
8772c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
8782c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public WebView.HitTestResult call() {
8792c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return getHitTestResult();
8802c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
8812c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
8822c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
8832c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
884c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        AwContents.HitTestData data = mAwContents.getLastHitTestResult();
885c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mHitTestResult.setType(data.hitTestResultType);
886c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mHitTestResult.setExtra(data.hitTestResultExtraData);
887c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        return mHitTestResult;
88846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
88946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
89046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
89181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void requestFocusNodeHref(final Message hrefMsg) {
89230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
89330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
89481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
89581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
89681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    requestFocusNodeHref(hrefMsg);
89781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
89881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
89981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
90081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
901c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mAwContents.requestFocusNodeHref(hrefMsg);
90246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
90346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
90446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
90581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void requestImageRef(final Message msg) {
90630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
90730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
90881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
90981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
91081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    requestImageRef(msg);
91181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
91281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
91381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
91481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
915c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mAwContents.requestImageRef(msg);
91646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
91746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
91846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
91946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public String getUrl() {
92030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(true);
92130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
9222c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            String ret = runOnUiThreadBlocking(new Callable<String>() {
9232c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
9242c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public String call() {
9252c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return getUrl();
9262c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
9272c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
9282c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
9292c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
9307cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        String url =  mAwContents.getUrl();
93146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (url == null || url.trim().isEmpty()) return null;
93246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return url;
93346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
93446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
93546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
93646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public String getOriginalUrl() {
93730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(true);
93830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
9392c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            String ret = runOnUiThreadBlocking(new Callable<String>() {
9402c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
9412c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public String call() {
9422c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return getOriginalUrl();
9432c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
9442c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
9452c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
9462c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
94746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        String url =  mAwContents.getOriginalUrl();
94846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (url == null || url.trim().isEmpty()) return null;
94946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return url;
95046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
95146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
95246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
95346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public String getTitle() {
95430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(true);
95530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
9562c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            String ret = runOnUiThreadBlocking(new Callable<String>() {
9572c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
9582c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public String call() {
9592c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return getTitle();
9602c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
9612c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
9622c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
9632c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
9647cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.getTitle();
96546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
96646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
96746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
96846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public Bitmap getFavicon() {
96930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(true);
97030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
9712c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            Bitmap ret = runOnUiThreadBlocking(new Callable<Bitmap>() {
9722c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
9732c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Bitmap call() {
9742c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return getFavicon();
9752c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
9762c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
9772c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
9782c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
9799405536501747e2d7b4fc46a33e5f0a1e7fd47acJonathan Dixon        return mAwContents.getFavicon();
98046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
98146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
98246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
98346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public String getTouchIconUrl() {
9849405536501747e2d7b4fc46a33e5f0a1e7fd47acJonathan Dixon        // Intentional no-op: hidden method on WebView.
98546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return null;
98646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
98746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
98846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
98946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int getProgress() {
99030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (mAwContents == null) return 100;
991c0c86c037ea697da375ae28c543cae9b050d6b68Jonathan Dixon        // No checkThread() because the value is cached java side (workaround for b/10533304).
99246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mAwContents.getMostRecentProgress();
99346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
99446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
99546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
99646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int getContentHeight() {
99730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (mAwContents == null) return 0;
99894a8e6a6d7d1b2a6b3718eb91956403ef6b03d9cKristian Monsen        // No checkThread() as it is mostly thread safe (workaround for b/10594869).
9996b5f3d1546ae2a9c712cde60c54ec027582bc4e6Martin Kosiba        return mAwContents.getContentHeightCss();
100046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
100146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
100246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
100346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int getContentWidth() {
100430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (mAwContents == null) return 0;
10052c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        // No checkThread() as it is mostly thread safe (workaround for b/10594869).
10066b5f3d1546ae2a9c712cde60c54ec027582bc4e6Martin Kosiba        return mAwContents.getContentWidthCss();
100746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
100846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
100946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
101046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void pauseTimers() {
101130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
101230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
101381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
101481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
101581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    pauseTimers();
101681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
101781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
101881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
101981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
1020531e68a2b50a5e542eeede13907f29e463a99ebfBen Murdoch        mAwContents.pauseTimers();
102146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
102246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
102346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
102446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void resumeTimers() {
102530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
102630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
102781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
102881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
102981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    resumeTimers();
103081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
103181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
103281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
103381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
1034531e68a2b50a5e542eeede13907f29e463a99ebfBen Murdoch        mAwContents.resumeTimers();
103546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
103646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
103746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
103846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onPause() {
103930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
104030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
104181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
104281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
104381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onPause();
104481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
104581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
104681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
104781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
10481cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onPause();
104946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
105046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
105146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
105246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onResume() {
105330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
105430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
105581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
105681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
105781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onResume();
105881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
105981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
106081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
106181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
10621cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onResume();
106346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
106446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
106546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
106646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean isPaused() {
106730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(true);
106830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
10692c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            Boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
10702c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
10712c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
10722c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return isPaused();
10732c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
10742c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
10752c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
10762c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
10771cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        return mAwContents.isPaused();
107846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
107946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
108046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
108146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void freeMemory() {
1082d43c55dd91cf7dd1bcd18d01e16acd5e55de0471Ben Murdoch        // Intentional no-op. Memory is managed automatically by Chromium.
108346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
108446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
108546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
108681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void clearCache(final boolean includeDiskFiles) {
108730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
108830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
108981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
109081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
109181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    clearCache(includeDiskFiles);
109281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
109381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
109481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
109581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
109646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.clearCache(includeDiskFiles);
109746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
109846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
1099bbef8de5696d48fc6458c926026fc524a62814e1Selim Gurun    /**
1100bbef8de5696d48fc6458c926026fc524a62814e1Selim Gurun     * This is a poorly named method, but we keep it for historical reasons.
1101bbef8de5696d48fc6458c926026fc524a62814e1Selim Gurun     */
110246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
110346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearFormData() {
110430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
110530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
110681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
110781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
110881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    clearFormData();
110981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
111081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
111181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
111281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
1113bbef8de5696d48fc6458c926026fc524a62814e1Selim Gurun        mAwContents.hideAutofillPopup();
111446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
111546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
111646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
111746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearHistory() {
111830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
111930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
112081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
112181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
112281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    clearHistory();
112381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
112481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
112581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
112681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
11277cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.clearHistory();
112846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
112946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
113046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
113146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearSslPreferences() {
113230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
113330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
113481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
113581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
113681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    clearSslPreferences();
113781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
113881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
113981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
114081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
11417cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.clearSslPreferences();
114246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
114346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
114446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
114546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebBackForwardList copyBackForwardList() {
114630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(true);
114730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
11482c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            WebBackForwardList ret = runOnUiThreadBlocking(new Callable<WebBackForwardList>() {
11492c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
11502c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public WebBackForwardList call() {
11512c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return copyBackForwardList();
11522c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
11532c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
11542c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
11552c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
115608a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu        return new WebBackForwardListChromium(
11577cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba                mAwContents.getNavigationHistory());
115846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
115946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
116046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
116146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setFindListener(WebView.FindListener listener) {
116246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mContentsClientAdapter.setFindListener(listener);
116346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
116446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
116546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
116681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void findNext(final boolean forwards) {
116730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
116830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
116981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
117081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
117181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    findNext(forwards);
117281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
117381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
117481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
117581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
117646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.findNext(forwards);
117746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
117846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
117946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
11802c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public int findAll(final String searchString) {
11812c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        findAllAsync(searchString);
1182f37548d6d8e2a73c65d675a26706a38f52960800Jonathan Dixon        return 0;
118346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
118446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
118546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
118681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void findAllAsync(final String searchString) {
118730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
118830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
118981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
119081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
119181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    findAllAsync(searchString);
119281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
119381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
119481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
119581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
119646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.findAllAsync(searchString);
119746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
119846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
119946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
12002c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean showFindDialog(final String text, final boolean showIme) {
120130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
120230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
12032c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return false;
12042c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
12056d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        if (mWebView.getParent() == null) {
12066d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            return false;
12076d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        }
12086d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch
12096d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        FindActionModeCallback findAction = new FindActionModeCallback(mWebView.getContext());
12106d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        if (findAction == null) {
12116d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            return false;
12126d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        }
12136d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch
12146d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        mWebView.startActionMode(findAction);
12156d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        findAction.setWebView(mWebView);
12166d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        if (showIme) {
12176d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            findAction.showSoftInput();
12186d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        }
12196d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch
12206d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        if (text != null) {
12216d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            findAction.setText(text);
12226d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            findAction.findAll();
12236d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        }
12246d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch
12256d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        return true;
122646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
122746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
12286d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch    @Override
1229fde8dae44f74be3de69ce6dd07b0023279b485a0Ben Murdoch    public void notifyFindDialogDismissed() {
123030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
123130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
123281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
123381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
123481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    notifyFindDialogDismissed();
123581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
123681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
123781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
123881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
12396d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        clearMatches();
1240fde8dae44f74be3de69ce6dd07b0023279b485a0Ben Murdoch    }
1241fde8dae44f74be3de69ce6dd07b0023279b485a0Ben Murdoch
124246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
124346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearMatches() {
124430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
124530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
124681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
124781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
124881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    clearMatches();
124981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
125081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
125181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
125281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
125346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.clearMatches();
125446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
125546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
125646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
125781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void documentHasImages(final Message response) {
125830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
125930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
126081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
126181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
126281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    documentHasImages(response);
126381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
126481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
126581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
126681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
126746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.documentHasImages(response);
126846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
126946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
127046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
127146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setWebViewClient(WebViewClient client) {
127246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mContentsClientAdapter.setWebViewClient(client);
127346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
127446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
127546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
127646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setDownloadListener(DownloadListener listener) {
12774320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu        mContentsClientAdapter.setDownloadListener(listener);
127846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
127946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
128046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
128146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setWebChromeClient(WebChromeClient client) {
128246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mContentsClientAdapter.setWebChromeClient(client);
128346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
128446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
128546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
128681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void setPictureListener(final WebView.PictureListener listener) {
128730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
128830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
128981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
129081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
129181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    setPictureListener(listener);
129281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
129381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
129481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
129581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
129646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mContentsClientAdapter.setPictureListener(listener);
12979c5a40623b62737244deb2d04a98830d7ffa8404Leandro Gracia Gil        mAwContents.enableOnNewPicture(listener != null,
12986ef347a29d692df672aaf59ee4926a476288476aBen Murdoch                mAppTargetSdkVersion >= Build.VERSION_CODES.JELLY_BEAN_MR2);
129946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
130046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
130146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
130281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void addJavascriptInterface(final Object obj, final String interfaceName) {
130330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
130430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
130581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
130681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
130781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    addJavascriptInterface(obj, interfaceName);
130881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
130981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
131081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
131181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
1312ea844f60b1b559788566fe6e004b1eeca53a8039Jonathan Dixon        Class<? extends Annotation> requiredAnnotation = null;
13136ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        if (mAppTargetSdkVersion >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
13147db34d3dcaac936566f912e1b0b21f3f103029ffJonathan Dixon           requiredAnnotation = JavascriptInterface.class;
13157db34d3dcaac936566f912e1b0b21f3f103029ffJonathan Dixon        }
13167cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.addPossiblyUnsafeJavascriptInterface(obj, interfaceName, requiredAnnotation);
131746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
131846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
131946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
132081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void removeJavascriptInterface(final String interfaceName) {
132130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
132230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
132381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
132481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
132581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    removeJavascriptInterface(interfaceName);
132681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
132781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
132881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
132981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
13307cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.removeJavascriptInterface(interfaceName);
133146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
133246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
133346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
133446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebSettings getSettings() {
133546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mWebSettings;
133646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
133746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
133846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
133946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setMapTrackballToArrowKeys(boolean setMap) {
134046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // This is a deprecated API: intentional no-op.
134146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
134246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
134346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
134481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void flingScroll(final int vx, final int vy) {
134530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
134630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
134781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
134881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
134981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    flingScroll(vx, vy);
135081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
135181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
135281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
135381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
13547cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.flingScroll(vx, vy);
135546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
135646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
135746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
135846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public View getZoomControls() {
135930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
136030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
13612c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return null;
13622c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
13632c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen
1364e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon        // This was deprecated in 2009 and hidden in JB MR1, so just provide the minimum needed
1365e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon        // to stop very out-dated applications from crashing.
1366e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon        Log.w(TAG, "WebView doesn't support getZoomControls");
1367420c0da3a4e06e1ac5574091e7c9c286ef012369Mikhail Naganov        return mAwContents.getSettings().supportZoom() ? new View(mWebView.getContext()) : null;
136846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
136946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
137046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
137146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean canZoomIn() {
137230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
13732c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return false;
13742c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
13757cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canZoomIn();
137646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
137746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
137846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
137946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean canZoomOut() {
138030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
13812c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return false;
13822c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
13837cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canZoomOut();
138446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
138546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
138646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
138746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean zoomIn() {
138830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(true);
138930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
13902c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
13912c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
13922c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
13932c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return zoomIn();
13942c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
13952c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
13962c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
13972c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
13987cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.zoomIn();
139946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
140046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
140146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
140246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean zoomOut() {
140330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(true);
140430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
14052c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
14062c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
14072c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
14082c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return zoomOut();
14092c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
14102c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
14112c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
14122c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
14137cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.zoomOut();
141446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
141546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
1416d2dcef4d9edfb7af7abff85b0867c3d6a363feb7Jonathan Dixon    @Override
141746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void dumpViewHierarchyWithProperties(BufferedWriter out, int level) {
1418f2b715bee3bb3a41e59f80ae53b45f249d9559c5Kristian Monsen        // Intentional no-op
141946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
142046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
1421d2dcef4d9edfb7af7abff85b0867c3d6a363feb7Jonathan Dixon    @Override
142246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public View findHierarchyView(String className, int hashCode) {
1423f2b715bee3bb3a41e59f80ae53b45f249d9559c5Kristian Monsen        // Intentional no-op
142446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return null;
142546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
142646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
142746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebViewProvider glue methods ---------------------------------------------------------------
142846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
142946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
143057b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen    // This needs to be kept thread safe!
143146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebViewProvider.ViewDelegate getViewDelegate() {
143246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return this;
143346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
143446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
143546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
14362c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    // This needs to be kept thread safe!
143746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebViewProvider.ScrollDelegate getScrollDelegate() {
143846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return this;
143946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
144046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
144146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
144246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebViewProvider.ViewDelegate implementation ------------------------------------------------
144346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
1444a7fba41c5661cb61b41c8a4ff2d69e5153666f7fBen Murdoch    // TODO: remove from WebViewProvider and use default implementation from
1445a7fba41c5661cb61b41c8a4ff2d69e5153666f7fBen Murdoch    // ViewGroup.
1446a7fba41c5661cb61b41c8a4ff2d69e5153666f7fBen Murdoch    // @Override
144746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean shouldDelayChildPressedState() {
144830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
144930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
14502c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
14512c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
14522c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
14532c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return shouldDelayChildPressedState();
14542c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
14552c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
14562c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
14572c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
1458a7fba41c5661cb61b41c8a4ff2d69e5153666f7fBen Murdoch        return true;
145946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
146046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
14615c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch//    @Override
14625c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch    public AccessibilityNodeProvider getAccessibilityNodeProvider() {
146330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
146430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
14652c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            AccessibilityNodeProvider ret = runOnUiThreadBlocking(
14662c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    new Callable<AccessibilityNodeProvider>() {
14672c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
14682c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public AccessibilityNodeProvider call() {
14692c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return getAccessibilityNodeProvider();
14702c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
14712c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
14722c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
14732c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
14745c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch        return mAwContents.getAccessibilityNodeProvider();
14755c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch    }
14765c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch
147746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
147830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch    public void onInitializeAccessibilityNodeInfo(final AccessibilityNodeInfo info) {
147930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
148030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
148181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            runVoidTaskOnUiThreadBlocking(new Runnable() {
148281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
148381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
148481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onInitializeAccessibilityNodeInfo(info);
148581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
148681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
148781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
148881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
14897cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.onInitializeAccessibilityNodeInfo(info);
149046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
149146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
149246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
149381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void onInitializeAccessibilityEvent(final AccessibilityEvent event) {
149430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
149530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
149681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            runVoidTaskOnUiThreadBlocking(new Runnable() {
149781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
149881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
149981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onInitializeAccessibilityEvent(event);
150081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
150181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
150281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
150381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
15047cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.onInitializeAccessibilityEvent(event);
150546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
150646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
150746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
15082c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean performAccessibilityAction(final int action, final Bundle arguments) {
150930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
151030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
15112c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
15122c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
15132c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
15142c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return performAccessibilityAction(action, arguments);
15152c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
15162c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
15172c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
15182c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
1519b7b706b2ed5cbb77dd690f5405b626a429989714Ben Murdoch        if (mAwContents.supportsAccessibilityAction(action)) {
1520b7b706b2ed5cbb77dd690f5405b626a429989714Ben Murdoch            return mAwContents.performAccessibilityAction(action, arguments);
1521b7b706b2ed5cbb77dd690f5405b626a429989714Ben Murdoch        }
1522b7b706b2ed5cbb77dd690f5405b626a429989714Ben Murdoch        return mWebViewPrivate.super_performAccessibilityAction(action, arguments);
152346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
152446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
152546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
152681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void setOverScrollMode(final int mode) {
152730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        // This gets called from the android.view.View c'tor that WebView inherits from. This
152830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        // causes the method to be called when mAwContents == null.
152930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        // It's safe to ignore these calls however since AwContents will read the current value of
153030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        // this setting when it's created.
153130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (mAwContents == null) return;
153230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch
153330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
153430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
153581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
153681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
153781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    setOverScrollMode(mode);
153881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
153981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
154081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
154181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
154230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mAwContents.setOverScrollMode(mode);
154346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
154446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
154546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
154681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void setScrollBarStyle(final int style) {
154730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
154830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
154981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
155081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
155181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    setScrollBarStyle(style);
155281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
155381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
155481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
155581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
1556bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        mAwContents.setScrollBarStyle(style);
155746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
155846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
155946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
156081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void onDrawVerticalScrollBar(final Canvas canvas, final Drawable scrollBar, final int l,
156181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            final int t, final int r, final int b) {
1562bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        // WebViewClassic was overriding this method to handle rubberband over-scroll. Since
1563bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        // WebViewChromium doesn't support that the vanilla implementation of this method can be
1564bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        // used.
1565bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        mWebViewPrivate.super_onDrawVerticalScrollBar(canvas, scrollBar, l, t, r, b);
156646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
156746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
156846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
156981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void onOverScrolled(final int scrollX, final int scrollY, final boolean clampedX,
157081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            final boolean clampedY) {
157130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
157230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
157381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
157481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
157581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onOverScrolled(scrollX, scrollY, clampedX, clampedY);
157681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
157781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
157881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
157981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
15803951fbadf5157dd3fe73decc879f9b763e780b09Martin Kosiba        mAwContents.onContainerViewOverScrolled(scrollX, scrollY, clampedX, clampedY);
158146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
158246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
158346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
158481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void onWindowVisibilityChanged(final int visibility) {
158530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
158630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
158781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
158881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
158981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onWindowVisibilityChanged(visibility);
159081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
159181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
159281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
159381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
15941cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onWindowVisibilityChanged(visibility);
159546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
159646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
159746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
1598c8523c99833f364c64744d60e408510fb83b998bKristian Monsen    public void onDraw(final Canvas canvas) {
159930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(true);
160030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
16014fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen            runVoidTaskOnUiThreadBlocking(new Runnable() {
1602c8523c99833f364c64744d60e408510fb83b998bKristian Monsen                @Override
1603c8523c99833f364c64744d60e408510fb83b998bKristian Monsen                public void run() {
1604c8523c99833f364c64744d60e408510fb83b998bKristian Monsen                    onDraw(canvas);
1605c8523c99833f364c64744d60e408510fb83b998bKristian Monsen                }
1606c8523c99833f364c64744d60e408510fb83b998bKristian Monsen            });
1607c8523c99833f364c64744d60e408510fb83b998bKristian Monsen            return;
1608c8523c99833f364c64744d60e408510fb83b998bKristian Monsen        }
16097ab33360e331e04f515d532064670e210d174a7aTao Bai        mAwContents.onDraw(canvas);
161046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
161146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
161246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
161381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void setLayoutParams(final ViewGroup.LayoutParams layoutParams) {
161430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        // This API is our strongest signal from the View system that this
161530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        // WebView is going to be bound to a View hierarchy and so at this
161630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        // point we must bind Chromium's UI thread to the current thread.
161730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
161830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        checkThread();
161946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewPrivate.super_setLayoutParams(layoutParams);
162046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
162146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
162246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
162346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean performLongClick() {
162459a30ac62fdd1e22b59776547730ac8d8be68531Kristian Monsen        // Return false unless the WebView is attached to a View with a parent
162559a30ac62fdd1e22b59776547730ac8d8be68531Kristian Monsen        return mWebView.getParent() != null ? mWebViewPrivate.super_performLongClick() : false;
162646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
162746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
162846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
162981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void onConfigurationChanged(final Configuration newConfig) {
163030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
163130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
163281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
163381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
163481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onConfigurationChanged(newConfig);
163581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
163681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
163781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
163881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
16391cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onConfigurationChanged(newConfig);
164046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
164146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
164246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
16432c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public InputConnection onCreateInputConnection(final EditorInfo outAttrs) {
164430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
164530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
164630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch           return null;
16472c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
16487cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.onCreateInputConnection(outAttrs);
164946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
165046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
165146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
16522c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean onKeyMultiple(final int keyCode, final int repeatCount, final KeyEvent event) {
165330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
165430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
16552c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
16562c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
16572c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
16582c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return onKeyMultiple(keyCode, repeatCount, event);
16592c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
16602c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
16612c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
16622c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
166346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
166446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
166546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
166646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
166746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
16682c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean onKeyDown(final int keyCode, final KeyEvent event) {
166930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
167030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
16712c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
16722c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
16732c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
16742c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return onKeyDown(keyCode, event);
16752c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
16762c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
16772c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
16782c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
167946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
168046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
168146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
168246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
168346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
16842c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean onKeyUp(final int keyCode, final KeyEvent event) {
168530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
168630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
16872c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
16882c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
16892c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
16902c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return onKeyUp(keyCode, event);
16912c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
16922c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
16932c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
16942c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
16957cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.onKeyUp(keyCode, event);
169646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
169746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
169846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
169946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onAttachedToWindow() {
170030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        // This API is our strongest signal from the View system that this
170130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        // WebView is going to be bound to a View hierarchy and so at this
170230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        // point we must bind Chromium's UI thread to the current thread.
170330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
170430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        checkThread();
17051cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onAttachedToWindow();
170646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
170746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
170846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
170946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onDetachedFromWindow() {
171030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
171130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
171281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
171381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
171481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onDetachedFromWindow();
171581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
171681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
171781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
171881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
1719157c78cfd4127a0b39d3c55c95c7cec23ccdc234Bo Liu
1720157c78cfd4127a0b39d3c55c95c7cec23ccdc234Bo Liu        Runnable detachAwContents = new Runnable() {
1721157c78cfd4127a0b39d3c55c95c7cec23ccdc234Bo Liu            @Override
1722157c78cfd4127a0b39d3c55c95c7cec23ccdc234Bo Liu            public void run() {
1723157c78cfd4127a0b39d3c55c95c7cec23ccdc234Bo Liu                mAwContents.onDetachedFromWindow();
1724157c78cfd4127a0b39d3c55c95c7cec23ccdc234Bo Liu            }
1725157c78cfd4127a0b39d3c55c95c7cec23ccdc234Bo Liu        };
1726157c78cfd4127a0b39d3c55c95c7cec23ccdc234Bo Liu
1727157c78cfd4127a0b39d3c55c95c7cec23ccdc234Bo Liu        if (mGLfunctor == null || !mWebView.executeHardwareAction(detachAwContents)) {
1728157c78cfd4127a0b39d3c55c95c7cec23ccdc234Bo Liu            detachAwContents.run();
1729157c78cfd4127a0b39d3c55c95c7cec23ccdc234Bo Liu        }
1730157c78cfd4127a0b39d3c55c95c7cec23ccdc234Bo Liu
1731a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon        if (mGLfunctor != null) {
1732a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon            mGLfunctor.detach();
1733a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon        }
173446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
173546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
173646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
173781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void onVisibilityChanged(final View changedView, final int visibility) {
173830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        // The AwContents will find out the container view visibility before the first draw so we
173930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        // can safely ignore onVisibilityChanged callbacks that happen before init().
174030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (mAwContents == null) return;
174130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch
174230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
174330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
174481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
174581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
174681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onVisibilityChanged(changedView, visibility);
174781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
174881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
174981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
175081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
175130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mAwContents.onVisibilityChanged(changedView, visibility);
175246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
175346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
175446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
175581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void onWindowFocusChanged(final boolean hasWindowFocus) {
175630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
175730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
175881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
175981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
176081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onWindowFocusChanged(hasWindowFocus);
176181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
176281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
176381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
176481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
17651cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onWindowFocusChanged(hasWindowFocus);
176646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
176746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
176846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
176981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void onFocusChanged(final boolean focused, final int direction,
177081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            final Rect previouslyFocusedRect) {
177130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
177230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
177381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
177481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
177581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onFocusChanged(focused, direction, previouslyFocusedRect);
177681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
177781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
177881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
177981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
17801cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onFocusChanged(focused, direction, previouslyFocusedRect);
178146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
178246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
178346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
17842c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean setFrame(final int left, final int top, final int right, final int bottom) {
178546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mWebViewPrivate.super_setFrame(left, top, right, bottom);
178646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
178746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
178846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
178981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void onSizeChanged(final int w, final int h, final int ow, final int oh) {
179030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
179130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            mRunQueue.addTask(new Runnable() {
179281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
179381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
179481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onSizeChanged(w, h, ow, oh);
179581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
179681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
179781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
179881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
17991cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onSizeChanged(w, h, ow, oh);
180046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
180146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
180246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
180346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onScrollChanged(int l, int t, int oldl, int oldt) {
180446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
180546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
180646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
18072c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean dispatchKeyEvent(final KeyEvent event) {
180830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
180930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
18102c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
18112c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
18122c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
18132c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return dispatchKeyEvent(event);
18142c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
18152c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
18162c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
18172c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
18187cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.dispatchKeyEvent(event);
181946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
182046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
182146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
18222c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean onTouchEvent(final MotionEvent ev) {
182330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
182430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
18252c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
18262c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
18272c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
18282c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return onTouchEvent(ev);
18292c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
18302c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
18312c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
18322c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
1833c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        return mAwContents.onTouchEvent(ev);
183446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
183546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
183646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
18372c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean onHoverEvent(final MotionEvent event) {
183830c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
183930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
18402c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
18412c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
18422c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
18432c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return onHoverEvent(event);
18442c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
18452c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
18462c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
18472c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
1848c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        return mAwContents.onHoverEvent(event);
184946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
185046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
185146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
18522c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean onGenericMotionEvent(final MotionEvent event) {
185330c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
185430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
18552c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
18562c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
18572c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
18582c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return onGenericMotionEvent(event);
18592c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
18602c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
18612c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
18622c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
1863c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        return mAwContents.onGenericMotionEvent(event);
186446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
186546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
186646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
186746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onTrackballEvent(MotionEvent ev) {
186846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // Trackball event not handled, which eventually gets converted to DPAD keyevents
186946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
187046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
187146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
187246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
18732c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean requestFocus(final int direction, final Rect previouslyFocusedRect) {
187430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
187530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
18762c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
18772c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
18782c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
18792c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return requestFocus(direction, previouslyFocusedRect);
18802c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
18812c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
18822c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
18832c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
18844cee3bf50c125a52a49323aa999f4b619fa18c10Ben Murdoch        mAwContents.requestFocus();
188546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mWebViewPrivate.super_requestFocus(direction, previouslyFocusedRect);
188646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
188746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
188846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
188981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
189030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
189130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
189230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            runVoidTaskOnUiThreadBlocking(new Runnable() {
189381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
189481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
189581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onMeasure(widthMeasureSpec, heightMeasureSpec);
189681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
189781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
189881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
189981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
1900d7bf6ab0cd8cc4005b112e4358eb797bb178a85fMarcin Kosiba        mAwContents.onMeasure(widthMeasureSpec, heightMeasureSpec);
190146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
190246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
190346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
19042c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean requestChildRectangleOnScreen(final View child, final Rect rect,
19052c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            final boolean immediate) {
190630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
190730c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
19082c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
19092c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
19102c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
19112c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return requestChildRectangleOnScreen(child, rect, immediate);
19122c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
19132c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
19142c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
19152c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
19161f76368786ae12898311d148b0057403db2fb36aMartin Kosiba        return mAwContents.requestChildRectangleOnScreen(child, rect, immediate);
191746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
191846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
191946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
192057b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen    public void setBackgroundColor(final int color) {
192130c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
192230c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
192357b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
192457b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                @Override
192557b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                public void run() {
192681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    setBackgroundColor(color);
192757b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                }
192857b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            });
192981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
193057b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen        }
193181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        mAwContents.setBackgroundColor(color);
193246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
193346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
193446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
193546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setLayerType(int layerType, Paint paint) {
1936f2b715bee3bb3a41e59f80ae53b45f249d9559c5Kristian Monsen        // Intentional no-op
193746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
193846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
193981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    // Remove from superclass
194046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void preDispatchDraw(Canvas canvas) {
19410b528e4924a7c14687181185bc66173ad18f00eaLeandro Gracia Gil        // TODO(leandrogracia): remove this method from WebViewProvider if we think
19420b528e4924a7c14687181185bc66173ad18f00eaLeandro Gracia Gil        // we won't need it again.
194346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
194446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
194546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebViewProvider.ScrollDelegate implementation ----------------------------------------------
194646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
194746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
194846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeHorizontalScrollRange() {
194930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
195030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
19512c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            int ret = runOnUiThreadBlocking(new Callable<Integer>() {
19522c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
19532c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Integer call() {
19542c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return computeHorizontalScrollRange();
19552c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
19562c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
19572c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
19582c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
19597cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeHorizontalScrollRange();
196046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
196146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
196246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
196346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeHorizontalScrollOffset() {
196430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
196530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
19662c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            int ret = runOnUiThreadBlocking(new Callable<Integer>() {
19672c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
19682c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Integer call() {
19692c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return computeHorizontalScrollOffset();
19702c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
19712c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
19722c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
19732c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
19747cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeHorizontalScrollOffset();
197546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
197646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
197746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
197846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeVerticalScrollRange() {
197930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
198030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
19812c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            int ret = runOnUiThreadBlocking(new Callable<Integer>() {
19822c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
19832c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Integer call() {
19842c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return computeVerticalScrollRange();
19852c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
19862c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
19872c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
19882c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
19897cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeVerticalScrollRange();
199046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
199146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
199246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
199346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeVerticalScrollOffset() {
199430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
199530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
19962c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            int ret = runOnUiThreadBlocking(new Callable<Integer>() {
19972c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
19982c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Integer call() {
19992c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return computeVerticalScrollOffset();
20002c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
20012c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
20022c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
20032c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
20047cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeVerticalScrollOffset();
200546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
200646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
200746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
200846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeVerticalScrollExtent() {
200930c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
201030c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
20112c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            int ret = runOnUiThreadBlocking(new Callable<Integer>() {
20122c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
20132c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Integer call() {
20142c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return computeVerticalScrollExtent();
20152c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
20162c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
20172c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
20182c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
20197cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeVerticalScrollExtent();
202046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
202146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
202246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
202346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void computeScroll() {
202430c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        mFactory.startYourEngines(false);
202530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch        if (checkNeedsPost()) {
202630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            runVoidTaskOnUiThreadBlocking(new Runnable() {
202781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
202881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
202981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    computeScroll();
203081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
203181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
203281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
203381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
20342a120ba09921dbb1e8354ecbc4a6e063ec891101Martin Kosiba        mAwContents.computeScroll();
203546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
203646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
20374702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba    // AwContents.InternalAccessDelegate implementation --------------------------------------
20384702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba    private class InternalAccessAdapter implements AwContents.InternalAccessDelegate {
203946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
204046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean drawChild(Canvas arg0, View arg1, long arg2) {
204146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
204246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
204346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
204446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
204546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
204646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_onKeyUp(int arg0, KeyEvent arg1) {
2047f2b715bee3bb3a41e59f80ae53b45f249d9559c5Kristian Monsen            // Intentional no-op
204846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
204946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
205046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
205146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
205246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_dispatchKeyEventPreIme(KeyEvent arg0) {
205346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
205446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
205546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
205646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
205746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
205846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_dispatchKeyEvent(KeyEvent event) {
205946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return mWebViewPrivate.super_dispatchKeyEvent(event);
206046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
206146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
206246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
206346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_onGenericMotionEvent(MotionEvent arg0) {
20644cde2296b2a773d3139ed97daa097eefa42b511aKristian Monsen            return mWebViewPrivate.super_onGenericMotionEvent(arg0);
206546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
206646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
206746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
206846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public void super_onConfigurationChanged(Configuration arg0) {
2069f2b715bee3bb3a41e59f80ae53b45f249d9559c5Kristian Monsen            // Intentional no-op
207046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
207146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
2072bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        @Override
20730088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba        public int super_getScrollBarStyle() {
20740088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba            return mWebViewPrivate.super_getScrollBarStyle();
20750088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba        }
20760088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba
207746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
207846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean awakenScrollBars() {
207946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mWebViewPrivate.awakenScrollBars(0);
208046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // TODO: modify the WebView.PrivateAccess to provide a return value.
208146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return true;
208246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
208346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
208446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
208546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_awakenScrollBars(int arg0, boolean arg1) {
208646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // TODO: need method on WebView.PrivateAccess?
208746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
208846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
208946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
20904702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba
2091d7bf6ab0cd8cc4005b112e4358eb797bb178a85fMarcin Kosiba        @Override
20922a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        public void onScrollChanged(int l, int t, int oldl, int oldt) {
20932a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.setScrollXRaw(l);
20942a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.setScrollYRaw(t);
20952a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.onScrollChanged(l, t, oldl, oldt);
20962a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        }
20972a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba
20983951fbadf5157dd3fe73decc879f9b763e780b09Martin Kosiba        @Override
20992a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        public void overScrollBy(int deltaX, int deltaY,
21002a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            int scrollX, int scrollY,
21012a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            int scrollRangeX, int scrollRangeY,
21022a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            int maxOverScrollX, int maxOverScrollY,
21032a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            boolean isTouchEvent) {
21042a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.overScrollBy(deltaX, deltaY, scrollX, scrollY,
21052a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba                    scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);
21062a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        }
21072a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba
21083951fbadf5157dd3fe73decc879f9b763e780b09Martin Kosiba        @Override
21092a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        public void super_scrollTo(int scrollX, int scrollY) {
21102a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.super_scrollTo(scrollX, scrollY);
21112a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        }
21122a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba
21132a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        @Override
21144702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba        public void setMeasuredDimension(int measuredWidth, int measuredHeight) {
21154702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba            mWebViewPrivate.setMeasuredDimension(measuredWidth, measuredHeight);
21164702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba        }
211751f7cf16cd02f14050bb723175a2a57570e8486dTao Bai
21187ab33360e331e04f515d532064670e210d174a7aTao Bai        @Override
211951f7cf16cd02f14050bb723175a2a57570e8486dTao Bai        public boolean requestDrawGL(Canvas canvas) {
21207ab33360e331e04f515d532064670e210d174a7aTao Bai            if (mGLfunctor == null) {
21217ab33360e331e04f515d532064670e210d174a7aTao Bai                mGLfunctor = new DrawGLFunctor(mAwContents.getAwDrawGLViewContext());
21227ab33360e331e04f515d532064670e210d174a7aTao Bai            }
212351f7cf16cd02f14050bb723175a2a57570e8486dTao Bai            return mGLfunctor.requestDrawGL((HardwareCanvas)canvas, mWebView.getViewRootImpl());
212451f7cf16cd02f14050bb723175a2a57570e8486dTao Bai        }
212546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
212646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)}
2127