WebViewChromium.java revision d21b8fe00b21742cc36929cb02eef6ad25946512
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;
2946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Message;
30412d84be859ce0eb91baf2f9afe5e6326a15d76aSelim Gurunimport android.print.PrintDocumentAdapter;
3119bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixonimport android.text.TextUtils;
32efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdochimport android.util.Base64;
33e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixonimport android.util.Log;
34a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixonimport android.view.HardwareCanvas;
3546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.KeyEvent;
3646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.MotionEvent;
3746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.View;
3846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.ViewGroup;
3946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.accessibility.AccessibilityEvent;
4046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.accessibility.AccessibilityNodeInfo;
415c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdochimport android.view.accessibility.AccessibilityNodeProvider;
4246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.inputmethod.EditorInfo;
4346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.inputmethod.InputConnection;
4446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.DownloadListener;
456d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdochimport android.webkit.FindActionModeCallback;
467db34d3dcaac936566f912e1b0b21f3f103029ffJonathan Dixonimport android.webkit.JavascriptInterface;
4746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.ValueCallback;
4846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebBackForwardList;
4946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebChromeClient;
5046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebSettings;
5146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebView;
5246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewClient;
5346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewProvider;
5433e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdochimport android.widget.TextView;
5546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
56aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsenimport org.chromium.android_webview.AwBrowserContext;
5746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.AwContents;
58ffabf2e121746d06b9930b1ae8fea243c4f5cb9dMikhail Naganovimport org.chromium.android_webview.AwLayoutSizer;
59a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurunimport org.chromium.android_webview.AwPdfExportAttributes;
60412d84be859ce0eb91baf2f9afe5e6326a15d76aSelim Gurunimport org.chromium.android_webview.AwPrintDocumentAdapter;
61a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsenimport org.chromium.base.ThreadUtils;
6246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.LoadUrlParams;
6346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.net.NetworkChangeNotifier;
6446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
6546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.io.BufferedWriter;
6646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.io.File;
67ea844f60b1b559788566fe6e004b1eeca53a8039Jonathan Dixonimport java.lang.annotation.Annotation;
682c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsenimport java.util.concurrent.Callable;
694fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsenimport java.util.concurrent.FutureTask;
704fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsenimport java.util.concurrent.TimeUnit;
71b8281877c710018a3bc8066be17b1e11822be015Selim Gurunimport java.util.HashMap;
7246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.util.Map;
7346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
7446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)/**
7546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * This class is the delegate to which WebViewProxy forwards all API calls.
7646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) *
771cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon * Most of the actual functionality is implemented by AwContents (or ContentViewCore within
781cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon * it). This class also contains WebView-specific APIs that require the creation of other
791cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon * adapters (otherwise org.chromium.content would depend on the webview.chromium package)
801cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon * and a small set of no-op deprecated APIs.
8146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */
8246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)class WebViewChromium implements WebViewProvider,
8346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)          WebViewProvider.ScrollDelegate, WebViewProvider.ViewDelegate {
84e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon
85e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon    private static final String TAG = WebViewChromium.class.getSimpleName();
86e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon
8746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The WebView that this WebViewChromium is the provider for.
8846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    WebView mWebView;
8946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // Lets us access protected View-derived methods on the WebView instance we're backing.
9046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    WebView.PrivateAccess mWebViewPrivate;
9146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The client adapter class.
9246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebViewContentsClientAdapter mContentsClientAdapter;
9346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
9446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // Variables for functionality provided by this adapter ---------------------------------------
9546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebSettings adapter, lazily initialized in the getter
9646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebSettings mWebSettings;
973949435b480cb71106f65b237025da359cf8a8caBen Murdoch    // The WebView wrapper for ContentViewCore and required browser compontents.
9846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private AwContents mAwContents;
99a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    // Non-null if this webview is using the GL accelerated draw path.
100a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    private DrawGLFunctor mGLfunctor;
10146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
102aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen    private AwBrowserContext mBrowserContext;
103aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen
104c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu    private final WebView.HitTestResult mHitTestResult;
105c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu
1066ef347a29d692df672aaf59ee4926a476288476aBen Murdoch    private final int mAppTargetSdkVersion;
1076ef347a29d692df672aaf59ee4926a476288476aBen Murdoch
1084fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen    // This does not touch any global / non-threadsafe state, but note that
1094fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen    // init is ofter called right after and is NOT threadsafe.
110aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen    public WebViewChromium(WebView webView, WebView.PrivateAccess webViewPrivate,
111aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen            AwBrowserContext browserContext) {
11246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebView = webView;
11346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewPrivate = webViewPrivate;
114c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mHitTestResult = new WebView.HitTestResult();
115aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen        mBrowserContext = browserContext;
1166ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        mAppTargetSdkVersion = mWebView.getContext().getApplicationInfo().targetSdkVersion;
11746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
11846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
1191ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch    static void completeWindowCreation(WebView parent, WebView child) {
1201ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch        AwContents parentContents = ((WebViewChromium) parent.getWebViewProvider()).mAwContents;
121bbfef40e5fc625f4821f012fae7f16468b7308cfJonathan Dixon        AwContents childContents =
122bbfef40e5fc625f4821f012fae7f16468b7308cfJonathan Dixon                child == null ? null : ((WebViewChromium) child.getWebViewProvider()).mAwContents;
1231ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch        parentContents.supplyContentsForPopup(childContents);
12446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
12546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
1262c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    private static <T> T runBlockingFuture(FutureTask<T> task) {
1274fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen        if (ThreadUtils.runningOnUiThread()) {
1284fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen            throw new IllegalStateException("This method should only be called off the UI thread");
1294fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen        }
1304fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen        ThreadUtils.postOnUiThread(task);
1314fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen        try {
1322c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return task.get(4, TimeUnit.SECONDS);
1334fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen        } catch (Exception e) { // Timeout is one of the possible exceptions here
1342c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            throw new RuntimeException("Probable deadlock detected due to WebView API being called "
1352c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    + "on incorrect thread while the UI thread is blocked.", e);
1364fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen        }
1374fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen    }
1384fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen
1392c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    // We have a 4 second timeout to try to detect deadlocks to detect and aid in debuggin
1402c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    // deadlocks.
1412c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    // Do not call this method while on the UI thread!
1422c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    private void runVoidTaskOnUiThreadBlocking(Runnable r) {
1432c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        FutureTask<Void> task = new FutureTask<Void>(r, null);
1442c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        runBlockingFuture(task);
1452c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    }
1462c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen
1472c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    private static <T> T runOnUiThreadBlocking(Callable<T> c) {
1482c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        return runBlockingFuture(new FutureTask<T>(c));
1492c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    }
1502c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen
15146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebViewProvider methods --------------------------------------------------------------------
15246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
15346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
1544fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen    public void init(final Map<String, Object> javaScriptInterfaces,
1554fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen            final boolean privateBrowsing) {
1564fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
1574fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen            runVoidTaskOnUiThreadBlocking(new Runnable() {
1584fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen                @Override
1594fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen                public void run() {
1604fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen                    init(javaScriptInterfaces, privateBrowsing);
1614fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen                }
1624fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen            });
1634fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen            return;
1644fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen        }
1654dcabaef9151384b571327b62234409b31caef38Jonathan Dixon        // BUG=6790250 |javaScriptInterfaces| was only ever used by the obsolete DumpRenderTree
1664dcabaef9151384b571327b62234409b31caef38Jonathan Dixon        // so is ignored. TODO: remove it from WebViewProvider.
16746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        final boolean isAccessFromFileURLsGrantedByDefault =
168ffabf2e121746d06b9930b1ae8fea243c4f5cb9dMikhail Naganov                mAppTargetSdkVersion < Build.VERSION_CODES.JELLY_BEAN;
169ffabf2e121746d06b9930b1ae8fea243c4f5cb9dMikhail Naganov        final boolean areLegacyQuirksEnabled =
170ffabf2e121746d06b9930b1ae8fea243c4f5cb9dMikhail Naganov                mAppTargetSdkVersion < Build.VERSION_CODES.KITKAT;
17146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mContentsClientAdapter = new WebViewContentsClientAdapter(mWebView);
172aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen        mAwContents = new AwContents(mBrowserContext, mWebView, new InternalAccessAdapter(),
173ffabf2e121746d06b9930b1ae8fea243c4f5cb9dMikhail Naganov                mContentsClientAdapter, isAccessFromFileURLsGrantedByDefault,
174ffabf2e121746d06b9930b1ae8fea243c4f5cb9dMikhail Naganov                new AwLayoutSizer(), areLegacyQuirksEnabled);
1757720b10b55b5db5564a72c2e4c2c23631acbff0aKristian Monsen        mWebSettings = new ContentSettingsAdapter(mAwContents.getSettings());
1767720b10b55b5db5564a72c2e4c2c23631acbff0aKristian Monsen
1774dcabaef9151384b571327b62234409b31caef38Jonathan Dixon        if (privateBrowsing) {
1784dcabaef9151384b571327b62234409b31caef38Jonathan Dixon            final String msg = "Private browsing is not supported in WebView.";
1799cd49cbc245e07e8e8c360fd22821a2918f99eaeChet Haase                       if (mAppTargetSdkVersion >= Build.VERSION_CODES.KITKAT) {
1804dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                throw new IllegalArgumentException(msg);
1814dcabaef9151384b571327b62234409b31caef38Jonathan Dixon            } else {
1824dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                Log.w(TAG, msg);
1834dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                // Intentionally irreversibly disable the webview instance, so that private
1844dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                // user data cannot leak through misuse of a non-privateBrowing WebView instance.
1854dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                // Can't just null out mAwContents as we never null-check it before use.
1864dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                mAwContents.destroy();
18733e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdoch                TextView warningLabel = new TextView(mWebView.getContext());
18833e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdoch                warningLabel.setText(mWebView.getContext().getString(
18933e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdoch                        com.android.internal.R.string.webviewchromium_private_browsing_warning));
19033e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdoch                mWebView.addView(warningLabel);
1914dcabaef9151384b571327b62234409b31caef38Jonathan Dixon            }
1924dcabaef9151384b571327b62234409b31caef38Jonathan Dixon        }
1934dcabaef9151384b571327b62234409b31caef38Jonathan Dixon
19446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
19546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
19657b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen    private RuntimeException createThreadException() {
1971a692d93c0172dc09a316bbf9a54896f1d40234fKristian Monsen        return new IllegalStateException(
1981a692d93c0172dc09a316bbf9a54896f1d40234fKristian Monsen                "Calling View methods on another thread than the UI thread.");
19957b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen    }
20057b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen
20162389e2d66a99e936652092333782947e363241dKristian Monsen    //  Intentionally not static, as no need to check thread on static methods
20262389e2d66a99e936652092333782947e363241dKristian Monsen    private void checkThread() {
20362389e2d66a99e936652092333782947e363241dKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
20457b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            final RuntimeException threadViolation = createThreadException();
20557b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
20657b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                @Override
20757b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                public void run() {
20857b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                    throw threadViolation;
20957b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                }
21057b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            });
211ab73853ea633a4ada353f5a2321c6bf0e6c108e5Kristian Monsen            throw createThreadException();
21262389e2d66a99e936652092333782947e363241dKristian Monsen        }
21362389e2d66a99e936652092333782947e363241dKristian Monsen    }
21462389e2d66a99e936652092333782947e363241dKristian Monsen
21546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
21681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void setHorizontalScrollbarOverlay(final boolean overlay) {
21781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
21881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
21981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
22081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
22181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    setHorizontalScrollbarOverlay(overlay);
22281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
22381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
22481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
22581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
226bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        mAwContents.setHorizontalScrollbarOverlay(overlay);
22746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
22846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
22946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
23081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void setVerticalScrollbarOverlay(final boolean overlay) {
23181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
23281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
23381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
23481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
23581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    setVerticalScrollbarOverlay(overlay);
23681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
23781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
23881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
23981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
240bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        mAwContents.setVerticalScrollbarOverlay(overlay);
24146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
24246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
24346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
24446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean overlayHorizontalScrollbar() {
2452c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
2462c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
2472c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
2482c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
2492c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return overlayHorizontalScrollbar();
2502c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
2512c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
2522c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
2532c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
254bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        return mAwContents.overlayHorizontalScrollbar();
25546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
25646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
25746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
25846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean overlayVerticalScrollbar() {
2592c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
2602c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
2612c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
2622c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
2632c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return overlayVerticalScrollbar();
2642c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
2652c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
2662c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
2672c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
268bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        return mAwContents.overlayVerticalScrollbar();
26946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
27046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
27146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
27246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int getVisibleTitleHeight() {
27346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // This is deprecated in WebView and should always return 0.
27446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return 0;
27546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
27646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
27746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
27846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public SslCertificate getCertificate() {
2792c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
2802c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            SslCertificate ret = runOnUiThreadBlocking(new Callable<SslCertificate>() {
2812c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
2822c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public SslCertificate call() {
2832c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return getCertificate();
2842c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
2852c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
2862c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
2872c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
28846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mAwContents.getCertificate();
28946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
29046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
29146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
29246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setCertificate(SslCertificate certificate) {
29381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        // intentional no-op
29446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
29546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
29646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
29746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void savePassword(String host, String username, String password) {
298adc6c4d74c77a617100bdfeb174ab0c314b24ea8Selim Gurun        // This is a deprecated API: intentional no-op.
29946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
30046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
30146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
30281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void setHttpAuthUsernamePassword(final String host, final String realm,
30381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            final String username, final String password) {
30481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
30581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
30681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
30781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
30881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    setHttpAuthUsernamePassword(host, realm, username, password);
30981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
31081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
31181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
31281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
31346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.setHttpAuthUsernamePassword(host, realm, username, password);
31446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
31546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
31646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
3172c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public String[] getHttpAuthUsernamePassword(final String host, final String realm) {
3182c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
3192c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            String[] ret = runOnUiThreadBlocking(new Callable<String[]>() {
3202c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
3212c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public String[] call() {
3222c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return getHttpAuthUsernamePassword(host, realm);
3232c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
3242c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
3252c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
3262c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
32746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mAwContents.getHttpAuthUsernamePassword(host, realm);
32846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
32946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
33046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
33146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void destroy() {
332370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
333370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
334370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen                @Override
335370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen                public void run() {
336370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen                    destroy();
337370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen                }
338370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen            });
339370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen            return;
340370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen        }
341370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen
3423949435b480cb71106f65b237025da359cf8a8caBen Murdoch        mAwContents.destroy();
343a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon        if (mGLfunctor != null) {
344a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon            mGLfunctor.destroy();
345a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon            mGLfunctor = null;
346a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon        }
34746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
34846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
34946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
35081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void setNetworkAvailable(final boolean networkUp) {
3510363422b19ca6263dbfbcd0d9daa6d1abe5c6892Ben Murdoch        // Note that this purely toggles the JS navigator.online property.
3520363422b19ca6263dbfbcd0d9daa6d1abe5c6892Ben Murdoch        // It does not in affect chromium or network stack state in any way.
35381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
35481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
35581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
35681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
35781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    setNetworkAvailable(networkUp);
35881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
35981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
36081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
36181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
3620363422b19ca6263dbfbcd0d9daa6d1abe5c6892Ben Murdoch        mAwContents.setNetworkAvailable(networkUp);
36346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
36446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
36546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
3662c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public WebBackForwardList saveState(final Bundle outState) {
3672c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
3682c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            WebBackForwardList ret = runOnUiThreadBlocking(new Callable<WebBackForwardList>() {
3692c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
3702c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public WebBackForwardList call() {
3712c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return saveState(outState);
3722c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
3732c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
3742c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
3752c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
376a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        if (outState == null) return null;
377a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        if (!mAwContents.saveState(outState)) return null;
378a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        return copyBackForwardList();
37946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
38046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
38146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
38246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean savePicture(Bundle b, File dest) {
3839405536501747e2d7b4fc46a33e5f0a1e7fd47acJonathan Dixon        // Intentional no-op: hidden method on WebView.
38446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
38546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
38646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
38746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
38846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean restorePicture(Bundle b, File src) {
3899405536501747e2d7b4fc46a33e5f0a1e7fd47acJonathan Dixon        // Intentional no-op: hidden method on WebView.
39046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
39146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
39246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
39346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
3942c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public WebBackForwardList restoreState(final Bundle inState) {
3952c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
3962c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            WebBackForwardList ret = runOnUiThreadBlocking(new Callable<WebBackForwardList>() {
3972c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
3982c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public WebBackForwardList call() {
3992c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return restoreState(inState);
4002c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
4012c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
4022c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
4032c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
404a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        if (inState == null) return null;
405a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        if (!mAwContents.restoreState(inState)) return null;
406a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        return copyBackForwardList();
40746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
40846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
40946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
41046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void loadUrl(String url, Map<String, String> additionalHttpHeaders) {
41146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // TODO: We may actually want to do some sanity checks here (like filter about://chrome).
4126ef347a29d692df672aaf59ee4926a476288476aBen Murdoch
4136ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        // For backwards compatibility, apps targeting less than K will have JS URLs evaluated
4146ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        // directly and any result of the evaluation will not replace the current page content.
4156ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        // Matching Chrome behavior more closely; apps targetting >= K that load a JS URL will
4166ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        // have the result of that URL replace the content of the current page.
4176ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        final String JAVASCRIPT_SCHEME = "javascript:";
4189cd49cbc245e07e8e8c360fd22821a2918f99eaeChet Haase        if (mAppTargetSdkVersion < Build.VERSION_CODES.KITKAT &&
41941618b2aeb0a500c740a75871a8f614cb6543362Kristian Monsen                url != null && url.startsWith(JAVASCRIPT_SCHEME)) {
4203d52163e1c466860651414670c59762f5bdd269fTao Bai            mAwContents.evaluateJavaScriptEvenIfNotYetNavigated(
4213d52163e1c466860651414670c59762f5bdd269fTao Bai                    url.substring(JAVASCRIPT_SCHEME.length()));
4226ef347a29d692df672aaf59ee4926a476288476aBen Murdoch            return;
4236ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        }
4246ef347a29d692df672aaf59ee4926a476288476aBen Murdoch
42546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        LoadUrlParams params = new LoadUrlParams(url);
42646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (additionalHttpHeaders != null) params.setExtraHeaders(additionalHttpHeaders);
427a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        loadUrlOnUiThread(params);
42846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
42946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
43046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
43146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void loadUrl(String url) {
43241618b2aeb0a500c740a75871a8f614cb6543362Kristian Monsen        // Early out to match old WebView implementation
43341618b2aeb0a500c740a75871a8f614cb6543362Kristian Monsen        if (url == null) {
43441618b2aeb0a500c740a75871a8f614cb6543362Kristian Monsen            return;
43541618b2aeb0a500c740a75871a8f614cb6543362Kristian Monsen        }
43646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        loadUrl(url, null);
43746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
43846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
43946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
44046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void postUrl(String url, byte[] postData) {
441b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        LoadUrlParams params = LoadUrlParams.createLoadHttpPostParams(url, postData);
442b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        Map<String,String> headers = new HashMap<String,String>();
443b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        headers.put("Content-Type", "application/x-www-form-urlencoded");
444b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        params.setExtraHeaders(headers);
445b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        loadUrlOnUiThread(params);
44646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
44746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
44819bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon    private static String fixupMimeType(String mimeType) {
44919bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        return TextUtils.isEmpty(mimeType) ? "text/html" : mimeType;
45019bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon    }
45119bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon
45219bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon    private static String fixupData(String data) {
45319bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        return TextUtils.isEmpty(data) ? "" : data;
45419bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon    }
45519bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon
45619bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon    private static String fixupBase(String url) {
45719bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        return TextUtils.isEmpty(url) ? "about:blank" : url;
45819bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon    }
45919bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon
46019bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon    private static String fixupHistory(String url) {
46119bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        return TextUtils.isEmpty(url) ? "about:blank" : url;
46219bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon    }
46319bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon
46446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private static boolean isBase64Encoded(String encoding) {
46546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return "base64".equals(encoding);
46646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
46746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
46846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
46946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void loadData(String data, String mimeType, String encoding) {
470a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        loadUrlOnUiThread(LoadUrlParams.createLoadDataParams(
47119bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon                fixupData(data), fixupMimeType(mimeType), isBase64Encoded(encoding)));
47246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
47346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
47446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
47546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding,
476efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            String historyUrl) {
47719bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        data = fixupData(data);
47819bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        mimeType = fixupMimeType(mimeType);
479efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch        LoadUrlParams loadUrlParams;
48019bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        baseUrl = fixupBase(baseUrl);
48119bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        historyUrl = fixupHistory(historyUrl);
482efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch
48319bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        if (baseUrl.startsWith("data:")) {
484efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // For backwards compatibility with WebViewClassic, we use the value of |encoding|
485efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // as the charset, as long as it's not "base64".
486efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            boolean isBase64 = isBase64Encoded(encoding);
487efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            loadUrlParams = LoadUrlParams.createLoadDataParamsWithBaseUrl(
488efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                    data, mimeType, isBase64, baseUrl, historyUrl, isBase64 ? null : encoding);
489efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch        } else {
490efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // When loading data with a non-data: base URL, the classic WebView would effectively
491efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // "dump" that string of data into the WebView without going through regular URL
492efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // loading steps such as decoding URL-encoded entities. We achieve this same behavior by
493efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // base64 encoding the data that is passed here and then loading that as a data: URL.
494efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            try {
495efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                loadUrlParams = LoadUrlParams.createLoadDataParamsWithBaseUrl(
496efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                        Base64.encodeToString(data.getBytes("utf-8"), Base64.DEFAULT), mimeType,
497efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                        true, baseUrl, historyUrl, "utf-8");
498efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            } catch (java.io.UnsupportedEncodingException e) {
499efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                Log.wtf(TAG, "Unable to load data string " + data, e);
500efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                return;
501efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            }
502efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch        }
503a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        loadUrlOnUiThread(loadUrlParams);
504a622984698ea393f81ce968ec87bab75087af7dcKristian Monsen
505a622984698ea393f81ce968ec87bab75087af7dcKristian Monsen        // Data url's with a base url will be resolved in Blink, and not cause an onPageStarted
506a622984698ea393f81ce968ec87bab75087af7dcKristian Monsen        // event to be sent. Sending the callback directly from here.
507a622984698ea393f81ce968ec87bab75087af7dcKristian Monsen        final String finalBaseUrl = loadUrlParams.getBaseUrl();
508a622984698ea393f81ce968ec87bab75087af7dcKristian Monsen        ThreadUtils.postOnUiThread(new Runnable() {
509a622984698ea393f81ce968ec87bab75087af7dcKristian Monsen            @Override
510a622984698ea393f81ce968ec87bab75087af7dcKristian Monsen            public void run() {
511a622984698ea393f81ce968ec87bab75087af7dcKristian Monsen                mContentsClientAdapter.onPageStarted(finalBaseUrl);
512a622984698ea393f81ce968ec87bab75087af7dcKristian Monsen            }
513a622984698ea393f81ce968ec87bab75087af7dcKristian Monsen        });
514a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen    }
515a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen
516a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen    private void loadUrlOnUiThread(final LoadUrlParams loadUrlParams) {
517a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        if (ThreadUtils.runningOnUiThread()) {
518a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen            mAwContents.loadUrl(loadUrlParams);
519a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        } else {
520a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen            // Disallowed in WebView API for apps targetting a new SDK
521a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen            assert mAppTargetSdkVersion < Build.VERSION_CODES.JELLY_BEAN_MR2;
522a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
523a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen                @Override
524a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen                public void run() {
525a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen                    mAwContents.loadUrl(loadUrlParams);
526a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen                }
527a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen            });
528a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        }
52946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
53046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
5316ef347a29d692df672aaf59ee4926a476288476aBen Murdoch    public void evaluateJavaScript(String script, ValueCallback<String> resultCallback) {
53262389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
5336ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        mAwContents.evaluateJavaScript(script, resultCallback);
5346ef347a29d692df672aaf59ee4926a476288476aBen Murdoch    }
5356ef347a29d692df672aaf59ee4926a476288476aBen Murdoch
53646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
53746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void saveWebArchive(String filename) {
53846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        saveWebArchive(filename, false, null);
53946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
54046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
54146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
54281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void saveWebArchive(final String basename, final boolean autoname,
54381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            final ValueCallback<String> callback) {
54481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
54581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
54681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
54781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
54881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    saveWebArchive(basename, autoname, callback);
54981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
55081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
55181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
55281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
55346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.saveWebArchive(basename, autoname, callback);
55446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
55546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
55646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
55746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void stopLoading() {
55819af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
55919af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
56019af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen                @Override
56119af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen                public void run() {
56219af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen                    stopLoading();
56319af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen                }
56419af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen            });
56519af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen            return;
56619af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen        }
56719af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen
5687cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.stopLoading();
56946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
57046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
57146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
57246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void reload() {
57381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
57481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
57581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
57681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
57781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    reload();
57881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
57981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
58081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
58181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
5827cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.reload();
58346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
58446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
58546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
58646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean canGoBack() {
5872c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
5882c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            Boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
5892c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
5902c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
5912c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return canGoBack();
5922c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
5932c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
5942c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
5952c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
5967cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canGoBack();
59746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
59846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
59946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
60046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void goBack() {
60181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
60281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
60381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
60481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
60581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    goBack();
60681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
60781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
60881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
60981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
6107cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.goBack();
61146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
61246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
61346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
61446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean canGoForward() {
6152c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
6162c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            Boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
6172c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
6182c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
6192c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return canGoForward();
6202c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
6212c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
6222c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
6232c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
6247cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canGoForward();
62546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
62646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
62746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
62846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void goForward() {
62981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
63081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
63181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
63281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
63381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    goForward();
63481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
63581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
63681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
63781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
6387cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.goForward();
63946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
64046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
64146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
6422c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean canGoBackOrForward(final int steps) {
6432c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
6442c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            Boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
6452c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
6462c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
6472c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return canGoBackOrForward(steps);
6482c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
6492c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
6502c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
6512c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
6527cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canGoBackOrForward(steps);
65346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
65446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
65546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
65681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void goBackOrForward(final int steps) {
65781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
65881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
65981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
66081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
66181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    goBackOrForward(steps);
66281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
66381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
66481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
66581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
6667cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.goBackOrForward(steps);
66746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
66846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
66946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
67046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean isPrivateBrowsingEnabled() {
6716d58f78e7fc0412a58b163559cb8e9c4af5c6fe1Jonathan Dixon        // Not supported in this WebView implementation.
67246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
67346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
67446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
67546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
6762c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean pageUp(final boolean top) {
6772c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
6782c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            Boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
6792c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
6802c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
6812c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return pageUp(top);
6822c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
6832c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
6842c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
6852c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
6867cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.pageUp(top);
68746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
68846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
68946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
6902c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean pageDown(final boolean bottom) {
6912c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
6922c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            Boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
6932c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
6942c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
6952c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return pageDown(bottom);
6962c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
6972c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
6982c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
6992c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
7007cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.pageDown(bottom);
70146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
70246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
70346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
70446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearView() {
70581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
70681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
70781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
70881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
70981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    clearView();
71081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
71181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
71281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
71381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
714d21b8fe00b21742cc36929cb02eef6ad25946512Kristian Monsen        mAwContents.clearView();
71546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
71646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
71746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
71846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public Picture capturePicture() {
7192c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
7202c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            Picture ret = runOnUiThreadBlocking(new Callable<Picture>() {
7212c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
7222c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Picture call() {
7232c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return capturePicture();
7242c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
7252c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
7262c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
7272c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
7289c5a40623b62737244deb2d04a98830d7ffa8404Leandro Gracia Gil        return mAwContents.capturePicture();
72946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
73046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
73146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
732412d84be859ce0eb91baf2f9afe5e6326a15d76aSelim Gurun    public PrintDocumentAdapter createPrintDocumentAdapter() {
73362389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
734412d84be859ce0eb91baf2f9afe5e6326a15d76aSelim Gurun        return new AwPrintDocumentAdapter(mAwContents.getPdfExporter());
735a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun    }
736a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun
73749a1a6f9f27b63687edc1d98f842627d4719a327Selim Gurun    @Override
73846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public float getScale() {
739fa62be4cdc2630566ee179843393d4a6f9893966Kristian Monsen        // No checkThread() as it is mostly thread safe (workaround for b/10652991).
7403520eb778d668dc76ca4541c69abd568b9d02691Mikhail Naganov        return mAwContents.getScale();
74146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
74246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
74346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
74481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void setInitialScale(final int scaleInPercent) {
74581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
74681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
74781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
74881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
74981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    setInitialScale(scaleInPercent);
75081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
75181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
75281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
75381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
7543520eb778d668dc76ca4541c69abd568b9d02691Mikhail Naganov        mAwContents.getSettings().setInitialPageScale(scaleInPercent);
75546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
75646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
75746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
75846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void invokeZoomPicker() {
75981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
76081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
76181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
76281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
76381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    invokeZoomPicker();
76481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
76581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
76681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
76781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
7687cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.invokeZoomPicker();
76946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
77046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
77146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
77246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebView.HitTestResult getHitTestResult() {
7732c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
7742c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            WebView.HitTestResult ret = runOnUiThreadBlocking(
7752c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    new Callable<WebView.HitTestResult>() {
7762c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
7772c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public WebView.HitTestResult call() {
7782c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return getHitTestResult();
7792c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
7802c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
7812c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
7822c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
783c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        AwContents.HitTestData data = mAwContents.getLastHitTestResult();
784c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mHitTestResult.setType(data.hitTestResultType);
785c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mHitTestResult.setExtra(data.hitTestResultExtraData);
786c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        return mHitTestResult;
78746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
78846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
78946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
79081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void requestFocusNodeHref(final Message hrefMsg) {
79181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
79281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
79381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
79481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
79581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    requestFocusNodeHref(hrefMsg);
79681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
79781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
79881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
79981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
800c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mAwContents.requestFocusNodeHref(hrefMsg);
80146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
80246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
80346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
80481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void requestImageRef(final Message msg) {
80581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
80681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
80781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
80881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
80981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    requestImageRef(msg);
81081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
81181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
81281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
81381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
814c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mAwContents.requestImageRef(msg);
81546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
81646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
81746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
81846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public String getUrl() {
8192c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
8202c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            String ret = runOnUiThreadBlocking(new Callable<String>() {
8212c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
8222c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public String call() {
8232c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return getUrl();
8242c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
8252c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
8262c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
8272c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
8287cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        String url =  mAwContents.getUrl();
82946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (url == null || url.trim().isEmpty()) return null;
83046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return url;
83146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
83246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
83346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
83446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public String getOriginalUrl() {
8352c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
8362c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            String ret = runOnUiThreadBlocking(new Callable<String>() {
8372c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
8382c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public String call() {
8392c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return getOriginalUrl();
8402c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
8412c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
8422c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
8432c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
84446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        String url =  mAwContents.getOriginalUrl();
84546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (url == null || url.trim().isEmpty()) return null;
84646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return url;
84746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
84846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
84946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
85046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public String getTitle() {
8512c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
8522c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            String ret = runOnUiThreadBlocking(new Callable<String>() {
8532c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
8542c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public String call() {
8552c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return getTitle();
8562c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
8572c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
8582c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
8592c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
8607cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.getTitle();
86146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
86246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
86346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
86446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public Bitmap getFavicon() {
8652c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
8662c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            Bitmap ret = runOnUiThreadBlocking(new Callable<Bitmap>() {
8672c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
8682c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Bitmap call() {
8692c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return getFavicon();
8702c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
8712c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
8722c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
8732c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
8749405536501747e2d7b4fc46a33e5f0a1e7fd47acJonathan Dixon        return mAwContents.getFavicon();
87546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
87646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
87746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
87846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public String getTouchIconUrl() {
8799405536501747e2d7b4fc46a33e5f0a1e7fd47acJonathan Dixon        // Intentional no-op: hidden method on WebView.
88046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return null;
88146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
88246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
88346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
88446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int getProgress() {
885c0c86c037ea697da375ae28c543cae9b050d6b68Jonathan Dixon        // No checkThread() because the value is cached java side (workaround for b/10533304).
88646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mAwContents.getMostRecentProgress();
88746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
88846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
88946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
89046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int getContentHeight() {
89194a8e6a6d7d1b2a6b3718eb91956403ef6b03d9cKristian Monsen        // No checkThread() as it is mostly thread safe (workaround for b/10594869).
8926b5f3d1546ae2a9c712cde60c54ec027582bc4e6Martin Kosiba        return mAwContents.getContentHeightCss();
89346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
89446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
89546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
89646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int getContentWidth() {
8972c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        // No checkThread() as it is mostly thread safe (workaround for b/10594869).
8986b5f3d1546ae2a9c712cde60c54ec027582bc4e6Martin Kosiba        return mAwContents.getContentWidthCss();
89946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
90046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
90146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
90246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void pauseTimers() {
90381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
90481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
90581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
90681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
90781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    pauseTimers();
90881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
90981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
91081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
91181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
912531e68a2b50a5e542eeede13907f29e463a99ebfBen Murdoch        mAwContents.pauseTimers();
91346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
91446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
91546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
91646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void resumeTimers() {
91781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
91881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
91981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
92081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
92181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    resumeTimers();
92281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
92381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
92481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
92581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
926531e68a2b50a5e542eeede13907f29e463a99ebfBen Murdoch        mAwContents.resumeTimers();
92746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
92846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
92946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
93046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onPause() {
93181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
93281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
93381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
93481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
93581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onPause();
93681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
93781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
93881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
93981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
9401cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onPause();
94146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
94246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
94346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
94446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onResume() {
94581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
94681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
94781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
94881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
94981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onResume();
95081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
95181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
95281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
95381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
9541cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onResume();
95546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
95646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
95746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
95846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean isPaused() {
9592c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
9602c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            Boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
9612c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
9622c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
9632c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return isPaused();
9642c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
9652c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
9662c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
9672c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
9681cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        return mAwContents.isPaused();
96946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
97046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
97146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
97246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void freeMemory() {
973d43c55dd91cf7dd1bcd18d01e16acd5e55de0471Ben Murdoch        // Intentional no-op. Memory is managed automatically by Chromium.
97446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
97546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
97646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
97781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void clearCache(final boolean includeDiskFiles) {
97881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
97981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
98081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
98181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
98281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    clearCache(includeDiskFiles);
98381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
98481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
98581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
98681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
98746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.clearCache(includeDiskFiles);
98846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
98946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
990bbef8de5696d48fc6458c926026fc524a62814e1Selim Gurun    /**
991bbef8de5696d48fc6458c926026fc524a62814e1Selim Gurun     * This is a poorly named method, but we keep it for historical reasons.
992bbef8de5696d48fc6458c926026fc524a62814e1Selim Gurun     */
99346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
99446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearFormData() {
99581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
99681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
99781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
99881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
99981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    clearFormData();
100081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
100181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
100281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
100381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
1004bbef8de5696d48fc6458c926026fc524a62814e1Selim Gurun        mAwContents.hideAutofillPopup();
100546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
100646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
100746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
100846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearHistory() {
100981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
101081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
101181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
101281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
101381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    clearHistory();
101481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
101581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
101681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
101781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
10187cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.clearHistory();
101946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
102046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
102146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
102246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearSslPreferences() {
102381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
102481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
102581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
102681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
102781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    clearSslPreferences();
102881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
102981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
103081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
103181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
10327cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.clearSslPreferences();
103346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
103446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
103546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
103646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebBackForwardList copyBackForwardList() {
10372c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
10382c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            WebBackForwardList ret = runOnUiThreadBlocking(new Callable<WebBackForwardList>() {
10392c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
10402c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public WebBackForwardList call() {
10412c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return copyBackForwardList();
10422c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
10432c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
10442c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
10452c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
104608a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu        return new WebBackForwardListChromium(
10477cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba                mAwContents.getNavigationHistory());
104846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
104946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
105046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
105146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setFindListener(WebView.FindListener listener) {
105246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mContentsClientAdapter.setFindListener(listener);
105346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
105446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
105546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
105681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void findNext(final boolean forwards) {
105781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
105881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
105981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
106081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
106181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    findNext(forwards);
106281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
106381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
106481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
106581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
106646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.findNext(forwards);
106746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
106846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
106946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
10702c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public int findAll(final String searchString) {
10712c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        findAllAsync(searchString);
1072f37548d6d8e2a73c65d675a26706a38f52960800Jonathan Dixon        return 0;
107346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
107446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
107546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
107681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void findAllAsync(final String searchString) {
107781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
107881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
107981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
108081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
108181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    findAllAsync(searchString);
108281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
108381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
108481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
108581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
108646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.findAllAsync(searchString);
108746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
108846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
108946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
10902c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean showFindDialog(final String text, final boolean showIme) {
10912c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
10922c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return false;
10932c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
10946d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        if (mWebView.getParent() == null) {
10956d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            return false;
10966d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        }
10976d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch
10986d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        FindActionModeCallback findAction = new FindActionModeCallback(mWebView.getContext());
10996d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        if (findAction == null) {
11006d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            return false;
11016d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        }
11026d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch
11036d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        mWebView.startActionMode(findAction);
11046d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        findAction.setWebView(mWebView);
11056d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        if (showIme) {
11066d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            findAction.showSoftInput();
11076d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        }
11086d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch
11096d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        if (text != null) {
11106d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            findAction.setText(text);
11116d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            findAction.findAll();
11126d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        }
11136d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch
11146d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        return true;
111546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
111646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
11176d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch    @Override
1118fde8dae44f74be3de69ce6dd07b0023279b485a0Ben Murdoch    public void notifyFindDialogDismissed() {
111981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
112081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
112181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
112281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
112381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    notifyFindDialogDismissed();
112481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
112581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
112681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
112781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
11286d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        clearMatches();
1129fde8dae44f74be3de69ce6dd07b0023279b485a0Ben Murdoch    }
1130fde8dae44f74be3de69ce6dd07b0023279b485a0Ben Murdoch
113146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
113246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearMatches() {
113381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
113481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
113581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
113681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
113781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    clearMatches();
113881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
113981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
114081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
114181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
114246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.clearMatches();
114346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
114446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
114546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
114681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void documentHasImages(final Message response) {
114781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
114881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
114981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
115081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
115181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    documentHasImages(response);
115281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
115381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
115481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
115581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
115646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.documentHasImages(response);
115746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
115846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
115946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
116046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setWebViewClient(WebViewClient client) {
116146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mContentsClientAdapter.setWebViewClient(client);
116246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
116346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
116446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
116546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setDownloadListener(DownloadListener listener) {
11664320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu        mContentsClientAdapter.setDownloadListener(listener);
116746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
116846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
116946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
117046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setWebChromeClient(WebChromeClient client) {
117146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mContentsClientAdapter.setWebChromeClient(client);
117246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
117346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
117446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
117581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void setPictureListener(final WebView.PictureListener listener) {
117681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
117781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
117881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
117981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
118081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    setPictureListener(listener);
118181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
118281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
118381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
118481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
118546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mContentsClientAdapter.setPictureListener(listener);
11869c5a40623b62737244deb2d04a98830d7ffa8404Leandro Gracia Gil        mAwContents.enableOnNewPicture(listener != null,
11876ef347a29d692df672aaf59ee4926a476288476aBen Murdoch                mAppTargetSdkVersion >= Build.VERSION_CODES.JELLY_BEAN_MR2);
118846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
118946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
119046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
119181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void addJavascriptInterface(final Object obj, final String interfaceName) {
119281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
119381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
119481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
119581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
119681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    addJavascriptInterface(obj, interfaceName);
119781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
119881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
119981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
120081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
1201ea844f60b1b559788566fe6e004b1eeca53a8039Jonathan Dixon        Class<? extends Annotation> requiredAnnotation = null;
12026ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        if (mAppTargetSdkVersion >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
12037db34d3dcaac936566f912e1b0b21f3f103029ffJonathan Dixon           requiredAnnotation = JavascriptInterface.class;
12047db34d3dcaac936566f912e1b0b21f3f103029ffJonathan Dixon        }
12057cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.addPossiblyUnsafeJavascriptInterface(obj, interfaceName, requiredAnnotation);
120646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
120746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
120846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
120981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void removeJavascriptInterface(final String interfaceName) {
121081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
121181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
121281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
121381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
121481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    removeJavascriptInterface(interfaceName);
121581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
121681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
121781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
121881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
12197cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.removeJavascriptInterface(interfaceName);
122046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
122146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
122246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
122346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebSettings getSettings() {
122446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mWebSettings;
122546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
122646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
122746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
122846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setMapTrackballToArrowKeys(boolean setMap) {
122946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // This is a deprecated API: intentional no-op.
123046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
123146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
123246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
123381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void flingScroll(final int vx, final int vy) {
123481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
123581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
123681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
123781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
123881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    flingScroll(vx, vy);
123981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
124081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
124181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
124281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
12437cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.flingScroll(vx, vy);
124446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
124546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
124646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
124746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public View getZoomControls() {
12482c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
12492c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return null;
12502c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
12512c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen
1252e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon        // This was deprecated in 2009 and hidden in JB MR1, so just provide the minimum needed
1253e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon        // to stop very out-dated applications from crashing.
1254e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon        Log.w(TAG, "WebView doesn't support getZoomControls");
1255420c0da3a4e06e1ac5574091e7c9c286ef012369Mikhail Naganov        return mAwContents.getSettings().supportZoom() ? new View(mWebView.getContext()) : null;
125646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
125746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
125846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
125946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean canZoomIn() {
12602c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
12612c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return false;
12622c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
12637cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canZoomIn();
126446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
126546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
126646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
126746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean canZoomOut() {
12682c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
12692c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return false;
12702c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
12717cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canZoomOut();
127246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
127346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
127446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
127546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean zoomIn() {
12762c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
12772c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
12782c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
12792c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
12802c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return zoomIn();
12812c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
12822c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
12832c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
12842c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
12857cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.zoomIn();
128646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
128746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
128846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
128946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean zoomOut() {
12902c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
12912c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
12922c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
12932c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
12942c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return zoomOut();
12952c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
12962c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
12972c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
12982c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
12997cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.zoomOut();
130046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
130146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
1302d2dcef4d9edfb7af7abff85b0867c3d6a363feb7Jonathan Dixon    @Override
130346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void dumpViewHierarchyWithProperties(BufferedWriter out, int level) {
1304f2b715bee3bb3a41e59f80ae53b45f249d9559c5Kristian Monsen        // Intentional no-op
130546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
130646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
1307d2dcef4d9edfb7af7abff85b0867c3d6a363feb7Jonathan Dixon    @Override
130846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public View findHierarchyView(String className, int hashCode) {
1309f2b715bee3bb3a41e59f80ae53b45f249d9559c5Kristian Monsen        // Intentional no-op
131046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return null;
131146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
131246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
131346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebViewProvider glue methods ---------------------------------------------------------------
131446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
131546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
131657b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen    // This needs to be kept thread safe!
131746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebViewProvider.ViewDelegate getViewDelegate() {
131846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return this;
131946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
132046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
132146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
13222c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    // This needs to be kept thread safe!
132346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebViewProvider.ScrollDelegate getScrollDelegate() {
132446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return this;
132546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
132646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
132746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
132846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebViewProvider.ViewDelegate implementation ------------------------------------------------
132946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
1330a7fba41c5661cb61b41c8a4ff2d69e5153666f7fBen Murdoch    // TODO: remove from WebViewProvider and use default implementation from
1331a7fba41c5661cb61b41c8a4ff2d69e5153666f7fBen Murdoch    // ViewGroup.
1332a7fba41c5661cb61b41c8a4ff2d69e5153666f7fBen Murdoch    // @Override
133346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean shouldDelayChildPressedState() {
13342c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
13352c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
13362c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
13372c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
13382c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return shouldDelayChildPressedState();
13392c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
13402c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
13412c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
13422c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
1343a7fba41c5661cb61b41c8a4ff2d69e5153666f7fBen Murdoch        return true;
134446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
134546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
13465c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch//    @Override
13475c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch    public AccessibilityNodeProvider getAccessibilityNodeProvider() {
13482c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
13492c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            AccessibilityNodeProvider ret = runOnUiThreadBlocking(
13502c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    new Callable<AccessibilityNodeProvider>() {
13512c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
13522c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public AccessibilityNodeProvider call() {
13532c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return getAccessibilityNodeProvider();
13542c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
13552c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
13562c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
13572c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
13585c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch        return mAwContents.getAccessibilityNodeProvider();
13595c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch    }
13605c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch
136146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
136281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        public void onInitializeAccessibilityNodeInfo(final AccessibilityNodeInfo info) {
136381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
136481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            runVoidTaskOnUiThreadBlocking(new Runnable() {
136581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
136681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
136781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onInitializeAccessibilityNodeInfo(info);
136881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
136981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
137081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
137181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
13727cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.onInitializeAccessibilityNodeInfo(info);
137346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
137446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
137546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
137681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void onInitializeAccessibilityEvent(final AccessibilityEvent event) {
137781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
137881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            runVoidTaskOnUiThreadBlocking(new Runnable() {
137981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
138081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
138181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onInitializeAccessibilityEvent(event);
138281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
138381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
138481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
138581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
13867cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.onInitializeAccessibilityEvent(event);
138746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
138846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
138946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
13902c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean performAccessibilityAction(final int action, final Bundle arguments) {
13912c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
13922c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
13932c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
13942c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
13952c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return performAccessibilityAction(action, arguments);
13962c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
13972c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
13982c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
13992c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
1400b7b706b2ed5cbb77dd690f5405b626a429989714Ben Murdoch        if (mAwContents.supportsAccessibilityAction(action)) {
1401b7b706b2ed5cbb77dd690f5405b626a429989714Ben Murdoch            return mAwContents.performAccessibilityAction(action, arguments);
1402b7b706b2ed5cbb77dd690f5405b626a429989714Ben Murdoch        }
1403b7b706b2ed5cbb77dd690f5405b626a429989714Ben Murdoch        return mWebViewPrivate.super_performAccessibilityAction(action, arguments);
140446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
140546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
140646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
140781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void setOverScrollMode(final int mode) {
140881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
140981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
141081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
141181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
141281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    setOverScrollMode(mode);
141381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
141481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
141581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
141681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
14172841152693d0410f8e8c309aae514329f008a612Martin Kosiba        // This gets called from the android.view.View c'tor that WebView inherits from. This
14182841152693d0410f8e8c309aae514329f008a612Martin Kosiba        // causes the method to be called when mAwContents == null.
14192841152693d0410f8e8c309aae514329f008a612Martin Kosiba        // It's safe to ignore these calls however since AwContents will read the current value of
14202841152693d0410f8e8c309aae514329f008a612Martin Kosiba        // this setting when it's created.
1421ab5398debe64d34306b0f709a93d840078ae181dMartin Kosiba        if (mAwContents != null) {
1422ab5398debe64d34306b0f709a93d840078ae181dMartin Kosiba            mAwContents.setOverScrollMode(mode);
1423ab5398debe64d34306b0f709a93d840078ae181dMartin Kosiba        }
142446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
142546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
142646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
142781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void setScrollBarStyle(final int style) {
142881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
142981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
143081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
143181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
143281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    setScrollBarStyle(style);
143381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
143481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
143581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
143681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
1437bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        mAwContents.setScrollBarStyle(style);
143846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
143946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
144046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
144181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void onDrawVerticalScrollBar(final Canvas canvas, final Drawable scrollBar, final int l,
144281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            final int t, final int r, final int b) {
144381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
144481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            runVoidTaskOnUiThreadBlocking(new Runnable() {
144581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
144681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
144781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onDrawVerticalScrollBar(canvas, scrollBar, l, t, r, b);
144881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
144981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
145081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
145181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
1452bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        // WebViewClassic was overriding this method to handle rubberband over-scroll. Since
1453bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        // WebViewChromium doesn't support that the vanilla implementation of this method can be
1454bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        // used.
1455bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        mWebViewPrivate.super_onDrawVerticalScrollBar(canvas, scrollBar, l, t, r, b);
145646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
145746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
145846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
145981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void onOverScrolled(final int scrollX, final int scrollY, final boolean clampedX,
146081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            final boolean clampedY) {
146181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
146281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
146381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
146481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
146581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onOverScrolled(scrollX, scrollY, clampedX, clampedY);
146681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
146781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
146881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
146981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
14703951fbadf5157dd3fe73decc879f9b763e780b09Martin Kosiba        mAwContents.onContainerViewOverScrolled(scrollX, scrollY, clampedX, clampedY);
147146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
147246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
147346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
147481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void onWindowVisibilityChanged(final int visibility) {
147581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
147681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
147781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
147881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
147981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onWindowVisibilityChanged(visibility);
148081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
148181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
148281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
148381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
14841cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onWindowVisibilityChanged(visibility);
148546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
148646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
148746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
1488c8523c99833f364c64744d60e408510fb83b998bKristian Monsen    public void onDraw(final Canvas canvas) {
1489c8523c99833f364c64744d60e408510fb83b998bKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
14904fb262f34ba888eaacc24a83d94a56b8d7bcef2bKristian Monsen            runVoidTaskOnUiThreadBlocking(new Runnable() {
1491c8523c99833f364c64744d60e408510fb83b998bKristian Monsen                @Override
1492c8523c99833f364c64744d60e408510fb83b998bKristian Monsen                public void run() {
1493c8523c99833f364c64744d60e408510fb83b998bKristian Monsen                    onDraw(canvas);
1494c8523c99833f364c64744d60e408510fb83b998bKristian Monsen                }
1495c8523c99833f364c64744d60e408510fb83b998bKristian Monsen            });
1496c8523c99833f364c64744d60e408510fb83b998bKristian Monsen            return;
1497c8523c99833f364c64744d60e408510fb83b998bKristian Monsen        }
14987ab33360e331e04f515d532064670e210d174a7aTao Bai        mAwContents.onDraw(canvas);
149946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
150046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
150146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
150281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void setLayoutParams(final ViewGroup.LayoutParams layoutParams) {
150381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
150481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
150581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
150681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
150781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    setLayoutParams(layoutParams);
150881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
150981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
151081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
151181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
151246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewPrivate.super_setLayoutParams(layoutParams);
151346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
151446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
151546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
151646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean performLongClick() {
15172c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
15182c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
15192c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
15202c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
15212c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return performLongClick();
15222c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
15232c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
15242c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
15252c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
1526decc147cebc8f73d355c024d92c60d3f727cab31Bo Liu        return mWebViewPrivate.super_performLongClick();
152746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
152846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
152946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
153081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void onConfigurationChanged(final Configuration newConfig) {
153181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
153281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
153381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
153481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
153581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onConfigurationChanged(newConfig);
153681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
153781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
153881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
153981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
15401cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onConfigurationChanged(newConfig);
154146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
154246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
154346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
15442c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public InputConnection onCreateInputConnection(final EditorInfo outAttrs) {
15452c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
15462c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            InputConnection ret = runOnUiThreadBlocking(new Callable<InputConnection>() {
15472c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
15482c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public InputConnection call() {
15492c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return onCreateInputConnection(outAttrs);
15502c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
15512c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
15522c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
15532c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
15547cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.onCreateInputConnection(outAttrs);
155546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
155646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
155746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
15582c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean onKeyMultiple(final int keyCode, final int repeatCount, final KeyEvent event) {
15592c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
15602c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
15612c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
15622c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
15632c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return onKeyMultiple(keyCode, repeatCount, event);
15642c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
15652c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
15662c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
15672c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
156846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
156946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
157046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
157146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
157246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
15732c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean onKeyDown(final int keyCode, final KeyEvent event) {
15742c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
15752c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
15762c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
15772c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
15782c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return onKeyDown(keyCode, event);
15792c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
15802c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
15812c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
15822c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
158346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
158446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
158546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
158646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
158746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
15882c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean onKeyUp(final int keyCode, final KeyEvent event) {
15892c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
15902c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
15912c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
15922c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
15932c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return onKeyUp(keyCode, event);
15942c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
15952c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
15962c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
15972c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
15987cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.onKeyUp(keyCode, event);
159946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
160046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
160146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
160246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onAttachedToWindow() {
160381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
160481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
160581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
160681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
160781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onAttachedToWindow();
160881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
160981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
161081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
161181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
16121cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onAttachedToWindow();
161346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
161446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
161546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
161646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onDetachedFromWindow() {
161781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
161881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
161981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
162081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
162181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onDetachedFromWindow();
162281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
162381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
162481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
162581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
16261cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onDetachedFromWindow();
1627a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon        if (mGLfunctor != null) {
1628a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon            mGLfunctor.detach();
1629a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon        }
163046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
163146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
163246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
163381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void onVisibilityChanged(final View changedView, final int visibility) {
163481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
163581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
163681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
163781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
163881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onVisibilityChanged(changedView, visibility);
163981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
164081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
164181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
164281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
1643c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba        // The AwContents will find out the container view visibility before the first draw so we
1644c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba        // can safely ignore onVisibilityChanged callbacks that happen before init().
1645c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba        if (mAwContents != null) {
1646c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba            mAwContents.onVisibilityChanged(changedView, visibility);
1647c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba        }
164846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
164946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
165046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
165181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void onWindowFocusChanged(final boolean hasWindowFocus) {
165281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
165381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
165481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
165581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
165681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onWindowFocusChanged(hasWindowFocus);
165781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
165881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
165981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
166081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
16611cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onWindowFocusChanged(hasWindowFocus);
166246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
166346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
166446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
166581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void onFocusChanged(final boolean focused, final int direction,
166681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            final Rect previouslyFocusedRect) {
166781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
166881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
166981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
167081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
167181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onFocusChanged(focused, direction, previouslyFocusedRect);
167281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
167381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
167481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
167581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
16761cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onFocusChanged(focused, direction, previouslyFocusedRect);
167746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
167846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
167946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
16802c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean setFrame(final int left, final int top, final int right, final int bottom) {
16812c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
16822c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
16832c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
16842c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
16852c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return setFrame(left, top, right, bottom);
16862c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
16872c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
16882c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
16892c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
169046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mWebViewPrivate.super_setFrame(left, top, right, bottom);
169146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
169246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
169346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
169481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void onSizeChanged(final int w, final int h, final int ow, final int oh) {
169581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
169681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
169781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
169881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
169981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onSizeChanged(w, h, ow, oh);
170081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
170181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
170281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
170381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
17041cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onSizeChanged(w, h, ow, oh);
170546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
170646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
170746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
170846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onScrollChanged(int l, int t, int oldl, int oldt) {
170946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
171046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
171146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
17122c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean dispatchKeyEvent(final KeyEvent event) {
17132c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
17142c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
17152c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
17162c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
17172c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return dispatchKeyEvent(event);
17182c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
17192c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
17202c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
17212c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
17227cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.dispatchKeyEvent(event);
172346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
172446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
172546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
17262c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean onTouchEvent(final MotionEvent ev) {
17272c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
17282c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
17292c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
17302c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
17312c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return onTouchEvent(ev);
17322c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
17332c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
17342c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
17352c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
1736c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        return mAwContents.onTouchEvent(ev);
173746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
173846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
173946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
17402c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean onHoverEvent(final MotionEvent event) {
17412c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
17422c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
17432c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
17442c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
17452c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return onHoverEvent(event);
17462c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
17472c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
17482c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
17492c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
1750c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        return mAwContents.onHoverEvent(event);
175146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
175246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
175346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
17542c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean onGenericMotionEvent(final MotionEvent event) {
17552c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
17562c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
17572c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
17582c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
17592c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return onGenericMotionEvent(event);
17602c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
17612c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
17622c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
17632c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
1764c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        return mAwContents.onGenericMotionEvent(event);
176546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
176646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
176746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
176846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onTrackballEvent(MotionEvent ev) {
176946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // Trackball event not handled, which eventually gets converted to DPAD keyevents
177046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
177146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
177246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
177346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
17742c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean requestFocus(final int direction, final Rect previouslyFocusedRect) {
17752c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
17762c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
17772c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
17782c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
17792c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return requestFocus(direction, previouslyFocusedRect);
17802c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
17812c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
17822c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
17832c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
17844cee3bf50c125a52a49323aa999f4b619fa18c10Ben Murdoch        mAwContents.requestFocus();
178546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mWebViewPrivate.super_requestFocus(direction, previouslyFocusedRect);
178646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
178746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
178846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
178981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    public void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
179081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
179181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
179281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
179381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
179481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    onMeasure(widthMeasureSpec, heightMeasureSpec);
179581cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
179681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
179781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
179881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
1799d7bf6ab0cd8cc4005b112e4358eb797bb178a85fMarcin Kosiba        mAwContents.onMeasure(widthMeasureSpec, heightMeasureSpec);
180046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
180146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
180246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
18032c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen    public boolean requestChildRectangleOnScreen(final View child, final Rect rect,
18042c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            final boolean immediate) {
18052c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
18062c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            boolean ret = runOnUiThreadBlocking(new Callable<Boolean>() {
18072c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
18082c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Boolean call() {
18092c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return requestChildRectangleOnScreen(child, rect, immediate);
18102c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
18112c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
18122c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
18132c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
18141f76368786ae12898311d148b0057403db2fb36aMartin Kosiba        return mAwContents.requestChildRectangleOnScreen(child, rect, immediate);
181546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
181646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
181746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
181857b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen    public void setBackgroundColor(final int color) {
181981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
182057b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
182157b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                @Override
182257b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                public void run() {
182381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    setBackgroundColor(color);
182457b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                }
182557b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            });
182681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
182757b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen        }
182881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        mAwContents.setBackgroundColor(color);
182946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
183046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
183146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
183246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setLayerType(int layerType, Paint paint) {
1833f2b715bee3bb3a41e59f80ae53b45f249d9559c5Kristian Monsen        // Intentional no-op
183446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
183546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
183681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen    // Remove from superclass
183746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void preDispatchDraw(Canvas canvas) {
18380b528e4924a7c14687181185bc66173ad18f00eaLeandro Gracia Gil        // TODO(leandrogracia): remove this method from WebViewProvider if we think
18390b528e4924a7c14687181185bc66173ad18f00eaLeandro Gracia Gil        // we won't need it again.
184046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
184146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
184246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebViewProvider.ScrollDelegate implementation ----------------------------------------------
184346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
184446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
184546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeHorizontalScrollRange() {
18462c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
18472c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            int ret = runOnUiThreadBlocking(new Callable<Integer>() {
18482c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
18492c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Integer call() {
18502c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return computeHorizontalScrollRange();
18512c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
18522c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
18532c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
18542c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
18557cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeHorizontalScrollRange();
185646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
185746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
185846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
185946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeHorizontalScrollOffset() {
18602c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
18612c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            int ret = runOnUiThreadBlocking(new Callable<Integer>() {
18622c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
18632c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Integer call() {
18642c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return computeHorizontalScrollOffset();
18652c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
18662c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
18672c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
18682c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
18697cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeHorizontalScrollOffset();
187046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
187146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
187246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
187346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeVerticalScrollRange() {
18742c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
18752c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            int ret = runOnUiThreadBlocking(new Callable<Integer>() {
18762c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
18772c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Integer call() {
18782c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return computeVerticalScrollRange();
18792c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
18802c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
18812c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
18822c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
18837cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeVerticalScrollRange();
188446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
188546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
188646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
188746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeVerticalScrollOffset() {
18882c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
18892c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            int ret = runOnUiThreadBlocking(new Callable<Integer>() {
18902c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
18912c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Integer call() {
18922c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return computeVerticalScrollOffset();
18932c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
18942c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
18952c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
18962c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
18977cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeVerticalScrollOffset();
189846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
189946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
190046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
190146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeVerticalScrollExtent() {
19022c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
19032c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            int ret = runOnUiThreadBlocking(new Callable<Integer>() {
19042c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                @Override
19052c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                public Integer call() {
19062c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                    return computeVerticalScrollExtent();
19072c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen                }
19082c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            });
19092c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen            return ret;
19102c11b458a21170c4eacba6c072f695c465f1c083Kristian Monsen        }
19117cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeVerticalScrollExtent();
191246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
191346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
191446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
191546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void computeScroll() {
191681cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
191781cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
191881cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                @Override
191981cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                public void run() {
192081cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                    computeScroll();
192181cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen                }
192281cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            });
192381cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen            return;
192481cdab1b4a022515f0234daafb3e224d13f20a9fKristian Monsen        }
19252a120ba09921dbb1e8354ecbc4a6e063ec891101Martin Kosiba        mAwContents.computeScroll();
192646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
192746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
19284702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba    // AwContents.InternalAccessDelegate implementation --------------------------------------
19294702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba    private class InternalAccessAdapter implements AwContents.InternalAccessDelegate {
193046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
193146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean drawChild(Canvas arg0, View arg1, long arg2) {
193246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
193346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
193446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
193546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
193646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
193746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_onKeyUp(int arg0, KeyEvent arg1) {
1938f2b715bee3bb3a41e59f80ae53b45f249d9559c5Kristian Monsen            // Intentional no-op
193946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
194046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
194146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
194246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
194346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_dispatchKeyEventPreIme(KeyEvent arg0) {
194446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
194546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
194646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
194746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
194846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
194946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_dispatchKeyEvent(KeyEvent event) {
195046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return mWebViewPrivate.super_dispatchKeyEvent(event);
195146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
195246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
195346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
195446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_onGenericMotionEvent(MotionEvent arg0) {
195546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
195646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
195746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
195846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
195946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
196046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public void super_onConfigurationChanged(Configuration arg0) {
1961f2b715bee3bb3a41e59f80ae53b45f249d9559c5Kristian Monsen            // Intentional no-op
196246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
196346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
1964bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        @Override
19650088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba        public int super_getScrollBarStyle() {
19660088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba            return mWebViewPrivate.super_getScrollBarStyle();
19670088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba        }
19680088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba
196946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
197046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean awakenScrollBars() {
197146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mWebViewPrivate.awakenScrollBars(0);
197246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // TODO: modify the WebView.PrivateAccess to provide a return value.
197346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return true;
197446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
197546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
197646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
197746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_awakenScrollBars(int arg0, boolean arg1) {
197846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // TODO: need method on WebView.PrivateAccess?
197946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
198046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
198146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
19824702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba
1983d7bf6ab0cd8cc4005b112e4358eb797bb178a85fMarcin Kosiba        @Override
19842a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        public void onScrollChanged(int l, int t, int oldl, int oldt) {
19852a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.setScrollXRaw(l);
19862a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.setScrollYRaw(t);
19872a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.onScrollChanged(l, t, oldl, oldt);
19882a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        }
19892a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba
19903951fbadf5157dd3fe73decc879f9b763e780b09Martin Kosiba        @Override
19912a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        public void overScrollBy(int deltaX, int deltaY,
19922a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            int scrollX, int scrollY,
19932a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            int scrollRangeX, int scrollRangeY,
19942a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            int maxOverScrollX, int maxOverScrollY,
19952a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            boolean isTouchEvent) {
19962a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.overScrollBy(deltaX, deltaY, scrollX, scrollY,
19972a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba                    scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);
19982a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        }
19992a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba
20003951fbadf5157dd3fe73decc879f9b763e780b09Martin Kosiba        @Override
20012a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        public void super_scrollTo(int scrollX, int scrollY) {
20022a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.super_scrollTo(scrollX, scrollY);
20032a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        }
20042a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba
20052a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        @Override
20064702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba        public void setMeasuredDimension(int measuredWidth, int measuredHeight) {
20074702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba            mWebViewPrivate.setMeasuredDimension(measuredWidth, measuredHeight);
20084702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba        }
200951f7cf16cd02f14050bb723175a2a57570e8486dTao Bai
20107ab33360e331e04f515d532064670e210d174a7aTao Bai        @Override
201151f7cf16cd02f14050bb723175a2a57570e8486dTao Bai        public boolean requestDrawGL(Canvas canvas) {
20127ab33360e331e04f515d532064670e210d174a7aTao Bai            if (mGLfunctor == null) {
20137ab33360e331e04f515d532064670e210d174a7aTao Bai                mGLfunctor = new DrawGLFunctor(mAwContents.getAwDrawGLViewContext());
20147ab33360e331e04f515d532064670e210d174a7aTao Bai            }
201551f7cf16cd02f14050bb723175a2a57570e8486dTao Bai            return mGLfunctor.requestDrawGL((HardwareCanvas)canvas, mWebView.getViewRootImpl());
201651f7cf16cd02f14050bb723175a2a57570e8486dTao Bai        }
201746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
201846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)}
2019