WebViewChromium.java revision c8523c99833f364c64744d60e408510fb83b998b
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;
3319bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixonimport android.text.TextUtils;
34efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdochimport android.util.Base64;
35e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixonimport android.util.Log;
36a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixonimport android.view.HardwareCanvas;
3746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.KeyEvent;
3846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.MotionEvent;
3946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.View;
4046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.ViewGroup;
4146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.accessibility.AccessibilityEvent;
4246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.accessibility.AccessibilityNodeInfo;
435c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdochimport android.view.accessibility.AccessibilityNodeProvider;
4446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.inputmethod.EditorInfo;
4546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.inputmethod.InputConnection;
4646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.DownloadListener;
476d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdochimport android.webkit.FindActionModeCallback;
487db34d3dcaac936566f912e1b0b21f3f103029ffJonathan Dixonimport android.webkit.JavascriptInterface;
4946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.ValueCallback;
5046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebBackForwardList;
5146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebChromeClient;
5246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebSettings;
5346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebView;
5446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewClient;
5546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewProvider;
5633e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdochimport android.widget.TextView;
5746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
58aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsenimport org.chromium.android_webview.AwBrowserContext;
5946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.AwContents;
60ffabf2e121746d06b9930b1ae8fea243c4f5cb9dMikhail Naganovimport org.chromium.android_webview.AwLayoutSizer;
61a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurunimport org.chromium.android_webview.AwPdfExportAttributes;
62a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsenimport org.chromium.base.ThreadUtils;
6346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.LoadUrlParams;
6446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.net.NetworkChangeNotifier;
6546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
6646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.io.BufferedWriter;
6746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.io.File;
68ea844f60b1b559788566fe6e004b1eeca53a8039Jonathan Dixonimport java.lang.annotation.Annotation;
69b8281877c710018a3bc8066be17b1e11822be015Selim Gurunimport java.util.HashMap;
7046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.util.Map;
7146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
7246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)/**
7346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * This class is the delegate to which WebViewProxy forwards all API calls.
7446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) *
751cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon * Most of the actual functionality is implemented by AwContents (or ContentViewCore within
761cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon * it). This class also contains WebView-specific APIs that require the creation of other
771cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon * adapters (otherwise org.chromium.content would depend on the webview.chromium package)
781cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon * and a small set of no-op deprecated APIs.
7946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */
8046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)class WebViewChromium implements WebViewProvider,
8146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)          WebViewProvider.ScrollDelegate, WebViewProvider.ViewDelegate {
82e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon
83e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon    private static final String TAG = WebViewChromium.class.getSimpleName();
84e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon
8546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The WebView that this WebViewChromium is the provider for.
8646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    WebView mWebView;
8746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // Lets us access protected View-derived methods on the WebView instance we're backing.
8846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    WebView.PrivateAccess mWebViewPrivate;
8946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The client adapter class.
9046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebViewContentsClientAdapter mContentsClientAdapter;
9146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
9246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // Variables for functionality provided by this adapter ---------------------------------------
9346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebSettings adapter, lazily initialized in the getter
9446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebSettings mWebSettings;
953949435b480cb71106f65b237025da359cf8a8caBen Murdoch    // The WebView wrapper for ContentViewCore and required browser compontents.
9646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private AwContents mAwContents;
97a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    // Non-null if this webview is using the GL accelerated draw path.
98a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    private DrawGLFunctor mGLfunctor;
9946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
100aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen    private AwBrowserContext mBrowserContext;
101aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen
102c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu    private final WebView.HitTestResult mHitTestResult;
103c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu
1046ef347a29d692df672aaf59ee4926a476288476aBen Murdoch    private final int mAppTargetSdkVersion;
1056ef347a29d692df672aaf59ee4926a476288476aBen Murdoch
106aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen    public WebViewChromium(WebView webView, WebView.PrivateAccess webViewPrivate,
107aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen            AwBrowserContext browserContext) {
108ab73853ea633a4ada353f5a2321c6bf0e6c108e5Kristian Monsen        checkThread();
10946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebView = webView;
11046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewPrivate = webViewPrivate;
111c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mHitTestResult = new WebView.HitTestResult();
112aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen        mBrowserContext = browserContext;
1136ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        mAppTargetSdkVersion = mWebView.getContext().getApplicationInfo().targetSdkVersion;
11446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
11546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
1161ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch    static void completeWindowCreation(WebView parent, WebView child) {
1171ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch        AwContents parentContents = ((WebViewChromium) parent.getWebViewProvider()).mAwContents;
118bbfef40e5fc625f4821f012fae7f16468b7308cfJonathan Dixon        AwContents childContents =
119bbfef40e5fc625f4821f012fae7f16468b7308cfJonathan Dixon                child == null ? null : ((WebViewChromium) child.getWebViewProvider()).mAwContents;
1201ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch        parentContents.supplyContentsForPopup(childContents);
12146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
12246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
12346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebViewProvider methods --------------------------------------------------------------------
12446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
12546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
12646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void init(Map<String, Object> javaScriptInterfaces, boolean privateBrowsing) {
1274dcabaef9151384b571327b62234409b31caef38Jonathan Dixon        // BUG=6790250 |javaScriptInterfaces| was only ever used by the obsolete DumpRenderTree
1284dcabaef9151384b571327b62234409b31caef38Jonathan Dixon        // so is ignored. TODO: remove it from WebViewProvider.
12946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        final boolean isAccessFromFileURLsGrantedByDefault =
130ffabf2e121746d06b9930b1ae8fea243c4f5cb9dMikhail Naganov                mAppTargetSdkVersion < Build.VERSION_CODES.JELLY_BEAN;
131ffabf2e121746d06b9930b1ae8fea243c4f5cb9dMikhail Naganov        final boolean areLegacyQuirksEnabled =
132ffabf2e121746d06b9930b1ae8fea243c4f5cb9dMikhail Naganov                mAppTargetSdkVersion < Build.VERSION_CODES.KITKAT;
13346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mContentsClientAdapter = new WebViewContentsClientAdapter(mWebView);
134aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen        mAwContents = new AwContents(mBrowserContext, mWebView, new InternalAccessAdapter(),
135ffabf2e121746d06b9930b1ae8fea243c4f5cb9dMikhail Naganov                mContentsClientAdapter, isAccessFromFileURLsGrantedByDefault,
136ffabf2e121746d06b9930b1ae8fea243c4f5cb9dMikhail Naganov                new AwLayoutSizer(), areLegacyQuirksEnabled);
1377720b10b55b5db5564a72c2e4c2c23631acbff0aKristian Monsen        mWebSettings = new ContentSettingsAdapter(mAwContents.getSettings());
1387720b10b55b5db5564a72c2e4c2c23631acbff0aKristian Monsen
1394dcabaef9151384b571327b62234409b31caef38Jonathan Dixon        if (privateBrowsing) {
1404dcabaef9151384b571327b62234409b31caef38Jonathan Dixon            final String msg = "Private browsing is not supported in WebView.";
1419cd49cbc245e07e8e8c360fd22821a2918f99eaeChet Haase                       if (mAppTargetSdkVersion >= Build.VERSION_CODES.KITKAT) {
1424dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                throw new IllegalArgumentException(msg);
1434dcabaef9151384b571327b62234409b31caef38Jonathan Dixon            } else {
1444dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                Log.w(TAG, msg);
1454dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                // Intentionally irreversibly disable the webview instance, so that private
1464dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                // user data cannot leak through misuse of a non-privateBrowing WebView instance.
1474dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                // Can't just null out mAwContents as we never null-check it before use.
1484dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                mAwContents.destroy();
14933e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdoch                TextView warningLabel = new TextView(mWebView.getContext());
15033e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdoch                warningLabel.setText(mWebView.getContext().getString(
15133e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdoch                        com.android.internal.R.string.webviewchromium_private_browsing_warning));
15233e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdoch                mWebView.addView(warningLabel);
1534dcabaef9151384b571327b62234409b31caef38Jonathan Dixon            }
1544dcabaef9151384b571327b62234409b31caef38Jonathan Dixon        }
1554dcabaef9151384b571327b62234409b31caef38Jonathan Dixon
15646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
15746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
15857b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen    private RuntimeException createThreadException() {
15957b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen        return new IllegalStateException("Calling View methods on another thread than the UI " +
16057b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                "thread. PLEASE FILE A BUG! go/klp-webview-bug");
16157b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen    }
16257b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen
16362389e2d66a99e936652092333782947e363241dKristian Monsen    //  Intentionally not static, as no need to check thread on static methods
16462389e2d66a99e936652092333782947e363241dKristian Monsen    private void checkThread() {
16562389e2d66a99e936652092333782947e363241dKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
16657b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            final RuntimeException threadViolation = createThreadException();
16757b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
16857b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                @Override
16957b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                public void run() {
17057b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                    throw threadViolation;
17157b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                }
17257b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            });
173ab73853ea633a4ada353f5a2321c6bf0e6c108e5Kristian Monsen            throw createThreadException();
17462389e2d66a99e936652092333782947e363241dKristian Monsen        }
17562389e2d66a99e936652092333782947e363241dKristian Monsen    }
17662389e2d66a99e936652092333782947e363241dKristian Monsen
17746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
17846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setHorizontalScrollbarOverlay(boolean overlay) {
17962389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
180bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        mAwContents.setHorizontalScrollbarOverlay(overlay);
18146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
18246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
18346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
18446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setVerticalScrollbarOverlay(boolean overlay) {
18562389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
186bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        mAwContents.setVerticalScrollbarOverlay(overlay);
18746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
18846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
18946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
19046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean overlayHorizontalScrollbar() {
19162389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
192bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        return mAwContents.overlayHorizontalScrollbar();
19346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
19446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
19546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
19646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean overlayVerticalScrollbar() {
19762389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
198bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        return mAwContents.overlayVerticalScrollbar();
19946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
20046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
20146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
20246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int getVisibleTitleHeight() {
20346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // This is deprecated in WebView and should always return 0.
20446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return 0;
20546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
20646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
20746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
20846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public SslCertificate getCertificate() {
20962389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
21046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mAwContents.getCertificate();
21146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
21246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
21346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
21446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setCertificate(SslCertificate certificate) {
21562389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
21646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
21746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
21846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
21946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
22046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void savePassword(String host, String username, String password) {
221adc6c4d74c77a617100bdfeb174ab0c314b24ea8Selim Gurun        // This is a deprecated API: intentional no-op.
22246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
22346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
22446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
22546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setHttpAuthUsernamePassword(String host, String realm, String username,
22646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                                            String password) {
22762389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
22846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.setHttpAuthUsernamePassword(host, realm, username, password);
22946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
23046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
23146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
23246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public String[] getHttpAuthUsernamePassword(String host, String realm) {
23362389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
23446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mAwContents.getHttpAuthUsernamePassword(host, realm);
23546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
23646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
23746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
23846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void destroy() {
239370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
240370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
241370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen                @Override
242370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen                public void run() {
243370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen                    destroy();
244370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen                }
245370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen            });
246370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen            return;
247370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen        }
248370194f596d6ed2b410d67a65782e5a6dc24a4e3Kristian Monsen
2493949435b480cb71106f65b237025da359cf8a8caBen Murdoch        mAwContents.destroy();
250a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon        if (mGLfunctor != null) {
251a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon            mGLfunctor.destroy();
252a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon            mGLfunctor = null;
253a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon        }
25446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
25546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
25646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
25746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setNetworkAvailable(boolean networkUp) {
25862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
2590363422b19ca6263dbfbcd0d9daa6d1abe5c6892Ben Murdoch        // Note that this purely toggles the JS navigator.online property.
2600363422b19ca6263dbfbcd0d9daa6d1abe5c6892Ben Murdoch        // It does not in affect chromium or network stack state in any way.
2610363422b19ca6263dbfbcd0d9daa6d1abe5c6892Ben Murdoch        mAwContents.setNetworkAvailable(networkUp);
26246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
26346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
26446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
26546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebBackForwardList saveState(Bundle outState) {
26662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
267a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        if (outState == null) return null;
268a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        if (!mAwContents.saveState(outState)) return null;
269a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        return copyBackForwardList();
27046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
27146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
27246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
27346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean savePicture(Bundle b, File dest) {
2749405536501747e2d7b4fc46a33e5f0a1e7fd47acJonathan Dixon        // Intentional no-op: hidden method on WebView.
27546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
27646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
27746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
27846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
27946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean restorePicture(Bundle b, File src) {
2809405536501747e2d7b4fc46a33e5f0a1e7fd47acJonathan Dixon        // Intentional no-op: hidden method on WebView.
28146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
28246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
28346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
28446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
28546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebBackForwardList restoreState(Bundle inState) {
28662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
287a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        if (inState == null) return null;
288a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        if (!mAwContents.restoreState(inState)) return null;
289a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        return copyBackForwardList();
29046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
29146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
29246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
29346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void loadUrl(String url, Map<String, String> additionalHttpHeaders) {
29446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // TODO: We may actually want to do some sanity checks here (like filter about://chrome).
2956ef347a29d692df672aaf59ee4926a476288476aBen Murdoch
2966ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        // For backwards compatibility, apps targeting less than K will have JS URLs evaluated
2976ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        // directly and any result of the evaluation will not replace the current page content.
2986ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        // Matching Chrome behavior more closely; apps targetting >= K that load a JS URL will
2996ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        // have the result of that URL replace the content of the current page.
3006ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        final String JAVASCRIPT_SCHEME = "javascript:";
3019cd49cbc245e07e8e8c360fd22821a2918f99eaeChet Haase        if (mAppTargetSdkVersion < Build.VERSION_CODES.KITKAT &&
3026ef347a29d692df672aaf59ee4926a476288476aBen Murdoch                url.startsWith(JAVASCRIPT_SCHEME)) {
3033d52163e1c466860651414670c59762f5bdd269fTao Bai            mAwContents.evaluateJavaScriptEvenIfNotYetNavigated(
3043d52163e1c466860651414670c59762f5bdd269fTao Bai                    url.substring(JAVASCRIPT_SCHEME.length()));
3056ef347a29d692df672aaf59ee4926a476288476aBen Murdoch            return;
3066ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        }
3076ef347a29d692df672aaf59ee4926a476288476aBen Murdoch
30846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        LoadUrlParams params = new LoadUrlParams(url);
30946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (additionalHttpHeaders != null) params.setExtraHeaders(additionalHttpHeaders);
310a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        loadUrlOnUiThread(params);
31146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
31246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
31346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
31446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void loadUrl(String url) {
31546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        loadUrl(url, null);
31646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
31746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
31846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
31946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void postUrl(String url, byte[] postData) {
320b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        LoadUrlParams params = LoadUrlParams.createLoadHttpPostParams(url, postData);
321b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        Map<String,String> headers = new HashMap<String,String>();
322b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        headers.put("Content-Type", "application/x-www-form-urlencoded");
323b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        params.setExtraHeaders(headers);
324b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        loadUrlOnUiThread(params);
32546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
32646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
32719bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon    private static String fixupMimeType(String mimeType) {
32819bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        return TextUtils.isEmpty(mimeType) ? "text/html" : mimeType;
32919bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon    }
33019bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon
33119bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon    private static String fixupData(String data) {
33219bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        return TextUtils.isEmpty(data) ? "" : data;
33319bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon    }
33419bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon
33519bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon    private static String fixupBase(String url) {
33619bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        return TextUtils.isEmpty(url) ? "about:blank" : url;
33719bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon    }
33819bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon
33919bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon    private static String fixupHistory(String url) {
34019bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        return TextUtils.isEmpty(url) ? "about:blank" : url;
34119bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon    }
34219bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon
34346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private static boolean isBase64Encoded(String encoding) {
34446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return "base64".equals(encoding);
34546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
34646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
34746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
34846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void loadData(String data, String mimeType, String encoding) {
349a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        loadUrlOnUiThread(LoadUrlParams.createLoadDataParams(
35019bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon                fixupData(data), fixupMimeType(mimeType), isBase64Encoded(encoding)));
35146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
35246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
35346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
35446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding,
355efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            String historyUrl) {
35619bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        data = fixupData(data);
35719bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        mimeType = fixupMimeType(mimeType);
358efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch        LoadUrlParams loadUrlParams;
35919bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        baseUrl = fixupBase(baseUrl);
36019bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        historyUrl = fixupHistory(historyUrl);
361efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch
36219bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon        if (baseUrl.startsWith("data:")) {
363efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // For backwards compatibility with WebViewClassic, we use the value of |encoding|
364efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // as the charset, as long as it's not "base64".
365efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            boolean isBase64 = isBase64Encoded(encoding);
366efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            loadUrlParams = LoadUrlParams.createLoadDataParamsWithBaseUrl(
367efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                    data, mimeType, isBase64, baseUrl, historyUrl, isBase64 ? null : encoding);
368efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch        } else {
369efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // When loading data with a non-data: base URL, the classic WebView would effectively
370efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // "dump" that string of data into the WebView without going through regular URL
371efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // loading steps such as decoding URL-encoded entities. We achieve this same behavior by
372efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // base64 encoding the data that is passed here and then loading that as a data: URL.
373efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            try {
374efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                loadUrlParams = LoadUrlParams.createLoadDataParamsWithBaseUrl(
375efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                        Base64.encodeToString(data.getBytes("utf-8"), Base64.DEFAULT), mimeType,
376efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                        true, baseUrl, historyUrl, "utf-8");
377efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            } catch (java.io.UnsupportedEncodingException e) {
378efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                Log.wtf(TAG, "Unable to load data string " + data, e);
379efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                return;
380efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            }
381efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch        }
382a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        loadUrlOnUiThread(loadUrlParams);
383a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen    }
384a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen
385a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen    private void loadUrlOnUiThread(final LoadUrlParams loadUrlParams) {
386a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        if (ThreadUtils.runningOnUiThread()) {
387a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen            mAwContents.loadUrl(loadUrlParams);
388a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        } else {
389a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen            // Disallowed in WebView API for apps targetting a new SDK
390a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen            assert mAppTargetSdkVersion < Build.VERSION_CODES.JELLY_BEAN_MR2;
391a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
392a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen                @Override
393a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen                public void run() {
394a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen                    mAwContents.loadUrl(loadUrlParams);
395a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen                }
396a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen            });
397a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        }
39846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
39946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
4006ef347a29d692df672aaf59ee4926a476288476aBen Murdoch    public void evaluateJavaScript(String script, ValueCallback<String> resultCallback) {
40162389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
4026ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        mAwContents.evaluateJavaScript(script, resultCallback);
4036ef347a29d692df672aaf59ee4926a476288476aBen Murdoch    }
4046ef347a29d692df672aaf59ee4926a476288476aBen Murdoch
40546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
40646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void saveWebArchive(String filename) {
40762389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
40846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        saveWebArchive(filename, false, null);
40946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
41046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
41146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
41246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void saveWebArchive(String basename, boolean autoname, ValueCallback<String> callback) {
41362389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
41446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.saveWebArchive(basename, autoname, callback);
41546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
41646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
41746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
41846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void stopLoading() {
41919af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
42019af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
42119af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen                @Override
42219af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen                public void run() {
42319af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen                    stopLoading();
42419af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen                }
42519af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen            });
42619af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen            return;
42719af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen        }
42819af3f6395d08f8d2b106b8d205260d3194e1017Kristian Monsen
4297cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.stopLoading();
43046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
43146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
43246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
43346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void reload() {
43462389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
4357cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.reload();
43646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
43746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
43846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
43946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean canGoBack() {
44062389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
4417cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canGoBack();
44246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
44346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
44446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
44546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void goBack() {
44662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
4477cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.goBack();
44846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
44946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
45046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
45146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean canGoForward() {
45262389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
4537cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canGoForward();
45446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
45546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
45646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
45746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void goForward() {
45862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
4597cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.goForward();
46046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
46146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
46246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
46346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean canGoBackOrForward(int steps) {
46462389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
4657cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canGoBackOrForward(steps);
46646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
46746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
46846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
46946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void goBackOrForward(int steps) {
47062389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
4717cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.goBackOrForward(steps);
47246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
47346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
47446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
47546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean isPrivateBrowsingEnabled() {
4766d58f78e7fc0412a58b163559cb8e9c4af5c6fe1Jonathan Dixon        // Not supported in this WebView implementation.
47746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
47846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
47946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
48046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
48146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean pageUp(boolean top) {
48262389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
4837cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.pageUp(top);
48446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
48546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
48646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
48746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean pageDown(boolean bottom) {
48862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
4897cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.pageDown(bottom);
49046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
49146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
49246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
49346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearView() {
49462389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
49546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
49646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
49746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
49846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
49946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public Picture capturePicture() {
50062389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
5019c5a40623b62737244deb2d04a98830d7ffa8404Leandro Gracia Gil        return mAwContents.capturePicture();
50246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
50346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
50446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
505a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun    public void exportToPdf(ParcelFileDescriptor fd, PrintAttributes attributes,
506a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun            ValueCallback<Boolean> resultCallback, CancellationSignal cancellationSignal)
507a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun            throws java.io.IOException {
50862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
509a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        // We convert frameworks attributes to an android_webview specific print attributes
510a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        // so we do not tie upstreaming android_webview changes to installation of correct
511a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        // SDK to try bots.
512a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        if (attributes == null) {
513a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun            throw new IllegalArgumentException("attributes cannot be null");
514a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        }
515a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        if (attributes.getMediaSize() == null) {
516a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun            throw new  IllegalArgumentException("attributes must specify a media size");
517a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        }
518a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        if (attributes.getResolution() == null) {
519a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun            throw new IllegalArgumentException("attributes must specify print resolution");
520a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        }
521a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        if (attributes.getMargins() == null) {
522a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun            throw new IllegalArgumentException("attributes must specify margins");
523a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        }
524a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        AwPdfExportAttributes pdfAttributes = new AwPdfExportAttributes();
525a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        pdfAttributes.pageWidth = attributes.getMediaSize().getWidthMils();
526a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        pdfAttributes.pageHeight = attributes.getMediaSize().getHeightMils();
527a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        pdfAttributes.dpi = getPrintDpi(attributes);
528a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        pdfAttributes.leftMargin = attributes.getMargins().getLeftMils();
529a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        pdfAttributes.rightMargin = attributes.getMargins().getRightMils();
530a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        pdfAttributes.topMargin = attributes.getMargins().getTopMils();
531a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        pdfAttributes.bottomMargin = attributes.getMargins().getBottomMils();
532a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun
533a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        mAwContents.getPdfExporter().exportToPdf(fd, pdfAttributes, resultCallback,
53454a6e3d0cc566df6cec6807c0c03f05664de0a55Selim Gurun                cancellationSignal);
53549a1a6f9f27b63687edc1d98f842627d4719a327Selim Gurun    }
53649a1a6f9f27b63687edc1d98f842627d4719a327Selim Gurun
537a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun    private static int getPrintDpi(PrintAttributes attributes) {
538a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        // TODO(sgurun) android print attributes support horizontal and
539a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        // vertical DPI. Chrome has only one DPI. Revisit this.
540a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        int horizontalDpi = attributes.getResolution().getHorizontalDpi();
541a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        int verticalDpi = attributes.getResolution().getVerticalDpi();
542a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        if (horizontalDpi != verticalDpi) {
543a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun            Log.w(TAG, "Horizontal and vertical DPIs differ. Using horizontal DPI " +
544a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun                    " hDpi=" + horizontalDpi + " vDPI=" + verticalDpi);
545a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        }
546a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun        return horizontalDpi;
547a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun    }
548a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun
54949a1a6f9f27b63687edc1d98f842627d4719a327Selim Gurun    @Override
55046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public float getScale() {
551fa62be4cdc2630566ee179843393d4a6f9893966Kristian Monsen        // No checkThread() as it is mostly thread safe (workaround for b/10652991).
5523520eb778d668dc76ca4541c69abd568b9d02691Mikhail Naganov        return mAwContents.getScale();
55346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
55446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
55546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
55646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setInitialScale(int scaleInPercent) {
55762389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
5583520eb778d668dc76ca4541c69abd568b9d02691Mikhail Naganov        mAwContents.getSettings().setInitialPageScale(scaleInPercent);
55946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
56046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
56146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
56246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void invokeZoomPicker() {
56362389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
5647cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.invokeZoomPicker();
56546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
56646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
56746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
56846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebView.HitTestResult getHitTestResult() {
56962389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
570c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        AwContents.HitTestData data = mAwContents.getLastHitTestResult();
571c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mHitTestResult.setType(data.hitTestResultType);
572c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mHitTestResult.setExtra(data.hitTestResultExtraData);
573c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        return mHitTestResult;
57446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
57546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
57646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
57746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void requestFocusNodeHref(Message hrefMsg) {
57862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
579c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mAwContents.requestFocusNodeHref(hrefMsg);
58046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
58146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
58246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
58346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void requestImageRef(Message msg) {
58462389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
585c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mAwContents.requestImageRef(msg);
58646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
58746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
58846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
58946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public String getUrl() {
59062389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
5917cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        String url =  mAwContents.getUrl();
59246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (url == null || url.trim().isEmpty()) return null;
59346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return url;
59446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
59546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
59646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
59746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public String getOriginalUrl() {
59862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
59946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        String url =  mAwContents.getOriginalUrl();
60046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (url == null || url.trim().isEmpty()) return null;
60146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return url;
60246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
60346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
60446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
60546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public String getTitle() {
60662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
6077cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.getTitle();
60846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
60946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
61046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
61146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public Bitmap getFavicon() {
61262389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
6139405536501747e2d7b4fc46a33e5f0a1e7fd47acJonathan Dixon        return mAwContents.getFavicon();
61446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
61546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
61646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
61746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public String getTouchIconUrl() {
6189405536501747e2d7b4fc46a33e5f0a1e7fd47acJonathan Dixon        // Intentional no-op: hidden method on WebView.
61946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return null;
62046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
62146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
62246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
62346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int getProgress() {
624c0c86c037ea697da375ae28c543cae9b050d6b68Jonathan Dixon        // No checkThread() because the value is cached java side (workaround for b/10533304).
62546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mAwContents.getMostRecentProgress();
62646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
62746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
62846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
62946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int getContentHeight() {
63094a8e6a6d7d1b2a6b3718eb91956403ef6b03d9cKristian Monsen        // No checkThread() as it is mostly thread safe (workaround for b/10594869).
6316b5f3d1546ae2a9c712cde60c54ec027582bc4e6Martin Kosiba        return mAwContents.getContentHeightCss();
63246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
63346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
63446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
63546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int getContentWidth() {
63662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
6376b5f3d1546ae2a9c712cde60c54ec027582bc4e6Martin Kosiba        return mAwContents.getContentWidthCss();
63846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
63946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
64046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
64146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void pauseTimers() {
64262389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
643531e68a2b50a5e542eeede13907f29e463a99ebfBen Murdoch        mAwContents.pauseTimers();
64446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
64546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
64646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
64746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void resumeTimers() {
64862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
649531e68a2b50a5e542eeede13907f29e463a99ebfBen Murdoch        mAwContents.resumeTimers();
65046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
65146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
65246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
65346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onPause() {
65462389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
6551cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onPause();
65646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
65746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
65846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
65946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onResume() {
66062389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
6611cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onResume();
66246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
66346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
66446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
66546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean isPaused() {
66662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
6671cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        return mAwContents.isPaused();
66846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
66946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
67046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
67146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void freeMemory() {
67262389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
673d43c55dd91cf7dd1bcd18d01e16acd5e55de0471Ben Murdoch        // Intentional no-op. Memory is managed automatically by Chromium.
67446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
67546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
67646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
67746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearCache(boolean includeDiskFiles) {
67862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
67946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.clearCache(includeDiskFiles);
68046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
68146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
682bbef8de5696d48fc6458c926026fc524a62814e1Selim Gurun    /**
683bbef8de5696d48fc6458c926026fc524a62814e1Selim Gurun     * This is a poorly named method, but we keep it for historical reasons.
684bbef8de5696d48fc6458c926026fc524a62814e1Selim Gurun     */
68546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
68646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearFormData() {
68762389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
688bbef8de5696d48fc6458c926026fc524a62814e1Selim Gurun        mAwContents.hideAutofillPopup();
68946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
69046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
69146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
69246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearHistory() {
69362389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
6947cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.clearHistory();
69546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
69646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
69746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
69846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearSslPreferences() {
69962389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
7007cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.clearSslPreferences();
70146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
70246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
70346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
70446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebBackForwardList copyBackForwardList() {
70562389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
70608a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu        return new WebBackForwardListChromium(
7077cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba                mAwContents.getNavigationHistory());
70846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
70946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
71046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
71146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setFindListener(WebView.FindListener listener) {
71262389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
71346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mContentsClientAdapter.setFindListener(listener);
71446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
71546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
71646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
71746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void findNext(boolean forwards) {
71862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
71946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.findNext(forwards);
72046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
72146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
72246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
72346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int findAll(String searchString) {
72462389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
725f37548d6d8e2a73c65d675a26706a38f52960800Jonathan Dixon        mAwContents.findAllAsync(searchString);
726f37548d6d8e2a73c65d675a26706a38f52960800Jonathan Dixon        return 0;
72746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
72846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
72946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
73046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void findAllAsync(String searchString) {
73162389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
73246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.findAllAsync(searchString);
73346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
73446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
73546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
73646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean showFindDialog(String text, boolean showIme) {
73762389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
7386d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        if (mWebView.getParent() == null) {
7396d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            return false;
7406d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        }
7416d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch
7426d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        FindActionModeCallback findAction = new FindActionModeCallback(mWebView.getContext());
7436d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        if (findAction == null) {
7446d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            return false;
7456d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        }
7466d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch
7476d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        mWebView.startActionMode(findAction);
7486d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        findAction.setWebView(mWebView);
7496d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        if (showIme) {
7506d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            findAction.showSoftInput();
7516d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        }
7526d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch
7536d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        if (text != null) {
7546d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            findAction.setText(text);
7556d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            findAction.findAll();
7566d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        }
7576d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch
7586d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        return true;
75946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
76046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
7616d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch    @Override
762fde8dae44f74be3de69ce6dd07b0023279b485a0Ben Murdoch    public void notifyFindDialogDismissed() {
76362389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
7646d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        clearMatches();
765fde8dae44f74be3de69ce6dd07b0023279b485a0Ben Murdoch    }
766fde8dae44f74be3de69ce6dd07b0023279b485a0Ben Murdoch
76746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
76846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearMatches() {
76962389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
77046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.clearMatches();
77146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
77246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
77346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
77446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void documentHasImages(Message response) {
77562389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
77646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.documentHasImages(response);
77746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
77846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
77946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
78046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setWebViewClient(WebViewClient client) {
78162389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
78246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mContentsClientAdapter.setWebViewClient(client);
78346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
78446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
78546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
78646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setDownloadListener(DownloadListener listener) {
78762389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
7884320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu        mContentsClientAdapter.setDownloadListener(listener);
78946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
79046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
79146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
79246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setWebChromeClient(WebChromeClient client) {
79362389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
79446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mContentsClientAdapter.setWebChromeClient(client);
79546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
79646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
79746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
79846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setPictureListener(WebView.PictureListener listener) {
79962389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
80046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mContentsClientAdapter.setPictureListener(listener);
8019c5a40623b62737244deb2d04a98830d7ffa8404Leandro Gracia Gil        mAwContents.enableOnNewPicture(listener != null,
8026ef347a29d692df672aaf59ee4926a476288476aBen Murdoch                mAppTargetSdkVersion >= Build.VERSION_CODES.JELLY_BEAN_MR2);
80346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
80446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
80546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
80646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void addJavascriptInterface(Object obj, String interfaceName) {
80762389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
808ea844f60b1b559788566fe6e004b1eeca53a8039Jonathan Dixon        Class<? extends Annotation> requiredAnnotation = null;
8096ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        if (mAppTargetSdkVersion >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
8107db34d3dcaac936566f912e1b0b21f3f103029ffJonathan Dixon           requiredAnnotation = JavascriptInterface.class;
8117db34d3dcaac936566f912e1b0b21f3f103029ffJonathan Dixon        }
8127cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.addPossiblyUnsafeJavascriptInterface(obj, interfaceName, requiredAnnotation);
81346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
81446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
81546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
81646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void removeJavascriptInterface(String interfaceName) {
81762389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
8187cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.removeJavascriptInterface(interfaceName);
81946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
82046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
82146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
82246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebSettings getSettings() {
82346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mWebSettings;
82446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
82546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
82646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
82746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setMapTrackballToArrowKeys(boolean setMap) {
82862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
82946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // This is a deprecated API: intentional no-op.
83046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
83146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
83246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
83346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void flingScroll(int vx, int vy) {
83462389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
8357cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.flingScroll(vx, vy);
83646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
83746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
83846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
83946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public View getZoomControls() {
84062389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
841e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon        // This was deprecated in 2009 and hidden in JB MR1, so just provide the minimum needed
842e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon        // to stop very out-dated applications from crashing.
843e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon        Log.w(TAG, "WebView doesn't support getZoomControls");
844420c0da3a4e06e1ac5574091e7c9c286ef012369Mikhail Naganov        return mAwContents.getSettings().supportZoom() ? new View(mWebView.getContext()) : null;
84546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
84646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
84746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
84846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean canZoomIn() {
84962389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
8507cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canZoomIn();
85146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
85246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
85346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
85446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean canZoomOut() {
85562389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
8567cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canZoomOut();
85746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
85846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
85946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
86046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean zoomIn() {
86162389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
8627cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.zoomIn();
86346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
86446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
86546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
86646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean zoomOut() {
86762389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
8687cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.zoomOut();
86946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
87046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
871d2dcef4d9edfb7af7abff85b0867c3d6a363feb7Jonathan Dixon    @Override
87246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void dumpViewHierarchyWithProperties(BufferedWriter out, int level) {
87346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
87446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
87546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
876d2dcef4d9edfb7af7abff85b0867c3d6a363feb7Jonathan Dixon    @Override
87746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public View findHierarchyView(String className, int hashCode) {
87846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
87946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return null;
88046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
88146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
88246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebViewProvider glue methods ---------------------------------------------------------------
88346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
88446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
88557b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen    // This needs to be kept thread safe!
88646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebViewProvider.ViewDelegate getViewDelegate() {
88746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return this;
88846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
88946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
89046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
89146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebViewProvider.ScrollDelegate getScrollDelegate() {
89262389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
89346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return this;
89446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
89546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
89646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
89746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebViewProvider.ViewDelegate implementation ------------------------------------------------
89846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
899a7fba41c5661cb61b41c8a4ff2d69e5153666f7fBen Murdoch    // TODO: remove from WebViewProvider and use default implementation from
900a7fba41c5661cb61b41c8a4ff2d69e5153666f7fBen Murdoch    // ViewGroup.
901a7fba41c5661cb61b41c8a4ff2d69e5153666f7fBen Murdoch    // @Override
90246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean shouldDelayChildPressedState() {
90362389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
904a7fba41c5661cb61b41c8a4ff2d69e5153666f7fBen Murdoch        return true;
90546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
90646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
9075c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch//    @Override
9085c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch    public AccessibilityNodeProvider getAccessibilityNodeProvider() {
90962389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
9105c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch        return mAwContents.getAccessibilityNodeProvider();
9115c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch    }
9125c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch
91346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
91446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
91562389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
9167cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.onInitializeAccessibilityNodeInfo(info);
91746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
91846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
91946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
92046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
92162389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
9227cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.onInitializeAccessibilityEvent(event);
92346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
92446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
92546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
92646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean performAccessibilityAction(int action, Bundle arguments) {
92762389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
928b7b706b2ed5cbb77dd690f5405b626a429989714Ben Murdoch        if (mAwContents.supportsAccessibilityAction(action)) {
929b7b706b2ed5cbb77dd690f5405b626a429989714Ben Murdoch            return mAwContents.performAccessibilityAction(action, arguments);
930b7b706b2ed5cbb77dd690f5405b626a429989714Ben Murdoch        }
931b7b706b2ed5cbb77dd690f5405b626a429989714Ben Murdoch        return mWebViewPrivate.super_performAccessibilityAction(action, arguments);
93246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
93346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
93446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
93546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setOverScrollMode(int mode) {
93662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
9372841152693d0410f8e8c309aae514329f008a612Martin Kosiba        // This gets called from the android.view.View c'tor that WebView inherits from. This
9382841152693d0410f8e8c309aae514329f008a612Martin Kosiba        // causes the method to be called when mAwContents == null.
9392841152693d0410f8e8c309aae514329f008a612Martin Kosiba        // It's safe to ignore these calls however since AwContents will read the current value of
9402841152693d0410f8e8c309aae514329f008a612Martin Kosiba        // this setting when it's created.
941ab5398debe64d34306b0f709a93d840078ae181dMartin Kosiba        if (mAwContents != null) {
942ab5398debe64d34306b0f709a93d840078ae181dMartin Kosiba            mAwContents.setOverScrollMode(mode);
943ab5398debe64d34306b0f709a93d840078ae181dMartin Kosiba        }
94446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
94546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
94646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
94746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setScrollBarStyle(int style) {
94862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
949bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        mAwContents.setScrollBarStyle(style);
95046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
95146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
95246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
95346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onDrawVerticalScrollBar(Canvas canvas, Drawable scrollBar,
95446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                                        int l, int t, int r, int b) {
95562389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
956bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        // WebViewClassic was overriding this method to handle rubberband over-scroll. Since
957bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        // WebViewChromium doesn't support that the vanilla implementation of this method can be
958bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        // used.
959bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        mWebViewPrivate.super_onDrawVerticalScrollBar(canvas, scrollBar, l, t, r, b);
96046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
96146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
96246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
96346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
96462389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
9653951fbadf5157dd3fe73decc879f9b763e780b09Martin Kosiba        mAwContents.onContainerViewOverScrolled(scrollX, scrollY, clampedX, clampedY);
96646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
96746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
96846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
96946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onWindowVisibilityChanged(int visibility) {
97062389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
9711cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onWindowVisibilityChanged(visibility);
97246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
97346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
97446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
975c8523c99833f364c64744d60e408510fb83b998bKristian Monsen    public void onDraw(final Canvas canvas) {
976c8523c99833f364c64744d60e408510fb83b998bKristian Monsen        if (!ThreadUtils.runningOnUiThread()) {
977c8523c99833f364c64744d60e408510fb83b998bKristian Monsen            ThreadUtils.runOnUiThreadBlocking(new Runnable() {
978c8523c99833f364c64744d60e408510fb83b998bKristian Monsen                @Override
979c8523c99833f364c64744d60e408510fb83b998bKristian Monsen                public void run() {
980c8523c99833f364c64744d60e408510fb83b998bKristian Monsen                    onDraw(canvas);
981c8523c99833f364c64744d60e408510fb83b998bKristian Monsen                }
982c8523c99833f364c64744d60e408510fb83b998bKristian Monsen            });
983c8523c99833f364c64744d60e408510fb83b998bKristian Monsen            return;
984c8523c99833f364c64744d60e408510fb83b998bKristian Monsen        }
9857ab33360e331e04f515d532064670e210d174a7aTao Bai        mAwContents.onDraw(canvas);
98646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
98746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
98846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
98946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setLayoutParams(ViewGroup.LayoutParams layoutParams) {
99062389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
99146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // TODO: This is the minimum implementation for HTMLViewer
99246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // bringup. Likely will need to go up to ContentViewCore for
99346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // a complete implementation.
99446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewPrivate.super_setLayoutParams(layoutParams);
99546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
99646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
99746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
99846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean performLongClick() {
99962389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
1000decc147cebc8f73d355c024d92c60d3f727cab31Bo Liu        return mWebViewPrivate.super_performLongClick();
100146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
100246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
100346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
100446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onConfigurationChanged(Configuration newConfig) {
100562389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
10061cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onConfigurationChanged(newConfig);
100746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
100846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
100946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
101046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
101162389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
10127cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.onCreateInputConnection(outAttrs);
101346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
101446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
101546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
101646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
101762389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
101846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
101946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
102046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
102146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
102246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
102346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onKeyDown(int keyCode, KeyEvent event) {
102462389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
102546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
102646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
102746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
102846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
102946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
103046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onKeyUp(int keyCode, KeyEvent event) {
103162389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
10327cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.onKeyUp(keyCode, event);
103346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
103446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
103546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
103646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onAttachedToWindow() {
103762389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
10381cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onAttachedToWindow();
103946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
104046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
104146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
104246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onDetachedFromWindow() {
104362389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
10441cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onDetachedFromWindow();
1045a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon        if (mGLfunctor != null) {
1046a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon            mGLfunctor.detach();
1047a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon        }
104846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
104946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
105046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
105146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onVisibilityChanged(View changedView, int visibility) {
105262389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
1053c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba        // The AwContents will find out the container view visibility before the first draw so we
1054c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba        // can safely ignore onVisibilityChanged callbacks that happen before init().
1055c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba        if (mAwContents != null) {
1056c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba            mAwContents.onVisibilityChanged(changedView, visibility);
1057c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba        }
105846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
105946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
106046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
106146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onWindowFocusChanged(boolean hasWindowFocus) {
106262389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
10631cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onWindowFocusChanged(hasWindowFocus);
106446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
106546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
106646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
106746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
106862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
10691cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onFocusChanged(focused, direction, previouslyFocusedRect);
107046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
107146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
107246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
107346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean setFrame(int left, int top, int right, int bottom) {
10741cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        // TODO(joth): This is the minimum implementation for initial
10751cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        // bringup. Likely will need to go up to AwContents for a complete
10761cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        // implementation, e.g. setting the compositor visible region (to
10771cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        // avoid painting tiles that are offscreen due to the view's position).
107862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
107946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mWebViewPrivate.super_setFrame(left, top, right, bottom);
108046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
108146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
108246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
108346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onSizeChanged(int w, int h, int ow, int oh) {
108462389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
10851cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onSizeChanged(w, h, ow, oh);
108646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
108746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
108846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
108946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onScrollChanged(int l, int t, int oldl, int oldt) {
109062389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
109146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
109246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
109346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
109446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean dispatchKeyEvent(KeyEvent event) {
109562389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
10967cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.dispatchKeyEvent(event);
109746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
109846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
109946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
110046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onTouchEvent(MotionEvent ev) {
110162389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
1102c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        return mAwContents.onTouchEvent(ev);
110346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
110446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
110546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
110646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onHoverEvent(MotionEvent event) {
110762389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
1108c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        return mAwContents.onHoverEvent(event);
110946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
111046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
111146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
111246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onGenericMotionEvent(MotionEvent event) {
111362389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
1114c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        return mAwContents.onGenericMotionEvent(event);
111546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
111646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
111746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
111846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onTrackballEvent(MotionEvent ev) {
111962389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
112046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // Trackball event not handled, which eventually gets converted to DPAD keyevents
112146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
112246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
112346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
112446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
112546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean requestFocus(int direction, Rect previouslyFocusedRect) {
112662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
11274cee3bf50c125a52a49323aa999f4b619fa18c10Ben Murdoch        mAwContents.requestFocus();
112846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mWebViewPrivate.super_requestFocus(direction, previouslyFocusedRect);
112946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
113046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
113146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
113246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
113362389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
1134d7bf6ab0cd8cc4005b112e4358eb797bb178a85fMarcin Kosiba        mAwContents.onMeasure(widthMeasureSpec, heightMeasureSpec);
113546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
113646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
113746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
113846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean requestChildRectangleOnScreen(View child, Rect rect, boolean immediate) {
113962389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
11401f76368786ae12898311d148b0057403db2fb36aMartin Kosiba        return mAwContents.requestChildRectangleOnScreen(child, rect, immediate);
114146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
114246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
114346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
114457b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen    public void setBackgroundColor(final int color) {
114557b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen        if (ThreadUtils.runningOnUiThread()) {
114657b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            mAwContents.setBackgroundColor(color);
114757b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen        } else {
114857b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            // Disallowed in WebView API for apps targetting a new SDK
114957b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            assert mAppTargetSdkVersion < Build.VERSION_CODES.JELLY_BEAN_MR2;
115057b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
115157b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                @Override
115257b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                public void run() {
115357b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                    mAwContents.setBackgroundColor(color);
115457b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen                }
115557b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen            });
115657b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen        }
115746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
115846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
115946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
116046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setLayerType(int layerType, Paint paint) {
116162389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
116246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
116346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
116446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
11650b528e4924a7c14687181185bc66173ad18f00eaLeandro Gracia Gil    @Override
116646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void preDispatchDraw(Canvas canvas) {
116762389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
11680b528e4924a7c14687181185bc66173ad18f00eaLeandro Gracia Gil        // TODO(leandrogracia): remove this method from WebViewProvider if we think
11690b528e4924a7c14687181185bc66173ad18f00eaLeandro Gracia Gil        // we won't need it again.
117046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
117146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
117246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebViewProvider.ScrollDelegate implementation ----------------------------------------------
117346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
117446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
117546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeHorizontalScrollRange() {
117662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
11777cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeHorizontalScrollRange();
117846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
117946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
118046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
118146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeHorizontalScrollOffset() {
118262389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
11837cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeHorizontalScrollOffset();
118446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
118546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
118646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
118746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeVerticalScrollRange() {
118862389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
11897cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeVerticalScrollRange();
119046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
119146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
119246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
119346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeVerticalScrollOffset() {
119462389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
11957cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeVerticalScrollOffset();
119646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
119746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
119846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
119946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeVerticalScrollExtent() {
120062389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
12017cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeVerticalScrollExtent();
120246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
120346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
120446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
120546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void computeScroll() {
120662389e2d66a99e936652092333782947e363241dKristian Monsen        checkThread();
12072a120ba09921dbb1e8354ecbc4a6e063ec891101Martin Kosiba        mAwContents.computeScroll();
120846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
120946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
12104702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba    // AwContents.InternalAccessDelegate implementation --------------------------------------
12114702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba    private class InternalAccessAdapter implements AwContents.InternalAccessDelegate {
121246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
121346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean drawChild(Canvas arg0, View arg1, long arg2) {
121446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
121546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
121646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
121746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
121846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
121946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_onKeyUp(int arg0, KeyEvent arg1) {
122046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
122146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
122246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
122346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
122446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
122546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_dispatchKeyEventPreIme(KeyEvent arg0) {
122646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
122746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
122846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
122946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
123046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
123146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_dispatchKeyEvent(KeyEvent event) {
123246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return mWebViewPrivate.super_dispatchKeyEvent(event);
123346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
123446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
123546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
123646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_onGenericMotionEvent(MotionEvent arg0) {
123746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
123846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
123946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
124046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
124146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
124246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public void super_onConfigurationChanged(Configuration arg0) {
124346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
124446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
124546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
1246bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba        @Override
12470088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba        public int super_getScrollBarStyle() {
12480088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba            return mWebViewPrivate.super_getScrollBarStyle();
12490088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba        }
12500088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba
125146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
125246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean awakenScrollBars() {
125346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mWebViewPrivate.awakenScrollBars(0);
125446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // TODO: modify the WebView.PrivateAccess to provide a return value.
125546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return true;
125646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
125746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
125846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
125946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_awakenScrollBars(int arg0, boolean arg1) {
126046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // TODO: need method on WebView.PrivateAccess?
126146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
126246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
126346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
12644702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba
1265d7bf6ab0cd8cc4005b112e4358eb797bb178a85fMarcin Kosiba        @Override
12662a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        public void onScrollChanged(int l, int t, int oldl, int oldt) {
12672a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.setScrollXRaw(l);
12682a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.setScrollYRaw(t);
12692a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.onScrollChanged(l, t, oldl, oldt);
12702a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        }
12712a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba
12723951fbadf5157dd3fe73decc879f9b763e780b09Martin Kosiba        @Override
12732a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        public void overScrollBy(int deltaX, int deltaY,
12742a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            int scrollX, int scrollY,
12752a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            int scrollRangeX, int scrollRangeY,
12762a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            int maxOverScrollX, int maxOverScrollY,
12772a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            boolean isTouchEvent) {
12782a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.overScrollBy(deltaX, deltaY, scrollX, scrollY,
12792a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba                    scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);
12802a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        }
12812a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba
12823951fbadf5157dd3fe73decc879f9b763e780b09Martin Kosiba        @Override
12832a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        public void super_scrollTo(int scrollX, int scrollY) {
12842a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.super_scrollTo(scrollX, scrollY);
12852a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        }
12862a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba
12872a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        @Override
12884702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba        public void setMeasuredDimension(int measuredWidth, int measuredHeight) {
12894702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba            mWebViewPrivate.setMeasuredDimension(measuredWidth, measuredHeight);
12904702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba        }
129151f7cf16cd02f14050bb723175a2a57570e8486dTao Bai
12927ab33360e331e04f515d532064670e210d174a7aTao Bai        @Override
129351f7cf16cd02f14050bb723175a2a57570e8486dTao Bai        public boolean requestDrawGL(Canvas canvas) {
12947ab33360e331e04f515d532064670e210d174a7aTao Bai            if (mGLfunctor == null) {
12957ab33360e331e04f515d532064670e210d174a7aTao Bai                mGLfunctor = new DrawGLFunctor(mAwContents.getAwDrawGLViewContext());
12967ab33360e331e04f515d532064670e210d174a7aTao Bai            }
129751f7cf16cd02f14050bb723175a2a57570e8486dTao Bai            return mGLfunctor.requestDrawGL((HardwareCanvas)canvas, mWebView.getViewRootImpl());
129851f7cf16cd02f14050bb723175a2a57570e8486dTao Bai        }
129946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
130046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)}
1301