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;
236138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)import android.graphics.BitmapFactory;
246138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)import android.graphics.Canvas;
256138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)import android.graphics.Color;
2646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.graphics.Picture;
277da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosibaimport android.net.http.ErrorStrings;
2862c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurunimport android.net.http.SslError;
2946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Handler;
3046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Looper;
31251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liuimport android.os.Message;
3246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.provider.Browser;
3346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.util.Log;
3446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.KeyEvent;
35e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liuimport android.view.View;
3646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.ConsoleMessage;
374320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liuimport android.webkit.DownloadListener;
38885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsenimport android.webkit.GeolocationPermissions;
396832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsenimport android.webkit.JsDialogHelper;
4046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.JsPromptResult;
4146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.JsResult;
4262c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurunimport android.webkit.SslErrorHandler;
43809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liuimport android.webkit.ValueCallback;
4446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebChromeClient;
45e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liuimport android.webkit.WebChromeClient.CustomViewCallback;
4646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebResourceResponse;
4746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebView;
4846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewClient;
4946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
5046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.AwContentsClient;
5146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.AwHttpAuthHandler;
5246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.InterceptedRequestData;
5346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.JsPromptResultReceiver;
5446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.JsResultReceiver;
5530c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdochimport org.chromium.base.ThreadUtils;
5646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.ContentView;
5746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.ContentViewClient;
58245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixonimport org.chromium.content.common.TraceEvent;
5946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
606138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)import java.lang.ref.SoftReference;
6146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.net.URISyntaxException;
6246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
6346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)/**
6446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * An adapter class that forwards the callbacks from {@link ContentViewClient}
6546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * to the appropriate {@link WebViewClient} or {@link WebChromeClient}.
6646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) *
6746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * An instance of this class is associated with one {@link WebViewChromium}
6846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * instance. A WebViewChromium is a WebView implementation provider (that is
6946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * android.webkit.WebView delegates all functionality to it) and has exactly
7046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * one corresponding {@link ContentView} instance.
7146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) *
7246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * A {@link ContentViewClient} may be shared between multiple {@link ContentView}s,
7346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * and hence multiple WebViews. Many WebViewClient methods pass the source
7446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * WebView as an argument. This means that we either need to pass the
7546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * corresponding ContentView to the corresponding ContentViewClient methods,
7646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * or use an instance of ContentViewClientAdapter per WebViewChromium, to
7746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * allow the source WebView to be injected by ContentViewClientAdapter. We
7846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * choose the latter, because it makes for a cleaner design.
7946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */
8046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)public class WebViewContentsClientAdapter extends AwContentsClient {
81081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon    // TAG is chosen for consistency with classic webview tracing.
82081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon    private static final String TAG = "WebViewCallback";
83081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon    // Enables API callback tracing
84081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon    private static final boolean TRACE = android.webkit.DebugFlags.TRACE_CALLBACK;
8546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The WebView instance that this adapter is serving.
8646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private final WebView mWebView;
8746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The WebViewClient instance that was passed to WebView.setWebViewClient().
8846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebViewClient mWebViewClient;
89384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen    // The WebChromeClient instance that was passed to WebView.setContentViewClient().
9046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebChromeClient mWebChromeClient;
9146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The listener receiving find-in-page API results.
9246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebView.FindListener mFindListener;
9346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The listener receiving notifications of screen updates.
9446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebView.PictureListener mPictureListener;
9546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
964320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    private DownloadListener mDownloadListener;
974320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu
989b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch    private Handler mUiThreadHandler;
999b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch
1006138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)    private SoftReference<Bitmap> mCachedDefaultVideoPoster;
1016138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)
1029b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch    private static final int NEW_WEBVIEW_CREATED = 100;
1039b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch
10446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
10546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * Adapter constructor.
10646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     *
10746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @param webView the {@link WebView} instance that this adapter is serving.
10846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
10946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    WebViewContentsClientAdapter(WebView webView) {
11046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (webView == null) {
11146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            throw new IllegalArgumentException("webView can't be null");
11246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
11346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
11446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebView = webView;
11546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        setWebViewClient(null);
1169b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch
1179b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch        mUiThreadHandler = new Handler() {
1189b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch
1199b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch            @Override
1209b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch            public void handleMessage(Message msg) {
1219b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                switch(msg.what) {
1229b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                    case NEW_WEBVIEW_CREATED:
1231ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        WebView.WebViewTransport t = (WebView.WebViewTransport) msg.obj;
1241ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        WebView newWebView = t.getWebView();
1251ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        if (newWebView == mWebView) {
1261ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                            throw new IllegalArgumentException(
1271ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                                    "Parent WebView cannot host it's own popup window. Please " +
1281ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                                    "use WebSettings.setSupportMultipleWindows(false)");
1291ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        }
1301ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch
131bbfef40e5fc625f4821f012fae7f16468b7308cfJonathan Dixon                        if (newWebView != null && newWebView.copyBackForwardList().getSize() != 0) {
1321ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                            throw new IllegalArgumentException(
1331ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                                    "New WebView for popup window must not have been previously " +
1341ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                                    "navigated.");
1351ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        }
1361ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch
1371ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        WebViewChromium.completeWindowCreation(mWebView, newWebView);
1389b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                        break;
1399b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                    default:
1409b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                        throw new IllegalStateException();
1419b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                }
1429b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch            }
1439b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch        };
1449b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch
14546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
14646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
14746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebViewClassic is coded in such a way that even if a null WebViewClient is set,
14846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // certain actions take place.
14946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // We choose to replicate this behavior by using a NullWebViewClient implementation (also known
15046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // as the Null Object pattern) rather than duplicating the WebViewClassic approach in
15146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // ContentView.
15246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    static class NullWebViewClient extends WebViewClient {
15346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
15446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
15546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // TODO: Investigate more and add a test case.
15646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // This is a copy of what Clank does. The WebViewCore key handling code and Clank key
15746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // handling code differ enough that it's not trivial to figure out how keycodes are
15846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // being filtered.
15946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            int keyCode = event.getKeyCode();
16046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            if (keyCode == KeyEvent.KEYCODE_MENU ||
16146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_HOME ||
16246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_BACK ||
16346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_CALL ||
16446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_ENDCALL ||
16546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_POWER ||
16646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_HEADSETHOOK ||
16746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_CAMERA ||
16846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_FOCUS ||
16946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_VOLUME_DOWN ||
17046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_VOLUME_MUTE ||
17146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
17246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                return true;
17346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
17446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return false;
17546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
17646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
17746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
17846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean shouldOverrideUrlLoading(WebView view, String url) {
17946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            Intent intent;
18046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // Perform generic parsing of the URI to turn it into an Intent.
18146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            try {
18246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
18346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            } catch (URISyntaxException ex) {
18446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                Log.w(TAG, "Bad URI " + url + ": " + ex.getMessage());
18546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                return false;
18646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
18746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // Sanitize the Intent, ensuring web pages can not bypass browser
18846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // security (only access to BROWSABLE activities).
18946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            intent.addCategory(Intent.CATEGORY_BROWSABLE);
19046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            intent.setComponent(null);
19146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // Pass the package name as application ID so that the intent from the
19246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // same application can be opened in the same tab.
193fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu            intent.putExtra(Browser.EXTRA_APPLICATION_ID,
194fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu                    view.getContext().getPackageName());
19546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            try {
196fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu                view.getContext().startActivity(intent);
19746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            } catch (ActivityNotFoundException ex) {
19846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                Log.w(TAG, "No application can handle " + url);
19946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                return false;
20046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
20146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return true;
20246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
20346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
20446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
20546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    void setWebViewClient(WebViewClient client) {
20646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (client != null) {
20746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mWebViewClient = client;
20846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        } else {
209fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu            mWebViewClient = new NullWebViewClient();
21046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
21146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
21246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
21346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    void setWebChromeClient(WebChromeClient client) {
214384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        mWebChromeClient = client;
21546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
21646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
2174320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    void setDownloadListener(DownloadListener listener) {
2184320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu        mDownloadListener = listener;
2194320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    }
2204320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu
22146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    void setFindListener(WebView.FindListener listener) {
22246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mFindListener = listener;
22346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
22446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
22546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    void setPictureListener(WebView.PictureListener listener) {
22646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mPictureListener = listener;
22746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
22846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
22946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //--------------------------------------------------------------------------------------------
230245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon    //                        Adapter for all the methods.
23146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //--------------------------------------------------------------------------------------------
23246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
23346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
234809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu     * @see AwContentsClient#getVisitedHistory
235809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu     */
236809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu    @Override
237809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu    public void getVisitedHistory(ValueCallback<String[]> callback) {
238245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
239384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        if (mWebChromeClient != null) {
240081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon            if (TRACE) Log.d(TAG, "getVisitedHistory");
241384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            mWebChromeClient.getVisitedHistory(callback);
242384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        }
243245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
244809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu    }
245809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu
246809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu    /**
2475e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu     * @see AwContentsClient#doUpdateVisiteHistory(String, boolean)
2485e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu     */
2495e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu    @Override
2505e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu    public void doUpdateVisitedHistory(String url, boolean isReload) {
251245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
252081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon        if (TRACE) Log.d(TAG, "doUpdateVisitedHistory=" + url + " reload=" + isReload);
2535e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu        mWebViewClient.doUpdateVisitedHistory(mWebView, url, isReload);
254245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
2555e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu    }
2565e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu
2575e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu    /**
25846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see AwContentsClient#onProgressChanged(int)
25946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
26046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
26146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onProgressChanged(int progress) {
262245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
263384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        if (mWebChromeClient != null) {
264081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon            if (TRACE) Log.d(TAG, "onProgressChanged=" + progress);
265384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            mWebChromeClient.onProgressChanged(mWebView, progress);
266384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        }
267245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
26846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
26946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
27046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
27146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see AwContentsClient#shouldInterceptRequest(java.lang.String)
27246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
27346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
27446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public InterceptedRequestData shouldInterceptRequest(String url) {
275245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
276081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon        if (TRACE) Log.d(TAG, "shouldInterceptRequest=" + url);
27746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        WebResourceResponse response = mWebViewClient.shouldInterceptRequest(mWebView, url);
278245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
27946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (response == null) return null;
28046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return new InterceptedRequestData(
28146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                response.getMimeType(),
28246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                response.getEncoding(),
28346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                response.getData());
28446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
28546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
28646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
287f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon     * @see AwContentsClient#shouldOverrideUrlLoading(java.lang.String)
28846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
289245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon    @Override
290f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon    public boolean shouldOverrideUrlLoading(String url) {
291245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
292081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon        if (TRACE) Log.d(TAG, "shouldOverrideUrlLoading=" + url);
293245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        boolean result = mWebViewClient.shouldOverrideUrlLoading(mWebView, url);
294245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
295245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        return result;
29646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
29746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
29846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
29946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see AwContentsClient#onUnhandledKeyEvent(android.view.KeyEvent)
30046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
30146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
30246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onUnhandledKeyEvent(KeyEvent event) {
303245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
304081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon        if (TRACE) Log.d(TAG, "onUnhandledKeyEvent");
30546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onUnhandledKeyEvent(mWebView, event);
306245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
30746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
30846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
30946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
31046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see AwContentsClient#onConsoleMessage(android.webkit.ConsoleMessage)
31146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
31246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
31346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
314245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
315384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        boolean result;
316384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        if (mWebChromeClient != null) {
317081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon            if (TRACE) Log.d(TAG, "onConsoleMessage");
318384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            result = mWebChromeClient.onConsoleMessage(consoleMessage);
3191a0ca658d1d188ed9dc9b2163be0f2ee89e06a1eKristian Monsen            String message = consoleMessage.message();
3201a0ca658d1d188ed9dc9b2163be0f2ee89e06a1eKristian Monsen            if (result && message != null && message.startsWith("[blocked]")) {
3211a0ca658d1d188ed9dc9b2163be0f2ee89e06a1eKristian Monsen                Log.e(TAG, "Blocked URL: " + message);
3221a0ca658d1d188ed9dc9b2163be0f2ee89e06a1eKristian Monsen            }
323384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        } else {
324384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            result = false;
325384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        }
326245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
327245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        return result;
32846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
32946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
33046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
33146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see AwContentsClient#onFindResultReceived(int,int,boolean)
33246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
33346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
33446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onFindResultReceived(int activeMatchOrdinal, int numberOfMatches,
33546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            boolean isDoneCounting) {
33646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (mFindListener == null) return;
337245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
338081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon        if (TRACE) Log.d(TAG, "onFindResultReceived");
33946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mFindListener.onFindResultReceived(activeMatchOrdinal, numberOfMatches, isDoneCounting);
340245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
34146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
34246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
3435ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil    /**
3445ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil     * @See AwContentsClient#onNewPicture(Picture)
3455ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil     */
3469c5a40623b62737244deb2d04a98830d7ffa8404Leandro Gracia Gil    @Override
3475ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil    public void onNewPicture(Picture picture) {
3485ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil        if (mPictureListener == null) return;
349245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
350081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon        if (TRACE) Log.d(TAG, "onNewPicture");
3515ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil        mPictureListener.onNewPicture(mWebView, picture);
352245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
3535ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil    }
3545ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil
35546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
35646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onLoadResource(String url) {
357245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
358081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon        if (TRACE) Log.d(TAG, "onLoadResource=" + url);
35946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onLoadResource(mWebView, url);
360245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
36146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
36246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
3639b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch    @Override
3649b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch    public boolean onCreateWindow(boolean isDialog, boolean isUserGesture) {
3659b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch        Message m = mUiThreadHandler.obtainMessage(
3669b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                NEW_WEBVIEW_CREATED, mWebView.new WebViewTransport());
367245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
368384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        boolean result;
369384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        if (mWebChromeClient != null) {
370081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon            if (TRACE) Log.d(TAG, "onCreateWindow");
371384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            result = mWebChromeClient.onCreateWindow(mWebView, isDialog, isUserGesture, m);
372384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        } else {
373384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            result = false;
374384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        }
375245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
376245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        return result;
3779b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch    }
3789b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch
379d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch    /**
380d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch     * @see AwContentsClient#onCloseWindow()
381d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch     */
382245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon    @Override
383d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch    public void onCloseWindow() {
384245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
385384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        if (mWebChromeClient != null) {
386081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon            if (TRACE) Log.d(TAG, "onCloseWindow");
387384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            mWebChromeClient.onCloseWindow(mWebView);
388384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        }
389245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
390d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch    }
391d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch
392d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch    /**
393d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch     * @see AwContentsClient#onRequestFocus()
394d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch     */
395245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon    @Override
396d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch    public void onRequestFocus() {
397245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
398384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        if (mWebChromeClient != null) {
399081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon            if (TRACE) Log.d(TAG, "onRequestFocus");
400384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            mWebChromeClient.onRequestFocus(mWebView);
401384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        }
402245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
403d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch    }
404d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch
4051e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch    /**
406690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun     * @see AwContentsClient#onReceivedTouchIconUrl(String url, boolean precomposed)
407690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun     */
408690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun    @Override
409690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun    public void onReceivedTouchIconUrl(String url, boolean precomposed) {
410245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
411384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        if (mWebChromeClient != null) {
412081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon            if (TRACE) Log.d(TAG, "onReceivedTouchIconUrl=" + url);
413384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            mWebChromeClient.onReceivedTouchIconUrl(mWebView, url, precomposed);
414384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        }
415245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
416690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun    }
417690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun
418690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun    /**
4191e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch     * @see AwContentsClient#onReceivedIcon(Bitmap bitmap)
4201e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch     */
4211e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch    @Override
4221e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch    public void onReceivedIcon(Bitmap bitmap) {
423245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
424384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        if (mWebChromeClient != null) {
425081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon            if (TRACE) Log.d(TAG, "onReceivedIcon");
426384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            mWebChromeClient.onReceivedIcon(mWebView, bitmap);
427384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        }
428245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
4291e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch    }
4301e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch
43146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
43246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onPageStarted(String)
43346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
43446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
43546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onPageStarted(String url) {
436245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
437081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon        if (TRACE) Log.d(TAG, "onPageStarted=" + url);
438f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon        mWebViewClient.onPageStarted(mWebView, url, mWebView.getFavicon());
439245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
44046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
44146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
44246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
44346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onPageFinished(String)
44446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
44546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
44646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onPageFinished(String url) {
447245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
448081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon        if (TRACE) Log.d(TAG, "onPageFinished=" + url);
44946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onPageFinished(mWebView, url);
450245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
451e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch
452e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // See b/8208948
453e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // This fakes an onNewPicture callback after onPageFinished to allow
454e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // CTS tests to run in an un-flaky manner. This is required as the
455e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // path for sending Picture updates in Chromium are decoupled from the
456e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // page loading callbacks, i.e. the Chrome compositor may draw our
457e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // content and send the Picture before onPageStarted or onPageFinished
458e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // are invoked. The CTS harness discards any pictures it receives before
459e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // onPageStarted is invoked, so in the case we get the Picture before that and
460e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // no further updates after onPageStarted, we'll fail the test by timing
461e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // out waiting for a Picture.
462e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // To ensure backwards compatibility, we need to defer sending Picture updates
463e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // until onPageFinished has been invoked. This work is being done
464e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // upstream, and we can revert this hack when it lands.
465e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        if (mPictureListener != null) {
46630c0a035f7c865ee300a3d8a9a3e515a66c6a818Ben Murdoch            ThreadUtils.postOnUiThreadDelayed(new Runnable() {
467e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                @Override
468e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                public void run() {
469e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                    UnimplementedWebViewApi.invoke();
470e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                    if (mPictureListener != null) {
471081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon                        if (TRACE) Log.d(TAG, "onPageFinished-fake");
47219b22dbf30aec2f35bfbdbc80f9fa01e98d563e8Ben Murdoch                        mPictureListener.onNewPicture(mWebView, new Picture());
473e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                    }
474e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                }
475e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch            }, 100);
476e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        }
47746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
47846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
47946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
48046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onReceivedError(int,String,String)
48146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
48246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
48346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onReceivedError(int errorCode, String description, String failingUrl) {
4847da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosiba        if (description == null || description.isEmpty()) {
4857da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosiba            // ErrorStrings is @hidden, so we can't do this in AwContents.
4867da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosiba            // Normally the net/ layer will set a valid description, but for synthesized callbacks
4877da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosiba            // (like in the case for intercepted requests) AwContents will pass in null.
4887da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosiba            description = ErrorStrings.getString(errorCode, mWebView.getContext());
4897da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosiba        }
490245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
491081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon        if (TRACE) Log.d(TAG, "onReceivedError=" + failingUrl);
49246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onReceivedError(mWebView, errorCode, description, failingUrl);
493245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
494f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon    }
495f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon
49646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
497f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon     * @see ContentViewClient#onReceivedTitle(String)
49846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
499245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon    @Override
500f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon    public void onReceivedTitle(String title) {
501245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
502384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        if (mWebChromeClient != null) {
503081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon            if (TRACE) Log.d(TAG, "onReceivedTitle");
504384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            mWebChromeClient.onReceivedTitle(mWebView, title);
505384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        }
506245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
50746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
50846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
50946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
51046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
51146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#shouldOverrideKeyEvent(KeyEvent)
51246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
51346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
51446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean shouldOverrideKeyEvent(KeyEvent event) {
515b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon        // TODO(joth): The expression here is a workaround for http://b/7697782 :-
516b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon        // 1. The check for system key should be made in AwContents or ContentViewCore,
517b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon        //    before shouldOverrideKeyEvent() is called at all.
518b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon        // 2. shouldOverrideKeyEvent() should be called in onKeyDown/onKeyUp, not from
519b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon        //    dispatchKeyEvent().
520245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        if (event.isSystem()) return true;
521245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
522081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon        if (TRACE) Log.d(TAG, "shouldOverrideKeyEvent");
523245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        boolean result = mWebViewClient.shouldOverrideKeyEvent(mWebView, event);
524245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
525245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        return result;
52646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
52746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
52846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
52946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
53046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onStartContentIntent(Context, String)
5313e9ca893bb8fb7e0038c04bd04ae78f40233db4fBo Liu     * Callback when detecting a click on a content link.
53246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
533f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon    // TODO: Delete this method when removed from base class.
53446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onStartContentIntent(Context context, String contentUrl) {
535245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
536081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon        if (TRACE) Log.d(TAG, "shouldOverrideUrlLoading=" + contentUrl);
5373e9ca893bb8fb7e0038c04bd04ae78f40233db4fBo Liu        mWebViewClient.shouldOverrideUrlLoading(mWebView, contentUrl);
538245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
53946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
54046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
5416832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen    @Override
5426832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen    public void onGeolocationPermissionsShowPrompt(String origin,
5436832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen            GeolocationPermissions.Callback callback) {
544245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
545384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        if (mWebChromeClient != null) {
546081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon            if (TRACE) Log.d(TAG, "onGeolocationPermissionsShowPrompt");
547384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            mWebChromeClient.onGeolocationPermissionsShowPrompt(origin, callback);
548384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        }
549245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
5506832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen    }
55146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
5526832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen    @Override
5536832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen    public void onGeolocationPermissionsHidePrompt() {
554245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
555384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        if (mWebChromeClient != null) {
556081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon            if (TRACE) Log.d(TAG, "onGeolocationPermissionsHidePrompt");
557384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            mWebChromeClient.onGeolocationPermissionsHidePrompt();
558384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        }
559245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
56046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
56146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
56246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private static class JsPromptResultReceiverAdapter implements JsResult.ResultReceiver {
5636832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        private JsPromptResultReceiver mChromePromptResultReceiver;
5646832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        private JsResultReceiver mChromeResultReceiver;
5656832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        // We hold onto the JsPromptResult here, just to avoid the need to downcast
5666832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        // in onJsResultComplete.
5676832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        private final JsPromptResult mPromptResult = new JsPromptResult(this);
56846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
56946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public JsPromptResultReceiverAdapter(JsPromptResultReceiver receiver) {
5706832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen            mChromePromptResultReceiver = receiver;
5716832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        }
5726832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen
5736832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        public JsPromptResultReceiverAdapter(JsResultReceiver receiver) {
57446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mChromeResultReceiver = receiver;
57546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
57646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
57746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public JsPromptResult getPromptResult() {
57846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return mPromptResult;
57946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
58046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
58146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
58246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public void onJsResultComplete(JsResult result) {
5836832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen            if (mChromePromptResultReceiver != null) {
5846832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                if (mPromptResult.getResult()) {
5856832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                    mChromePromptResultReceiver.confirm(mPromptResult.getStringResult());
5866832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                } else {
5876832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                    mChromePromptResultReceiver.cancel();
5886832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                }
58946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            } else {
5906832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                if (mPromptResult.getResult()) {
5916832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                    mChromeResultReceiver.confirm();
5926832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                } else {
5936832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                    mChromeResultReceiver.cancel();
5946832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                }
59546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
59646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
59746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
59846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
59946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
60046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void handleJsAlert(String url, String message, JsResultReceiver receiver) {
601245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
602384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        if (mWebChromeClient != null) {
603384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            final JsPromptResult res =
604384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen                    new JsPromptResultReceiverAdapter(receiver).getPromptResult();
605081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon            if (TRACE) Log.d(TAG, "onJsAlert");
606384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            if (!mWebChromeClient.onJsAlert(mWebView, url, message, res)) {
607384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen                new JsDialogHelper(res, JsDialogHelper.ALERT, null, message, url)
608384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen                        .showDialog(mWebView.getContext());
609384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            }
610fa824b4e111b53fb0981eb0dec3d254bf2c300eeKristian Monsen        } else {
611fa824b4e111b53fb0981eb0dec3d254bf2c300eeKristian Monsen            receiver.cancel();
6126832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        }
613245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
61446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
61546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
61646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
61746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void handleJsBeforeUnload(String url, String message, JsResultReceiver receiver) {
618245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
619384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        if (mWebChromeClient != null) {
620384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            final JsPromptResult res =
621384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen                    new JsPromptResultReceiverAdapter(receiver).getPromptResult();
622081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon            if (TRACE) Log.d(TAG, "onJsBeforeUnload");
623384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            if (!mWebChromeClient.onJsBeforeUnload(mWebView, url, message, res)) {
624384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen                new JsDialogHelper(res, JsDialogHelper.UNLOAD, null, message, url)
625384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen                        .showDialog(mWebView.getContext());
626384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            }
627fa824b4e111b53fb0981eb0dec3d254bf2c300eeKristian Monsen        } else {
628fa824b4e111b53fb0981eb0dec3d254bf2c300eeKristian Monsen            receiver.cancel();
6296832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        }
630245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
63146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
63246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
63346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
63446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void handleJsConfirm(String url, String message, JsResultReceiver receiver) {
635245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
636384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        if (mWebChromeClient != null) {
637384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            final JsPromptResult res =
638384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen                    new JsPromptResultReceiverAdapter(receiver).getPromptResult();
639081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon            if (TRACE) Log.d(TAG, "onJsConfirm");
640384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            if (!mWebChromeClient.onJsConfirm(mWebView, url, message, res)) {
641384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen                new JsDialogHelper(res, JsDialogHelper.CONFIRM, null, message, url)
642384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen                        .showDialog(mWebView.getContext());
643384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            }
644fa824b4e111b53fb0981eb0dec3d254bf2c300eeKristian Monsen        } else {
645fa824b4e111b53fb0981eb0dec3d254bf2c300eeKristian Monsen            receiver.cancel();
6466832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        }
647245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
64846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
64946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
65046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
65146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void handleJsPrompt(String url, String message, String defaultValue,
65246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            JsPromptResultReceiver receiver) {
653245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
654384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        if (mWebChromeClient != null) {
655384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            final JsPromptResult res =
656384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen                    new JsPromptResultReceiverAdapter(receiver).getPromptResult();
657081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon            if (TRACE) Log.d(TAG, "onJsPrompt");
658384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            if (!mWebChromeClient.onJsPrompt(mWebView, url, message, defaultValue, res)) {
659384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen                new JsDialogHelper(res, JsDialogHelper.PROMPT, defaultValue, message, url)
660384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen                        .showDialog(mWebView.getContext());
661384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            }
662fa824b4e111b53fb0981eb0dec3d254bf2c300eeKristian Monsen        } else {
663fa824b4e111b53fb0981eb0dec3d254bf2c300eeKristian Monsen            receiver.cancel();
6646832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        }
665245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
66646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
66746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
66846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
66946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onReceivedHttpAuthRequest(AwHttpAuthHandler handler, String host, String realm) {
670245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
671081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon        if (TRACE) Log.d(TAG, "onReceivedHttpAuthRequest=" + host);
67246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onReceivedHttpAuthRequest(mWebView,
67346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                new AwHttpAuthHandlerAdapter(handler), host, realm);
674245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
67546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
67646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
677251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu    @Override
67862c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun    public void onReceivedSslError(final ValueCallback<Boolean> callback, SslError error) {
67962c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun        SslErrorHandler handler = new SslErrorHandler() {
68062c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            @Override
68162c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            public void proceed() {
68262c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun                postProceed(true);
68362c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            }
68462c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            @Override
68562c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            public void cancel() {
68662c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun                postProceed(false);
68762c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            }
68862c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            private void postProceed(final boolean proceed) {
68962c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun                post(new Runnable() {
69062c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun                        @Override
69162c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun                        public void run() {
69262c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun                            callback.onReceiveValue(proceed);
69362c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun                        }
69462c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun                    });
69562c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            }
69662c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun        };
697245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
698081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon        if (TRACE) Log.d(TAG, "onReceivedSslError");
69962c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun        mWebViewClient.onReceivedSslError(mWebView, handler, error);
700245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
70162c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun    }
70262c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun
70362c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun    @Override
70497a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu    public void onReceivedLoginRequest(String realm, String account, String args) {
705245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
706081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon        if (TRACE) Log.d(TAG, "onReceivedLoginRequest=" + realm);
70797a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu        mWebViewClient.onReceivedLoginRequest(mWebView, realm, account, args);
708245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
70997a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu    }
71097a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu
71197a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu    @Override
712251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu    public void onFormResubmission(Message dontResend, Message resend) {
713245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
714081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon        if (TRACE) Log.d(TAG, "onFormResubmission");
715251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu        mWebViewClient.onFormResubmission(mWebView, dontResend, resend);
716245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
717251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu    }
718251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu
7194320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    @Override
7204320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    public void onDownloadStart(String url,
7214320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                String userAgent,
7224320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                String contentDisposition,
7234320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                String mimeType,
7244320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                long contentLength) {
7254320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu        if (mDownloadListener != null) {
726245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon            TraceEvent.begin();
727081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon            if (TRACE) Log.d(TAG, "onDownloadStart");
7284320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu            mDownloadListener.onDownloadStart(url,
7294320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                              userAgent,
7304320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                              contentDisposition,
7314320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                              mimeType,
7324320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                              contentLength);
733245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon            TraceEvent.end();
7344320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu        }
7354320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    }
7364320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu
7373c4cc4ad5269837048ffabfa3e749a30b6d17e25Alan Leung    @Override
7383520eb778d668dc76ca4541c69abd568b9d02691Mikhail Naganov    public void onScaleChangedScaled(float oldScale, float newScale) {
739245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
740081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon        if (TRACE) Log.d(TAG, " onScaleChangedScaled");
7413c4cc4ad5269837048ffabfa3e749a30b6d17e25Alan Leung        mWebViewClient.onScaleChanged(mWebView, oldScale, newScale);
742245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
7433c4cc4ad5269837048ffabfa3e749a30b6d17e25Alan Leung    }
7444320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu
7452729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai    @Override
746bbe58198e8cce0c35c42809aebc965aa2b476e1cTao Bai    public void onShowCustomView(View view, CustomViewCallback cb) {
747245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
748384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        if (mWebChromeClient != null) {
749081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon            if (TRACE) Log.d(TAG, "onShowCustomView");
750384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            mWebChromeClient.onShowCustomView(view, cb);
751384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        }
752245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
753e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu    }
754e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu
7552729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai    @Override
756782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai    public void onHideCustomView() {
757245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
758384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        if (mWebChromeClient != null) {
759081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon            if (TRACE) Log.d(TAG, "onHideCustomView");
760384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            mWebChromeClient.onHideCustomView();
761384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        }
762245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
763782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai    }
764782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai
765782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai    @Override
7662729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai    protected View getVideoLoadingProgressView() {
767245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
768384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        View result;
769384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        if (mWebChromeClient != null) {
770081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon            if (TRACE) Log.d(TAG, "getVideoLoadingProgressView");
771384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            result = mWebChromeClient.getVideoLoadingProgressView();
772384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        } else {
773384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            result = null;
774384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        }
775245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
776245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        return result;
7772729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai    }
7782729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai
779be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai    @Override
780be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai    public Bitmap getDefaultVideoPoster() {
781245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
7826138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)        Bitmap result = null;
783384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        if (mWebChromeClient != null) {
784081c438a8201fe2d1248f487808b3bae6706aa7eJonathan Dixon            if (TRACE) Log.d(TAG, "getDefaultVideoPoster");
785384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen            result = mWebChromeClient.getDefaultVideoPoster();
7866138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)        }
7876138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)        if (result == null) {
7886138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)            if (mCachedDefaultVideoPoster != null) {
7896138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)                result = mCachedDefaultVideoPoster.get();
7906138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)            }
7916138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)            if (result == null) {
7926138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)                Bitmap poster = BitmapFactory.decodeResource(
7936138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)                        mWebView.getContext().getResources(),
7946138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)                        com.android.internal.R.drawable.ic_media_video_poster);
7956138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)                result = Bitmap.createBitmap(poster.getWidth(),
7966138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)                                             poster.getHeight(),
7976138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)                                             poster.getConfig());
7986138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)                result.eraseColor(Color.GRAY);
7996138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)                Canvas canvas = new Canvas(result);
8006138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)                canvas.drawBitmap(poster, 0f, 0f, null);
8016138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)                mCachedDefaultVideoPoster = new SoftReference<Bitmap>(result);
8026138d17c5fd136a215078b4a9ae818d73cfa8b9aTorne (Richard Coles)            }
803384082f8b157276c85b658d8dc254e3489f8f944Kristian Monsen        }
804245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
805245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        return result;
806be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai    }
807be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai
80846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private static class AwHttpAuthHandlerAdapter extends android.webkit.HttpAuthHandler {
80946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        private AwHttpAuthHandler mAwHandler;
81046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
81146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public AwHttpAuthHandlerAdapter(AwHttpAuthHandler awHandler) {
81246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mAwHandler = awHandler;
81346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
81446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
81546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
81646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public void proceed(String username, String password) {
81746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            if (username == null) {
81846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                username = "";
81946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
82046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
82146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            if (password == null) {
82246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                password = "";
82346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
82446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mAwHandler.proceed(username, password);
82546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
82646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
82746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
82846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public void cancel() {
82946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mAwHandler.cancel();
83046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
83146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
83246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
83346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean useHttpAuthUsernamePassword() {
834d32343c77868461af07738ac7abd802000490d3dBen Murdoch            return mAwHandler.isFirstAttempt();
83546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
83646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
83746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)}
838