WebViewChromium.java revision b8281877c710018a3bc8066be17b1e11822be015
146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)/*
246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * Copyright (C) 2012 The Android Open Source Project
346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) *
446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License");
546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * you may not use this file except in compliance with the License.
646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * You may obtain a copy of the License at
746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) *
846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) *      http://www.apache.org/licenses/LICENSE-2.0
946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) *
1046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * Unless required by applicable law or agreed to in writing, software
1146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS,
1246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * See the License for the specific language governing permissions and
1446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * limitations under the License.
1546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */
1646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
1746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)package com.android.webview.chromium;
1846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
1946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.content.res.Configuration;
2046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.graphics.Bitmap;
2146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.graphics.Canvas;
2246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.graphics.Paint;
2346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.graphics.Picture;
2446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.graphics.Rect;
2546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.graphics.drawable.Drawable;
2646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.net.http.SslCertificate;
2746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Build;
2846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Bundle;
2946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Message;
30efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdochimport android.util.Base64;
31e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixonimport android.util.Log;
32a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixonimport android.view.HardwareCanvas;
3346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.KeyEvent;
3446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.MotionEvent;
3546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.View;
363411fdf2737f3f0dd0c1fa20045356cf89f34eddBo Liuimport android.view.View.MeasureSpec;
3746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.ViewGroup;
3846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.accessibility.AccessibilityEvent;
3946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.accessibility.AccessibilityNodeInfo;
405c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdochimport android.view.accessibility.AccessibilityNodeProvider;
4146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.inputmethod.EditorInfo;
4246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.inputmethod.InputConnection;
4346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.DownloadListener;
446d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdochimport android.webkit.FindActionModeCallback;
457db34d3dcaac936566f912e1b0b21f3f103029ffJonathan Dixonimport android.webkit.JavascriptInterface;
4646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.ValueCallback;
4746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebBackForwardList;
4846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebChromeClient;
4946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebSettings;
5046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebView;
5146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewClient;
5246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewProvider;
5346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
54aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsenimport org.chromium.android_webview.AwBrowserContext;
5546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.AwContents;
56a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsenimport org.chromium.base.ThreadUtils;
5746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.LoadUrlParams;
5846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.net.NetworkChangeNotifier;
5946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
6046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.io.BufferedWriter;
6146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.io.File;
62ea844f60b1b559788566fe6e004b1eeca53a8039Jonathan Dixonimport java.lang.annotation.Annotation;
63b8281877c710018a3bc8066be17b1e11822be015Selim Gurunimport java.util.HashMap;
6446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.util.Map;
6546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
6646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)/**
6746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * This class is the delegate to which WebViewProxy forwards all API calls.
6846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) *
691cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon * Most of the actual functionality is implemented by AwContents (or ContentViewCore within
701cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon * it). This class also contains WebView-specific APIs that require the creation of other
711cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon * adapters (otherwise org.chromium.content would depend on the webview.chromium package)
721cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon * and a small set of no-op deprecated APIs.
7346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */
7446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)class WebViewChromium implements WebViewProvider,
7546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)          WebViewProvider.ScrollDelegate, WebViewProvider.ViewDelegate {
76e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon
77e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon    private static final String TAG = WebViewChromium.class.getSimpleName();
78e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon
7946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The WebView that this WebViewChromium is the provider for.
8046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    WebView mWebView;
8146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // Lets us access protected View-derived methods on the WebView instance we're backing.
8246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    WebView.PrivateAccess mWebViewPrivate;
8346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The client adapter class.
8446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebViewContentsClientAdapter mContentsClientAdapter;
8546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
8646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // Variables for functionality provided by this adapter ---------------------------------------
8746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebSettings adapter, lazily initialized in the getter
8846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebSettings mWebSettings;
893949435b480cb71106f65b237025da359cf8a8caBen Murdoch    // The WebView wrapper for ContentViewCore and required browser compontents.
9046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private AwContents mAwContents;
91a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    // Non-null if this webview is using the GL accelerated draw path.
92a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon    private DrawGLFunctor mGLfunctor;
9346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
94aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen    private AwBrowserContext mBrowserContext;
95aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen
96c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu    private final WebView.HitTestResult mHitTestResult;
97c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu
986ef347a29d692df672aaf59ee4926a476288476aBen Murdoch    private final int mAppTargetSdkVersion;
996ef347a29d692df672aaf59ee4926a476288476aBen Murdoch
100aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen    public WebViewChromium(WebView webView, WebView.PrivateAccess webViewPrivate,
101aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen            AwBrowserContext browserContext) {
10246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebView = webView;
10346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewPrivate = webViewPrivate;
104c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mHitTestResult = new WebView.HitTestResult();
105aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen        mBrowserContext = browserContext;
1066ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        mAppTargetSdkVersion = mWebView.getContext().getApplicationInfo().targetSdkVersion;
10746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
10846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
1091ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch    static void completeWindowCreation(WebView parent, WebView child) {
1101ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch        AwContents parentContents = ((WebViewChromium) parent.getWebViewProvider()).mAwContents;
111bbfef40e5fc625f4821f012fae7f16468b7308cfJonathan Dixon        AwContents childContents =
112bbfef40e5fc625f4821f012fae7f16468b7308cfJonathan Dixon                child == null ? null : ((WebViewChromium) child.getWebViewProvider()).mAwContents;
1131ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch        parentContents.supplyContentsForPopup(childContents);
11446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
11546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
11646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebViewProvider methods --------------------------------------------------------------------
11746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
11846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
11946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void init(Map<String, Object> javaScriptInterfaces, boolean privateBrowsing) {
1204dcabaef9151384b571327b62234409b31caef38Jonathan Dixon        // BUG=6790250 |javaScriptInterfaces| was only ever used by the obsolete DumpRenderTree
1214dcabaef9151384b571327b62234409b31caef38Jonathan Dixon        // so is ignored. TODO: remove it from WebViewProvider.
12246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        final boolean isAccessFromFileURLsGrantedByDefault =
1236ef347a29d692df672aaf59ee4926a476288476aBen Murdoch                 mAppTargetSdkVersion < Build.VERSION_CODES.JELLY_BEAN;
12446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mContentsClientAdapter = new WebViewContentsClientAdapter(mWebView);
125aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen        mAwContents = new AwContents(mBrowserContext, mWebView, new InternalAccessAdapter(),
126aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen                mContentsClientAdapter, isAccessFromFileURLsGrantedByDefault);
1274dcabaef9151384b571327b62234409b31caef38Jonathan Dixon
1284dcabaef9151384b571327b62234409b31caef38Jonathan Dixon        if (privateBrowsing) {
1294dcabaef9151384b571327b62234409b31caef38Jonathan Dixon            final String msg = "Private browsing is not supported in WebView.";
1306ef347a29d692df672aaf59ee4926a476288476aBen Murdoch            if (mAppTargetSdkVersion >= Build.VERSION_CODES.KEY_LIME_PIE) {
1314dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                throw new IllegalArgumentException(msg);
1324dcabaef9151384b571327b62234409b31caef38Jonathan Dixon            } else {
1334dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                Log.w(TAG, msg);
1344dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                // Intentionally irreversibly disable the webview instance, so that private
1354dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                // user data cannot leak through misuse of a non-privateBrowing WebView instance.
1364dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                // Can't just null out mAwContents as we never null-check it before use.
1374dcabaef9151384b571327b62234409b31caef38Jonathan Dixon                mAwContents.destroy();
1384dcabaef9151384b571327b62234409b31caef38Jonathan Dixon            }
1394dcabaef9151384b571327b62234409b31caef38Jonathan Dixon        }
1404dcabaef9151384b571327b62234409b31caef38Jonathan Dixon
14146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
14246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
14346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
14446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setHorizontalScrollbarOverlay(boolean overlay) {
14546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
14646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
14746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
14846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
14946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setVerticalScrollbarOverlay(boolean overlay) {
15046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
15146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
15246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
15346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
15446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean overlayHorizontalScrollbar() {
15546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
15646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
15746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
15846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
15946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
16046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean overlayVerticalScrollbar() {
16146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
16246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
16346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
16446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
16546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
16646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int getVisibleTitleHeight() {
16746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // This is deprecated in WebView and should always return 0.
16846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return 0;
16946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
17046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
17146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
17246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public SslCertificate getCertificate() {
17346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mAwContents.getCertificate();
17446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
17546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
17646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
17746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setCertificate(SslCertificate certificate) {
17846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
17946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
18046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
18146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
18246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void savePassword(String host, String username, String password) {
183adc6c4d74c77a617100bdfeb174ab0c314b24ea8Selim Gurun        // This is a deprecated API: intentional no-op.
18446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
18546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
18646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
18746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setHttpAuthUsernamePassword(String host, String realm, String username,
18846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                                            String password) {
18946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.setHttpAuthUsernamePassword(host, realm, username, password);
19046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
19146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
19246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
19346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public String[] getHttpAuthUsernamePassword(String host, String realm) {
19446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mAwContents.getHttpAuthUsernamePassword(host, realm);
19546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
19646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
19746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
19846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void destroy() {
1993949435b480cb71106f65b237025da359cf8a8caBen Murdoch        mAwContents.destroy();
200a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon        if (mGLfunctor != null) {
201a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon            mGLfunctor.destroy();
202a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon            mGLfunctor = null;
203a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon        }
20446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
20546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
20646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
20746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setNetworkAvailable(boolean networkUp) {
20846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        NetworkChangeNotifier.forceConnectivityState(networkUp);
20946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
21046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
21146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
21246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebBackForwardList saveState(Bundle outState) {
213a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        if (outState == null) return null;
214a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        if (!mAwContents.saveState(outState)) return null;
215a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        return copyBackForwardList();
21646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
21746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
21846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
21946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean savePicture(Bundle b, File dest) {
2209405536501747e2d7b4fc46a33e5f0a1e7fd47acJonathan Dixon        // Intentional no-op: hidden method on WebView.
22146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
22246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
22346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
22446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
22546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean restorePicture(Bundle b, File src) {
2269405536501747e2d7b4fc46a33e5f0a1e7fd47acJonathan Dixon        // Intentional no-op: hidden method on WebView.
22746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
22846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
22946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
23046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
23146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebBackForwardList restoreState(Bundle inState) {
232a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        if (inState == null) return null;
233a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        if (!mAwContents.restoreState(inState)) return null;
234a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu        return copyBackForwardList();
23546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
23646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
23746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
23846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void loadUrl(String url, Map<String, String> additionalHttpHeaders) {
23946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // TODO: We may actually want to do some sanity checks here (like filter about://chrome).
2406ef347a29d692df672aaf59ee4926a476288476aBen Murdoch
2416ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        // For backwards compatibility, apps targeting less than K will have JS URLs evaluated
2426ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        // directly and any result of the evaluation will not replace the current page content.
2436ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        // Matching Chrome behavior more closely; apps targetting >= K that load a JS URL will
2446ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        // have the result of that URL replace the content of the current page.
2456ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        final String JAVASCRIPT_SCHEME = "javascript:";
2466ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        if (mAppTargetSdkVersion < Build.VERSION_CODES.KEY_LIME_PIE &&
2476ef347a29d692df672aaf59ee4926a476288476aBen Murdoch                url.startsWith(JAVASCRIPT_SCHEME)) {
2486ef347a29d692df672aaf59ee4926a476288476aBen Murdoch            evaluateJavaScript(url.substring(JAVASCRIPT_SCHEME.length()), null);
2496ef347a29d692df672aaf59ee4926a476288476aBen Murdoch            return;
2506ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        }
2516ef347a29d692df672aaf59ee4926a476288476aBen Murdoch
25246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        LoadUrlParams params = new LoadUrlParams(url);
25346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (additionalHttpHeaders != null) params.setExtraHeaders(additionalHttpHeaders);
254a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        loadUrlOnUiThread(params);
25546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
25646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
25746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
25846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void loadUrl(String url) {
25946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        loadUrl(url, null);
26046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
26146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
26246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
26346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void postUrl(String url, byte[] postData) {
264b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        LoadUrlParams params = LoadUrlParams.createLoadHttpPostParams(url, postData);
265b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        Map<String,String> headers = new HashMap<String,String>();
266b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        headers.put("Content-Type", "application/x-www-form-urlencoded");
267b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        params.setExtraHeaders(headers);
268b8281877c710018a3bc8066be17b1e11822be015Selim Gurun        loadUrlOnUiThread(params);
26946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
27046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
27146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private static boolean isBase64Encoded(String encoding) {
27246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return "base64".equals(encoding);
27346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
27446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
27546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
27646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void loadData(String data, String mimeType, String encoding) {
277a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        loadUrlOnUiThread(LoadUrlParams.createLoadDataParams(
278a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen                data, mimeType, isBase64Encoded(encoding)));
27946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
28046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
28146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
28246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding,
283efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            String historyUrl) {
284efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch        LoadUrlParams loadUrlParams;
285efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch
286efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch        if (baseUrl != null && baseUrl.startsWith("data:")) {
287efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // For backwards compatibility with WebViewClassic, we use the value of |encoding|
288efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // as the charset, as long as it's not "base64".
289efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            boolean isBase64 = isBase64Encoded(encoding);
290efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            loadUrlParams = LoadUrlParams.createLoadDataParamsWithBaseUrl(
291efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                    data, mimeType, isBase64, baseUrl, historyUrl, isBase64 ? null : encoding);
292efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch        } else {
293efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            if (baseUrl == null || baseUrl.length() == 0) baseUrl = "about:blank";
294efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // When loading data with a non-data: base URL, the classic WebView would effectively
295efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // "dump" that string of data into the WebView without going through regular URL
296efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // loading steps such as decoding URL-encoded entities. We achieve this same behavior by
297efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            // base64 encoding the data that is passed here and then loading that as a data: URL.
298efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            try {
299efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                loadUrlParams = LoadUrlParams.createLoadDataParamsWithBaseUrl(
300efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                        Base64.encodeToString(data.getBytes("utf-8"), Base64.DEFAULT), mimeType,
301efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                        true, baseUrl, historyUrl, "utf-8");
302efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            } catch (java.io.UnsupportedEncodingException e) {
303efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                Log.wtf(TAG, "Unable to load data string " + data, e);
304efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch                return;
305efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch            }
306efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch        }
307a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        loadUrlOnUiThread(loadUrlParams);
308a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen    }
309a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen
310a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen    private void loadUrlOnUiThread(final LoadUrlParams loadUrlParams) {
311a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        if (ThreadUtils.runningOnUiThread()) {
312a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen            mAwContents.loadUrl(loadUrlParams);
313a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        } else {
314a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen            // Disallowed in WebView API for apps targetting a new SDK
315a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen            assert mAppTargetSdkVersion < Build.VERSION_CODES.JELLY_BEAN_MR2;
316a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen            ThreadUtils.postOnUiThread(new Runnable() {
317a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen                @Override
318a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen                public void run() {
319a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen                    mAwContents.loadUrl(loadUrlParams);
320a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen                }
321a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen            });
322a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen        }
32346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
32446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
3256ef347a29d692df672aaf59ee4926a476288476aBen Murdoch    public void evaluateJavaScript(String script, ValueCallback<String> resultCallback) {
3266ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        mAwContents.evaluateJavaScript(script, resultCallback);
3276ef347a29d692df672aaf59ee4926a476288476aBen Murdoch    }
3286ef347a29d692df672aaf59ee4926a476288476aBen Murdoch
32946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
33046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void saveWebArchive(String filename) {
33146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        saveWebArchive(filename, false, null);
33246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
33346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
33446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
33546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void saveWebArchive(String basename, boolean autoname, ValueCallback<String> callback) {
33646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.saveWebArchive(basename, autoname, callback);
33746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
33846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
33946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
34046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void stopLoading() {
3417cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.stopLoading();
34246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
34346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
34446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
34546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void reload() {
3467cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.reload();
34746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
34846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
34946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
35046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean canGoBack() {
3517cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canGoBack();
35246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
35346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
35446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
35546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void goBack() {
3567cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.goBack();
35746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
35846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
35946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
36046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean canGoForward() {
3617cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canGoForward();
36246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
36346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
36446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
36546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void goForward() {
3667cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.goForward();
36746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
36846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
36946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
37046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean canGoBackOrForward(int steps) {
3717cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canGoBackOrForward(steps);
37246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
37346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
37446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
37546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void goBackOrForward(int steps) {
3767cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.goBackOrForward(steps);
37746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
37846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
37946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
38046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean isPrivateBrowsingEnabled() {
3816d58f78e7fc0412a58b163559cb8e9c4af5c6fe1Jonathan Dixon        // Not supported in this WebView implementation.
38246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
38346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
38446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
38546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
38646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean pageUp(boolean top) {
3877cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.pageUp(top);
38846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
38946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
39046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
39146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean pageDown(boolean bottom) {
3927cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.pageDown(bottom);
39346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
39446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
39546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
39646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearView() {
39746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
39846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
39946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
40046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
40146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public Picture capturePicture() {
4029c5a40623b62737244deb2d04a98830d7ffa8404Leandro Gracia Gil        return mAwContents.capturePicture();
40346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
40446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
40546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
40646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public float getScale() {
4073520eb778d668dc76ca4541c69abd568b9d02691Mikhail Naganov        return mAwContents.getScale();
40846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
40946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
41046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
41146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setInitialScale(int scaleInPercent) {
4123520eb778d668dc76ca4541c69abd568b9d02691Mikhail Naganov        mAwContents.getSettings().setInitialPageScale(scaleInPercent);
41346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
41446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
41546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
41646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void invokeZoomPicker() {
4177cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.invokeZoomPicker();
41846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
41946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
42046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
42146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebView.HitTestResult getHitTestResult() {
422c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        AwContents.HitTestData data = mAwContents.getLastHitTestResult();
423c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mHitTestResult.setType(data.hitTestResultType);
424c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mHitTestResult.setExtra(data.hitTestResultExtraData);
425c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        return mHitTestResult;
42646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
42746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
42846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
42946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void requestFocusNodeHref(Message hrefMsg) {
430c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mAwContents.requestFocusNodeHref(hrefMsg);
43146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
43246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
43346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
43446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void requestImageRef(Message msg) {
435c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        mAwContents.requestImageRef(msg);
43646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
43746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
43846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
43946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public String getUrl() {
4407cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        String url =  mAwContents.getUrl();
44146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (url == null || url.trim().isEmpty()) return null;
44246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return url;
44346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
44446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
44546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
44646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public String getOriginalUrl() {
44746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        String url =  mAwContents.getOriginalUrl();
44846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (url == null || url.trim().isEmpty()) return null;
44946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return url;
45046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
45146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
45246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
45346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public String getTitle() {
4547cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.getTitle();
45546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
45646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
45746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
45846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public Bitmap getFavicon() {
4599405536501747e2d7b4fc46a33e5f0a1e7fd47acJonathan Dixon        return mAwContents.getFavicon();
46046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
46146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
46246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
46346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public String getTouchIconUrl() {
4649405536501747e2d7b4fc46a33e5f0a1e7fd47acJonathan Dixon        // Intentional no-op: hidden method on WebView.
46546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return null;
46646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
46746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
46846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
46946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int getProgress() {
47046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mAwContents.getMostRecentProgress();
47146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
47246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
47346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
47446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int getContentHeight() {
4756b5f3d1546ae2a9c712cde60c54ec027582bc4e6Martin Kosiba        return mAwContents.getContentHeightCss();
47646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
47746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
47846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
47946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int getContentWidth() {
4806b5f3d1546ae2a9c712cde60c54ec027582bc4e6Martin Kosiba        return mAwContents.getContentWidthCss();
48146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
48246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
48346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
48446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void pauseTimers() {
485531e68a2b50a5e542eeede13907f29e463a99ebfBen Murdoch        mAwContents.pauseTimers();
48646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
48746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
48846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
48946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void resumeTimers() {
490531e68a2b50a5e542eeede13907f29e463a99ebfBen Murdoch        mAwContents.resumeTimers();
49146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
49246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
49346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
49446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onPause() {
4951cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onPause();
49646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
49746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
49846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
49946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onResume() {
5001cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onResume();
50146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
50246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
50346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
50446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean isPaused() {
5051cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        return mAwContents.isPaused();
50646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
50746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
50846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
50946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void freeMemory() {
51046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
51146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
51246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
51346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
51446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearCache(boolean includeDiskFiles) {
51546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.clearCache(includeDiskFiles);
51646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
51746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
518bbef8de5696d48fc6458c926026fc524a62814e1Selim Gurun    /**
519bbef8de5696d48fc6458c926026fc524a62814e1Selim Gurun     * This is a poorly named method, but we keep it for historical reasons.
520bbef8de5696d48fc6458c926026fc524a62814e1Selim Gurun     */
52146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
52246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearFormData() {
523bbef8de5696d48fc6458c926026fc524a62814e1Selim Gurun        mAwContents.hideAutofillPopup();
52446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
52546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
52646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
52746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearHistory() {
5287cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.clearHistory();
52946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
53046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
53146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
53246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearSslPreferences() {
5337cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.clearSslPreferences();
53446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
53546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
53646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
53746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebBackForwardList copyBackForwardList() {
53808a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu        return new WebBackForwardListChromium(
5397cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba                mAwContents.getNavigationHistory());
54046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
54146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
54246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
54346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setFindListener(WebView.FindListener listener) {
54446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mContentsClientAdapter.setFindListener(listener);
54546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
54646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
54746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
54846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void findNext(boolean forwards) {
54946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.findNext(forwards);
55046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
55146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
55246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
55346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int findAll(String searchString) {
554f37548d6d8e2a73c65d675a26706a38f52960800Jonathan Dixon        mAwContents.findAllAsync(searchString);
555f37548d6d8e2a73c65d675a26706a38f52960800Jonathan Dixon        return 0;
55646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
55746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
55846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
55946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void findAllAsync(String searchString) {
56046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.findAllAsync(searchString);
56146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
56246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
56346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
56446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean showFindDialog(String text, boolean showIme) {
5656d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        if (mWebView.getParent() == null) {
5666d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            return false;
5676d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        }
5686d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch
5696d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        FindActionModeCallback findAction = new FindActionModeCallback(mWebView.getContext());
5706d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        if (findAction == null) {
5716d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            return false;
5726d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        }
5736d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch
5746d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        mWebView.startActionMode(findAction);
5756d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        findAction.setWebView(mWebView);
5766d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        if (showIme) {
5776d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            findAction.showSoftInput();
5786d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        }
5796d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch
5806d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        if (text != null) {
5816d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            findAction.setText(text);
5826d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch            findAction.findAll();
5836d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        }
5846d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch
5856d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        return true;
58646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
58746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
5886d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch    @Override
589fde8dae44f74be3de69ce6dd07b0023279b485a0Ben Murdoch    public void notifyFindDialogDismissed() {
5906d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch        clearMatches();
591fde8dae44f74be3de69ce6dd07b0023279b485a0Ben Murdoch    }
592fde8dae44f74be3de69ce6dd07b0023279b485a0Ben Murdoch
59346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
59446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void clearMatches() {
59546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.clearMatches();
59646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
59746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
59846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
59946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void documentHasImages(Message response) {
60046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mAwContents.documentHasImages(response);
60146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
60246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
60346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
60446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setWebViewClient(WebViewClient client) {
60546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mContentsClientAdapter.setWebViewClient(client);
60646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
60746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
60846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
60946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setDownloadListener(DownloadListener listener) {
6104320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu        mContentsClientAdapter.setDownloadListener(listener);
61146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
61246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
61346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
61446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setWebChromeClient(WebChromeClient client) {
61546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mContentsClientAdapter.setWebChromeClient(client);
61646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
61746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
61846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
61946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setPictureListener(WebView.PictureListener listener) {
62046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mContentsClientAdapter.setPictureListener(listener);
6219c5a40623b62737244deb2d04a98830d7ffa8404Leandro Gracia Gil        mAwContents.enableOnNewPicture(listener != null,
6226ef347a29d692df672aaf59ee4926a476288476aBen Murdoch                mAppTargetSdkVersion >= Build.VERSION_CODES.JELLY_BEAN_MR2);
62346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
62446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
62546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
62646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void addJavascriptInterface(Object obj, String interfaceName) {
627ea844f60b1b559788566fe6e004b1eeca53a8039Jonathan Dixon        Class<? extends Annotation> requiredAnnotation = null;
6286ef347a29d692df672aaf59ee4926a476288476aBen Murdoch        if (mAppTargetSdkVersion >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
6297db34d3dcaac936566f912e1b0b21f3f103029ffJonathan Dixon           requiredAnnotation = JavascriptInterface.class;
6307db34d3dcaac936566f912e1b0b21f3f103029ffJonathan Dixon        }
6317cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.addPossiblyUnsafeJavascriptInterface(obj, interfaceName, requiredAnnotation);
63246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
63346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
63446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
63546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void removeJavascriptInterface(String interfaceName) {
6367cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.removeJavascriptInterface(interfaceName);
63746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
63846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
63946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
64046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebSettings getSettings() {
64146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (mWebSettings == null) {
642420c0da3a4e06e1ac5574091e7c9c286ef012369Mikhail Naganov            mWebSettings = new ContentSettingsAdapter(mAwContents.getSettings());
64346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
64446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mWebSettings;
64546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
64646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
64746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
64846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setMapTrackballToArrowKeys(boolean setMap) {
64946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // This is a deprecated API: intentional no-op.
65046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
65146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
65246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
65346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void flingScroll(int vx, int vy) {
6547cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.flingScroll(vx, vy);
65546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
65646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
65746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
65846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public View getZoomControls() {
659e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon        // This was deprecated in 2009 and hidden in JB MR1, so just provide the minimum needed
660e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon        // to stop very out-dated applications from crashing.
661e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon        Log.w(TAG, "WebView doesn't support getZoomControls");
662420c0da3a4e06e1ac5574091e7c9c286ef012369Mikhail Naganov        return mAwContents.getSettings().supportZoom() ? new View(mWebView.getContext()) : null;
66346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
66446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
66546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
66646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean canZoomIn() {
6677cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canZoomIn();
66846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
66946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
67046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
67146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean canZoomOut() {
6727cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.canZoomOut();
67346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
67446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
67546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
67646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean zoomIn() {
6777cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.zoomIn();
67846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
67946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
68046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
68146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean zoomOut() {
6827cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.zoomOut();
68346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
68446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
685d2dcef4d9edfb7af7abff85b0867c3d6a363feb7Jonathan Dixon    @Override
68646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void dumpViewHierarchyWithProperties(BufferedWriter out, int level) {
68746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
68846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
68946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
690d2dcef4d9edfb7af7abff85b0867c3d6a363feb7Jonathan Dixon    @Override
69146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public View findHierarchyView(String className, int hashCode) {
69246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
69346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return null;
69446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
69546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
69646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebViewProvider glue methods ---------------------------------------------------------------
69746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
69846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
69946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebViewProvider.ViewDelegate getViewDelegate() {
70046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return this;
70146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
70246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
70346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
70446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public WebViewProvider.ScrollDelegate getScrollDelegate() {
70546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return this;
70646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
70746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
70846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
70946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebViewProvider.ViewDelegate implementation ------------------------------------------------
71046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
711a7fba41c5661cb61b41c8a4ff2d69e5153666f7fBen Murdoch    // TODO: remove from WebViewProvider and use default implementation from
712a7fba41c5661cb61b41c8a4ff2d69e5153666f7fBen Murdoch    // ViewGroup.
713a7fba41c5661cb61b41c8a4ff2d69e5153666f7fBen Murdoch    // @Override
71446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean shouldDelayChildPressedState() {
715a7fba41c5661cb61b41c8a4ff2d69e5153666f7fBen Murdoch        return true;
71646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
71746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
7185c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch//    @Override
7195c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch    public AccessibilityNodeProvider getAccessibilityNodeProvider() {
7205c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch        return mAwContents.getAccessibilityNodeProvider();
7215c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch    }
7225c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch
72346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
72446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
7257cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.onInitializeAccessibilityNodeInfo(info);
72646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
72746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
72846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
72946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
7307cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        mAwContents.onInitializeAccessibilityEvent(event);
73146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
73246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
73346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
73446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean performAccessibilityAction(int action, Bundle arguments) {
735b7b706b2ed5cbb77dd690f5405b626a429989714Ben Murdoch        if (mAwContents.supportsAccessibilityAction(action)) {
736b7b706b2ed5cbb77dd690f5405b626a429989714Ben Murdoch            return mAwContents.performAccessibilityAction(action, arguments);
737b7b706b2ed5cbb77dd690f5405b626a429989714Ben Murdoch        }
738b7b706b2ed5cbb77dd690f5405b626a429989714Ben Murdoch        return mWebViewPrivate.super_performAccessibilityAction(action, arguments);
73946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
74046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
74146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
74246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setOverScrollMode(int mode) {
7432841152693d0410f8e8c309aae514329f008a612Martin Kosiba        // This gets called from the android.view.View c'tor that WebView inherits from. This
7442841152693d0410f8e8c309aae514329f008a612Martin Kosiba        // causes the method to be called when mAwContents == null.
7452841152693d0410f8e8c309aae514329f008a612Martin Kosiba        // It's safe to ignore these calls however since AwContents will read the current value of
7462841152693d0410f8e8c309aae514329f008a612Martin Kosiba        // this setting when it's created.
747ab5398debe64d34306b0f709a93d840078ae181dMartin Kosiba        if (mAwContents != null) {
748ab5398debe64d34306b0f709a93d840078ae181dMartin Kosiba            mAwContents.setOverScrollMode(mode);
749ab5398debe64d34306b0f709a93d840078ae181dMartin Kosiba        }
75046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
75146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
75246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
75346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setScrollBarStyle(int style) {
75446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
75546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
75646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
75746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
75846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onDrawVerticalScrollBar(Canvas canvas, Drawable scrollBar,
75946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                                        int l, int t, int r, int b) {
76046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
76146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
76246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
76346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
76446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
7653951fbadf5157dd3fe73decc879f9b763e780b09Martin Kosiba        mAwContents.onContainerViewOverScrolled(scrollX, scrollY, clampedX, clampedY);
76646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
76746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
76846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
76946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onWindowVisibilityChanged(int visibility) {
7701cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onWindowVisibilityChanged(visibility);
77146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
77246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
77346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
77446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onDraw(Canvas canvas) {
7757ab33360e331e04f515d532064670e210d174a7aTao Bai        mAwContents.onDraw(canvas);
77646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
77746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
77846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
77946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setLayoutParams(ViewGroup.LayoutParams layoutParams) {
78046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // TODO: This is the minimum implementation for HTMLViewer
78146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // bringup. Likely will need to go up to ContentViewCore for
78246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // a complete implementation.
78346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewPrivate.super_setLayoutParams(layoutParams);
78446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
78546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
78646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
78746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean performLongClick() {
788decc147cebc8f73d355c024d92c60d3f727cab31Bo Liu        return mWebViewPrivate.super_performLongClick();
78946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
79046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
79146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
79246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onConfigurationChanged(Configuration newConfig) {
7931cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onConfigurationChanged(newConfig);
79446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
79546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
79646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
79746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
7987cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.onCreateInputConnection(outAttrs);
79946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
80046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
80146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
80246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
80346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
80446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
80546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
80646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
80746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
80846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onKeyDown(int keyCode, KeyEvent event) {
80946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
81046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
81146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
81246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
81346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
81446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onKeyUp(int keyCode, KeyEvent event) {
8157cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.onKeyUp(keyCode, event);
81646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
81746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
81846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
81946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onAttachedToWindow() {
8201cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onAttachedToWindow();
82146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
82246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
82346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
82446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onDetachedFromWindow() {
8251cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onDetachedFromWindow();
826a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon        if (mGLfunctor != null) {
827a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon            mGLfunctor.detach();
828a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon        }
82946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
83046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
83146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
83246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onVisibilityChanged(View changedView, int visibility) {
833c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba        // The AwContents will find out the container view visibility before the first draw so we
834c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba        // can safely ignore onVisibilityChanged callbacks that happen before init().
835c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba        if (mAwContents != null) {
836c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba            mAwContents.onVisibilityChanged(changedView, visibility);
837c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba        }
83846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
83946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
84046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
84146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onWindowFocusChanged(boolean hasWindowFocus) {
8421cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onWindowFocusChanged(hasWindowFocus);
84346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
84446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
84546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
84646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
8471cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onFocusChanged(focused, direction, previouslyFocusedRect);
84846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
84946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
85046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
85146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean setFrame(int left, int top, int right, int bottom) {
8521cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        // TODO(joth): This is the minimum implementation for initial
8531cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        // bringup. Likely will need to go up to AwContents for a complete
8541cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        // implementation, e.g. setting the compositor visible region (to
8551cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        // avoid painting tiles that are offscreen due to the view's position).
85646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mWebViewPrivate.super_setFrame(left, top, right, bottom);
85746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
85846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
85946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
86046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onSizeChanged(int w, int h, int ow, int oh) {
8611cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon        mAwContents.onSizeChanged(w, h, ow, oh);
86246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
86346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
86446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
86546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onScrollChanged(int l, int t, int oldl, int oldt) {
86646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
86746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
86846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
86946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean dispatchKeyEvent(KeyEvent event) {
8707cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.dispatchKeyEvent(event);
87146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
87246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
87346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
87446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onTouchEvent(MotionEvent ev) {
875c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        return mAwContents.onTouchEvent(ev);
87646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
87746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
87846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
87946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onHoverEvent(MotionEvent event) {
880c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        return mAwContents.onHoverEvent(event);
88146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
88246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
88346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
88446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onGenericMotionEvent(MotionEvent event) {
885c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu        return mAwContents.onGenericMotionEvent(event);
88646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
88746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
88846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
88946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onTrackballEvent(MotionEvent ev) {
89046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // Trackball event not handled, which eventually gets converted to DPAD keyevents
89146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
89246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
89346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
89446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
89546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean requestFocus(int direction, Rect previouslyFocusedRect) {
8964cee3bf50c125a52a49323aa999f4b619fa18c10Ben Murdoch        mAwContents.requestFocus();
89746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mWebViewPrivate.super_requestFocus(direction, previouslyFocusedRect);
89846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
89946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
90046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
90146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
902d7bf6ab0cd8cc4005b112e4358eb797bb178a85fMarcin Kosiba        mAwContents.onMeasure(widthMeasureSpec, heightMeasureSpec);
90346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
90446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
90546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
90646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean requestChildRectangleOnScreen(View child, Rect rect, boolean immediate) {
90746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
90846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return false;
90946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
91046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
91146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
91246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setBackgroundColor(int color) {
913058714d7ae16bbfc096d9b4e0423efeb897bae68Jonathan Dixon        mAwContents.setBackgroundColor(color);
91446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
91546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
91646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
91746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void setLayerType(int layerType, Paint paint) {
91846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        UnimplementedWebViewApi.invoke();
91946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
92046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
9210b528e4924a7c14687181185bc66173ad18f00eaLeandro Gracia Gil    @Override
92246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void preDispatchDraw(Canvas canvas) {
9230b528e4924a7c14687181185bc66173ad18f00eaLeandro Gracia Gil        // TODO(leandrogracia): remove this method from WebViewProvider if we think
9240b528e4924a7c14687181185bc66173ad18f00eaLeandro Gracia Gil        // we won't need it again.
92546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
92646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
92746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebViewProvider.ScrollDelegate implementation ----------------------------------------------
92846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
92946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
93046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeHorizontalScrollRange() {
9317cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeHorizontalScrollRange();
93246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
93346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
93446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
93546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeHorizontalScrollOffset() {
9367cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeHorizontalScrollOffset();
93746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
93846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
93946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
94046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeVerticalScrollRange() {
9417cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeVerticalScrollRange();
94246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
94346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
94446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
94546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeVerticalScrollOffset() {
9467cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeVerticalScrollOffset();
94746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
94846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
94946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
95046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public int computeVerticalScrollExtent() {
9517cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba        return mAwContents.computeVerticalScrollExtent();
95246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
95346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
95446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
95546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void computeScroll() {
9562a120ba09921dbb1e8354ecbc4a6e063ec891101Martin Kosiba        mAwContents.computeScroll();
95746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
95846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
9594702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba    // AwContents.InternalAccessDelegate implementation --------------------------------------
9604702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba    private class InternalAccessAdapter implements AwContents.InternalAccessDelegate {
96146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
96246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean drawChild(Canvas arg0, View arg1, long arg2) {
96346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
96446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
96546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
96646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
96746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
96846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_onKeyUp(int arg0, KeyEvent arg1) {
96946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
97046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
97146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
97246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
97346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
97446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_dispatchKeyEventPreIme(KeyEvent arg0) {
97546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
97646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
97746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
97846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
97946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
98046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_dispatchKeyEvent(KeyEvent event) {
98146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return mWebViewPrivate.super_dispatchKeyEvent(event);
98246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
98346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
98446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
98546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_onGenericMotionEvent(MotionEvent arg0) {
98646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
98746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
98846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
98946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
99046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
99146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public void super_onConfigurationChanged(Configuration arg0) {
99246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
99346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
99446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
9950088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba        // TODO(mkosiba): @Override
9960088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba        public int super_getScrollBarStyle() {
9970088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba            return mWebViewPrivate.super_getScrollBarStyle();
9980088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba        }
9990088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba
100046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
100146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean awakenScrollBars() {
100246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mWebViewPrivate.awakenScrollBars(0);
100346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // TODO: modify the WebView.PrivateAccess to provide a return value.
100446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return true;
100546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
100646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
100746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
100846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean super_awakenScrollBars(int arg0, boolean arg1) {
100946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // TODO: need method on WebView.PrivateAccess?
101046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            UnimplementedWebViewApi.invoke();
101146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
101246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
10134702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba
1014d7bf6ab0cd8cc4005b112e4358eb797bb178a85fMarcin Kosiba        @Override
10152a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        public void onScrollChanged(int l, int t, int oldl, int oldt) {
10162a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.setScrollXRaw(l);
10172a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.setScrollYRaw(t);
10182a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.onScrollChanged(l, t, oldl, oldt);
10192a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        }
10202a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba
10213951fbadf5157dd3fe73decc879f9b763e780b09Martin Kosiba        @Override
10222a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        public void overScrollBy(int deltaX, int deltaY,
10232a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            int scrollX, int scrollY,
10242a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            int scrollRangeX, int scrollRangeY,
10252a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            int maxOverScrollX, int maxOverScrollY,
10262a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            boolean isTouchEvent) {
10272a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.overScrollBy(deltaX, deltaY, scrollX, scrollY,
10282a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba                    scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);
10292a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        }
10302a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba
10313951fbadf5157dd3fe73decc879f9b763e780b09Martin Kosiba        @Override
10322a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        public void super_scrollTo(int scrollX, int scrollY) {
10332a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba            mWebViewPrivate.super_scrollTo(scrollX, scrollY);
10342a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        }
10352a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba
10362a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba        @Override
10374702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba        public void setMeasuredDimension(int measuredWidth, int measuredHeight) {
10384702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba            mWebViewPrivate.setMeasuredDimension(measuredWidth, measuredHeight);
10394702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba        }
104051f7cf16cd02f14050bb723175a2a57570e8486dTao Bai
10417ab33360e331e04f515d532064670e210d174a7aTao Bai        @Override
104251f7cf16cd02f14050bb723175a2a57570e8486dTao Bai        public boolean requestDrawGL(Canvas canvas) {
10437ab33360e331e04f515d532064670e210d174a7aTao Bai            if (mGLfunctor == null) {
10447ab33360e331e04f515d532064670e210d174a7aTao Bai                mGLfunctor = new DrawGLFunctor(mAwContents.getAwDrawGLViewContext());
10457ab33360e331e04f515d532064670e210d174a7aTao Bai            }
104651f7cf16cd02f14050bb723175a2a57570e8486dTao Bai            return mGLfunctor.requestDrawGL((HardwareCanvas)canvas, mWebView.getViewRootImpl());
104751f7cf16cd02f14050bb723175a2a57570e8486dTao Bai        }
104846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
104946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)}
1050