WebViewContentsClientAdapter.java revision 4054cf14197579550220ccb28ee43d63f3df3937
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;
23780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles)import android.graphics.BitmapFactory;
24780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles)import android.graphics.Canvas;
25780460e70baa6eeb9dd596248384c6dd6a05673fTorne (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;
2948c8233468f8c735d8504c8410b86cc373d679edJonathan Dixonimport android.net.Uri;
3048c8233468f8c735d8504c8410b86cc373d679edJonathan Dixonimport android.os.Build;
3146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Handler;
3246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Looper;
33251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liuimport android.os.Message;
3446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.provider.Browser;
3546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.util.Log;
3646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.KeyEvent;
37e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liuimport android.view.View;
3806b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurunimport android.webkit.ClientCertRequest;
3946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.ConsoleMessage;
404320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liuimport android.webkit.DownloadListener;
41885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsenimport android.webkit.GeolocationPermissions;
426832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsenimport android.webkit.JsDialogHelper;
4346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.JsPromptResult;
4446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.JsResult;
45750453815989696ae449df0e58556cd16ebe63c0Tao Baiimport android.webkit.PermissionRequest;
4662c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurunimport android.webkit.SslErrorHandler;
47809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liuimport android.webkit.ValueCallback;
4846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebChromeClient;
49e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liuimport android.webkit.WebChromeClient.CustomViewCallback;
5046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebResourceResponse;
51c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosibaimport android.webkit.WebResourceRequest;
5246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebView;
5346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewClient;
5446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
5546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.AwContentsClient;
5606b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurunimport org.chromium.android_webview.AwContentsClientBridge;
5746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.AwHttpAuthHandler;
58017554f2c30b84041e3e47a921fd94c80425699aMarcin Kosibaimport org.chromium.android_webview.AwWebResourceResponse;
5946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.JsPromptResultReceiver;
6046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.JsResultReceiver;
61750453815989696ae449df0e58556cd16ebe63c0Tao Baiimport org.chromium.android_webview.permission.AwPermissionRequest;
62fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdochimport org.chromium.base.ThreadUtils;
6354b3666a044d576394424822704d21dace02dc7cMarcin Kosibaimport org.chromium.base.TraceEvent;
6446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.ContentView;
6546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.ContentViewClient;
6646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
67b6e8dc172dcd850cf57321a9c574b184275c85fbTao Baiimport java.lang.ref.WeakReference;
6846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.net.URISyntaxException;
6906b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurunimport java.security.Principal;
7006b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurunimport java.security.PrivateKey;
7106b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurunimport java.security.cert.X509Certificate;
724054cf14197579550220ccb28ee43d63f3df3937Marcin Kosibaimport java.util.HashMap;
73c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosibaimport java.util.Map;
74b6e8dc172dcd850cf57321a9c574b184275c85fbTao Baiimport java.util.WeakHashMap;
7548c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon
7646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)/**
7746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * An adapter class that forwards the callbacks from {@link ContentViewClient}
7846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * to the appropriate {@link WebViewClient} or {@link WebChromeClient}.
7946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) *
8046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * An instance of this class is associated with one {@link WebViewChromium}
8146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * instance. A WebViewChromium is a WebView implementation provider (that is
8246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * android.webkit.WebView delegates all functionality to it) and has exactly
8346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * one corresponding {@link ContentView} instance.
8446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) *
8546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * A {@link ContentViewClient} may be shared between multiple {@link ContentView}s,
8646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * and hence multiple WebViews. Many WebViewClient methods pass the source
8746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * WebView as an argument. This means that we either need to pass the
8846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * corresponding ContentView to the corresponding ContentViewClient methods,
8946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * or use an instance of ContentViewClientAdapter per WebViewChromium, to
9046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * allow the source WebView to be injected by ContentViewClientAdapter. We
9146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * choose the latter, because it makes for a cleaner design.
9246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */
9346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)public class WebViewContentsClientAdapter extends AwContentsClient {
94a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon    // TAG is chosen for consistency with classic webview tracing.
95a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon    private static final String TAG = "WebViewCallback";
96a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon    // Enables API callback tracing
97a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon    private static final boolean TRACE = android.webkit.DebugFlags.TRACE_CALLBACK;
9846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The WebView instance that this adapter is serving.
9946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private final WebView mWebView;
10046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The WebViewClient instance that was passed to WebView.setWebViewClient().
10146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebViewClient mWebViewClient;
10233e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen    // The WebChromeClient instance that was passed to WebView.setContentViewClient().
10346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebChromeClient mWebChromeClient;
10446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The listener receiving find-in-page API results.
10546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebView.FindListener mFindListener;
10646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // The listener receiving notifications of screen updates.
10746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private WebView.PictureListener mPictureListener;
10846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
1094320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    private DownloadListener mDownloadListener;
1104320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu
1119b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch    private Handler mUiThreadHandler;
1129b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch
1139b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch    private static final int NEW_WEBVIEW_CREATED = 100;
1149b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch
115b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai    private WeakHashMap<AwPermissionRequest, WeakReference<PermissionRequestAdapter>>
116b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai            mOngoingPermissionRequests;
11746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
11846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * Adapter constructor.
11946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     *
12046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @param webView the {@link WebView} instance that this adapter is serving.
12146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
12246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    WebViewContentsClientAdapter(WebView webView) {
12346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (webView == null) {
12446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            throw new IllegalArgumentException("webView can't be null");
12546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
12646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
12746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebView = webView;
12846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        setWebViewClient(null);
1299b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch
1309b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch        mUiThreadHandler = new Handler() {
1319b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch
1329b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch            @Override
1339b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch            public void handleMessage(Message msg) {
1349b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                switch(msg.what) {
1359b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                    case NEW_WEBVIEW_CREATED:
1361ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        WebView.WebViewTransport t = (WebView.WebViewTransport) msg.obj;
1371ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        WebView newWebView = t.getWebView();
1381ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        if (newWebView == mWebView) {
1391ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                            throw new IllegalArgumentException(
1401ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                                    "Parent WebView cannot host it's own popup window. Please " +
1411ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                                    "use WebSettings.setSupportMultipleWindows(false)");
1421ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        }
1431ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch
144bbfef40e5fc625f4821f012fae7f16468b7308cfJonathan Dixon                        if (newWebView != null && newWebView.copyBackForwardList().getSize() != 0) {
1451ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                            throw new IllegalArgumentException(
1461ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                                    "New WebView for popup window must not have been previously " +
1471ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                                    "navigated.");
1481ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        }
1491ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch
1501ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch                        WebViewChromium.completeWindowCreation(mWebView, newWebView);
1519b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                        break;
1529b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                    default:
1539b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                        throw new IllegalStateException();
1549b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                }
1559b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch            }
1569b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch        };
1579b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch
15846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
15946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
16046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // WebViewClassic is coded in such a way that even if a null WebViewClient is set,
16146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // certain actions take place.
16246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // We choose to replicate this behavior by using a NullWebViewClient implementation (also known
16346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // as the Null Object pattern) rather than duplicating the WebViewClassic approach in
16446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    // ContentView.
16546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    static class NullWebViewClient extends WebViewClient {
16646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
16746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
16846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // TODO: Investigate more and add a test case.
169924278d1f98b209b04bd699494d269d363d1aaa4Primiano Tucci            // This is reflecting Clank's behavior.
17046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            int keyCode = event.getKeyCode();
171924278d1f98b209b04bd699494d269d363d1aaa4Primiano Tucci            return !ContentViewClient.shouldPropagateKey(keyCode);
17246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
17346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
17446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
17546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean shouldOverrideUrlLoading(WebView view, String url) {
17646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            Intent intent;
17746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // Perform generic parsing of the URI to turn it into an Intent.
17846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            try {
17946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
18046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            } catch (URISyntaxException ex) {
18146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                Log.w(TAG, "Bad URI " + url + ": " + ex.getMessage());
18246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                return false;
18346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
18446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // Sanitize the Intent, ensuring web pages can not bypass browser
18546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // security (only access to BROWSABLE activities).
18646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            intent.addCategory(Intent.CATEGORY_BROWSABLE);
18746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            intent.setComponent(null);
18840dc0636706dd146d31f6d09882b5846ae7947ebMarcin Kosiba            Intent selector = intent.getSelector();
18940dc0636706dd146d31f6d09882b5846ae7947ebMarcin Kosiba            if (selector != null) {
19040dc0636706dd146d31f6d09882b5846ae7947ebMarcin Kosiba                selector.addCategory(Intent.CATEGORY_BROWSABLE);
19140dc0636706dd146d31f6d09882b5846ae7947ebMarcin Kosiba                selector.setComponent(null);
19240dc0636706dd146d31f6d09882b5846ae7947ebMarcin Kosiba            }
19346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // Pass the package name as application ID so that the intent from the
19446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // same application can be opened in the same tab.
195fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu            intent.putExtra(Browser.EXTRA_APPLICATION_ID,
196fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu                    view.getContext().getPackageName());
19746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            try {
198fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu                view.getContext().startActivity(intent);
19946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            } catch (ActivityNotFoundException ex) {
20046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                Log.w(TAG, "No application can handle " + url);
20146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                return false;
20246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
20346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return true;
20446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
20546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
20646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
20746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    void setWebViewClient(WebViewClient client) {
20846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (client != null) {
20946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mWebViewClient = client;
21046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        } else {
211fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu            mWebViewClient = new NullWebViewClient();
21246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
21346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
21446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
21546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    void setWebChromeClient(WebChromeClient client) {
21633e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        mWebChromeClient = client;
21746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
21846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
2194320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    void setDownloadListener(DownloadListener listener) {
2204320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu        mDownloadListener = listener;
2214320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    }
2224320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu
22346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    void setFindListener(WebView.FindListener listener) {
22446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mFindListener = listener;
22546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
22646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
22746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    void setPictureListener(WebView.PictureListener listener) {
22846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mPictureListener = listener;
22946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
23046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
23146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //--------------------------------------------------------------------------------------------
232245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon    //                        Adapter for all the methods.
23346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //--------------------------------------------------------------------------------------------
23446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
23546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
236809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu     * @see AwContentsClient#getVisitedHistory
237809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu     */
238809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu    @Override
239809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu    public void getVisitedHistory(ValueCallback<String[]> callback) {
240245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
24133e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        if (mWebChromeClient != null) {
242a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon            if (TRACE) Log.d(TAG, "getVisitedHistory");
24333e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            mWebChromeClient.getVisitedHistory(callback);
24433e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        }
245245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
246809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu    }
247809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu
248809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu    /**
2495e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu     * @see AwContentsClient#doUpdateVisiteHistory(String, boolean)
2505e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu     */
2515e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu    @Override
2525e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu    public void doUpdateVisitedHistory(String url, boolean isReload) {
253245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
254a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon        if (TRACE) Log.d(TAG, "doUpdateVisitedHistory=" + url + " reload=" + isReload);
2555e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu        mWebViewClient.doUpdateVisitedHistory(mWebView, url, isReload);
256245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
2575e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu    }
2585e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu
2595e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu    /**
26046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see AwContentsClient#onProgressChanged(int)
26146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
26246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
26346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onProgressChanged(int progress) {
264245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
26533e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        if (mWebChromeClient != null) {
266a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon            if (TRACE) Log.d(TAG, "onProgressChanged=" + progress);
26733e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            mWebChromeClient.onProgressChanged(mWebView, progress);
26833e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        }
269245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
27046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
27146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
272c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba    private static class WebResourceRequestImpl implements WebResourceRequest {
273c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba        private final ShouldInterceptRequestParams mParams;
274c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba
275c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba        public WebResourceRequestImpl(ShouldInterceptRequestParams params) {
276c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba            mParams = params;
277c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba        }
278c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba
279c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba        @Override
280c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba        public Uri getUrl() {
281c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba            return Uri.parse(mParams.url);
282c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba        }
283c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba
284c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba        @Override
285c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba        public boolean isForMainFrame() {
286c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba            return mParams.isMainFrame;
287c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba        }
288c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba
289c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba        @Override
290c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba        public boolean hasUserGestureInsecure() {
291c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba            return mParams.hasUserGesture;
292c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba        }
293c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba
294c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba        @Override
295c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba        public String getMethod() {
296c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba            return mParams.method;
297c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba        }
298c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba
299c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba        @Override
300c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba        public Map<String, String> getRequestHeaders() {
301c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba            return mParams.requestHeaders;
302c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba        }
303c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba    }
304c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba
30546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
30646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see AwContentsClient#shouldInterceptRequest(java.lang.String)
30746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
30846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
309017554f2c30b84041e3e47a921fd94c80425699aMarcin Kosiba    public AwWebResourceResponse shouldInterceptRequest(ShouldInterceptRequestParams params) {
310245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
311017554f2c30b84041e3e47a921fd94c80425699aMarcin Kosiba        if (TRACE) Log.d(TAG, "shouldInterceptRequest=" + params.url);
312c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba        WebResourceResponse response = mWebViewClient.shouldInterceptRequest(mWebView,
313c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba                new WebResourceRequestImpl(params));
314245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
31546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (response == null) return null;
3164054cf14197579550220ccb28ee43d63f3df3937Marcin Kosiba
3174054cf14197579550220ccb28ee43d63f3df3937Marcin Kosiba        // AwWebResourceResponse should support null headers. b/16332774.
3184054cf14197579550220ccb28ee43d63f3df3937Marcin Kosiba        Map<String, String> responseHeaders = response.getResponseHeaders();
3194054cf14197579550220ccb28ee43d63f3df3937Marcin Kosiba        if (responseHeaders == null)
3204054cf14197579550220ccb28ee43d63f3df3937Marcin Kosiba            responseHeaders = new HashMap<String, String>();
3214054cf14197579550220ccb28ee43d63f3df3937Marcin Kosiba
322017554f2c30b84041e3e47a921fd94c80425699aMarcin Kosiba        return new AwWebResourceResponse(
32346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                response.getMimeType(),
32446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                response.getEncoding(),
325c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba                response.getData(),
326c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba                response.getStatusCode(),
327c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba                response.getReasonPhrase(),
3284054cf14197579550220ccb28ee43d63f3df3937Marcin Kosiba                responseHeaders);
32946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
33046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
33146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
332f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon     * @see AwContentsClient#shouldOverrideUrlLoading(java.lang.String)
33346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
334245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon    @Override
335f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon    public boolean shouldOverrideUrlLoading(String url) {
336245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
337a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon        if (TRACE) Log.d(TAG, "shouldOverrideUrlLoading=" + url);
338245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        boolean result = mWebViewClient.shouldOverrideUrlLoading(mWebView, url);
339245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
340245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        return result;
34146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
34246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
34346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
34446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see AwContentsClient#onUnhandledKeyEvent(android.view.KeyEvent)
34546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
34646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
34746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onUnhandledKeyEvent(KeyEvent event) {
348245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
349a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon        if (TRACE) Log.d(TAG, "onUnhandledKeyEvent");
35046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onUnhandledKeyEvent(mWebView, event);
351245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
35246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
35346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
35446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
35546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see AwContentsClient#onConsoleMessage(android.webkit.ConsoleMessage)
35646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
35746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
35846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
359245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
36033e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        boolean result;
36133e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        if (mWebChromeClient != null) {
362f8f270cb5b54adc9546566b283b83df911fc516fKristian Monsen            if (TRACE) Log.d(TAG, "onConsoleMessage: " + consoleMessage.message());
36333e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            result = mWebChromeClient.onConsoleMessage(consoleMessage);
364cd7ea20fdcedc8cf0a8beb9e3a0f3ec2e7955a29Kristian Monsen            String message = consoleMessage.message();
365cd7ea20fdcedc8cf0a8beb9e3a0f3ec2e7955a29Kristian Monsen            if (result && message != null && message.startsWith("[blocked]")) {
366cd7ea20fdcedc8cf0a8beb9e3a0f3ec2e7955a29Kristian Monsen                Log.e(TAG, "Blocked URL: " + message);
367cd7ea20fdcedc8cf0a8beb9e3a0f3ec2e7955a29Kristian Monsen            }
36833e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        } else {
36933e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            result = false;
37033e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        }
371245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
372245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        return result;
37346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
37446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
37546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
37646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see AwContentsClient#onFindResultReceived(int,int,boolean)
37746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
37846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
37946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onFindResultReceived(int activeMatchOrdinal, int numberOfMatches,
38046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            boolean isDoneCounting) {
38146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (mFindListener == null) return;
382245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
383a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon        if (TRACE) Log.d(TAG, "onFindResultReceived");
38446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mFindListener.onFindResultReceived(activeMatchOrdinal, numberOfMatches, isDoneCounting);
385245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
38646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
38746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
3885ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil    /**
3895ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil     * @See AwContentsClient#onNewPicture(Picture)
3905ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil     */
3919c5a40623b62737244deb2d04a98830d7ffa8404Leandro Gracia Gil    @Override
3925ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil    public void onNewPicture(Picture picture) {
3935ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil        if (mPictureListener == null) return;
394245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
395a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon        if (TRACE) Log.d(TAG, "onNewPicture");
3965ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil        mPictureListener.onNewPicture(mWebView, picture);
397245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
3985ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil    }
3995ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil
40046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
40146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onLoadResource(String url) {
402245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
403a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon        if (TRACE) Log.d(TAG, "onLoadResource=" + url);
40446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onLoadResource(mWebView, url);
405245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
40646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
40746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
4089b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch    @Override
4099b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch    public boolean onCreateWindow(boolean isDialog, boolean isUserGesture) {
4109b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch        Message m = mUiThreadHandler.obtainMessage(
4119b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch                NEW_WEBVIEW_CREATED, mWebView.new WebViewTransport());
412245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
41333e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        boolean result;
41433e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        if (mWebChromeClient != null) {
415a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon            if (TRACE) Log.d(TAG, "onCreateWindow");
41633e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            result = mWebChromeClient.onCreateWindow(mWebView, isDialog, isUserGesture, m);
41733e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        } else {
41833e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            result = false;
41933e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        }
420245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
421245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        return result;
4229b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch    }
4239b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch
424d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch    /**
425d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch     * @see AwContentsClient#onCloseWindow()
426d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch     */
427245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon    @Override
428d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch    public void onCloseWindow() {
429245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
43033e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        if (mWebChromeClient != null) {
431a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon            if (TRACE) Log.d(TAG, "onCloseWindow");
43233e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            mWebChromeClient.onCloseWindow(mWebView);
43333e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        }
434245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
435d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch    }
436d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch
437d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch    /**
438d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch     * @see AwContentsClient#onRequestFocus()
439d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch     */
440245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon    @Override
441d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch    public void onRequestFocus() {
442245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
44333e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        if (mWebChromeClient != null) {
444a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon            if (TRACE) Log.d(TAG, "onRequestFocus");
44533e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            mWebChromeClient.onRequestFocus(mWebView);
44633e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        }
447245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
448d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch    }
449d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch
4501e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch    /**
451690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun     * @see AwContentsClient#onReceivedTouchIconUrl(String url, boolean precomposed)
452690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun     */
453690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun    @Override
454690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun    public void onReceivedTouchIconUrl(String url, boolean precomposed) {
455245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
45633e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        if (mWebChromeClient != null) {
457a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon            if (TRACE) Log.d(TAG, "onReceivedTouchIconUrl=" + url);
45833e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            mWebChromeClient.onReceivedTouchIconUrl(mWebView, url, precomposed);
45933e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        }
460245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
461690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun    }
462690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun
463690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun    /**
4641e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch     * @see AwContentsClient#onReceivedIcon(Bitmap bitmap)
4651e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch     */
4661e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch    @Override
4671e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch    public void onReceivedIcon(Bitmap bitmap) {
468245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
46933e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        if (mWebChromeClient != null) {
470a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon            if (TRACE) Log.d(TAG, "onReceivedIcon");
47133e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            mWebChromeClient.onReceivedIcon(mWebView, bitmap);
47233e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        }
473245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
4741e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch    }
4751e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch
47646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
47746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onPageStarted(String)
47846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
47946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
48046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onPageStarted(String url) {
481245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
482a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon        if (TRACE) Log.d(TAG, "onPageStarted=" + url);
483f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon        mWebViewClient.onPageStarted(mWebView, url, mWebView.getFavicon());
484245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
48546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
48646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
48746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
48846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onPageFinished(String)
48946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
49046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
49146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onPageFinished(String url) {
492245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
493a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon        if (TRACE) Log.d(TAG, "onPageFinished=" + url);
49446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onPageFinished(mWebView, url);
495245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
496e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch
497e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // See b/8208948
498e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // This fakes an onNewPicture callback after onPageFinished to allow
499e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // CTS tests to run in an un-flaky manner. This is required as the
500e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // path for sending Picture updates in Chromium are decoupled from the
501e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // page loading callbacks, i.e. the Chrome compositor may draw our
502e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // content and send the Picture before onPageStarted or onPageFinished
503e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // are invoked. The CTS harness discards any pictures it receives before
504e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // onPageStarted is invoked, so in the case we get the Picture before that and
505e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // no further updates after onPageStarted, we'll fail the test by timing
506e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // out waiting for a Picture.
507e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // To ensure backwards compatibility, we need to defer sending Picture updates
508e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // until onPageFinished has been invoked. This work is being done
509e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        // upstream, and we can revert this hack when it lands.
510e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        if (mPictureListener != null) {
511fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch            ThreadUtils.postOnUiThreadDelayed(new Runnable() {
512e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                @Override
513e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                public void run() {
514e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                    UnimplementedWebViewApi.invoke();
515e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                    if (mPictureListener != null) {
516a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon                        if (TRACE) Log.d(TAG, "onPageFinished-fake");
51719b22dbf30aec2f35bfbdbc80f9fa01e98d563e8Ben Murdoch                        mPictureListener.onNewPicture(mWebView, new Picture());
518e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                    }
519e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch                }
520e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch            }, 100);
521e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch        }
52246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
52346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
52446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
52546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onReceivedError(int,String,String)
52646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
52746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
52846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onReceivedError(int errorCode, String description, String failingUrl) {
5297da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosiba        if (description == null || description.isEmpty()) {
5307da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosiba            // ErrorStrings is @hidden, so we can't do this in AwContents.
5317da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosiba            // Normally the net/ layer will set a valid description, but for synthesized callbacks
5327da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosiba            // (like in the case for intercepted requests) AwContents will pass in null.
5337da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosiba            description = ErrorStrings.getString(errorCode, mWebView.getContext());
5347da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosiba        }
535245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
536a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon        if (TRACE) Log.d(TAG, "onReceivedError=" + failingUrl);
53746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onReceivedError(mWebView, errorCode, description, failingUrl);
538245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
539f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon    }
540f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon
54146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
542f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon     * @see ContentViewClient#onReceivedTitle(String)
54346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
544245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon    @Override
545f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon    public void onReceivedTitle(String title) {
546245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
54733e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        if (mWebChromeClient != null) {
548a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon            if (TRACE) Log.d(TAG, "onReceivedTitle");
54933e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            mWebChromeClient.onReceivedTitle(mWebView, title);
55033e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        }
551245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
55246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
55346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
55446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
55546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
55646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#shouldOverrideKeyEvent(KeyEvent)
55746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
55846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
55946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean shouldOverrideKeyEvent(KeyEvent event) {
560924278d1f98b209b04bd699494d269d363d1aaa4Primiano Tucci        // The check below is reflecting Clank's behavior and is a workaround for http://b/7697782.
561924278d1f98b209b04bd699494d269d363d1aaa4Primiano Tucci        // 1. The check for system key should be made in AwContents or ContentViewCore, before
562924278d1f98b209b04bd699494d269d363d1aaa4Primiano Tucci        //    shouldOverrideKeyEvent() is called at all.
563b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon        // 2. shouldOverrideKeyEvent() should be called in onKeyDown/onKeyUp, not from
564b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon        //    dispatchKeyEvent().
565924278d1f98b209b04bd699494d269d363d1aaa4Primiano Tucci        if (!ContentViewClient.shouldPropagateKey(event.getKeyCode())) return true;
566245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
567a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon        if (TRACE) Log.d(TAG, "shouldOverrideKeyEvent");
568245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        boolean result = mWebViewClient.shouldOverrideKeyEvent(mWebView, event);
569245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
570245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        return result;
57146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
57246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
57346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
57446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
57546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onStartContentIntent(Context, String)
5763e9ca893bb8fb7e0038c04bd04ae78f40233db4fBo Liu     * Callback when detecting a click on a content link.
57746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
578f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon    // TODO: Delete this method when removed from base class.
57946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onStartContentIntent(Context context, String contentUrl) {
580245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
581a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon        if (TRACE) Log.d(TAG, "shouldOverrideUrlLoading=" + contentUrl);
5823e9ca893bb8fb7e0038c04bd04ae78f40233db4fBo Liu        mWebViewClient.shouldOverrideUrlLoading(mWebView, contentUrl);
583245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
58446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
58546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
5866832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen    @Override
5876832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen    public void onGeolocationPermissionsShowPrompt(String origin,
5886832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen            GeolocationPermissions.Callback callback) {
589245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
59033e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        if (mWebChromeClient != null) {
591a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon            if (TRACE) Log.d(TAG, "onGeolocationPermissionsShowPrompt");
59233e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            mWebChromeClient.onGeolocationPermissionsShowPrompt(origin, callback);
59333e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        }
594245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
5956832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen    }
59646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
5976832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen    @Override
5986832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen    public void onGeolocationPermissionsHidePrompt() {
599245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
60033e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        if (mWebChromeClient != null) {
601a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon            if (TRACE) Log.d(TAG, "onGeolocationPermissionsHidePrompt");
60233e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            mWebChromeClient.onGeolocationPermissionsHidePrompt();
60333e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        }
604245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
60546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
60646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
607750453815989696ae449df0e58556cd16ebe63c0Tao Bai    @Override
608750453815989696ae449df0e58556cd16ebe63c0Tao Bai    public void onPermissionRequest(AwPermissionRequest permissionRequest) {
609750453815989696ae449df0e58556cd16ebe63c0Tao Bai        TraceEvent.begin();
610750453815989696ae449df0e58556cd16ebe63c0Tao Bai        if (mWebChromeClient != null) {
611750453815989696ae449df0e58556cd16ebe63c0Tao Bai            if (TRACE) Log.d(TAG, "onPermissionRequest");
612b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai            if (mOngoingPermissionRequests == null) {
613b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai                mOngoingPermissionRequests =
614b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai                    new WeakHashMap<AwPermissionRequest, WeakReference<PermissionRequestAdapter>>();
615b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai            }
616b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai            PermissionRequestAdapter adapter = new PermissionRequestAdapter(permissionRequest);
617b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai            mOngoingPermissionRequests.put(
618b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai                    permissionRequest, new WeakReference<PermissionRequestAdapter>(adapter));
619b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai            mWebChromeClient.onPermissionRequest(adapter);
620750453815989696ae449df0e58556cd16ebe63c0Tao Bai        } else {
621750453815989696ae449df0e58556cd16ebe63c0Tao Bai            // By default, we deny the permission.
622750453815989696ae449df0e58556cd16ebe63c0Tao Bai            permissionRequest.deny();
623750453815989696ae449df0e58556cd16ebe63c0Tao Bai        }
624750453815989696ae449df0e58556cd16ebe63c0Tao Bai        TraceEvent.end();
625750453815989696ae449df0e58556cd16ebe63c0Tao Bai    }
626750453815989696ae449df0e58556cd16ebe63c0Tao Bai
627750453815989696ae449df0e58556cd16ebe63c0Tao Bai    @Override
628750453815989696ae449df0e58556cd16ebe63c0Tao Bai    public void onPermissionRequestCanceled(AwPermissionRequest permissionRequest) {
629750453815989696ae449df0e58556cd16ebe63c0Tao Bai        TraceEvent.begin();
630b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai        if (mWebChromeClient != null && mOngoingPermissionRequests != null) {
631750453815989696ae449df0e58556cd16ebe63c0Tao Bai            if (TRACE) Log.d(TAG, "onPermissionRequestCanceled");
632b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai            WeakReference<PermissionRequestAdapter> weakRef =
633b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai                    mOngoingPermissionRequests.get(permissionRequest);
634b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai            // We don't hold strong reference to PermissionRequestAdpater and don't expect the
635b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai            // user only holds weak reference to it either, if so, user has no way to call
636b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai            // grant()/deny(), and no need to be notified the cancellation of request.
637b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai            if (weakRef != null) {
638b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai                PermissionRequestAdapter adapter = weakRef.get();
639b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai                if (adapter != null) mWebChromeClient.onPermissionRequestCanceled(adapter);
640b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai            }
641750453815989696ae449df0e58556cd16ebe63c0Tao Bai        }
642750453815989696ae449df0e58556cd16ebe63c0Tao Bai        TraceEvent.end();
643750453815989696ae449df0e58556cd16ebe63c0Tao Bai    }
644750453815989696ae449df0e58556cd16ebe63c0Tao Bai
64546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private static class JsPromptResultReceiverAdapter implements JsResult.ResultReceiver {
6466832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        private JsPromptResultReceiver mChromePromptResultReceiver;
6476832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        private JsResultReceiver mChromeResultReceiver;
6486832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        // We hold onto the JsPromptResult here, just to avoid the need to downcast
6496832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        // in onJsResultComplete.
6506832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        private final JsPromptResult mPromptResult = new JsPromptResult(this);
65146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
65246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public JsPromptResultReceiverAdapter(JsPromptResultReceiver receiver) {
6536832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen            mChromePromptResultReceiver = receiver;
6546832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        }
6556832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen
6566832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        public JsPromptResultReceiverAdapter(JsResultReceiver receiver) {
65746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mChromeResultReceiver = receiver;
65846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
65946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
66046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public JsPromptResult getPromptResult() {
66146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return mPromptResult;
66246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
66346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
66446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
66546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public void onJsResultComplete(JsResult result) {
6666832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen            if (mChromePromptResultReceiver != null) {
6676832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                if (mPromptResult.getResult()) {
6686832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                    mChromePromptResultReceiver.confirm(mPromptResult.getStringResult());
6696832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                } else {
6706832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                    mChromePromptResultReceiver.cancel();
6716832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                }
67246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            } else {
6736832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                if (mPromptResult.getResult()) {
6746832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                    mChromeResultReceiver.confirm();
6756832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                } else {
6766832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                    mChromeResultReceiver.cancel();
6776832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen                }
67846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
67946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
68046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
68146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
68246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
68346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void handleJsAlert(String url, String message, JsResultReceiver receiver) {
684245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
68533e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        if (mWebChromeClient != null) {
68633e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            final JsPromptResult res =
68733e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen                    new JsPromptResultReceiverAdapter(receiver).getPromptResult();
688a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon            if (TRACE) Log.d(TAG, "onJsAlert");
68933e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            if (!mWebChromeClient.onJsAlert(mWebView, url, message, res)) {
69033e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen                new JsDialogHelper(res, JsDialogHelper.ALERT, null, message, url)
69133e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen                        .showDialog(mWebView.getContext());
69233e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            }
6933e4e8cf37dfb631bbdf1aa5b04410bf038065fe6Kristian Monsen        } else {
6943e4e8cf37dfb631bbdf1aa5b04410bf038065fe6Kristian Monsen            receiver.cancel();
6956832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        }
696245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
69746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
69846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
69946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
70046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void handleJsBeforeUnload(String url, String message, JsResultReceiver receiver) {
701245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
70233e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        if (mWebChromeClient != null) {
70333e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            final JsPromptResult res =
70433e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen                    new JsPromptResultReceiverAdapter(receiver).getPromptResult();
705a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon            if (TRACE) Log.d(TAG, "onJsBeforeUnload");
70633e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            if (!mWebChromeClient.onJsBeforeUnload(mWebView, url, message, res)) {
70733e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen                new JsDialogHelper(res, JsDialogHelper.UNLOAD, null, message, url)
70833e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen                        .showDialog(mWebView.getContext());
70933e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            }
7103e4e8cf37dfb631bbdf1aa5b04410bf038065fe6Kristian Monsen        } else {
7113e4e8cf37dfb631bbdf1aa5b04410bf038065fe6Kristian Monsen            receiver.cancel();
7126832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        }
713245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
71446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
71546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
71646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
71746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void handleJsConfirm(String url, String message, JsResultReceiver receiver) {
718245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
71933e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        if (mWebChromeClient != null) {
72033e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            final JsPromptResult res =
72133e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen                    new JsPromptResultReceiverAdapter(receiver).getPromptResult();
722a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon            if (TRACE) Log.d(TAG, "onJsConfirm");
72333e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            if (!mWebChromeClient.onJsConfirm(mWebView, url, message, res)) {
72433e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen                new JsDialogHelper(res, JsDialogHelper.CONFIRM, null, message, url)
72533e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen                        .showDialog(mWebView.getContext());
72633e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            }
7273e4e8cf37dfb631bbdf1aa5b04410bf038065fe6Kristian Monsen        } else {
7283e4e8cf37dfb631bbdf1aa5b04410bf038065fe6Kristian Monsen            receiver.cancel();
7296832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        }
730245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
73146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
73246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
73346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
73446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void handleJsPrompt(String url, String message, String defaultValue,
73546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            JsPromptResultReceiver receiver) {
736245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
73733e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        if (mWebChromeClient != null) {
73833e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            final JsPromptResult res =
73933e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen                    new JsPromptResultReceiverAdapter(receiver).getPromptResult();
740a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon            if (TRACE) Log.d(TAG, "onJsPrompt");
74133e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            if (!mWebChromeClient.onJsPrompt(mWebView, url, message, defaultValue, res)) {
74233e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen                new JsDialogHelper(res, JsDialogHelper.PROMPT, defaultValue, message, url)
74333e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen                        .showDialog(mWebView.getContext());
74433e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            }
7453e4e8cf37dfb631bbdf1aa5b04410bf038065fe6Kristian Monsen        } else {
7463e4e8cf37dfb631bbdf1aa5b04410bf038065fe6Kristian Monsen            receiver.cancel();
7476832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen        }
748245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
74946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
75046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
75146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
75246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onReceivedHttpAuthRequest(AwHttpAuthHandler handler, String host, String realm) {
753245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
754a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon        if (TRACE) Log.d(TAG, "onReceivedHttpAuthRequest=" + host);
75546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onReceivedHttpAuthRequest(mWebView,
75646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                new AwHttpAuthHandlerAdapter(handler), host, realm);
757245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
75846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
75946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
760251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu    @Override
761a4ff082306972f691e0b53ae30f1fa3203bd5189Selim Gurun    public void onReceivedSslError(final ValueCallback<Boolean> callback, SslError error) {
76262c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun        SslErrorHandler handler = new SslErrorHandler() {
76362c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            @Override
76462c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            public void proceed() {
765413084d3ad5ebedb497b42aa931bcce7caa36268Selim Gurun                callback.onReceiveValue(true);
76662c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            }
76762c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            @Override
76862c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            public void cancel() {
769413084d3ad5ebedb497b42aa931bcce7caa36268Selim Gurun                callback.onReceiveValue(false);
77062c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun            }
77162c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun        };
772245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
773a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon        if (TRACE) Log.d(TAG, "onReceivedSslError");
77462c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun        mWebViewClient.onReceivedSslError(mWebView, handler, error);
775245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
77662c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun    }
77762c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun
778a83766bebe5b32a442a51b1f757abb943b2fec4bSelim Gurun    private static class ClientCertRequestImpl extends ClientCertRequest {
77906b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun
78006b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        final private AwContentsClientBridge.ClientCertificateRequestCallback mCallback;
78106b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        final private String[] mKeyTypes;
78206b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        final private Principal[] mPrincipals;
78306b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        final private String mHost;
78406b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        final private int mPort;
78506b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun
78606b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        public ClientCertRequestImpl(
78706b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun                AwContentsClientBridge.ClientCertificateRequestCallback callback,
78806b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun                String[] keyTypes, Principal[] principals, String host, int port) {
78906b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun            mCallback = callback;
79006b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun            mKeyTypes = keyTypes;
79106b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun            mPrincipals = principals;
79206b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun            mHost = host;
79306b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun            mPort = port;
79406b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        }
79506b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun
79606b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        @Override
79706b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        public String[] getKeyTypes() {
79806b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun            // This is already a copy of native argument, so return directly.
79906b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun            return mKeyTypes;
80006b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        }
80106b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun
80206b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        @Override
80306b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        public Principal[] getPrincipals() {
80406b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun            // This is already a copy of native argument, so return directly.
80506b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun            return mPrincipals;
80606b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        }
80706b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun
80806b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        @Override
80906b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        public String getHost() {
81006b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun            return mHost;
81106b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        }
81206b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun
81306b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        @Override
81406b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        public int getPort() {
81506b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun            return mPort;
81606b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        }
81706b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun
81806b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        @Override
81906b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        public void proceed(final PrivateKey privateKey, final X509Certificate[] chain) {
82006b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun            mCallback.proceed(privateKey, chain);
82106b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        }
82206b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun
82306b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        @Override
82406b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        public void ignore() {
82506b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun            mCallback.ignore();
82606b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        }
82706b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun
82806b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        @Override
82906b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        public void cancel() {
83006b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun            mCallback.cancel();
83106b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        }
83206b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun    }
83306b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun
83406b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun    @Override
83506b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun    public void onReceivedClientCertRequest(
83606b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun            AwContentsClientBridge.ClientCertificateRequestCallback callback,
83706b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun            String[] keyTypes, Principal[] principals, String host, int port) {
83806b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        if (TRACE) Log.d(TAG, "onReceivedClientCertRequest");
83906b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        TraceEvent.begin();
84006b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        final ClientCertRequestImpl request = new ClientCertRequestImpl(callback,
84106b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun            keyTypes, principals, host, port);
84206b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        mWebViewClient.onReceivedClientCertRequest(mWebView, request);
84306b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun        TraceEvent.end();
84406b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun    }
84506b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun
84662c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun    @Override
84797a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu    public void onReceivedLoginRequest(String realm, String account, String args) {
848245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
849a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon        if (TRACE) Log.d(TAG, "onReceivedLoginRequest=" + realm);
85097a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu        mWebViewClient.onReceivedLoginRequest(mWebView, realm, account, args);
851245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
85297a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu    }
85397a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu
85497a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu    @Override
855251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu    public void onFormResubmission(Message dontResend, Message resend) {
856245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
857a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon        if (TRACE) Log.d(TAG, "onFormResubmission");
858251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu        mWebViewClient.onFormResubmission(mWebView, dontResend, resend);
859245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
860251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu    }
861251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu
8624320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    @Override
8634320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    public void onDownloadStart(String url,
8644320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                String userAgent,
8654320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                String contentDisposition,
8664320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                String mimeType,
8674320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                long contentLength) {
8684320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu        if (mDownloadListener != null) {
869245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon            TraceEvent.begin();
870a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon            if (TRACE) Log.d(TAG, "onDownloadStart");
8714320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu            mDownloadListener.onDownloadStart(url,
8724320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                              userAgent,
8734320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                              contentDisposition,
8744320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                              mimeType,
8754320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                              contentLength);
876245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon            TraceEvent.end();
8774320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu        }
8784320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    }
8794320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu
8803c4cc4ad5269837048ffabfa3e749a30b6d17e25Alan Leung    @Override
88148c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon    public void showFileChooser(final ValueCallback<String[]> uploadFileCallback,
88248c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon            final AwContentsClient.FileChooserParams fileChooserParams) {
88348c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon        if (mWebChromeClient == null) {
88448c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon            uploadFileCallback.onReceiveValue(null);
88548c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon            return;
88648c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon        }
88748c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon        TraceEvent.begin();
88848c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon        WebChromeClient.FileChooserParams p = new WebChromeClient.FileChooserParams();
88948c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon        p.mode = fileChooserParams.mode;
89048c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon        p.acceptTypes = fileChooserParams.acceptTypes;
89148c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon        p.title = fileChooserParams.title;
89248c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon        p.defaultFilename = fileChooserParams.defaultFilename;
89348c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon        p.capture = fileChooserParams.capture;
89448c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon        if (TRACE) Log.d(TAG, "showFileChooser");
895e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun        ValueCallback<Uri[]> callbackAdapter = new ValueCallback<Uri[]>() {
896e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun            private boolean mCompleted;
897e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun            @Override
898e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun            public void onReceiveValue(Uri[] uriList) {
899e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun                if (mCompleted) {
900e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun                    throw new IllegalStateException("showFileChooser result was already called");
901e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun                }
902e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun                mCompleted = true;
903e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun                String s[] = null;
904e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun                if (uriList != null) {
905e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun                    s = new String[uriList.length];
906e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun                    for(int i = 0; i < uriList.length; i++) {
907e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun                        s[i] = uriList[i].toString();
908e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun                    }
909e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun                }
910e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun                uploadFileCallback.onReceiveValue(s);
911e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun            }
912e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun        };
913e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun        if (mWebChromeClient.showFileChooser(mWebView, callbackAdapter, p)) {
91448c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon            return;
91548c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon        }
91648c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon        if (mWebView.getContext().getApplicationInfo().targetSdkVersion >
917e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun                Build.VERSION_CODES.KITKAT) {
91848c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon            uploadFileCallback.onReceiveValue(null);
91948c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon            return;
92048c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon        }
92148c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon        ValueCallback<Uri> innerCallback = new ValueCallback<Uri>() {
922e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun            private boolean mCompleted;
92348c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon            @Override
92448c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon            public void onReceiveValue(Uri uri) {
925e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun                if (mCompleted) {
926e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun                    throw new IllegalStateException("showFileChooser result was already called");
927e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun                }
928e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun                mCompleted = true;
92948c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon                uploadFileCallback.onReceiveValue(
93048c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon                        uri == null ? null : new String[] { uri.toString() });
93148c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon            }
93248c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon        };
93348c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon        if (TRACE) Log.d(TAG, "openFileChooser");
93448c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon        mWebChromeClient.openFileChooser(innerCallback, fileChooserParams.acceptTypes,
93548c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon                fileChooserParams.capture ? "*" : "");
93648c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon        TraceEvent.end();
93748c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon    }
93848c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon
93948c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon    @Override
9403520eb778d668dc76ca4541c69abd568b9d02691Mikhail Naganov    public void onScaleChangedScaled(float oldScale, float newScale) {
941245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
942a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon        if (TRACE) Log.d(TAG, " onScaleChangedScaled");
9433c4cc4ad5269837048ffabfa3e749a30b6d17e25Alan Leung        mWebViewClient.onScaleChanged(mWebView, oldScale, newScale);
944245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
9453c4cc4ad5269837048ffabfa3e749a30b6d17e25Alan Leung    }
9464320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu
9472729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai    @Override
948bbe58198e8cce0c35c42809aebc965aa2b476e1cTao Bai    public void onShowCustomView(View view, CustomViewCallback cb) {
949245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
95033e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        if (mWebChromeClient != null) {
951a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon            if (TRACE) Log.d(TAG, "onShowCustomView");
95233e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            mWebChromeClient.onShowCustomView(view, cb);
95333e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        }
954245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
955e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu    }
956e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu
9572729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai    @Override
958782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai    public void onHideCustomView() {
959245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
96033e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        if (mWebChromeClient != null) {
961a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon            if (TRACE) Log.d(TAG, "onHideCustomView");
96233e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            mWebChromeClient.onHideCustomView();
96333e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        }
964245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
965782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai    }
966782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai
967782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai    @Override
9682729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai    protected View getVideoLoadingProgressView() {
969245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
97033e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        View result;
97133e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        if (mWebChromeClient != null) {
972a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon            if (TRACE) Log.d(TAG, "getVideoLoadingProgressView");
97333e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            result = mWebChromeClient.getVideoLoadingProgressView();
97433e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        } else {
97533e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            result = null;
97633e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        }
977245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
978245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        return result;
9792729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai    }
9802729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai
981be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai    @Override
982be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai    public Bitmap getDefaultVideoPoster() {
983245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.begin();
984780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles)        Bitmap result = null;
98533e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        if (mWebChromeClient != null) {
986a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon            if (TRACE) Log.d(TAG, "getDefaultVideoPoster");
98733e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen            result = mWebChromeClient.getDefaultVideoPoster();
988780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles)        }
989780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles)        if (result == null) {
990780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles)            // The ic_media_video_poster icon is transparent so we need to draw it on a gray
991780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles)            // background.
992780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles)            Bitmap poster = BitmapFactory.decodeResource(
993780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles)                    mWebView.getContext().getResources(),
994780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles)                    com.android.internal.R.drawable.ic_media_video_poster);
995780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles)            result = Bitmap.createBitmap(poster.getWidth(), poster.getHeight(), poster.getConfig());
996780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles)            result.eraseColor(Color.GRAY);
997780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles)            Canvas canvas = new Canvas(result);
998780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles)            canvas.drawBitmap(poster, 0f, 0f, null);
99933e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen        }
1000245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        TraceEvent.end();
1001245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon        return result;
1002be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai    }
1003be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai
1004750453815989696ae449df0e58556cd16ebe63c0Tao Bai    // TODO: Move to upstream.
100546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private static class AwHttpAuthHandlerAdapter extends android.webkit.HttpAuthHandler {
100646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        private AwHttpAuthHandler mAwHandler;
100746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
100846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public AwHttpAuthHandlerAdapter(AwHttpAuthHandler awHandler) {
100946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mAwHandler = awHandler;
101046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
101146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
101246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
101346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public void proceed(String username, String password) {
101446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            if (username == null) {
101546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                username = "";
101646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
101746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
101846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            if (password == null) {
101946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                password = "";
102046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
102146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mAwHandler.proceed(username, password);
102246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
102346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
102446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
102546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public void cancel() {
102646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mAwHandler.cancel();
102746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
102846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
102946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
103046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean useHttpAuthUsernamePassword() {
1031d32343c77868461af07738ac7abd802000490d3dBen Murdoch            return mAwHandler.isFirstAttempt();
103246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
103346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
1034750453815989696ae449df0e58556cd16ebe63c0Tao Bai
1035750453815989696ae449df0e58556cd16ebe63c0Tao Bai    // TODO: Move to the upstream once the PermissionRequest is part of SDK.
1036b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai    private static class PermissionRequestAdapter implements PermissionRequest {
1037750453815989696ae449df0e58556cd16ebe63c0Tao Bai        private AwPermissionRequest mAwPermissionRequest;
1038750453815989696ae449df0e58556cd16ebe63c0Tao Bai
1039b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai        public PermissionRequestAdapter(AwPermissionRequest awPermissionRequest) {
1040750453815989696ae449df0e58556cd16ebe63c0Tao Bai            assert awPermissionRequest != null;
1041750453815989696ae449df0e58556cd16ebe63c0Tao Bai            mAwPermissionRequest = awPermissionRequest;
1042750453815989696ae449df0e58556cd16ebe63c0Tao Bai        }
1043750453815989696ae449df0e58556cd16ebe63c0Tao Bai
1044750453815989696ae449df0e58556cd16ebe63c0Tao Bai        @Override
1045750453815989696ae449df0e58556cd16ebe63c0Tao Bai        public Uri getOrigin() {
1046750453815989696ae449df0e58556cd16ebe63c0Tao Bai            return mAwPermissionRequest.getOrigin();
1047750453815989696ae449df0e58556cd16ebe63c0Tao Bai        }
1048750453815989696ae449df0e58556cd16ebe63c0Tao Bai
1049750453815989696ae449df0e58556cd16ebe63c0Tao Bai        @Override
1050750453815989696ae449df0e58556cd16ebe63c0Tao Bai        public long getResources() {
1051750453815989696ae449df0e58556cd16ebe63c0Tao Bai            return mAwPermissionRequest.getResources();
1052750453815989696ae449df0e58556cd16ebe63c0Tao Bai        }
1053750453815989696ae449df0e58556cd16ebe63c0Tao Bai
1054750453815989696ae449df0e58556cd16ebe63c0Tao Bai        @Override
1055750453815989696ae449df0e58556cd16ebe63c0Tao Bai        public void grant(long resources) {
1056750453815989696ae449df0e58556cd16ebe63c0Tao Bai            long requestedResource = getResources();
1057750453815989696ae449df0e58556cd16ebe63c0Tao Bai            if ((requestedResource & resources) == requestedResource)
1058750453815989696ae449df0e58556cd16ebe63c0Tao Bai                mAwPermissionRequest.grant();
1059750453815989696ae449df0e58556cd16ebe63c0Tao Bai            else
1060750453815989696ae449df0e58556cd16ebe63c0Tao Bai                mAwPermissionRequest.deny();
1061750453815989696ae449df0e58556cd16ebe63c0Tao Bai        }
1062750453815989696ae449df0e58556cd16ebe63c0Tao Bai
1063750453815989696ae449df0e58556cd16ebe63c0Tao Bai        @Override
1064750453815989696ae449df0e58556cd16ebe63c0Tao Bai        public void deny() {
1065750453815989696ae449df0e58556cd16ebe63c0Tao Bai            mAwPermissionRequest.deny();
1066750453815989696ae449df0e58556cd16ebe63c0Tao Bai        }
1067750453815989696ae449df0e58556cd16ebe63c0Tao Bai
1068750453815989696ae449df0e58556cd16ebe63c0Tao Bai    }
106946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)}
1070