WebViewChromium.java revision ffabf2e121746d06b9930b1ae8fea243c4f5cb9d
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;
2954a6e3d0cc566df6cec6807c0c03f05664de0a55Selim Gurunimport android.os.CancellationSignal;
3046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Message;
31a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurunimport android.os.ParcelFileDescriptor;
32a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurunimport android.print.PrintAttributes;
33efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdochimport android.util.Base64;
34e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixonimport android.util.Log;
35a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixonimport android.view.HardwareCanvas;
3646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.KeyEvent;
3746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.MotionEvent;
3846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.View;
3946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.ViewGroup;
4046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.accessibility.AccessibilityEvent;
4146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.accessibility.AccessibilityNodeInfo;
425c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdochimport android.view.accessibility.AccessibilityNodeProvider;
4346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.inputmethod.EditorInfo;
4446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.inputmethod.InputConnection;
4546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.DownloadListener;
466d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdochimport android.webkit.FindActionModeCallback;
477db34d3dcaac936566f912e1b0b21f3f103029ffJonathan Dixonimport android.webkit.JavascriptInterface;
4846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.ValueCallback;
4946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebBackForwardList;
5046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebChromeClient;
5146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebSettings;
5246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebView;
5346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewClient;
5446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewProvider;
5533e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdochimport android.widget.TextView;
5646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
57aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsenimport org.chromium.android_webview.AwBrowserContext;
5846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.AwContents;
59ffabf2e121746d06b9930b1ae8fea243c4f5cb9dMikhail Naganovimport org.chromium.android_webview.AwLayoutSizer;
60a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurunimport org.chromium.android_webview.AwPdfExportAttributes;
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;
68b8281877c710018a3bc8066be17b1e11822be015Selim Gurunimport java.util.HashMap;
6946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.util.Map;
7046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
7146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)/**
7246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * This class is the delegate to which WebViewProxy forwards all API calls.
7346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) *
741cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon * Most of the actual functionality is implemented by AwContents (or ContentViewCore within
751cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon * it). This class also contains WebView-specific APIs that require the creation of other
761cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon * adapters (otherwise org.chromium.content would depend on the webview.chromium package)
771cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon * and a small set of no-op deprecated APIs.
7846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */
7946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)class WebViewChromium implements WebViewProvider,
8046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)          WebViewProvider.ScrollDelegate, WebViewProvider.ViewDelegate {
81e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon
82e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon    private static final String TAG = WebViewChromium.class.getSimpleName();
83e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon
8446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The WebView that this WebViewChromium is the provider for.
8546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    WebView mWebView;
8646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // Lets us access protected View-derived methods on the WebView instance we're backing.
8746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    WebView.PrivateAccess mWebViewPrivate;
8846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The client adapter class.
8946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebViewContentsClientAdapter mContentsClientAdapter;
9046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
9146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // Variables for functionality provided by this adapter ---------------------------------------
9246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebSettings adapter, lazily initialized in the getter
9346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebSettings mWebSettings;
943949435b480cb71106f65b237025da359cf8a8caBen Murdoch    // The WebView wrapper for ContentViewCore and required browser compontents.
9546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private AwContents mAwContents;
96a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    // Non-null if this webview is using the GL accelerated draw path.
97a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    private DrawGLFunctor mGLfunctor;
9846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
99aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen    private AwBrowserContext mBrowserContext;
100aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen
101c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu    private final WebView.HitTestResult mHitTestResult;
102c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu
1036ef347a29d692df672aaf59ee4926a476288476aBen Murdoch    private final int mAppTargetSdkVersion;
1046ef347a29d692df672aaf59ee4926a476288476aBen Murdoch
105aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen    public WebViewChromium(WebView webView, WebView.PrivateAccess webViewPrivate,
106aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen            AwBrowserContext browserContext) {
107ab73853ea633a4ada353f5a2321c6bf0e6c108e5Kristian Monsen        checkThread();
10846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebView = webView;
10946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewPrivate = webViewPrivate;
110c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mHitTestResult = new WebView.HitTestResult();
111aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen        mBrowserContext = browserContext;
1126ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        mAppTargetSdkVersion = mWebView.getContext().getApplicationInfo().targetSdkVersion;
11346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
11446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
1151ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch    static void completeWindowCreation(WebView parent, WebView child) {
1161ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch        AwContents parentContents = ((WebViewChromium) parent.getWebViewProvider()).mAwContents;
117bbfef40e5fc625f4821f012fae7f16468b7308cfJonathan Dixon        AwContents childContents =
118bbfef40e5fc625f4821f012fae7f16468b7308cfJonathan Dixon                child == null ? null : ((WebViewChromium) child.getWebViewProvider()).mAwContents;
1191ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch        parentContents.supplyContentsForPopup(childContents);
12046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
12146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
12246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebViewProvider methods --------------------------------------------------------------------
12346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
12446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
12546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void init(Map<String, Object> javaScriptInterfaces, boolean privateBrowsing) {
1264dcabaef9151384b571327b62234409b31caef38Jonathan Dixon        // BUG=6790250 |javaScriptInterfaces| was only ever used by the obsolete DumpRenderTree
1274dcabaef9151384b571327b62234409b31caef38Jonathan Dixon        // so is ignored. TODO: remove it from WebViewProvider.
12846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        final boolean isAccessFromFileURLsGrantedByDefault =
129ffabf2e121746d06b9930b1ae8fea243c4f5cb9dMikhail Naganov                mAppTargetSdkVersion < Build.VERSION_CODES.JELLY_BEAN;
130ffabf2e121746d06b9930b1ae8fea243c4f5cb9dMikhail Naganov        final boolean areLegacyQuirksEnabled =
131ffabf2e121746d06b9930b1ae8fea243c4f5cb9dMikhail Naganov                mAppTargetSdkVersion < Build.VERSION_CODES.KITKAT;
13246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mContentsClientAdapter = new WebViewContentsClientAdapter(mWebView);
133aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen        mAwContents = new AwContents(mBrowserContext, mWebView, new InternalAccessAdapter(),
134ffabf2e121746d06b9930b1ae8fea243c4f5cb9dMikhail Naganov                mContentsClientAdapter, isAccessFromFileURLsGrantedByDefault,
135ffabf2e121746d06b9930b1ae8fea243c4f5cb9dMikhail Naganov                new AwLayoutSizer(), areLegacyQuirksEnabled);
1367720b10b55b5db5564a72c2e4c2c23631acbff0aKristian Monsen        mWebSettings = new ContentSettingsAdapter(mAwContents.getSettings());
1377720b10b55b5db5564a72c2e4c2c23631acbff0aKristian Monsen
1384dcabaef9151384b571327b62234409b31caef38Jonathan Dixon        if (privateBrowsing) {
1394dcabaef9151384b571327b62234409b31caef38Jonathan Dixon            final String msg = "Private browsing is not supported in WebView.";
1409cd49cbc245e07e8e8c360fd22821a2918f99eaeChet Haase                       if (mAppTargetSdkVersion >= Build.VERSION_CODES.KITKAT) {
1414dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                throw new IllegalArgumentException(msg);
1424dcabaef9151384b571327b62234409b31caef38Jonathan Dixon            } else {
1434dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                Log.w(TAG, msg);
1444dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                // Intentionally irreversibly disable the webview instance, so that private
1454dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                // user data cannot leak through misuse of a non-privateBrowing WebView instance.
1464dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                // Can't just null out mAwContents as we never null-check it before use.
1474dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                mAwContents.destroy();
14833e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdoch                TextView warningLabel = new TextView(mWebView.getContext());
14933e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdoch                warningLabel.setText(mWebView.getContext().getString(
15033e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdoch                        com.android.internal.R.string.webviewchromium_private_browsing_warning));
15133e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdoch                mWebView.addView(warningLabel);
1524dcabaef9151384b571327b62234409b31caef38Jonathan Dixon            }
1534dcabaef9151384b571327b62234409b31caef38Jonathan Dixon        }
1544dcabaef9151384b571327b62234409b31caef38Jonathan Dixon
15546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
15646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
15757b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen    private RuntimeException createThreadException() {
15857b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen        return new IllegalStateException("Calling View methods on another thread than the UI " +
15957b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                "thread. PLEASE FILE A BUG! go/klp-webview-bug");
16057b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen    }
16157b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen
16262389e2d66a99e936652092333782947e363241dKristian Monsen    //  Intentionally not static, as no need to check thread on static methods
16362389e2d66a99e936652092333782947e363241dKristian Monsen    private void checkThread() {
16462389e2d66a99e936652092333782947e363241dKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
16557b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            final RuntimeException threadViolation = createThreadException();
16657b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
16757b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                @Override
16857b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                public void run() {
16957b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                    throw threadViolation;
17057b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                }
17157b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            });
172ab73853ea633a4ada353f5a2321c6bf0e6c108e5Kristian Monsen            throw createThreadException();
17362389e2d66a99e936652092333782947e363241dKristian Monsen        }
17462389e2d66a99e936652092333782947e363241dKristian Monsen    }
17562389e2d66a99e936652092333782947e363241dKristian Monsen
17646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
17746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setHorizontalScrollbarOverlay(boolean overlay) {
17862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
179bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        mAwContents.setHorizontalScrollbarOverlay(overlay);
18046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
18146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
18246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
18346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setVerticalScrollbarOverlay(boolean overlay) {
18462389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
185bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        mAwContents.setVerticalScrollbarOverlay(overlay);
18646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
18746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
18846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
18946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean overlayHorizontalScrollbar() {
19062389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
191bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        return mAwContents.overlayHorizontalScrollbar();
19246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
19346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
19446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
19546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean overlayVerticalScrollbar() {
19662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
197bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        return mAwContents.overlayVerticalScrollbar();
19846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
19946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
20046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
20146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int getVisibleTitleHeight() {
20246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // This is deprecated in WebView and should always return 0.
20346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return 0;
20446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
20546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
20646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
20746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public SslCertificate getCertificate() {
20862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
20946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mAwContents.getCertificate();
21046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
21146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
21246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
21346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setCertificate(SslCertificate certificate) {
21462389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
21546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
21646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
21746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
21846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
21946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void savePassword(String host, String username, String password) {
220adc6c4d74c77a617100bdfeb174ab0c314b24ea8Selim Gurun        // This is a deprecated API: intentional no-op.
22146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
22246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
22346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
22446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setHttpAuthUsernamePassword(String host, String realm, String username,
22546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                                            String password) {
22662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
22746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.setHttpAuthUsernamePassword(host, realm, username, password);
22846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
22946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
23046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
23146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public String[] getHttpAuthUsernamePassword(String host, String realm) {
23262389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
23346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mAwContents.getHttpAuthUsernamePassword(host, realm);
23446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
23546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
23646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
23746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void destroy() {
23862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
2393949435b480cb71106f65b237025da359cf8a8caBen Murdoch        mAwContents.destroy();
240a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon        if (mGLfunctor != null) {
241a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon            mGLfunctor.destroy();
242a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon            mGLfunctor = null;
243a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon        }
24446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
24546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
24646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
24746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setNetworkAvailable(boolean networkUp) {
24862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
2490363422b19ca6263dbfbcd0d9daa6d1abe5c6892Ben Murdoch        // Note that this purely toggles the JS navigator.online property.
2500363422b19ca6263dbfbcd0d9daa6d1abe5c6892Ben Murdoch        // It does not in affect chromium or network stack state in any way.
2510363422b19ca6263dbfbcd0d9daa6d1abe5c6892Ben Murdoch        mAwContents.setNetworkAvailable(networkUp);
25246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
25346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
25446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
25546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebBackForwardList saveState(Bundle outState) {
25662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
257a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        if (outState == null) return null;
258a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        if (!mAwContents.saveState(outState)) return null;
259a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        return copyBackForwardList();
26046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
26146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
26246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
26346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean savePicture(Bundle b, File dest) {
2649405536501747e2d7b4fc46a33e5f0a1e7fd47acJonathan Dixon        // Intentional no-op: hidden method on WebView.
26546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
26646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
26746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
26846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
26946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean restorePicture(Bundle b, File src) {
2709405536501747e2d7b4fc46a33e5f0a1e7fd47acJonathan Dixon        // Intentional no-op: hidden method on WebView.
27146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
27246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
27346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
27446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
27546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebBackForwardList restoreState(Bundle inState) {
27662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
277a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        if (inState == null) return null;
278a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        if (!mAwContents.restoreState(inState)) return null;
279a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        return copyBackForwardList();
28046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
28146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
28246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
28346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void loadUrl(String url, Map<String, String> additionalHttpHeaders) {
28446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // TODO: We may actually want to do some sanity checks here (like filter about://chrome).
2856ef347a29d692df672aaf59ee4926a476288476aBen Murdoch
2866ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        // For backwards compatibility, apps targeting less than K will have JS URLs evaluated
2876ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        // directly and any result of the evaluation will not replace the current page content.
2886ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        // Matching Chrome behavior more closely; apps targetting >= K that load a JS URL will
2896ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        // have the result of that URL replace the content of the current page.
2906ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        final String JAVASCRIPT_SCHEME = "javascript:";
2919cd49cbc245e07e8e8c360fd22821a2918f99eaeChet Haase        if (mAppTargetSdkVersion < Build.VERSION_CODES.KITKAT &&
2926ef347a29d692df672aaf59ee4926a476288476aBen Murdoch                url.startsWith(JAVASCRIPT_SCHEME)) {
2933d52163e1c466860651414670c59762f5bdd269fTao Bai            mAwContents.evaluateJavaScriptEvenIfNotYetNavigated(
2943d52163e1c466860651414670c59762f5bdd269fTao Bai                    url.substring(JAVASCRIPT_SCHEME.length()));
2956ef347a29d692df672aaf59ee4926a476288476aBen Murdoch            return;
2966ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        }
2976ef347a29d692df672aaf59ee4926a476288476aBen Murdoch
29846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        LoadUrlParams params = new LoadUrlParams(url);
29946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (additionalHttpHeaders != null) params.setExtraHeaders(additionalHttpHeaders);
300a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        loadUrlOnUiThread(params);
30146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
30246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
30346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
30446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void loadUrl(String url) {
30546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        loadUrl(url, null);
30646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
30746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
30846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
30946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void postUrl(String url, byte[] postData) {
310b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        LoadUrlParams params = LoadUrlParams.createLoadHttpPostParams(url, postData);
311b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        Map<String,String> headers = new HashMap<String,String>();
312b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        headers.put("Content-Type", "application/x-www-form-urlencoded");
313b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        params.setExtraHeaders(headers);
314b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        loadUrlOnUiThread(params);
31546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
31646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
31746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private static boolean isBase64Encoded(String encoding) {
31846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return "base64".equals(encoding);
31946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
32046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
32146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
32246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void loadData(String data, String mimeType, String encoding) {
323a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        loadUrlOnUiThread(LoadUrlParams.createLoadDataParams(
324a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen                data, mimeType, isBase64Encoded(encoding)));
32546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
32646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
32746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
32846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding,
329efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            String historyUrl) {
330efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch        LoadUrlParams loadUrlParams;
331efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch
332efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch        if (baseUrl != null && baseUrl.startsWith("data:")) {
333efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // For backwards compatibility with WebViewClassic, we use the value of |encoding|
334efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // as the charset, as long as it's not "base64".
335efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            boolean isBase64 = isBase64Encoded(encoding);
336efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            loadUrlParams = LoadUrlParams.createLoadDataParamsWithBaseUrl(
337efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                    data, mimeType, isBase64, baseUrl, historyUrl, isBase64 ? null : encoding);
338efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch        } else {
339efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            if (baseUrl == null || baseUrl.length() == 0) baseUrl = "about:blank";
340efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // When loading data with a non-data: base URL, the classic WebView would effectively
341efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // "dump" that string of data into the WebView without going through regular URL
342efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // loading steps such as decoding URL-encoded entities. We achieve this same behavior by
343efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // base64 encoding the data that is passed here and then loading that as a data: URL.
344efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            try {
345efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                loadUrlParams = LoadUrlParams.createLoadDataParamsWithBaseUrl(
346efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                        Base64.encodeToString(data.getBytes("utf-8"), Base64.DEFAULT), mimeType,
347efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                        true, baseUrl, historyUrl, "utf-8");
348efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            } catch (java.io.UnsupportedEncodingException e) {
349efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                Log.wtf(TAG, "Unable to load data string " + data, e);
350efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                return;
351efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            }
352efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch        }
353a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        loadUrlOnUiThread(loadUrlParams);
354a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen    }
355a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen
356a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen    private void loadUrlOnUiThread(final LoadUrlParams loadUrlParams) {
357a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        if (ThreadUtils.runningOnUiThread()) {
358a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen            mAwContents.loadUrl(loadUrlParams);
359a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        } else {
360a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen            // Disallowed in WebView API for apps targetting a new SDK
361a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen            assert mAppTargetSdkVersion < Build.VERSION_CODES.JELLY_BEAN_MR2;
362a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
363a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen                @Override
364a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen                public void run() {
365a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen                    mAwContents.loadUrl(loadUrlParams);
366a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen                }
367a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen            });
368a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        }
36946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
37046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
3716ef347a29d692df672aaf59ee4926a476288476aBen Murdoch    public void evaluateJavaScript(String script, ValueCallback<String> resultCallback) {
37262389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
3736ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        mAwContents.evaluateJavaScript(script, resultCallback);
3746ef347a29d692df672aaf59ee4926a476288476aBen Murdoch    }
3756ef347a29d692df672aaf59ee4926a476288476aBen Murdoch
37646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
37746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void saveWebArchive(String filename) {
37862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
37946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        saveWebArchive(filename, false, null);
38046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
38146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
38246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
38346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void saveWebArchive(String basename, boolean autoname, ValueCallback<String> callback) {
38462389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
38546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.saveWebArchive(basename, autoname, callback);
38646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
38746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
38846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
38946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void stopLoading() {
39062389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
3917cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.stopLoading();
39246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
39346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
39446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
39546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void reload() {
39662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
3977cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.reload();
39846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
39946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
40046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
40146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean canGoBack() {
40262389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
4037cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canGoBack();
40446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
40546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
40646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
40746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void goBack() {
40862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
4097cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.goBack();
41046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
41146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
41246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
41346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean canGoForward() {
41462389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
4157cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canGoForward();
41646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
41746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
41846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
41946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void goForward() {
42062389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
4217cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.goForward();
42246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
42346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
42446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
42546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean canGoBackOrForward(int steps) {
42662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
4277cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canGoBackOrForward(steps);
42846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
42946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
43046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
43146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void goBackOrForward(int steps) {
43262389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
4337cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.goBackOrForward(steps);
43446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
43546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
43646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
43746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean isPrivateBrowsingEnabled() {
4386d58f78e7fc0412a58b163559cb8e9c4af5c6fe1Jonathan Dixon        // Not supported in this WebView implementation.
43946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
44046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
44146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
44246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
44346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean pageUp(boolean top) {
44462389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
4457cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.pageUp(top);
44646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
44746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
44846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
44946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean pageDown(boolean bottom) {
45062389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
4517cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.pageDown(bottom);
45246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
45346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
45446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
45546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearView() {
45662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
45746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
45846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
45946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
46046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
46146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public Picture capturePicture() {
46262389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
4639c5a40623b62737244deb2d04a98830d7ffa8404Leandro Gracia Gil        return mAwContents.capturePicture();
46446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
46546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
46646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
467a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun    public void exportToPdf(ParcelFileDescriptor fd, PrintAttributes attributes,
468a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun            ValueCallback<Boolean> resultCallback, CancellationSignal cancellationSignal)
469a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun            throws java.io.IOException {
47062389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
471a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        // We convert frameworks attributes to an android_webview specific print attributes
472a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        // so we do not tie upstreaming android_webview changes to installation of correct
473a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        // SDK to try bots.
474a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        if (attributes == null) {
475a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun            throw new IllegalArgumentException("attributes cannot be null");
476a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        }
477a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        if (attributes.getMediaSize() == null) {
478a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun            throw new  IllegalArgumentException("attributes must specify a media size");
479a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        }
480a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        if (attributes.getResolution() == null) {
481a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun            throw new IllegalArgumentException("attributes must specify print resolution");
482a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        }
483a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        if (attributes.getMargins() == null) {
484a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun            throw new IllegalArgumentException("attributes must specify margins");
485a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        }
486a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        AwPdfExportAttributes pdfAttributes = new AwPdfExportAttributes();
487a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        pdfAttributes.pageWidth = attributes.getMediaSize().getWidthMils();
488a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        pdfAttributes.pageHeight = attributes.getMediaSize().getHeightMils();
489a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        pdfAttributes.dpi = getPrintDpi(attributes);
490a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        pdfAttributes.leftMargin = attributes.getMargins().getLeftMils();
491a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        pdfAttributes.rightMargin = attributes.getMargins().getRightMils();
492a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        pdfAttributes.topMargin = attributes.getMargins().getTopMils();
493a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        pdfAttributes.bottomMargin = attributes.getMargins().getBottomMils();
494a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun
495a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        mAwContents.getPdfExporter().exportToPdf(fd, pdfAttributes, resultCallback,
49654a6e3d0cc566df6cec6807c0c03f05664de0a55Selim Gurun                cancellationSignal);
49749a1a6f9f27b63687edc1d98f842627d4719a327Selim Gurun    }
49849a1a6f9f27b63687edc1d98f842627d4719a327Selim Gurun
499a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun    private static int getPrintDpi(PrintAttributes attributes) {
500a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        // TODO(sgurun) android print attributes support horizontal and
501a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        // vertical DPI. Chrome has only one DPI. Revisit this.
502a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        int horizontalDpi = attributes.getResolution().getHorizontalDpi();
503a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        int verticalDpi = attributes.getResolution().getVerticalDpi();
504a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        if (horizontalDpi != verticalDpi) {
505a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun            Log.w(TAG, "Horizontal and vertical DPIs differ. Using horizontal DPI " +
506a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun                    " hDpi=" + horizontalDpi + " vDPI=" + verticalDpi);
507a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        }
508a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        return horizontalDpi;
509a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun    }
510a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun
51149a1a6f9f27b63687edc1d98f842627d4719a327Selim Gurun    @Override
51246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public float getScale() {
51362389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
5143520eb778d668dc76ca4541c69abd568b9d02691Mikhail Naganov        return mAwContents.getScale();
51546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
51646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
51746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
51846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setInitialScale(int scaleInPercent) {
51962389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
5203520eb778d668dc76ca4541c69abd568b9d02691Mikhail Naganov        mAwContents.getSettings().setInitialPageScale(scaleInPercent);
52146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
52246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
52346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
52446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void invokeZoomPicker() {
52562389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
5267cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.invokeZoomPicker();
52746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
52846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
52946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
53046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebView.HitTestResult getHitTestResult() {
53162389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
532c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        AwContents.HitTestData data = mAwContents.getLastHitTestResult();
533c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mHitTestResult.setType(data.hitTestResultType);
534c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mHitTestResult.setExtra(data.hitTestResultExtraData);
535c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        return mHitTestResult;
53646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
53746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
53846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
53946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void requestFocusNodeHref(Message hrefMsg) {
54062389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
541c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mAwContents.requestFocusNodeHref(hrefMsg);
54246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
54346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
54446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
54546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void requestImageRef(Message msg) {
54662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
547c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mAwContents.requestImageRef(msg);
54846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
54946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
55046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
55146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public String getUrl() {
55262389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
5537cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        String url =  mAwContents.getUrl();
55446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (url == null || url.trim().isEmpty()) return null;
55546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return url;
55646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
55746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
55846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
55946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public String getOriginalUrl() {
56062389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
56146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        String url =  mAwContents.getOriginalUrl();
56246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (url == null || url.trim().isEmpty()) return null;
56346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return url;
56446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
56546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
56646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
56746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public String getTitle() {
56862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
5697cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.getTitle();
57046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
57146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
57246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
57346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public Bitmap getFavicon() {
57462389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
5759405536501747e2d7b4fc46a33e5f0a1e7fd47acJonathan Dixon        return mAwContents.getFavicon();
57646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
57746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
57846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
57946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public String getTouchIconUrl() {
5809405536501747e2d7b4fc46a33e5f0a1e7fd47acJonathan Dixon        // Intentional no-op: hidden method on WebView.
58146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return null;
58246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
58346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
58446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
58546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int getProgress() {
586c0c86c037ea697da375ae28c543cae9b050d6b68Jonathan Dixon        // No checkThread() because the value is cached java side (workaround for b/10533304).
58746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mAwContents.getMostRecentProgress();
58846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
58946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
59046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
59146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int getContentHeight() {
59294a8e6a6d7d1b2a6b3718eb91956403ef6b03d9cKristian Monsen        // No checkThread() as it is mostly thread safe (workaround for b/10594869).
5936b5f3d1546ae2a9c712cde60c54ec027582bc4e6Martin Kosiba        return mAwContents.getContentHeightCss();
59446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
59546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
59646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
59746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int getContentWidth() {
59862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
5996b5f3d1546ae2a9c712cde60c54ec027582bc4e6Martin Kosiba        return mAwContents.getContentWidthCss();
60046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
60146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
60246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
60346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void pauseTimers() {
60462389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
605531e68a2b50a5e542eeede13907f29e463a99ebfBen Murdoch        mAwContents.pauseTimers();
60646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
60746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
60846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
60946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void resumeTimers() {
61062389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
611531e68a2b50a5e542eeede13907f29e463a99ebfBen Murdoch        mAwContents.resumeTimers();
61246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
61346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
61446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
61546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onPause() {
61662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
6171cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onPause();
61846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
61946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
62046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
62146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onResume() {
62262389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
6231cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onResume();
62446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
62546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
62646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
62746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean isPaused() {
62862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
6291cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        return mAwContents.isPaused();
63046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
63146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
63246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
63346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void freeMemory() {
63462389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
635d43c55dd91cf7dd1bcd18d01e16acd5e55de0471Ben Murdoch        // Intentional no-op. Memory is managed automatically by Chromium.
63646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
63746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
63846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
63946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearCache(boolean includeDiskFiles) {
64062389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
64146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.clearCache(includeDiskFiles);
64246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
64346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
644bbef8de5696d48fc6458c926026fc524a62814e1Selim Gurun    /**
645bbef8de5696d48fc6458c926026fc524a62814e1Selim Gurun     * This is a poorly named method, but we keep it for historical reasons.
646bbef8de5696d48fc6458c926026fc524a62814e1Selim Gurun     */
64746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
64846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearFormData() {
64962389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
650bbef8de5696d48fc6458c926026fc524a62814e1Selim Gurun        mAwContents.hideAutofillPopup();
65146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
65246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
65346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
65446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearHistory() {
65562389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
6567cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.clearHistory();
65746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
65846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
65946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
66046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearSslPreferences() {
66162389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
6627cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.clearSslPreferences();
66346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
66446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
66546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
66646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebBackForwardList copyBackForwardList() {
66762389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
66808a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu        return new WebBackForwardListChromium(
6697cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba                mAwContents.getNavigationHistory());
67046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
67146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
67246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
67346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setFindListener(WebView.FindListener listener) {
67462389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
67546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mContentsClientAdapter.setFindListener(listener);
67646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
67746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
67846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
67946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void findNext(boolean forwards) {
68062389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
68146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.findNext(forwards);
68246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
68346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
68446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
68546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int findAll(String searchString) {
68662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
687f37548d6d8e2a73c65d675a26706a38f52960800Jonathan Dixon        mAwContents.findAllAsync(searchString);
688f37548d6d8e2a73c65d675a26706a38f52960800Jonathan Dixon        return 0;
68946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
69046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
69146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
69246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void findAllAsync(String searchString) {
69362389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
69446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.findAllAsync(searchString);
69546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
69646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
69746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
69846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean showFindDialog(String text, boolean showIme) {
69962389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
7006d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        if (mWebView.getParent() == null) {
7016d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            return false;
7026d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        }
7036d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch
7046d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        FindActionModeCallback findAction = new FindActionModeCallback(mWebView.getContext());
7056d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        if (findAction == null) {
7066d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            return false;
7076d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        }
7086d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch
7096d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        mWebView.startActionMode(findAction);
7106d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        findAction.setWebView(mWebView);
7116d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        if (showIme) {
7126d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            findAction.showSoftInput();
7136d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        }
7146d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch
7156d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        if (text != null) {
7166d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            findAction.setText(text);
7176d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            findAction.findAll();
7186d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        }
7196d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch
7206d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        return true;
72146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
72246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
7236d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch    @Override
724fde8dae44f74be3de69ce6dd07b0023279b485a0Ben Murdoch    public void notifyFindDialogDismissed() {
72562389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
7266d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        clearMatches();
727fde8dae44f74be3de69ce6dd07b0023279b485a0Ben Murdoch    }
728fde8dae44f74be3de69ce6dd07b0023279b485a0Ben Murdoch
72946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
73046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearMatches() {
73162389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
73246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.clearMatches();
73346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
73446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
73546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
73646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void documentHasImages(Message response) {
73762389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
73846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.documentHasImages(response);
73946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
74046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
74146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
74246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setWebViewClient(WebViewClient client) {
74362389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
74446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mContentsClientAdapter.setWebViewClient(client);
74546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
74646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
74746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
74846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setDownloadListener(DownloadListener listener) {
74962389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
7504320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu        mContentsClientAdapter.setDownloadListener(listener);
75146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
75246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
75346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
75446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setWebChromeClient(WebChromeClient client) {
75562389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
75646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mContentsClientAdapter.setWebChromeClient(client);
75746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
75846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
75946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
76046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setPictureListener(WebView.PictureListener listener) {
76162389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
76246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mContentsClientAdapter.setPictureListener(listener);
7639c5a40623b62737244deb2d04a98830d7ffa8404Leandro Gracia Gil        mAwContents.enableOnNewPicture(listener != null,
7646ef347a29d692df672aaf59ee4926a476288476aBen Murdoch                mAppTargetSdkVersion >= Build.VERSION_CODES.JELLY_BEAN_MR2);
76546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
76646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
76746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
76846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void addJavascriptInterface(Object obj, String interfaceName) {
76962389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
770ea844f60b1b559788566fe6e004b1eeca53a8039Jonathan Dixon        Class<? extends Annotation> requiredAnnotation = null;
7716ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        if (mAppTargetSdkVersion >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
7727db34d3dcaac936566f912e1b0b21f3f103029ffJonathan Dixon           requiredAnnotation = JavascriptInterface.class;
7737db34d3dcaac936566f912e1b0b21f3f103029ffJonathan Dixon        }
7747cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.addPossiblyUnsafeJavascriptInterface(obj, interfaceName, requiredAnnotation);
77546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
77646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
77746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
77846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void removeJavascriptInterface(String interfaceName) {
77962389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
7807cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.removeJavascriptInterface(interfaceName);
78146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
78246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
78346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
78446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebSettings getSettings() {
78546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mWebSettings;
78646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
78746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
78846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
78946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setMapTrackballToArrowKeys(boolean setMap) {
79062389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
79146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // This is a deprecated API: intentional no-op.
79246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
79346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
79446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
79546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void flingScroll(int vx, int vy) {
79662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
7977cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.flingScroll(vx, vy);
79846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
79946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
80046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
80146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public View getZoomControls() {
80262389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
803e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon        // This was deprecated in 2009 and hidden in JB MR1, so just provide the minimum needed
804e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon        // to stop very out-dated applications from crashing.
805e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon        Log.w(TAG, "WebView doesn't support getZoomControls");
806420c0da3a4e06e1ac5574091e7c9c286ef012369Mikhail Naganov        return mAwContents.getSettings().supportZoom() ? new View(mWebView.getContext()) : null;
80746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
80846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
80946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
81046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean canZoomIn() {
81162389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
8127cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canZoomIn();
81346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
81446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
81546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
81646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean canZoomOut() {
81762389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
8187cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canZoomOut();
81946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
82046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
82146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
82246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean zoomIn() {
82362389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
8247cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.zoomIn();
82546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
82646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
82746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
82846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean zoomOut() {
82962389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
8307cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.zoomOut();
83146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
83246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
833d2dcef4d9edfb7af7abff85b0867c3d6a363feb7Jonathan Dixon    @Override
83446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void dumpViewHierarchyWithProperties(BufferedWriter out, int level) {
83546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
83646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
83746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
838d2dcef4d9edfb7af7abff85b0867c3d6a363feb7Jonathan Dixon    @Override
83946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public View findHierarchyView(String className, int hashCode) {
84046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
84146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return null;
84246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
84346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
84446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebViewProvider glue methods ---------------------------------------------------------------
84546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
84646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
84757b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen    // This needs to be kept thread safe!
84846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebViewProvider.ViewDelegate getViewDelegate() {
84946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return this;
85046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
85146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
85246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
85346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebViewProvider.ScrollDelegate getScrollDelegate() {
85462389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
85546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return this;
85646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
85746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
85846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
85946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebViewProvider.ViewDelegate implementation ------------------------------------------------
86046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
861a7fba41c5661cb61b41c8a4ff2d69e5153666f7fBen Murdoch    // TODO: remove from WebViewProvider and use default implementation from
862a7fba41c5661cb61b41c8a4ff2d69e5153666f7fBen Murdoch    // ViewGroup.
863a7fba41c5661cb61b41c8a4ff2d69e5153666f7fBen Murdoch    // @Override
86446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean shouldDelayChildPressedState() {
86562389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
866a7fba41c5661cb61b41c8a4ff2d69e5153666f7fBen Murdoch        return true;
86746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
86846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
8695c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch//    @Override
8705c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch    public AccessibilityNodeProvider getAccessibilityNodeProvider() {
87162389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
8725c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch        return mAwContents.getAccessibilityNodeProvider();
8735c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch    }
8745c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch
87546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
87646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
87762389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
8787cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.onInitializeAccessibilityNodeInfo(info);
87946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
88046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
88146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
88246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
88362389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
8847cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.onInitializeAccessibilityEvent(event);
88546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
88646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
88746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
88846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean performAccessibilityAction(int action, Bundle arguments) {
88962389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
890b7b706b2ed5cbb77dd690f5405b626a429989714Ben Murdoch        if (mAwContents.supportsAccessibilityAction(action)) {
891b7b706b2ed5cbb77dd690f5405b626a429989714Ben Murdoch            return mAwContents.performAccessibilityAction(action, arguments);
892b7b706b2ed5cbb77dd690f5405b626a429989714Ben Murdoch        }
893b7b706b2ed5cbb77dd690f5405b626a429989714Ben Murdoch        return mWebViewPrivate.super_performAccessibilityAction(action, arguments);
89446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
89546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
89646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
89746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setOverScrollMode(int mode) {
89862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
8992841152693d0410f8e8c309aae514329f008a612Martin Kosiba        // This gets called from the android.view.View c'tor that WebView inherits from. This
9002841152693d0410f8e8c309aae514329f008a612Martin Kosiba        // causes the method to be called when mAwContents == null.
9012841152693d0410f8e8c309aae514329f008a612Martin Kosiba        // It's safe to ignore these calls however since AwContents will read the current value of
9022841152693d0410f8e8c309aae514329f008a612Martin Kosiba        // this setting when it's created.
903ab5398debe64d34306b0f709a93d840078ae181dMartin Kosiba        if (mAwContents != null) {
904ab5398debe64d34306b0f709a93d840078ae181dMartin Kosiba            mAwContents.setOverScrollMode(mode);
905ab5398debe64d34306b0f709a93d840078ae181dMartin Kosiba        }
90646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
90746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
90846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
90946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setScrollBarStyle(int style) {
91062389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
911bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        mAwContents.setScrollBarStyle(style);
91246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
91346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
91446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
91546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onDrawVerticalScrollBar(Canvas canvas, Drawable scrollBar,
91646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                                        int l, int t, int r, int b) {
91762389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
918bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        // WebViewClassic was overriding this method to handle rubberband over-scroll. Since
919bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        // WebViewChromium doesn't support that the vanilla implementation of this method can be
920bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        // used.
921bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        mWebViewPrivate.super_onDrawVerticalScrollBar(canvas, scrollBar, l, t, r, b);
92246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
92346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
92446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
92546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
92662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
9273951fbadf5157dd3fe73decc879f9b763e780b09Martin Kosiba        mAwContents.onContainerViewOverScrolled(scrollX, scrollY, clampedX, clampedY);
92846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
92946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
93046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
93146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onWindowVisibilityChanged(int visibility) {
93262389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
9331cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onWindowVisibilityChanged(visibility);
93446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
93546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
93646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
93746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onDraw(Canvas canvas) {
93862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
9397ab33360e331e04f515d532064670e210d174a7aTao Bai        mAwContents.onDraw(canvas);
94046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
94146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
94246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
94346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setLayoutParams(ViewGroup.LayoutParams layoutParams) {
94462389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
94546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // TODO: This is the minimum implementation for HTMLViewer
94646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // bringup. Likely will need to go up to ContentViewCore for
94746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // a complete implementation.
94846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewPrivate.super_setLayoutParams(layoutParams);
94946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
95046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
95146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
95246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean performLongClick() {
95362389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
954decc147cebc8f73d355c024d92c60d3f727cab31Bo Liu        return mWebViewPrivate.super_performLongClick();
95546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
95646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
95746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
95846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onConfigurationChanged(Configuration newConfig) {
95962389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
9601cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onConfigurationChanged(newConfig);
96146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
96246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
96346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
96446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
96562389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
9667cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.onCreateInputConnection(outAttrs);
96746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
96846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
96946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
97046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
97162389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
97246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
97346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
97446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
97546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
97646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
97746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onKeyDown(int keyCode, KeyEvent event) {
97862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
97946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
98046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
98146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
98246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
98346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
98446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onKeyUp(int keyCode, KeyEvent event) {
98562389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
9867cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.onKeyUp(keyCode, event);
98746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
98846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
98946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
99046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onAttachedToWindow() {
99162389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
9921cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onAttachedToWindow();
99346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
99446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
99546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
99646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onDetachedFromWindow() {
99762389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
9981cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onDetachedFromWindow();
999a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon        if (mGLfunctor != null) {
1000a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon            mGLfunctor.detach();
1001a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon        }
100246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
100346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
100446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
100546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onVisibilityChanged(View changedView, int visibility) {
100662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
1007c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba        // The AwContents will find out the container view visibility before the first draw so we
1008c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba        // can safely ignore onVisibilityChanged callbacks that happen before init().
1009c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba        if (mAwContents != null) {
1010c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba            mAwContents.onVisibilityChanged(changedView, visibility);
1011c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba        }
101246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
101346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
101446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
101546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onWindowFocusChanged(boolean hasWindowFocus) {
101662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
10171cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onWindowFocusChanged(hasWindowFocus);
101846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
101946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
102046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
102146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
102262389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
10231cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onFocusChanged(focused, direction, previouslyFocusedRect);
102446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
102546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
102646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
102746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean setFrame(int left, int top, int right, int bottom) {
10281cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        // TODO(joth): This is the minimum implementation for initial
10291cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        // bringup. Likely will need to go up to AwContents for a complete
10301cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        // implementation, e.g. setting the compositor visible region (to
10311cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        // avoid painting tiles that are offscreen due to the view's position).
103262389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
103346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mWebViewPrivate.super_setFrame(left, top, right, bottom);
103446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
103546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
103646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
103746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onSizeChanged(int w, int h, int ow, int oh) {
103862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
10391cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onSizeChanged(w, h, ow, oh);
104046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
104146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
104246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
104346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onScrollChanged(int l, int t, int oldl, int oldt) {
104462389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
104546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
104646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
104746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
104846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean dispatchKeyEvent(KeyEvent event) {
104962389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
10507cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.dispatchKeyEvent(event);
105146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
105246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
105346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
105446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onTouchEvent(MotionEvent ev) {
105562389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
1056c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        return mAwContents.onTouchEvent(ev);
105746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
105846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
105946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
106046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onHoverEvent(MotionEvent event) {
106162389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
1062c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        return mAwContents.onHoverEvent(event);
106346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
106446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
106546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
106646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onGenericMotionEvent(MotionEvent event) {
106762389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
1068c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        return mAwContents.onGenericMotionEvent(event);
106946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
107046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
107146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
107246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onTrackballEvent(MotionEvent ev) {
107362389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
107446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // Trackball event not handled, which eventually gets converted to DPAD keyevents
107546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
107646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
107746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
107846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
107946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean requestFocus(int direction, Rect previouslyFocusedRect) {
108062389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
10814cee3bf50c125a52a49323aa999f4b619fa18c10Ben Murdoch        mAwContents.requestFocus();
108246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mWebViewPrivate.super_requestFocus(direction, previouslyFocusedRect);
108346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
108446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
108546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
108646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
108762389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
1088d7bf6ab0cd8cc4005b112e4358eb797bb178a85fMarcin Kosiba        mAwContents.onMeasure(widthMeasureSpec, heightMeasureSpec);
108946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
109046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
109146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
109246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean requestChildRectangleOnScreen(View child, Rect rect, boolean immediate) {
109362389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
109446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
109546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
109646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
109746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
109846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
109957b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen    public void setBackgroundColor(final int color) {
110057b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen        if (ThreadUtils.runningOnUiThread()) {
110157b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            mAwContents.setBackgroundColor(color);
110257b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen        } else {
110357b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            // Disallowed in WebView API for apps targetting a new SDK
110457b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            assert mAppTargetSdkVersion < Build.VERSION_CODES.JELLY_BEAN_MR2;
110557b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
110657b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                @Override
110757b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                public void run() {
110857b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                    mAwContents.setBackgroundColor(color);
110957b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                }
111057b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            });
111157b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen        }
111246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
111346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
111446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
111546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setLayerType(int layerType, Paint paint) {
111662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
111746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
111846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
111946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
11200b528e4924a7c14687181185bc66173ad18f00eaLeandro Gracia Gil    @Override
112146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void preDispatchDraw(Canvas canvas) {
112262389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
11230b528e4924a7c14687181185bc66173ad18f00eaLeandro Gracia Gil        // TODO(leandrogracia): remove this method from WebViewProvider if we think
11240b528e4924a7c14687181185bc66173ad18f00eaLeandro Gracia Gil        // we won't need it again.
112546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
112646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
112746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebViewProvider.ScrollDelegate implementation ----------------------------------------------
112846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
112946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
113046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeHorizontalScrollRange() {
113162389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
11327cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeHorizontalScrollRange();
113346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
113446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
113546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
113646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeHorizontalScrollOffset() {
113762389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
11387cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeHorizontalScrollOffset();
113946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
114046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
114146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
114246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeVerticalScrollRange() {
114362389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
11447cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeVerticalScrollRange();
114546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
114646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
114746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
114846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeVerticalScrollOffset() {
114962389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
11507cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeVerticalScrollOffset();
115146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
115246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
115346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
115446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeVerticalScrollExtent() {
115562389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
11567cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeVerticalScrollExtent();
115746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
115846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
115946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
116046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void computeScroll() {
116162389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
11622a120ba09921dbb1e8354ecbc4a6e063ec891101Martin Kosiba        mAwContents.computeScroll();
116346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
116446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
11654702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba    // AwContents.InternalAccessDelegate implementation --------------------------------------
11664702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba    private class InternalAccessAdapter implements AwContents.InternalAccessDelegate {
116746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
116846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean drawChild(Canvas arg0, View arg1, long arg2) {
116946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
117046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
117146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
117246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
117346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
117446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_onKeyUp(int arg0, KeyEvent arg1) {
117546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
117646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
117746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
117846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
117946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
118046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_dispatchKeyEventPreIme(KeyEvent arg0) {
118146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
118246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
118346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
118446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
118546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
118646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_dispatchKeyEvent(KeyEvent event) {
118746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return mWebViewPrivate.super_dispatchKeyEvent(event);
118846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
118946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
119046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
119146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_onGenericMotionEvent(MotionEvent arg0) {
119246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
119346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
119446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
119546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
119646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
119746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public void super_onConfigurationChanged(Configuration arg0) {
119846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
119946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
120046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
1201bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        @Override
12020088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba        public int super_getScrollBarStyle() {
12030088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba            return mWebViewPrivate.super_getScrollBarStyle();
12040088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba        }
12050088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba
120646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
120746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean awakenScrollBars() {
120846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mWebViewPrivate.awakenScrollBars(0);
120946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // TODO: modify the WebView.PrivateAccess to provide a return value.
121046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return true;
121146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
121246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
121346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
121446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_awakenScrollBars(int arg0, boolean arg1) {
121546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // TODO: need method on WebView.PrivateAccess?
121646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
121746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
121846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
12194702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba
1220d7bf6ab0cd8cc4005b112e4358eb797bb178a85fMarcin Kosiba        @Override
12212a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        public void onScrollChanged(int l, int t, int oldl, int oldt) {
12222a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.setScrollXRaw(l);
12232a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.setScrollYRaw(t);
12242a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.onScrollChanged(l, t, oldl, oldt);
12252a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        }
12262a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba
12273951fbadf5157dd3fe73decc879f9b763e780b09Martin Kosiba        @Override
12282a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        public void overScrollBy(int deltaX, int deltaY,
12292a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            int scrollX, int scrollY,
12302a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            int scrollRangeX, int scrollRangeY,
12312a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            int maxOverScrollX, int maxOverScrollY,
12322a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            boolean isTouchEvent) {
12332a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.overScrollBy(deltaX, deltaY, scrollX, scrollY,
12342a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba                    scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);
12352a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        }
12362a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba
12373951fbadf5157dd3fe73decc879f9b763e780b09Martin Kosiba        @Override
12382a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        public void super_scrollTo(int scrollX, int scrollY) {
12392a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.super_scrollTo(scrollX, scrollY);
12402a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        }
12412a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba
12422a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        @Override
12434702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba        public void setMeasuredDimension(int measuredWidth, int measuredHeight) {
12444702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba            mWebViewPrivate.setMeasuredDimension(measuredWidth, measuredHeight);
12454702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba        }
124651f7cf16cd02f14050bb723175a2a57570e8486dTao Bai
12477ab33360e331e04f515d532064670e210d174a7aTao Bai        @Override
124851f7cf16cd02f14050bb723175a2a57570e8486dTao Bai        public boolean requestDrawGL(Canvas canvas) {
12497ab33360e331e04f515d532064670e210d174a7aTao Bai            if (mGLfunctor == null) {
12507ab33360e331e04f515d532064670e210d174a7aTao Bai                mGLfunctor = new DrawGLFunctor(mAwContents.getAwDrawGLViewContext());
12517ab33360e331e04f515d532064670e210d174a7aTao Bai            }
125251f7cf16cd02f14050bb723175a2a57570e8486dTao Bai            return mGLfunctor.requestDrawGL((HardwareCanvas)canvas, mWebView.getViewRootImpl());
125351f7cf16cd02f14050bb723175a2a57570e8486dTao Bai        }
125446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
125546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)}
1256