WebViewContentsClientAdapter.java revision 6832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820
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;
356832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsenimport android.webkit.JsDialogHelper;
3646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.JsPromptResult;
3746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.JsResult;
3862c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurunimport android.webkit.SslErrorHandler;
39809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liuimport android.webkit.ValueCallback;
4046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebChromeClient;
41e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liuimport android.webkit.WebChromeClient.CustomViewCallback;
4246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebResourceResponse;
4346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebView;
4446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewClient;
4546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
4646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.AwContentsClient;
4746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.AwHttpAuthHandler;
4846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.InterceptedRequestData;
4946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.JsPromptResultReceiver;
5046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.JsResultReceiver;
5146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.ContentView;
5246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.ContentViewClient;
5346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
5446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.net.URISyntaxException;
5546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
5646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)/**
5746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * An adapter class that forwards the callbacks from {@link ContentViewClient}
5846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * to the appropriate {@link WebViewClient} or {@link WebChromeClient}.
5946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) *
6046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * An instance of this class is associated with one {@link WebViewChromium}
6146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * instance. A WebViewChromium is a WebView implementation provider (that is
6246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * android.webkit.WebView delegates all functionality to it) and has exactly
6346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * one corresponding {@link ContentView} instance.
6446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) *
6546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * A {@link ContentViewClient} may be shared between multiple {@link ContentView}s,
6646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * and hence multiple WebViews. Many WebViewClient methods pass the source
6746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * WebView as an argument. This means that we either need to pass the
6846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * corresponding ContentView to the corresponding ContentViewClient methods,
6946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * or use an instance of ContentViewClientAdapter per WebViewChromium, to
7046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * allow the source WebView to be injected by ContentViewClientAdapter. We
7146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * choose the latter, because it makes for a cleaner design.
7246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */
7346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)public class WebViewContentsClientAdapter extends AwContentsClient {
7446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private static final String TAG = "ContentViewClientAdapter";
7546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The WebView instance that this adapter is serving.
7646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private final WebView mWebView;
7746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The WebViewClient instance that was passed to WebView.setWebViewClient().
7846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebViewClient mWebViewClient;
7946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The WebViewClient instance that was passed to WebView.setContentViewClient().
8046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebChromeClient mWebChromeClient;
8146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The listener receiving find-in-page API results.
8246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebView.FindListener mFindListener;
8346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The listener receiving notifications of screen updates.
8446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebView.PictureListener mPictureListener;
8546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
864320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    private DownloadListener mDownloadListener;
874320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu
889b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch    private Handler mUiThreadHandler;
899b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch
909b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch    private static final int NEW_WEBVIEW_CREATED = 100;
919b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch
9246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
9346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * Adapter constructor.
9446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     *
9546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @param webView the {@link WebView} instance that this adapter is serving.
9646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
9746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    WebViewContentsClientAdapter(WebView webView) {
9846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (webView == null) {
9946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            throw new IllegalArgumentException("webView can't be null");
10046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
10146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
10246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebView = webView;
10346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        setWebViewClient(null);
10446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        setWebChromeClient(null);
1059b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch
1069b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch        mUiThreadHandler = new Handler() {
1079b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch
1089b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch            @Override
1099b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch            public void handleMessage(Message msg) {
1109b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                switch(msg.what) {
1119b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                    case NEW_WEBVIEW_CREATED:
1121ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        WebView.WebViewTransport t = (WebView.WebViewTransport) msg.obj;
1131ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        WebView newWebView = t.getWebView();
1141ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        if (newWebView == null) {
1151ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                            throw new IllegalArgumentException(
1161ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                                    "Must provide a new WebView for the new window.");
1171ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        }
1181ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        if (newWebView == mWebView) {
1191ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                            throw new IllegalArgumentException(
1201ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                                    "Parent WebView cannot host it's own popup window. Please " +
1211ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                                    "use WebSettings.setSupportMultipleWindows(false)");
1221ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        }
1231ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch
1241ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        if (newWebView.copyBackForwardList().getSize() != 0) {
1251ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                            throw new IllegalArgumentException(
1261ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                                    "New WebView for popup window must not have been previously " +
1271ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                                    "navigated.");
1281ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        }
1291ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch
1301ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        WebViewChromium.completeWindowCreation(mWebView, newWebView);
1319b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                        break;
1329b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                    default:
1339b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                        throw new IllegalStateException();
1349b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                }
1359b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch            }
1369b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch        };
1379b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch
13846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
13946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
14046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebViewClassic is coded in such a way that even if a null WebViewClient is set,
14146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // certain actions take place.
14246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // We choose to replicate this behavior by using a NullWebViewClient implementation (also known
14346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // as the Null Object pattern) rather than duplicating the WebViewClassic approach in
14446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // ContentView.
14546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    static class NullWebViewClient extends WebViewClient {
14646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
14746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
14846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // TODO: Investigate more and add a test case.
14946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // This is a copy of what Clank does. The WebViewCore key handling code and Clank key
15046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // handling code differ enough that it's not trivial to figure out how keycodes are
15146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // being filtered.
15246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            int keyCode = event.getKeyCode();
15346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            if (keyCode == KeyEvent.KEYCODE_MENU ||
15446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_HOME ||
15546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_BACK ||
15646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_CALL ||
15746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_ENDCALL ||
15846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_POWER ||
15946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_HEADSETHOOK ||
16046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_CAMERA ||
16146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_FOCUS ||
16246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_VOLUME_DOWN ||
16346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_VOLUME_MUTE ||
16446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
16546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                return true;
16646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
16746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
16846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
16946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
17046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
17146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean shouldOverrideUrlLoading(WebView view, String url) {
17246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            Intent intent;
17346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // Perform generic parsing of the URI to turn it into an Intent.
17446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            try {
17546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
17646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            } catch (URISyntaxException ex) {
17746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                Log.w(TAG, "Bad URI " + url + ": " + ex.getMessage());
17846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                return false;
17946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
18046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // Sanitize the Intent, ensuring web pages can not bypass browser
18146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // security (only access to BROWSABLE activities).
18246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            intent.addCategory(Intent.CATEGORY_BROWSABLE);
18346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            intent.setComponent(null);
18446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // Pass the package name as application ID so that the intent from the
18546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // same application can be opened in the same tab.
186fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu            intent.putExtra(Browser.EXTRA_APPLICATION_ID,
187fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu                    view.getContext().getPackageName());
18846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            try {
189fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu                view.getContext().startActivity(intent);
19046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            } catch (ActivityNotFoundException ex) {
19146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                Log.w(TAG, "No application can handle " + url);
19246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                return false;
19346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
19446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return true;
19546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
19646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
19746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
19846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    void setWebViewClient(WebViewClient client) {
19946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (client != null) {
20046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mWebViewClient = client;
20146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        } else {
202fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu            mWebViewClient = new NullWebViewClient();
20346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
20446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
20546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
20646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    void setWebChromeClient(WebChromeClient client) {
20746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (client != null) {
20846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mWebChromeClient = client;
20946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        } else {
21046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // WebViewClassic doesn't implement any special behavior for a null WebChromeClient.
21146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mWebChromeClient = new WebChromeClient();
21246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
21346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
21446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
2154320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    void setDownloadListener(DownloadListener listener) {
2164320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu        mDownloadListener = listener;
2174320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    }
2184320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu
21946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    void setFindListener(WebView.FindListener listener) {
22046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mFindListener = listener;
22146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
22246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
22346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    void setPictureListener(WebView.PictureListener listener) {
22446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mPictureListener = listener;
22546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
22646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
22746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //--------------------------------------------------------------------------------------------
22846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //                        Adapter for WebContentsDelegate methods.
22946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //--------------------------------------------------------------------------------------------
23046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
23146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
232809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu     * @see AwContentsClient#getVisitedHistory
233809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu     */
234809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu    @Override
235809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu    public void getVisitedHistory(ValueCallback<String[]> callback) {
236809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu        mWebChromeClient.getVisitedHistory(callback);
237809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu    }
238809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu
239809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu    /**
2405e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu     * @see AwContentsClient#doUpdateVisiteHistory(String, boolean)
2415e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu     */
2425e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu    @Override
2435e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu    public void doUpdateVisitedHistory(String url, boolean isReload) {
2445e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu        mWebViewClient.doUpdateVisitedHistory(mWebView, url, isReload);
2455e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu    }
2465e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu
2475e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu    /**
24846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see AwContentsClient#onProgressChanged(int)
24946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
25046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
25146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onProgressChanged(int progress) {
25246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebChromeClient.onProgressChanged(mWebView, progress);
25346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
25446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
25546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
25646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see AwContentsClient#shouldInterceptRequest(java.lang.String)
25746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
25846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
25946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public InterceptedRequestData shouldInterceptRequest(String url) {
26046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        WebResourceResponse response = mWebViewClient.shouldInterceptRequest(mWebView, url);
26146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (response == null) return null;
26246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return new InterceptedRequestData(
26346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                response.getMimeType(),
26446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                response.getEncoding(),
26546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                response.getData());
26646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
26746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
268f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon    // TODO: remove this overload, and mark shouldOverrideUrlLoading as @Override
269f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon    public boolean shouldIgnoreNavigation(String url) {
270f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon        return this.shouldOverrideUrlLoading(url);
271f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon    }
272f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon
27346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
274f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon     * @see AwContentsClient#shouldOverrideUrlLoading(java.lang.String)
27546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
276f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon    //@Override
277f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon    public boolean shouldOverrideUrlLoading(String url) {
27846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)      return mWebViewClient.shouldOverrideUrlLoading(mWebView, url);
27946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
28046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
28146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
28246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see AwContentsClient#onUnhandledKeyEvent(android.view.KeyEvent)
28346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
28446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
28546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onUnhandledKeyEvent(KeyEvent event) {
28646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onUnhandledKeyEvent(mWebView, event);
28746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
28846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
28946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
29046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see AwContentsClient#onConsoleMessage(android.webkit.ConsoleMessage)
29146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
29246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
29346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
29446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mWebChromeClient.onConsoleMessage(consoleMessage);
29546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
29646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
29746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
29846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see AwContentsClient#onFindResultReceived(int,int,boolean)
29946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
30046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
30146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onFindResultReceived(int activeMatchOrdinal, int numberOfMatches,
30246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            boolean isDoneCounting) {
30346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (mFindListener == null) return;
30446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mFindListener.onFindResultReceived(activeMatchOrdinal, numberOfMatches, isDoneCounting);
30546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
30646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
3075ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil    /**
3085ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil     * @See AwContentsClient#onNewPicture(Picture)
3095ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil     */
3109c5a40623b62737244deb2d04a98830d7ffa8404Leandro Gracia Gil    @Override
3115ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil    public void onNewPicture(Picture picture) {
3125ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil        if (mPictureListener == null) return;
3135ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil        mPictureListener.onNewPicture(mWebView, picture);
3145ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil    }
3155ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil
31646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
31746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onLoadResource(String url) {
31846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onLoadResource(mWebView, url);
31946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
32046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
3219b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch    @Override
3229b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch    public boolean onCreateWindow(boolean isDialog, boolean isUserGesture) {
3239b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch        Message m = mUiThreadHandler.obtainMessage(
3249b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                NEW_WEBVIEW_CREATED, mWebView.new WebViewTransport());
3251ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch        return mWebChromeClient.onCreateWindow(mWebView, isDialog, isUserGesture, m);
3269b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch    }
3279b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch
328d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch    /**
329d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch     * @see AwContentsClient#onCloseWindow()
330d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch     */
331d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch    /* @Override */
332d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch    public void onCloseWindow() {
333d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch        mWebChromeClient.onCloseWindow(mWebView);
334d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch    }
335d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch
336d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch    /**
337d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch     * @see AwContentsClient#onRequestFocus()
338d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch     */
339d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch    /* @Override */
340d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch    public void onRequestFocus() {
341d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch        mWebChromeClient.onRequestFocus(mWebView);
342d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch    }
343d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch
3441e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch    /**
345690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun     * @see AwContentsClient#onReceivedTouchIconUrl(String url, boolean precomposed)
346690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun     */
347690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun    @Override
348690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun    public void onReceivedTouchIconUrl(String url, boolean precomposed) {
349690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun        mWebChromeClient.onReceivedTouchIconUrl(mWebView, url, precomposed);
350690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun    }
351690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun
352690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun    /**
3531e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch     * @see AwContentsClient#onReceivedIcon(Bitmap bitmap)
3541e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch     */
3551e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch    @Override
3561e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch    public void onReceivedIcon(Bitmap bitmap) {
3571e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch        mWebChromeClient.onReceivedIcon(mWebView, bitmap);
3581e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch    }
3591e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch
36046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //--------------------------------------------------------------------------------------------
36146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //                        Trivial Chrome -> WebViewClient mappings.
36246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //--------------------------------------------------------------------------------------------
36346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
36446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
36546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onPageStarted(String)
36646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
36746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
36846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onPageStarted(String url) {
369f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon        mWebViewClient.onPageStarted(mWebView, url, mWebView.getFavicon());
37046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
37146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
37246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
37346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onPageFinished(String)
37446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
37546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
37646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onPageFinished(String url) {
37746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onPageFinished(mWebView, url);
378e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch
379e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // See b/8208948
380e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // This fakes an onNewPicture callback after onPageFinished to allow
381e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // CTS tests to run in an un-flaky manner. This is required as the
382e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // path for sending Picture updates in Chromium are decoupled from the
383e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // page loading callbacks, i.e. the Chrome compositor may draw our
384e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // content and send the Picture before onPageStarted or onPageFinished
385e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // are invoked. The CTS harness discards any pictures it receives before
386e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // onPageStarted is invoked, so in the case we get the Picture before that and
387e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // no further updates after onPageStarted, we'll fail the test by timing
388e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // out waiting for a Picture.
389e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // To ensure backwards compatibility, we need to defer sending Picture updates
390e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // until onPageFinished has been invoked. This work is being done
391e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // upstream, and we can revert this hack when it lands.
392e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        if (mPictureListener != null) {
393e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch            new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
394e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                @Override
395e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                public void run() {
396e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                    UnimplementedWebViewApi.invoke();
397e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                    if (mPictureListener != null) {
398e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                        mPictureListener.onNewPicture(mWebView, null);
399e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                    }
400e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                }
401e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch            }, 100);
402e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        }
40346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
40446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
40546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
40646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onReceivedError(int,String,String)
40746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
40846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
40946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onReceivedError(int errorCode, String description, String failingUrl) {
41046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onReceivedError(mWebView, errorCode, description, failingUrl);
41146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
41246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
413f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon    // TODO: remove this method, and mark onReceivedTitle as @Override
414f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon    public void onUpdateTitle(String title) {
415f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon        onReceivedTitle(title);
416f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon    }
417f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon
41846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
419f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon     * @see ContentViewClient#onReceivedTitle(String)
42046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
421f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon    //@Override
422f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon    public void onReceivedTitle(String title) {
42346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebChromeClient.onReceivedTitle(mWebView, title);
42446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
42546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
42646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
42746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
42846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#shouldOverrideKeyEvent(KeyEvent)
42946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
43046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
43146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean shouldOverrideKeyEvent(KeyEvent event) {
432b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon        // TODO(joth): The expression here is a workaround for http://b/7697782 :-
433b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon        // 1. The check for system key should be made in AwContents or ContentViewCore,
434b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon        //    before shouldOverrideKeyEvent() is called at all.
435b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon        // 2. shouldOverrideKeyEvent() should be called in onKeyDown/onKeyUp, not from
436b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon        //    dispatchKeyEvent().
437b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon        return event.isSystem() ||
438b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon            mWebViewClient.shouldOverrideKeyEvent(mWebView, event);
43946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
44046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
44146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
44246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
44346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onStartContentIntent(Context, String)
4443e9ca893bb8fb7e0038c04bd04ae78f40233db4fBo Liu     * Callback when detecting a click on a content link.
44546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
446f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon    // TODO: Delete this method when removed from base class.
44746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onStartContentIntent(Context context, String contentUrl) {
4483e9ca893bb8fb7e0038c04bd04ae78f40233db4fBo Liu        mWebViewClient.shouldOverrideUrlLoading(mWebView, contentUrl);
44946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
45046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
4516832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen    @Override
4526832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen    public void onGeolocationPermissionsShowPrompt(String origin,
4536832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen            GeolocationPermissions.Callback callback) {
4546832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        mWebChromeClient.onGeolocationPermissionsShowPrompt(origin, callback);
4556832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen    }
45646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
4576832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen    @Override
4586832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen    public void onGeolocationPermissionsHidePrompt() {
4596832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        mWebChromeClient.onGeolocationPermissionsHidePrompt();
46046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
46146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
46246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private static class JsPromptResultReceiverAdapter implements JsResult.ResultReceiver {
4636832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        private JsPromptResultReceiver mChromePromptResultReceiver;
4646832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        private JsResultReceiver mChromeResultReceiver;
4656832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        // We hold onto the JsPromptResult here, just to avoid the need to downcast
4666832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        // in onJsResultComplete.
4676832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        private final JsPromptResult mPromptResult = new JsPromptResult(this);
46846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
46946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public JsPromptResultReceiverAdapter(JsPromptResultReceiver receiver) {
4706832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen            mChromePromptResultReceiver = receiver;
4716832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        }
4726832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen
4736832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        public JsPromptResultReceiverAdapter(JsResultReceiver receiver) {
47446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mChromeResultReceiver = receiver;
47546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
47646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
47746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public JsPromptResult getPromptResult() {
47846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return mPromptResult;
47946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
48046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
48146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
48246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public void onJsResultComplete(JsResult result) {
4836832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen            if (mChromePromptResultReceiver != null) {
4846832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                if (mPromptResult.getResult()) {
4856832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                    mChromePromptResultReceiver.confirm(mPromptResult.getStringResult());
4866832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                } else {
4876832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                    mChromePromptResultReceiver.cancel();
4886832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                }
48946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            } else {
4906832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                if (mPromptResult.getResult()) {
4916832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                    mChromeResultReceiver.confirm();
4926832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                } else {
4936832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                    mChromeResultReceiver.cancel();
4946832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                }
49546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
49646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
49746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
49846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
49946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
50046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void handleJsAlert(String url, String message, JsResultReceiver receiver) {
5016832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        final JsPromptResult res = new JsPromptResultReceiverAdapter(receiver).getPromptResult();
5026832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        if (!mWebChromeClient.onJsAlert(mWebView, url, message, res)) {
5036832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen            new JsDialogHelper(res, JsDialogHelper.ALERT, null, message, url)
5046832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                    .showDialog(mWebView.getContext());
5056832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        }
50646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
50746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
50846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
50946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void handleJsBeforeUnload(String url, String message, JsResultReceiver receiver) {
5106832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        final JsPromptResult res = new JsPromptResultReceiverAdapter(receiver).getPromptResult();
5116832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        if (!mWebChromeClient.onJsBeforeUnload(mWebView, url, message, res)) {
5126832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen            new JsDialogHelper(res, JsDialogHelper.UNLOAD, null, message, url)
5136832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                    .showDialog(mWebView.getContext());
5146832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        }
51546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
51646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
51746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
51846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void handleJsConfirm(String url, String message, JsResultReceiver receiver) {
5196832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        final JsPromptResult res = new JsPromptResultReceiverAdapter(receiver).getPromptResult();
5206832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        if (!mWebChromeClient.onJsConfirm(mWebView, url, message, res)) {
5216832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen            new JsDialogHelper(res, JsDialogHelper.CONFIRM, null, message, url)
5226832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                    .showDialog(mWebView.getContext());
5236832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        }
52446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
52546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
52646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
52746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void handleJsPrompt(String url, String message, String defaultValue,
52846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            JsPromptResultReceiver receiver) {
5296832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        final JsPromptResult res = new JsPromptResultReceiverAdapter(receiver).getPromptResult();
5306832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        if (!mWebChromeClient.onJsPrompt(mWebView, url, message, defaultValue, res)) {
5316832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen            new JsDialogHelper(res, JsDialogHelper.PROMPT, defaultValue, message, url)
5326832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                    .showDialog(mWebView.getContext());
5336832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        }
53446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
53546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
53646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
53746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onReceivedHttpAuthRequest(AwHttpAuthHandler handler, String host, String realm) {
53846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onReceivedHttpAuthRequest(mWebView,
53946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                new AwHttpAuthHandlerAdapter(handler), host, realm);
54046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
54146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
542251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu    @Override
54362c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun    public void onReceivedSslError(final ValueCallback<Boolean> callback, SslError error) {
54462c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun        SslErrorHandler handler = new SslErrorHandler() {
54562c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            @Override
54662c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            public void proceed() {
54762c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun                postProceed(true);
54862c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            }
54962c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            @Override
55062c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            public void cancel() {
55162c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun                postProceed(false);
55262c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            }
55362c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            private void postProceed(final boolean proceed) {
55462c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun                post(new Runnable() {
55562c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun                        @Override
55662c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun                        public void run() {
55762c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun                            callback.onReceiveValue(proceed);
55862c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun                        }
55962c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun                    });
56062c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            }
56162c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun        };
56262c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun        mWebViewClient.onReceivedSslError(mWebView, handler, error);
56362c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun    }
56462c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun
56562c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun    @Override
56697a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu    public void onReceivedLoginRequest(String realm, String account, String args) {
56797a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu        mWebViewClient.onReceivedLoginRequest(mWebView, realm, account, args);
56897a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu    }
56997a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu
57097a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu    @Override
571251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu    public void onFormResubmission(Message dontResend, Message resend) {
572251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu        mWebViewClient.onFormResubmission(mWebView, dontResend, resend);
573251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu    }
574251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu
5754320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    @Override
5764320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    public void onDownloadStart(String url,
5774320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                String userAgent,
5784320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                String contentDisposition,
5794320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                String mimeType,
5804320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                long contentLength) {
5814320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu        if (mDownloadListener != null) {
5824320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu            mDownloadListener.onDownloadStart(url,
5834320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                              userAgent,
5844320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                              contentDisposition,
5854320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                              mimeType,
5864320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                              contentLength);
5874320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu        }
5884320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    }
5894320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu
5903c4cc4ad5269837048ffabfa3e749a30b6d17e25Alan Leung    @Override
5913520eb778d668dc76ca4541c69abd568b9d02691Mikhail Naganov    public void onScaleChangedScaled(float oldScale, float newScale) {
5923c4cc4ad5269837048ffabfa3e749a30b6d17e25Alan Leung        mWebViewClient.onScaleChanged(mWebView, oldScale, newScale);
5933c4cc4ad5269837048ffabfa3e749a30b6d17e25Alan Leung    }
5944320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu
5952729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai    @Override
596e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu    public void onShowCustomView(View view,
597e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu            int requestedOrientation, CustomViewCallback cb) {
598e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu        mWebChromeClient.onShowCustomView(view, requestedOrientation, cb);
599e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu    }
600e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu
6012729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai    @Override
602782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai    public void onHideCustomView() {
603782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai        mWebChromeClient.onHideCustomView();
604782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai    }
605782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai
606782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai    @Override
6072729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai    protected View getVideoLoadingProgressView() {
6082729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai        return mWebChromeClient.getVideoLoadingProgressView();
6092729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai    }
6102729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai
611be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai    @Override
612be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai    public Bitmap getDefaultVideoPoster() {
613be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai        return mWebChromeClient.getDefaultVideoPoster();
614be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai    }
615be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai
61646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private static class AwHttpAuthHandlerAdapter extends android.webkit.HttpAuthHandler {
61746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        private AwHttpAuthHandler mAwHandler;
61846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
61946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public AwHttpAuthHandlerAdapter(AwHttpAuthHandler awHandler) {
62046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mAwHandler = awHandler;
62146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
62246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
62346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
62446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public void proceed(String username, String password) {
62546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            if (username == null) {
62646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                username = "";
62746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
62846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
62946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            if (password == null) {
63046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                password = "";
63146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
63246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mAwHandler.proceed(username, password);
63346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
63446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
63546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
63646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public void cancel() {
63746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mAwHandler.cancel();
63846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
63946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
64046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
64146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean useHttpAuthUsernamePassword() {
642d32343c77868461af07738ac7abd802000490d3dBen Murdoch            return mAwHandler.isFirstAttempt();
64346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
64446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
64546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)}
646