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