WebViewContentsClientAdapter.java revision 690b7c64c2aaae62680d137fca34c7fac5176ed2
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.ActivityNotFoundException;
2046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.content.Context;
2146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.content.Intent;
221e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdochimport android.graphics.Bitmap;
2346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.graphics.Picture;
2462c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurunimport android.net.http.SslError;
2546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Handler;
2646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Looper;
27251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liuimport android.os.Message;
2846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.provider.Browser;
2946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.util.Log;
3046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.KeyEvent;
31e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liuimport android.view.View;
3246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.ConsoleMessage;
334320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liuimport android.webkit.DownloadListener;
34885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsenimport android.webkit.GeolocationPermissions;
3546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.JsPromptResult;
3646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.JsResult;
3762c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurunimport android.webkit.SslErrorHandler;
38809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liuimport android.webkit.ValueCallback;
3946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebChromeClient;
40e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liuimport android.webkit.WebChromeClient.CustomViewCallback;
4146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebResourceResponse;
4246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebView;
4346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewClient;
4446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
4546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.AwContentsClient;
4646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.AwHttpAuthHandler;
4746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.InterceptedRequestData;
4846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.JsPromptResultReceiver;
4946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.JsResultReceiver;
5046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.ContentView;
5146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.ContentViewClient;
5246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
5346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.net.URISyntaxException;
5446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
5546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)/**
5646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * An adapter class that forwards the callbacks from {@link ContentViewClient}
5746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * to the appropriate {@link WebViewClient} or {@link WebChromeClient}.
5846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) *
5946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * An instance of this class is associated with one {@link WebViewChromium}
6046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * instance. A WebViewChromium is a WebView implementation provider (that is
6146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * android.webkit.WebView delegates all functionality to it) and has exactly
6246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * one corresponding {@link ContentView} instance.
6346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) *
6446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * A {@link ContentViewClient} may be shared between multiple {@link ContentView}s,
6546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * and hence multiple WebViews. Many WebViewClient methods pass the source
6646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * WebView as an argument. This means that we either need to pass the
6746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * corresponding ContentView to the corresponding ContentViewClient methods,
6846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * or use an instance of ContentViewClientAdapter per WebViewChromium, to
6946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * allow the source WebView to be injected by ContentViewClientAdapter. We
7046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * choose the latter, because it makes for a cleaner design.
7146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */
7246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)public class WebViewContentsClientAdapter extends AwContentsClient {
7346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private static final String TAG = "ContentViewClientAdapter";
7446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The WebView instance that this adapter is serving.
7546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private final WebView mWebView;
7646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The WebViewClient instance that was passed to WebView.setWebViewClient().
7746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebViewClient mWebViewClient;
7846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The WebViewClient instance that was passed to WebView.setContentViewClient().
7946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebChromeClient mWebChromeClient;
8046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The listener receiving find-in-page API results.
8146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebView.FindListener mFindListener;
8246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The listener receiving notifications of screen updates.
8346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebView.PictureListener mPictureListener;
8446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
854320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    private DownloadListener mDownloadListener;
864320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu
879b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch    private Handler mUiThreadHandler;
889b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch
899b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch    private static final int NEW_WEBVIEW_CREATED = 100;
909b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch
9146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
9246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * Adapter constructor.
9346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     *
9446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @param webView the {@link WebView} instance that this adapter is serving.
9546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
9646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    WebViewContentsClientAdapter(WebView webView) {
9746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (webView == null) {
9846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            throw new IllegalArgumentException("webView can't be null");
9946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
10046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
10146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebView = webView;
10246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        setWebViewClient(null);
10346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        setWebChromeClient(null);
1049b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch
1059b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch        mUiThreadHandler = new Handler() {
1069b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch
1079b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch            @Override
1089b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch            public void handleMessage(Message msg) {
1099b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                switch(msg.what) {
1109b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                    case NEW_WEBVIEW_CREATED:
1111ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        WebView.WebViewTransport t = (WebView.WebViewTransport) msg.obj;
1121ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        WebView newWebView = t.getWebView();
1131ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        if (newWebView == null) {
1141ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                            throw new IllegalArgumentException(
1151ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                                    "Must provide a new WebView for the new window.");
1161ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        }
1171ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        if (newWebView == mWebView) {
1181ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                            throw new IllegalArgumentException(
1191ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                                    "Parent WebView cannot host it's own popup window. Please " +
1201ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                                    "use WebSettings.setSupportMultipleWindows(false)");
1211ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        }
1221ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch
1231ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        if (newWebView.copyBackForwardList().getSize() != 0) {
1241ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                            throw new IllegalArgumentException(
1251ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                                    "New WebView for popup window must not have been previously " +
1261ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                                    "navigated.");
1271ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        }
1281ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch
1291ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        WebViewChromium.completeWindowCreation(mWebView, newWebView);
1309b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                        break;
1319b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                    default:
1329b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                        throw new IllegalStateException();
1339b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                }
1349b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch            }
1359b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch        };
1369b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch
13746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
13846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
13946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebViewClassic is coded in such a way that even if a null WebViewClient is set,
14046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // certain actions take place.
14146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // We choose to replicate this behavior by using a NullWebViewClient implementation (also known
14246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // as the Null Object pattern) rather than duplicating the WebViewClassic approach in
14346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // ContentView.
14446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    static class NullWebViewClient extends WebViewClient {
14546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
14646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
14746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // TODO: Investigate more and add a test case.
14846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // This is a copy of what Clank does. The WebViewCore key handling code and Clank key
14946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // handling code differ enough that it's not trivial to figure out how keycodes are
15046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // being filtered.
15146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            int keyCode = event.getKeyCode();
15246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            if (keyCode == KeyEvent.KEYCODE_MENU ||
15346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_HOME ||
15446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_BACK ||
15546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_CALL ||
15646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_ENDCALL ||
15746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_POWER ||
15846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_HEADSETHOOK ||
15946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_CAMERA ||
16046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_FOCUS ||
16146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_VOLUME_DOWN ||
16246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_VOLUME_MUTE ||
16346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
16446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                return true;
16546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
16646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
16746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
16846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
16946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
17046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean shouldOverrideUrlLoading(WebView view, String url) {
17146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            Intent intent;
17246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // Perform generic parsing of the URI to turn it into an Intent.
17346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            try {
17446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
17546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            } catch (URISyntaxException ex) {
17646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                Log.w(TAG, "Bad URI " + url + ": " + ex.getMessage());
17746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                return false;
17846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
17946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // Sanitize the Intent, ensuring web pages can not bypass browser
18046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // security (only access to BROWSABLE activities).
18146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            intent.addCategory(Intent.CATEGORY_BROWSABLE);
18246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            intent.setComponent(null);
18346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // Pass the package name as application ID so that the intent from the
18446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // same application can be opened in the same tab.
185fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu            intent.putExtra(Browser.EXTRA_APPLICATION_ID,
186fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu                    view.getContext().getPackageName());
18746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            try {
188fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu                view.getContext().startActivity(intent);
18946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            } catch (ActivityNotFoundException ex) {
19046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                Log.w(TAG, "No application can handle " + url);
19146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                return false;
19246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
19346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return true;
19446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
19546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
19646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
19746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    void setWebViewClient(WebViewClient client) {
19846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (client != null) {
19946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mWebViewClient = client;
20046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        } else {
201fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu            mWebViewClient = new NullWebViewClient();
20246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
20346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
20446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
20546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    void setWebChromeClient(WebChromeClient client) {
20646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (client != null) {
20746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mWebChromeClient = client;
20846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        } else {
20946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // WebViewClassic doesn't implement any special behavior for a null WebChromeClient.
21046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mWebChromeClient = new WebChromeClient();
21146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
21246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
21346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
2144320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    void setDownloadListener(DownloadListener listener) {
2154320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu        mDownloadListener = listener;
2164320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    }
2174320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu
21846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    void setFindListener(WebView.FindListener listener) {
21946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mFindListener = listener;
22046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
22146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
22246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    void setPictureListener(WebView.PictureListener listener) {
22346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mPictureListener = listener;
22446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
22546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
22646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //--------------------------------------------------------------------------------------------
22746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //                        Adapter for WebContentsDelegate methods.
22846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //--------------------------------------------------------------------------------------------
22946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
23046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
231809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu     * @see AwContentsClient#getVisitedHistory
232809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu     */
233809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu    @Override
234809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu    public void getVisitedHistory(ValueCallback<String[]> callback) {
235809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu        mWebChromeClient.getVisitedHistory(callback);
236809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu    }
237809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu
238809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu    /**
2395e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu     * @see AwContentsClient#doUpdateVisiteHistory(String, boolean)
2405e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu     */
2415e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu    @Override
2425e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu    public void doUpdateVisitedHistory(String url, boolean isReload) {
2435e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu        mWebViewClient.doUpdateVisitedHistory(mWebView, url, isReload);
2445e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu    }
2455e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu
2465e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu    /**
24746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see AwContentsClient#onProgressChanged(int)
24846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
24946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
25046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onProgressChanged(int progress) {
25146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebChromeClient.onProgressChanged(mWebView, progress);
25246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
25346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
25446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
25546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see AwContentsClient#shouldInterceptRequest(java.lang.String)
25646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
25746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
25846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public InterceptedRequestData shouldInterceptRequest(String url) {
25946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        WebResourceResponse response = mWebViewClient.shouldInterceptRequest(mWebView, url);
26046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (response == null) return null;
26146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return new InterceptedRequestData(
26246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                response.getMimeType(),
26346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                response.getEncoding(),
26446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                response.getData());
26546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
26646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
26746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
26846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see AwContentsClient#shouldIgnoreNavigation(java.lang.String)
26946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
27046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
27146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean shouldIgnoreNavigation(String url) {
27246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)      return mWebViewClient.shouldOverrideUrlLoading(mWebView, url);
27346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
27446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
27546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
27646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see AwContentsClient#onUnhandledKeyEvent(android.view.KeyEvent)
27746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
27846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
27946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onUnhandledKeyEvent(KeyEvent event) {
28046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onUnhandledKeyEvent(mWebView, event);
28146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
28246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
28346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
28446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see AwContentsClient#onConsoleMessage(android.webkit.ConsoleMessage)
28546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
28646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
28746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
28846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mWebChromeClient.onConsoleMessage(consoleMessage);
28946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
29046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
29146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
29246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see AwContentsClient#onFindResultReceived(int,int,boolean)
29346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
29446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
29546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onFindResultReceived(int activeMatchOrdinal, int numberOfMatches,
29646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            boolean isDoneCounting) {
29746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (mFindListener == null) return;
29846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mFindListener.onFindResultReceived(activeMatchOrdinal, numberOfMatches, isDoneCounting);
29946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
30046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
3015ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil    /**
3025ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil     * @See AwContentsClient#onNewPicture(Picture)
3035ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil     */
3049c5a40623b62737244deb2d04a98830d7ffa8404Leandro Gracia Gil    @Override
3055ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil    public void onNewPicture(Picture picture) {
3065ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil        if (mPictureListener == null) return;
3075ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil        mPictureListener.onNewPicture(mWebView, picture);
3085ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil    }
3095ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil
31046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
31146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onLoadResource(String url) {
31246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onLoadResource(mWebView, url);
31346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
31446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
3159b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch    @Override
3169b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch    public boolean onCreateWindow(boolean isDialog, boolean isUserGesture) {
3179b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch        Message m = mUiThreadHandler.obtainMessage(
3189b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                NEW_WEBVIEW_CREATED, mWebView.new WebViewTransport());
3191ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch        return mWebChromeClient.onCreateWindow(mWebView, isDialog, isUserGesture, m);
3209b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch    }
3219b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch
322d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch    /**
323d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch     * @see AwContentsClient#onCloseWindow()
324d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch     */
325d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch    /* @Override */
326d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch    public void onCloseWindow() {
327d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch        mWebChromeClient.onCloseWindow(mWebView);
328d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch    }
329d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch
330d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch    /**
331d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch     * @see AwContentsClient#onRequestFocus()
332d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch     */
333d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch    /* @Override */
334d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch    public void onRequestFocus() {
335d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch        mWebChromeClient.onRequestFocus(mWebView);
336d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch    }
337d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch
3381e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch    /**
339690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun     * @see AwContentsClient#onReceivedTouchIconUrl(String url, boolean precomposed)
340690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun     */
341690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun    @Override
342690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun    public void onReceivedTouchIconUrl(String url, boolean precomposed) {
343690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun        mWebChromeClient.onReceivedTouchIconUrl(mWebView, url, precomposed);
344690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun    }
345690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun
346690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun    /**
3471e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch     * @see AwContentsClient#onReceivedIcon(Bitmap bitmap)
3481e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch     */
3491e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch    @Override
3501e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch    public void onReceivedIcon(Bitmap bitmap) {
3511e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch        mWebChromeClient.onReceivedIcon(mWebView, bitmap);
3521e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch    }
3531e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch
35446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //--------------------------------------------------------------------------------------------
35546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //                        Trivial Chrome -> WebViewClient mappings.
35646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //--------------------------------------------------------------------------------------------
35746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
35846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
35946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onPageStarted(String)
36046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
36146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
36246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onPageStarted(String url) {
36346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        //TODO: Can't get the favicon till b/6094807 is fixed.
36446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onPageStarted(mWebView, url, null);
36546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
36646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
36746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
36846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onPageFinished(String)
36946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
37046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
37146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onPageFinished(String url) {
37246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onPageFinished(mWebView, url);
373e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch
374e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // See b/8208948
375e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // This fakes an onNewPicture callback after onPageFinished to allow
376e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // CTS tests to run in an un-flaky manner. This is required as the
377e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // path for sending Picture updates in Chromium are decoupled from the
378e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // page loading callbacks, i.e. the Chrome compositor may draw our
379e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // content and send the Picture before onPageStarted or onPageFinished
380e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // are invoked. The CTS harness discards any pictures it receives before
381e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // onPageStarted is invoked, so in the case we get the Picture before that and
382e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // no further updates after onPageStarted, we'll fail the test by timing
383e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // out waiting for a Picture.
384e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // To ensure backwards compatibility, we need to defer sending Picture updates
385e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // until onPageFinished has been invoked. This work is being done
386e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // upstream, and we can revert this hack when it lands.
387e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        if (mPictureListener != null) {
388e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch            new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
389e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                @Override
390e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                public void run() {
391e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                    UnimplementedWebViewApi.invoke();
392e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                    if (mPictureListener != null) {
393e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                        mPictureListener.onNewPicture(mWebView, null);
394e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                    }
395e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                }
396e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch            }, 100);
397e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        }
39846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
39946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
40046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
40146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onReceivedError(int,String,String)
40246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
40346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
40446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onReceivedError(int errorCode, String description, String failingUrl) {
40546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onReceivedError(mWebView, errorCode, description, failingUrl);
40646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
40746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
40846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
40946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onUpdateTitle(String)
41046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
41146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
41246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onUpdateTitle(String title) {
41346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebChromeClient.onReceivedTitle(mWebView, title);
41446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
41546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
41646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
41746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
41846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#shouldOverrideKeyEvent(KeyEvent)
41946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
42046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
42146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean shouldOverrideKeyEvent(KeyEvent event) {
422b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon        // TODO(joth): The expression here is a workaround for http://b/7697782 :-
423b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon        // 1. The check for system key should be made in AwContents or ContentViewCore,
424b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon        //    before shouldOverrideKeyEvent() is called at all.
425b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon        // 2. shouldOverrideKeyEvent() should be called in onKeyDown/onKeyUp, not from
426b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon        //    dispatchKeyEvent().
427b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon        return event.isSystem() ||
428b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon            mWebViewClient.shouldOverrideKeyEvent(mWebView, event);
42946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
43046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
43146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
43246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //--------------------------------------------------------------------------------------------
43346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //                 More complicated mappings (including behavior choices)
43446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //--------------------------------------------------------------------------------------------
43546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
43646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
43746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onTabCrash()
43846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
43946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
44046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onTabCrash() {
44146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // The WebViewClassic implementation used a single process, so any crash would
44246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // cause the application to terminate.  WebViewChromium should have the same
44346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // behavior as long as we run the renderer in-process. This needs to be revisited
44446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // if we change that decision.
44546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        Log.e(TAG, "Renderer crash reported.");
44646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebChromeClient.onCloseWindow(mWebView);
44746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
44846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
44946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //--------------------------------------------------------------------------------------------
45046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //                                     The TODO section
45146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //--------------------------------------------------------------------------------------------
45246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
45346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
45446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
45546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onImeEvent()
45646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
45746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
45846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onImeEvent() {
45946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
46046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
46146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
46246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onStartContentIntent(Context, String)
4633e9ca893bb8fb7e0038c04bd04ae78f40233db4fBo Liu     * Callback when detecting a click on a content link.
46446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
46546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
46646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onStartContentIntent(Context context, String contentUrl) {
4673e9ca893bb8fb7e0038c04bd04ae78f40233db4fBo Liu        mWebViewClient.shouldOverrideUrlLoading(mWebView, contentUrl);
46846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
46946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
47046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private static class SimpleJsResultReceiver implements JsResult.ResultReceiver {
47146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        private JsResultReceiver mChromeResultReceiver;
47246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
47346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public SimpleJsResultReceiver(JsResultReceiver receiver) {
47446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mChromeResultReceiver = receiver;
47546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
47646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
47746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
47846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public void onJsResultComplete(JsResult result) {
47946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            if (result.getResult()) {
48046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                mChromeResultReceiver.confirm();
48146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            } else {
48246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                mChromeResultReceiver.cancel();
48346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
48446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
48546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
48646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
48746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private static class JsPromptResultReceiverAdapter implements JsResult.ResultReceiver {
48846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        private JsPromptResultReceiver mChromeResultReceiver;
48946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        private JsPromptResult mPromptResult;
49046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
49146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public JsPromptResultReceiverAdapter(JsPromptResultReceiver receiver) {
49246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mChromeResultReceiver = receiver;
49346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // We hold onto the JsPromptResult here, just to avoid the need to downcast
49446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // in onJsResultComplete.
49546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mPromptResult = new JsPromptResult(this);
49646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
49746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
49846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public JsPromptResult getPromptResult() {
49946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return mPromptResult;
50046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
50146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
50246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
50346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public void onJsResultComplete(JsResult result) {
50446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            if (result != mPromptResult) throw new RuntimeException("incorrect JsResult instance");
50546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            if (mPromptResult.getResult()) {
50646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                mChromeResultReceiver.confirm(mPromptResult.getStringResult());
50746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            } else {
50846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                mChromeResultReceiver.cancel();
50946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
51046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
51146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
51246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
51346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
514885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsen    public void onGeolocationPermissionsShowPrompt(String origin,
515885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsen            GeolocationPermissions.Callback callback) {
516885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsen        mWebChromeClient.onGeolocationPermissionsShowPrompt(origin, callback);
517885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsen    }
518885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsen
519885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsen    @Override
520885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsen    public void onGeolocationPermissionsHidePrompt() {
521885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsen        mWebChromeClient.onGeolocationPermissionsHidePrompt();
522885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsen    }
523885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsen
524885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsen    @Override
52546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void handleJsAlert(String url, String message, JsResultReceiver receiver) {
52646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        JsResult res = new JsResult(new SimpleJsResultReceiver(receiver));
52746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebChromeClient.onJsAlert(mWebView, url, message, res);
52846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // TODO: Handle the case of the client returning false;
52946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
53046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
53146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
53246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void handleJsBeforeUnload(String url, String message, JsResultReceiver receiver) {
53346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        JsResult res = new JsResult(new SimpleJsResultReceiver(receiver));
53446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebChromeClient.onJsBeforeUnload(mWebView, url, message, res);
53546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // TODO: Handle the case of the client returning false;
53646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
53746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
53846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
53946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void handleJsConfirm(String url, String message, JsResultReceiver receiver) {
54046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        JsResult res = new JsResult(new SimpleJsResultReceiver(receiver));
54146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebChromeClient.onJsConfirm(mWebView, url, message, res);
54246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // TODO: Handle the case of the client returning false;
54346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
54446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
54546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
54646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void handleJsPrompt(String url, String message, String defaultValue,
54746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            JsPromptResultReceiver receiver) {
54846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        JsPromptResult res = new JsPromptResultReceiverAdapter(receiver).getPromptResult();
54946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebChromeClient.onJsPrompt(mWebView, url, message, defaultValue, res);
55046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // TODO: Handle the case of the client returning false;
55146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
55246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
55346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
55446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onReceivedHttpAuthRequest(AwHttpAuthHandler handler, String host, String realm) {
55546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onReceivedHttpAuthRequest(mWebView,
55646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                new AwHttpAuthHandlerAdapter(handler), host, realm);
55746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
55846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
559251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu    @Override
56062c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun    public void onReceivedSslError(final ValueCallback<Boolean> callback, SslError error) {
56162c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun        SslErrorHandler handler = new SslErrorHandler() {
56262c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            @Override
56362c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            public void proceed() {
56462c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun                postProceed(true);
56562c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            }
56662c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            @Override
56762c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            public void cancel() {
56862c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun                postProceed(false);
56962c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            }
57062c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            private void postProceed(final boolean proceed) {
57162c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun                post(new Runnable() {
57262c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun                        @Override
57362c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun                        public void run() {
57462c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun                            callback.onReceiveValue(proceed);
57562c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun                        }
57662c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun                    });
57762c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            }
57862c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun        };
57962c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun        mWebViewClient.onReceivedSslError(mWebView, handler, error);
58062c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun    }
58162c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun
58262c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun    @Override
58397a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu    public void onReceivedLoginRequest(String realm, String account, String args) {
58497a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu        mWebViewClient.onReceivedLoginRequest(mWebView, realm, account, args);
58597a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu    }
58697a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu
58797a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu    @Override
588251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu    public void onFormResubmission(Message dontResend, Message resend) {
589251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu        mWebViewClient.onFormResubmission(mWebView, dontResend, resend);
590251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu    }
591251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu
5924320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    @Override
5934320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    public void onDownloadStart(String url,
5944320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                String userAgent,
5954320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                String contentDisposition,
5964320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                String mimeType,
5974320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                long contentLength) {
5984320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu        if (mDownloadListener != null) {
5994320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu            mDownloadListener.onDownloadStart(url,
6004320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                              userAgent,
6014320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                              contentDisposition,
6024320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                              mimeType,
6034320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                              contentLength);
6044320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu        }
6054320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    }
6064320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu
6073c4cc4ad5269837048ffabfa3e749a30b6d17e25Alan Leung    @Override
6083520eb778d668dc76ca4541c69abd568b9d02691Mikhail Naganov    public void onScaleChangedScaled(float oldScale, float newScale) {
6093c4cc4ad5269837048ffabfa3e749a30b6d17e25Alan Leung        mWebViewClient.onScaleChanged(mWebView, oldScale, newScale);
6103c4cc4ad5269837048ffabfa3e749a30b6d17e25Alan Leung    }
6114320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu
6122729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai    @Override
613e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu    public void onShowCustomView(View view,
614e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu            int requestedOrientation, CustomViewCallback cb) {
615e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu        mWebChromeClient.onShowCustomView(view, requestedOrientation, cb);
616e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu    }
617e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu
6182729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai    @Override
6192729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai    protected View getVideoLoadingProgressView() {
6202729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai        return mWebChromeClient.getVideoLoadingProgressView();
6212729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai    }
6222729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai
62346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private static class AwHttpAuthHandlerAdapter extends android.webkit.HttpAuthHandler {
62446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        private AwHttpAuthHandler mAwHandler;
62546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
62646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public AwHttpAuthHandlerAdapter(AwHttpAuthHandler awHandler) {
62746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mAwHandler = awHandler;
62846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
62946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
63046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
63146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public void proceed(String username, String password) {
63246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            if (username == null) {
63346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                username = "";
63446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
63546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
63646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            if (password == null) {
63746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                password = "";
63846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
63946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mAwHandler.proceed(username, password);
64046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
64146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
64246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
64346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public void cancel() {
64446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mAwHandler.cancel();
64546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
64646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
64746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
64846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean useHttpAuthUsernamePassword() {
649d32343c77868461af07738ac7abd802000490d3dBen Murdoch            return mAwHandler.isFirstAttempt();
65046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
65146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
65246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)}
653