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; 2762c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurunimport android.net.http.SslError; 2848c8233468f8c735d8504c8410b86cc373d679edJonathan Dixonimport android.net.Uri; 2948c8233468f8c735d8504c8410b86cc373d679edJonathan Dixonimport android.os.Build; 3046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Handler; 3146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Looper; 32251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liuimport android.os.Message; 3346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.provider.Browser; 3446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.util.Log; 3546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.KeyEvent; 36e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liuimport android.view.View; 3706b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurunimport android.webkit.ClientCertRequest; 3846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.ConsoleMessage; 394320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liuimport android.webkit.DownloadListener; 40885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsenimport android.webkit.GeolocationPermissions; 416832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsenimport android.webkit.JsDialogHelper; 4246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.JsPromptResult; 4346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.JsResult; 44750453815989696ae449df0e58556cd16ebe63c0Tao Baiimport android.webkit.PermissionRequest; 4562c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurunimport android.webkit.SslErrorHandler; 46809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liuimport android.webkit.ValueCallback; 4746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebChromeClient; 48e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liuimport android.webkit.WebChromeClient.CustomViewCallback; 4946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebResourceResponse; 50c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosibaimport android.webkit.WebResourceRequest; 5146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebView; 5246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewClient; 5346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 5445702509d4752478188935eaf442c549c2c220beIgnacio Sollaimport com.android.webview.chromium.WebViewDelegateFactory.WebViewDelegate; 5545702509d4752478188935eaf442c549c2c220beIgnacio Solla 5646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.AwContentsClient; 5706b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurunimport org.chromium.android_webview.AwContentsClientBridge; 5846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.AwHttpAuthHandler; 59017554f2c30b84041e3e47a921fd94c80425699aMarcin Kosibaimport org.chromium.android_webview.AwWebResourceResponse; 6046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.JsPromptResultReceiver; 6146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.JsResultReceiver; 62750453815989696ae449df0e58556cd16ebe63c0Tao Baiimport org.chromium.android_webview.permission.AwPermissionRequest; 63fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdochimport org.chromium.base.ThreadUtils; 6454b3666a044d576394424822704d21dace02dc7cMarcin Kosibaimport org.chromium.base.TraceEvent; 6546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.ContentView; 6646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.ContentViewClient; 6746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 68b6e8dc172dcd850cf57321a9c574b184275c85fbTao Baiimport java.lang.ref.WeakReference; 6946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.net.URISyntaxException; 7006b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurunimport java.security.Principal; 7106b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurunimport java.security.PrivateKey; 7206b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurunimport java.security.cert.X509Certificate; 73c0bac61af98d8597256114c3366cd23051ed2674Tao Baiimport java.util.ArrayList; 744054cf14197579550220ccb28ee43d63f3df3937Marcin Kosibaimport java.util.HashMap; 75c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosibaimport java.util.Map; 76b6e8dc172dcd850cf57321a9c574b184275c85fbTao Baiimport java.util.WeakHashMap; 7748c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon 7846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)/** 7946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * An adapter class that forwards the callbacks from {@link ContentViewClient} 8046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * to the appropriate {@link WebViewClient} or {@link WebChromeClient}. 8146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 8246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * An instance of this class is associated with one {@link WebViewChromium} 8346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * instance. A WebViewChromium is a WebView implementation provider (that is 8446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * android.webkit.WebView delegates all functionality to it) and has exactly 8546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * one corresponding {@link ContentView} instance. 8646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 8746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * A {@link ContentViewClient} may be shared between multiple {@link ContentView}s, 8846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * and hence multiple WebViews. Many WebViewClient methods pass the source 8946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * WebView as an argument. This means that we either need to pass the 9046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * corresponding ContentView to the corresponding ContentViewClient methods, 9146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * or use an instance of ContentViewClientAdapter per WebViewChromium, to 9246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * allow the source WebView to be injected by ContentViewClientAdapter. We 9346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * choose the latter, because it makes for a cleaner design. 9446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 9546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)public class WebViewContentsClientAdapter extends AwContentsClient { 96a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon // TAG is chosen for consistency with classic webview tracing. 97a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon private static final String TAG = "WebViewCallback"; 98a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon // Enables API callback tracing 994eb3b4bdb57147426190c8fb42a7b5c33a0a2857Ignacio Solla private static final boolean TRACE = false; 10046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The WebView instance that this adapter is serving. 10146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private final WebView mWebView; 10246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The WebViewClient instance that was passed to WebView.setWebViewClient(). 10346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private WebViewClient mWebViewClient; 10433e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen // The WebChromeClient instance that was passed to WebView.setContentViewClient(). 10546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private WebChromeClient mWebChromeClient; 10646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The listener receiving find-in-page API results. 10746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private WebView.FindListener mFindListener; 10846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The listener receiving notifications of screen updates. 10946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private WebView.PictureListener mPictureListener; 11046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 11145702509d4752478188935eaf442c549c2c220beIgnacio Solla private WebViewDelegate mWebViewDelegate; 11245702509d4752478188935eaf442c549c2c220beIgnacio Solla 1134320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu private DownloadListener mDownloadListener; 1144320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu 1159b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch private Handler mUiThreadHandler; 1169b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 1179b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch private static final int NEW_WEBVIEW_CREATED = 100; 1189b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 119b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai private WeakHashMap<AwPermissionRequest, WeakReference<PermissionRequestAdapter>> 120b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai mOngoingPermissionRequests; 12146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 12246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * Adapter constructor. 12346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 12446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @param webView the {@link WebView} instance that this adapter is serving. 12546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 12645702509d4752478188935eaf442c549c2c220beIgnacio Solla WebViewContentsClientAdapter(WebView webView, WebViewDelegate webViewDelegate) { 12745702509d4752478188935eaf442c549c2c220beIgnacio Solla if (webView == null || webViewDelegate == null) { 12845702509d4752478188935eaf442c549c2c220beIgnacio Solla throw new IllegalArgumentException("webView or delegate can't be null"); 12946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 13046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 13146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebView = webView; 13245702509d4752478188935eaf442c549c2c220beIgnacio Solla mWebViewDelegate = webViewDelegate; 13346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) setWebViewClient(null); 1349b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 1359b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch mUiThreadHandler = new Handler() { 1369b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 1379b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch @Override 1389b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch public void handleMessage(Message msg) { 1399b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch switch(msg.what) { 1409b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch case NEW_WEBVIEW_CREATED: 1411ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch WebView.WebViewTransport t = (WebView.WebViewTransport) msg.obj; 1421ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch WebView newWebView = t.getWebView(); 1431ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch if (newWebView == mWebView) { 1441ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch throw new IllegalArgumentException( 1451ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch "Parent WebView cannot host it's own popup window. Please " + 1461ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch "use WebSettings.setSupportMultipleWindows(false)"); 1471ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch } 1481ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch 149bbfef40e5fc625f4821f012fae7f16468b7308cfJonathan Dixon if (newWebView != null && newWebView.copyBackForwardList().getSize() != 0) { 1501ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch throw new IllegalArgumentException( 1511ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch "New WebView for popup window must not have been previously " + 1521ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch "navigated."); 1531ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch } 1541ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch 1551ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch WebViewChromium.completeWindowCreation(mWebView, newWebView); 1569b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch break; 1579b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch default: 1589b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch throw new IllegalStateException(); 1599b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch } 1609b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch } 1619b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch }; 1629b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 16346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 16446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 16546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // WebViewClassic is coded in such a way that even if a null WebViewClient is set, 16646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // certain actions take place. 16746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // We choose to replicate this behavior by using a NullWebViewClient implementation (also known 16846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // as the Null Object pattern) rather than duplicating the WebViewClassic approach in 16946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // ContentView. 17046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) static class NullWebViewClient extends WebViewClient { 17146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 17246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) { 17346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // TODO: Investigate more and add a test case. 174924278d1f98b209b04bd699494d269d363d1aaa4Primiano Tucci // This is reflecting Clank's behavior. 17546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) int keyCode = event.getKeyCode(); 176924278d1f98b209b04bd699494d269d363d1aaa4Primiano Tucci return !ContentViewClient.shouldPropagateKey(keyCode); 17746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 17846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 17946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 18046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean shouldOverrideUrlLoading(WebView view, String url) { 18146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) Intent intent; 18246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Perform generic parsing of the URI to turn it into an Intent. 18346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) try { 18446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME); 18546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } catch (URISyntaxException ex) { 18646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) Log.w(TAG, "Bad URI " + url + ": " + ex.getMessage()); 18746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return false; 18846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 18946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Sanitize the Intent, ensuring web pages can not bypass browser 19046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // security (only access to BROWSABLE activities). 19146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) intent.addCategory(Intent.CATEGORY_BROWSABLE); 19246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) intent.setComponent(null); 19340dc0636706dd146d31f6d09882b5846ae7947ebMarcin Kosiba Intent selector = intent.getSelector(); 19440dc0636706dd146d31f6d09882b5846ae7947ebMarcin Kosiba if (selector != null) { 19540dc0636706dd146d31f6d09882b5846ae7947ebMarcin Kosiba selector.addCategory(Intent.CATEGORY_BROWSABLE); 19640dc0636706dd146d31f6d09882b5846ae7947ebMarcin Kosiba selector.setComponent(null); 19740dc0636706dd146d31f6d09882b5846ae7947ebMarcin Kosiba } 19846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Pass the package name as application ID so that the intent from the 19946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // same application can be opened in the same tab. 200fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu intent.putExtra(Browser.EXTRA_APPLICATION_ID, 201fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu view.getContext().getPackageName()); 20246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) try { 203fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu view.getContext().startActivity(intent); 20446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } catch (ActivityNotFoundException ex) { 20546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) Log.w(TAG, "No application can handle " + url); 20646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return false; 20746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 20846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return true; 20946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 21046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 21146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 21246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) void setWebViewClient(WebViewClient client) { 21346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (client != null) { 21446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient = client; 21546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } else { 216fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu mWebViewClient = new NullWebViewClient(); 21746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 21846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 21946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 22046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) void setWebChromeClient(WebChromeClient client) { 22133e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen mWebChromeClient = client; 22246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 22346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 2244320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu void setDownloadListener(DownloadListener listener) { 2254320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu mDownloadListener = listener; 2264320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu } 2274320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu 22846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) void setFindListener(WebView.FindListener listener) { 22946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mFindListener = listener; 23046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 23146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 23246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) void setPictureListener(WebView.PictureListener listener) { 23346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mPictureListener = listener; 23446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 23546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 23646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //-------------------------------------------------------------------------------------------- 237245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon // Adapter for all the methods. 23846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //-------------------------------------------------------------------------------------------- 23946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 24046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 241809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu * @see AwContentsClient#getVisitedHistory 242809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu */ 243809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu @Override 244809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu public void getVisitedHistory(ValueCallback<String[]> callback) { 245245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 24633e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen if (mWebChromeClient != null) { 247a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "getVisitedHistory"); 24833e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen mWebChromeClient.getVisitedHistory(callback); 24933e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen } 250245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 251809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu } 252809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu 253809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu /** 2545e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu * @see AwContentsClient#doUpdateVisiteHistory(String, boolean) 2555e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu */ 2565e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu @Override 2575e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu public void doUpdateVisitedHistory(String url, boolean isReload) { 258245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 259a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "doUpdateVisitedHistory=" + url + " reload=" + isReload); 2605e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu mWebViewClient.doUpdateVisitedHistory(mWebView, url, isReload); 261245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 2625e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu } 2635e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu 2645e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu /** 26546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#onProgressChanged(int) 26646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 26746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 26846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onProgressChanged(int progress) { 269245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 27033e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen if (mWebChromeClient != null) { 271a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onProgressChanged=" + progress); 27233e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen mWebChromeClient.onProgressChanged(mWebView, progress); 27333e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen } 274245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 27546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 27646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 277c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba private static class WebResourceRequestImpl implements WebResourceRequest { 278c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba private final ShouldInterceptRequestParams mParams; 279c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba 280c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba public WebResourceRequestImpl(ShouldInterceptRequestParams params) { 281c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba mParams = params; 282c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba } 283c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba 284c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba @Override 285c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba public Uri getUrl() { 286c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba return Uri.parse(mParams.url); 287c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba } 288c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba 289c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba @Override 290c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba public boolean isForMainFrame() { 291c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba return mParams.isMainFrame; 292c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba } 293c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba 294a63a43a08e447d69f7472d13b97cd402064f683aMarcin Kosiba @Override 295556ee2ee901252baba7a701c693b456bd799d433Marcin Kosiba public boolean hasGesture() { 296556ee2ee901252baba7a701c693b456bd799d433Marcin Kosiba return mParams.hasUserGesture; 297c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba } 298c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba 299c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba @Override 300c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba public String getMethod() { 301c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba return mParams.method; 302c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba } 303c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba 304c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba @Override 305c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba public Map<String, String> getRequestHeaders() { 306c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba return mParams.requestHeaders; 307c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba } 308c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba } 309c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba 31046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 31146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#shouldInterceptRequest(java.lang.String) 31246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 31346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 314017554f2c30b84041e3e47a921fd94c80425699aMarcin Kosiba public AwWebResourceResponse shouldInterceptRequest(ShouldInterceptRequestParams params) { 315245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 316017554f2c30b84041e3e47a921fd94c80425699aMarcin Kosiba if (TRACE) Log.d(TAG, "shouldInterceptRequest=" + params.url); 317c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba WebResourceResponse response = mWebViewClient.shouldInterceptRequest(mWebView, 318c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba new WebResourceRequestImpl(params)); 319245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 32046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (response == null) return null; 3214054cf14197579550220ccb28ee43d63f3df3937Marcin Kosiba 3224054cf14197579550220ccb28ee43d63f3df3937Marcin Kosiba // AwWebResourceResponse should support null headers. b/16332774. 3234054cf14197579550220ccb28ee43d63f3df3937Marcin Kosiba Map<String, String> responseHeaders = response.getResponseHeaders(); 3244054cf14197579550220ccb28ee43d63f3df3937Marcin Kosiba if (responseHeaders == null) 3254054cf14197579550220ccb28ee43d63f3df3937Marcin Kosiba responseHeaders = new HashMap<String, String>(); 3264054cf14197579550220ccb28ee43d63f3df3937Marcin Kosiba 327017554f2c30b84041e3e47a921fd94c80425699aMarcin Kosiba return new AwWebResourceResponse( 32846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) response.getMimeType(), 32946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) response.getEncoding(), 330c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba response.getData(), 331c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba response.getStatusCode(), 332c5faabbe90f772416a710e94d790817a9c2523c5Marcin Kosiba response.getReasonPhrase(), 3334054cf14197579550220ccb28ee43d63f3df3937Marcin Kosiba responseHeaders); 33446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 33546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 33646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 337f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon * @see AwContentsClient#shouldOverrideUrlLoading(java.lang.String) 33846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 339245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon @Override 340f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon public boolean shouldOverrideUrlLoading(String url) { 341245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 342a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "shouldOverrideUrlLoading=" + url); 343245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon boolean result = mWebViewClient.shouldOverrideUrlLoading(mWebView, url); 344245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 345245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon return result; 34646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 34746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 34846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 34946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#onUnhandledKeyEvent(android.view.KeyEvent) 35046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 35146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 35246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onUnhandledKeyEvent(KeyEvent event) { 353245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 354a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onUnhandledKeyEvent"); 35546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onUnhandledKeyEvent(mWebView, event); 356245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 35746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 35846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 35946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 36046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#onConsoleMessage(android.webkit.ConsoleMessage) 36146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 36246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 36346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean onConsoleMessage(ConsoleMessage consoleMessage) { 364245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 36533e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen boolean result; 36633e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen if (mWebChromeClient != null) { 367f8f270cb5b54adc9546566b283b83df911fc516fKristian Monsen if (TRACE) Log.d(TAG, "onConsoleMessage: " + consoleMessage.message()); 36833e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen result = mWebChromeClient.onConsoleMessage(consoleMessage); 369cd7ea20fdcedc8cf0a8beb9e3a0f3ec2e7955a29Kristian Monsen String message = consoleMessage.message(); 370cd7ea20fdcedc8cf0a8beb9e3a0f3ec2e7955a29Kristian Monsen if (result && message != null && message.startsWith("[blocked]")) { 371cd7ea20fdcedc8cf0a8beb9e3a0f3ec2e7955a29Kristian Monsen Log.e(TAG, "Blocked URL: " + message); 372cd7ea20fdcedc8cf0a8beb9e3a0f3ec2e7955a29Kristian Monsen } 37333e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen } else { 37433e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen result = false; 37533e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen } 376245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 377245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon return result; 37846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 37946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 38046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 38146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#onFindResultReceived(int,int,boolean) 38246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 38346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 38446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onFindResultReceived(int activeMatchOrdinal, int numberOfMatches, 38546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) boolean isDoneCounting) { 38646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (mFindListener == null) return; 387245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 388a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onFindResultReceived"); 38946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mFindListener.onFindResultReceived(activeMatchOrdinal, numberOfMatches, isDoneCounting); 390245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 39146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 39246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 3935ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil /** 3945ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil * @See AwContentsClient#onNewPicture(Picture) 3955ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil */ 3969c5a40623b62737244deb2d04a98830d7ffa8404Leandro Gracia Gil @Override 3975ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil public void onNewPicture(Picture picture) { 3985ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil if (mPictureListener == null) return; 399245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 400a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onNewPicture"); 4015ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil mPictureListener.onNewPicture(mWebView, picture); 402245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 4035ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil } 4045ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil 40546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 40646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onLoadResource(String url) { 407245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 408a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onLoadResource=" + url); 40946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onLoadResource(mWebView, url); 410245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 41146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 41246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 4139b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch @Override 4149b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch public boolean onCreateWindow(boolean isDialog, boolean isUserGesture) { 4159b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch Message m = mUiThreadHandler.obtainMessage( 4169b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch NEW_WEBVIEW_CREATED, mWebView.new WebViewTransport()); 417245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 41833e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen boolean result; 41933e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen if (mWebChromeClient != null) { 420a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onCreateWindow"); 42133e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen result = mWebChromeClient.onCreateWindow(mWebView, isDialog, isUserGesture, m); 42233e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen } else { 42333e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen result = false; 42433e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen } 425245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 426245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon return result; 4279b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch } 4289b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 429d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch /** 430d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch * @see AwContentsClient#onCloseWindow() 431d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch */ 432245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon @Override 433d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch public void onCloseWindow() { 434245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 43533e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen if (mWebChromeClient != null) { 436a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onCloseWindow"); 43733e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen mWebChromeClient.onCloseWindow(mWebView); 43833e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen } 439245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 440d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch } 441d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch 442d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch /** 443d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch * @see AwContentsClient#onRequestFocus() 444d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch */ 445245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon @Override 446d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch public void onRequestFocus() { 447245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 44833e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen if (mWebChromeClient != null) { 449a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onRequestFocus"); 45033e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen mWebChromeClient.onRequestFocus(mWebView); 45133e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen } 452245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 453d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch } 454d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch 4551e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch /** 456690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun * @see AwContentsClient#onReceivedTouchIconUrl(String url, boolean precomposed) 457690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun */ 458690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun @Override 459690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun public void onReceivedTouchIconUrl(String url, boolean precomposed) { 460245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 46133e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen if (mWebChromeClient != null) { 462a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onReceivedTouchIconUrl=" + url); 46333e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen mWebChromeClient.onReceivedTouchIconUrl(mWebView, url, precomposed); 46433e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen } 465245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 466690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun } 467690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun 468690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun /** 4691e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch * @see AwContentsClient#onReceivedIcon(Bitmap bitmap) 4701e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch */ 4711e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch @Override 4721e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch public void onReceivedIcon(Bitmap bitmap) { 473245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 47433e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen if (mWebChromeClient != null) { 475a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onReceivedIcon"); 47633e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen mWebChromeClient.onReceivedIcon(mWebView, bitmap); 47733e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen } 478245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 4791e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch } 4801e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch 48146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 48246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onPageStarted(String) 48346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 48446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 48546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onPageStarted(String url) { 486245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 487a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onPageStarted=" + url); 488f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon mWebViewClient.onPageStarted(mWebView, url, mWebView.getFavicon()); 489245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 49046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 49146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 49246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 49346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onPageFinished(String) 49446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 49546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 49646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onPageFinished(String url) { 497245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 498a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onPageFinished=" + url); 49946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onPageFinished(mWebView, url); 500245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 501e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch 502e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // See b/8208948 503e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // This fakes an onNewPicture callback after onPageFinished to allow 504e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // CTS tests to run in an un-flaky manner. This is required as the 505e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // path for sending Picture updates in Chromium are decoupled from the 506e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // page loading callbacks, i.e. the Chrome compositor may draw our 507e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // content and send the Picture before onPageStarted or onPageFinished 508e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // are invoked. The CTS harness discards any pictures it receives before 509e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // onPageStarted is invoked, so in the case we get the Picture before that and 510e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // no further updates after onPageStarted, we'll fail the test by timing 511e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // out waiting for a Picture. 512e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // To ensure backwards compatibility, we need to defer sending Picture updates 513e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // until onPageFinished has been invoked. This work is being done 514e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // upstream, and we can revert this hack when it lands. 515e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch if (mPictureListener != null) { 516fa14014161c4f0bc0e99d926cacb7071b8d903efBen Murdoch ThreadUtils.postOnUiThreadDelayed(new Runnable() { 517e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch @Override 518e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch public void run() { 519e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch UnimplementedWebViewApi.invoke(); 520e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch if (mPictureListener != null) { 521a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onPageFinished-fake"); 52219b22dbf30aec2f35bfbdbc80f9fa01e98d563e8Ben Murdoch mPictureListener.onNewPicture(mWebView, new Picture()); 523e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch } 524e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch } 525e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch }, 100); 526e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch } 52746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 52846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 52946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 53046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onReceivedError(int,String,String) 53146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 53246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 53346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onReceivedError(int errorCode, String description, String failingUrl) { 5347da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosiba if (description == null || description.isEmpty()) { 5357da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosiba // ErrorStrings is @hidden, so we can't do this in AwContents. 5367da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosiba // Normally the net/ layer will set a valid description, but for synthesized callbacks 5377da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosiba // (like in the case for intercepted requests) AwContents will pass in null. 53845702509d4752478188935eaf442c549c2c220beIgnacio Solla description = mWebViewDelegate.getErrorString(mWebView.getContext(), errorCode); 5397da9c0c080655cfd18bb4ab0937d89be4c2ca659Marcin Kosiba } 540245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 541a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onReceivedError=" + failingUrl); 54246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onReceivedError(mWebView, errorCode, description, failingUrl); 543245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 544f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon } 545f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon 54646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 547f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon * @see ContentViewClient#onReceivedTitle(String) 54846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 549245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon @Override 550f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon public void onReceivedTitle(String title) { 551245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 55233e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen if (mWebChromeClient != null) { 553a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onReceivedTitle"); 55433e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen mWebChromeClient.onReceivedTitle(mWebView, title); 55533e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen } 556245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 55746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 55846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 55946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 56046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 56146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#shouldOverrideKeyEvent(KeyEvent) 56246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 56346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 56446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean shouldOverrideKeyEvent(KeyEvent event) { 565924278d1f98b209b04bd699494d269d363d1aaa4Primiano Tucci // The check below is reflecting Clank's behavior and is a workaround for http://b/7697782. 566924278d1f98b209b04bd699494d269d363d1aaa4Primiano Tucci // 1. The check for system key should be made in AwContents or ContentViewCore, before 567924278d1f98b209b04bd699494d269d363d1aaa4Primiano Tucci // shouldOverrideKeyEvent() is called at all. 568b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon // 2. shouldOverrideKeyEvent() should be called in onKeyDown/onKeyUp, not from 569b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon // dispatchKeyEvent(). 570924278d1f98b209b04bd699494d269d363d1aaa4Primiano Tucci if (!ContentViewClient.shouldPropagateKey(event.getKeyCode())) return true; 571245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 572a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "shouldOverrideKeyEvent"); 573245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon boolean result = mWebViewClient.shouldOverrideKeyEvent(mWebView, event); 574245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 575245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon return result; 57646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 57746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 57846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 57946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 58046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onStartContentIntent(Context, String) 5813e9ca893bb8fb7e0038c04bd04ae78f40233db4fBo Liu * Callback when detecting a click on a content link. 58246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 583f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon // TODO: Delete this method when removed from base class. 58446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onStartContentIntent(Context context, String contentUrl) { 585245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 586a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "shouldOverrideUrlLoading=" + contentUrl); 5873e9ca893bb8fb7e0038c04bd04ae78f40233db4fBo Liu mWebViewClient.shouldOverrideUrlLoading(mWebView, contentUrl); 588245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 58946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 59046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 5916832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen @Override 5926832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen public void onGeolocationPermissionsShowPrompt(String origin, 5936832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen GeolocationPermissions.Callback callback) { 594245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 59533e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen if (mWebChromeClient != null) { 596a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onGeolocationPermissionsShowPrompt"); 59733e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen mWebChromeClient.onGeolocationPermissionsShowPrompt(origin, callback); 59833e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen } 599245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 6006832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } 60146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 6026832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen @Override 6036832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen public void onGeolocationPermissionsHidePrompt() { 604245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 60533e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen if (mWebChromeClient != null) { 606a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onGeolocationPermissionsHidePrompt"); 60733e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen mWebChromeClient.onGeolocationPermissionsHidePrompt(); 60833e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen } 609245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 61046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 61146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 612750453815989696ae449df0e58556cd16ebe63c0Tao Bai @Override 613750453815989696ae449df0e58556cd16ebe63c0Tao Bai public void onPermissionRequest(AwPermissionRequest permissionRequest) { 614750453815989696ae449df0e58556cd16ebe63c0Tao Bai TraceEvent.begin(); 615750453815989696ae449df0e58556cd16ebe63c0Tao Bai if (mWebChromeClient != null) { 616750453815989696ae449df0e58556cd16ebe63c0Tao Bai if (TRACE) Log.d(TAG, "onPermissionRequest"); 617b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai if (mOngoingPermissionRequests == null) { 618b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai mOngoingPermissionRequests = 619b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai new WeakHashMap<AwPermissionRequest, WeakReference<PermissionRequestAdapter>>(); 620b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai } 621b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai PermissionRequestAdapter adapter = new PermissionRequestAdapter(permissionRequest); 622b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai mOngoingPermissionRequests.put( 623b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai permissionRequest, new WeakReference<PermissionRequestAdapter>(adapter)); 624b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai mWebChromeClient.onPermissionRequest(adapter); 625750453815989696ae449df0e58556cd16ebe63c0Tao Bai } else { 626750453815989696ae449df0e58556cd16ebe63c0Tao Bai // By default, we deny the permission. 627750453815989696ae449df0e58556cd16ebe63c0Tao Bai permissionRequest.deny(); 628750453815989696ae449df0e58556cd16ebe63c0Tao Bai } 629750453815989696ae449df0e58556cd16ebe63c0Tao Bai TraceEvent.end(); 630750453815989696ae449df0e58556cd16ebe63c0Tao Bai } 631750453815989696ae449df0e58556cd16ebe63c0Tao Bai 632750453815989696ae449df0e58556cd16ebe63c0Tao Bai @Override 633750453815989696ae449df0e58556cd16ebe63c0Tao Bai public void onPermissionRequestCanceled(AwPermissionRequest permissionRequest) { 634750453815989696ae449df0e58556cd16ebe63c0Tao Bai TraceEvent.begin(); 635b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai if (mWebChromeClient != null && mOngoingPermissionRequests != null) { 636750453815989696ae449df0e58556cd16ebe63c0Tao Bai if (TRACE) Log.d(TAG, "onPermissionRequestCanceled"); 637b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai WeakReference<PermissionRequestAdapter> weakRef = 638b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai mOngoingPermissionRequests.get(permissionRequest); 639b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai // We don't hold strong reference to PermissionRequestAdpater and don't expect the 640b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai // user only holds weak reference to it either, if so, user has no way to call 641b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai // grant()/deny(), and no need to be notified the cancellation of request. 642b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai if (weakRef != null) { 643b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai PermissionRequestAdapter adapter = weakRef.get(); 644b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai if (adapter != null) mWebChromeClient.onPermissionRequestCanceled(adapter); 645b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai } 646750453815989696ae449df0e58556cd16ebe63c0Tao Bai } 647750453815989696ae449df0e58556cd16ebe63c0Tao Bai TraceEvent.end(); 648750453815989696ae449df0e58556cd16ebe63c0Tao Bai } 649750453815989696ae449df0e58556cd16ebe63c0Tao Bai 65046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private static class JsPromptResultReceiverAdapter implements JsResult.ResultReceiver { 6516832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen private JsPromptResultReceiver mChromePromptResultReceiver; 6526832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen private JsResultReceiver mChromeResultReceiver; 6536832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen // We hold onto the JsPromptResult here, just to avoid the need to downcast 6546832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen // in onJsResultComplete. 6556832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen private final JsPromptResult mPromptResult = new JsPromptResult(this); 65646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 65746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public JsPromptResultReceiverAdapter(JsPromptResultReceiver receiver) { 6586832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen mChromePromptResultReceiver = receiver; 6596832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } 6606832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen 6616832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen public JsPromptResultReceiverAdapter(JsResultReceiver receiver) { 66246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mChromeResultReceiver = receiver; 66346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 66446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 66546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public JsPromptResult getPromptResult() { 66646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return mPromptResult; 66746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 66846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 66946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 67046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onJsResultComplete(JsResult result) { 6716832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen if (mChromePromptResultReceiver != null) { 6726832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen if (mPromptResult.getResult()) { 6736832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen mChromePromptResultReceiver.confirm(mPromptResult.getStringResult()); 6746832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } else { 6756832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen mChromePromptResultReceiver.cancel(); 6766832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } 67746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } else { 6786832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen if (mPromptResult.getResult()) { 6796832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen mChromeResultReceiver.confirm(); 6806832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } else { 6816832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen mChromeResultReceiver.cancel(); 6826832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } 68346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 68446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 68546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 68646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 68746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 68846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void handleJsAlert(String url, String message, JsResultReceiver receiver) { 689245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 69033e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen if (mWebChromeClient != null) { 69133e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen final JsPromptResult res = 69233e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen new JsPromptResultReceiverAdapter(receiver).getPromptResult(); 693a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onJsAlert"); 69433e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen if (!mWebChromeClient.onJsAlert(mWebView, url, message, res)) { 69533e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen new JsDialogHelper(res, JsDialogHelper.ALERT, null, message, url) 69633e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen .showDialog(mWebView.getContext()); 69733e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen } 6983e4e8cf37dfb631bbdf1aa5b04410bf038065fe6Kristian Monsen } else { 6993e4e8cf37dfb631bbdf1aa5b04410bf038065fe6Kristian Monsen receiver.cancel(); 7006832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } 701245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 70246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 70346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 70446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 70546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void handleJsBeforeUnload(String url, String message, JsResultReceiver receiver) { 706245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 70733e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen if (mWebChromeClient != null) { 70833e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen final JsPromptResult res = 70933e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen new JsPromptResultReceiverAdapter(receiver).getPromptResult(); 710a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onJsBeforeUnload"); 71133e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen if (!mWebChromeClient.onJsBeforeUnload(mWebView, url, message, res)) { 71233e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen new JsDialogHelper(res, JsDialogHelper.UNLOAD, null, message, url) 71333e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen .showDialog(mWebView.getContext()); 71433e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen } 7153e4e8cf37dfb631bbdf1aa5b04410bf038065fe6Kristian Monsen } else { 7163e4e8cf37dfb631bbdf1aa5b04410bf038065fe6Kristian Monsen receiver.cancel(); 7176832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } 718245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 71946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 72046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 72146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 72246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void handleJsConfirm(String url, String message, JsResultReceiver receiver) { 723245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 72433e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen if (mWebChromeClient != null) { 72533e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen final JsPromptResult res = 72633e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen new JsPromptResultReceiverAdapter(receiver).getPromptResult(); 727a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onJsConfirm"); 72833e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen if (!mWebChromeClient.onJsConfirm(mWebView, url, message, res)) { 72933e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen new JsDialogHelper(res, JsDialogHelper.CONFIRM, null, message, url) 73033e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen .showDialog(mWebView.getContext()); 73133e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen } 7323e4e8cf37dfb631bbdf1aa5b04410bf038065fe6Kristian Monsen } else { 7333e4e8cf37dfb631bbdf1aa5b04410bf038065fe6Kristian Monsen receiver.cancel(); 7346832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } 735245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 73646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 73746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 73846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 73946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void handleJsPrompt(String url, String message, String defaultValue, 74046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) JsPromptResultReceiver receiver) { 741245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 74233e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen if (mWebChromeClient != null) { 74333e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen final JsPromptResult res = 74433e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen new JsPromptResultReceiverAdapter(receiver).getPromptResult(); 745a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onJsPrompt"); 74633e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen if (!mWebChromeClient.onJsPrompt(mWebView, url, message, defaultValue, res)) { 74733e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen new JsDialogHelper(res, JsDialogHelper.PROMPT, defaultValue, message, url) 74833e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen .showDialog(mWebView.getContext()); 74933e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen } 7503e4e8cf37dfb631bbdf1aa5b04410bf038065fe6Kristian Monsen } else { 7513e4e8cf37dfb631bbdf1aa5b04410bf038065fe6Kristian Monsen receiver.cancel(); 7526832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } 753245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 75446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 75546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 75646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 75746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onReceivedHttpAuthRequest(AwHttpAuthHandler handler, String host, String realm) { 758245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 759a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onReceivedHttpAuthRequest=" + host); 76046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onReceivedHttpAuthRequest(mWebView, 76146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) new AwHttpAuthHandlerAdapter(handler), host, realm); 762245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 76346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 76446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 765251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu @Override 766a4ff082306972f691e0b53ae30f1fa3203bd5189Selim Gurun public void onReceivedSslError(final ValueCallback<Boolean> callback, SslError error) { 76762c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun SslErrorHandler handler = new SslErrorHandler() { 76862c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun @Override 76962c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun public void proceed() { 770413084d3ad5ebedb497b42aa931bcce7caa36268Selim Gurun callback.onReceiveValue(true); 77162c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun } 77262c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun @Override 77362c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun public void cancel() { 774413084d3ad5ebedb497b42aa931bcce7caa36268Selim Gurun callback.onReceiveValue(false); 77562c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun } 77662c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun }; 777245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 778a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onReceivedSslError"); 77962c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun mWebViewClient.onReceivedSslError(mWebView, handler, error); 780245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 78162c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun } 78262c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun 783a83766bebe5b32a442a51b1f757abb943b2fec4bSelim Gurun private static class ClientCertRequestImpl extends ClientCertRequest { 78406b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun 78506b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun final private AwContentsClientBridge.ClientCertificateRequestCallback mCallback; 78606b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun final private String[] mKeyTypes; 78706b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun final private Principal[] mPrincipals; 78806b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun final private String mHost; 78906b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun final private int mPort; 79006b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun 79106b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun public ClientCertRequestImpl( 79206b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun AwContentsClientBridge.ClientCertificateRequestCallback callback, 79306b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun String[] keyTypes, Principal[] principals, String host, int port) { 79406b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun mCallback = callback; 79506b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun mKeyTypes = keyTypes; 79606b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun mPrincipals = principals; 79706b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun mHost = host; 79806b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun mPort = port; 79906b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun } 80006b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun 80106b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun @Override 80206b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun public String[] getKeyTypes() { 80306b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun // This is already a copy of native argument, so return directly. 80406b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun return mKeyTypes; 80506b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun } 80606b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun 80706b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun @Override 80806b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun public Principal[] getPrincipals() { 80906b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun // This is already a copy of native argument, so return directly. 81006b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun return mPrincipals; 81106b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun } 81206b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun 81306b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun @Override 81406b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun public String getHost() { 81506b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun return mHost; 81606b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun } 81706b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun 81806b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun @Override 81906b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun public int getPort() { 82006b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun return mPort; 82106b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun } 82206b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun 82306b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun @Override 82406b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun public void proceed(final PrivateKey privateKey, final X509Certificate[] chain) { 82506b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun mCallback.proceed(privateKey, chain); 82606b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun } 82706b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun 82806b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun @Override 82906b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun public void ignore() { 83006b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun mCallback.ignore(); 83106b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun } 83206b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun 83306b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun @Override 83406b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun public void cancel() { 83506b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun mCallback.cancel(); 83606b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun } 83706b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun } 83806b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun 83906b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun @Override 84006b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun public void onReceivedClientCertRequest( 84106b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun AwContentsClientBridge.ClientCertificateRequestCallback callback, 84206b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun String[] keyTypes, Principal[] principals, String host, int port) { 84306b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun if (TRACE) Log.d(TAG, "onReceivedClientCertRequest"); 84406b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun TraceEvent.begin(); 84506b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun final ClientCertRequestImpl request = new ClientCertRequestImpl(callback, 84606b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun keyTypes, principals, host, port); 84706b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun mWebViewClient.onReceivedClientCertRequest(mWebView, request); 84806b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun TraceEvent.end(); 84906b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun } 85006b29e22754df5cc9c951dc94f60541b4e1a6221Selim Gurun 85162c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun @Override 85297a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu public void onReceivedLoginRequest(String realm, String account, String args) { 853245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 854a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onReceivedLoginRequest=" + realm); 85597a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu mWebViewClient.onReceivedLoginRequest(mWebView, realm, account, args); 856245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 85797a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu } 85897a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu 85997a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu @Override 860251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu public void onFormResubmission(Message dontResend, Message resend) { 861245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 862a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onFormResubmission"); 863251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu mWebViewClient.onFormResubmission(mWebView, dontResend, resend); 864245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 865251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu } 866251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu 8674320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu @Override 8684320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu public void onDownloadStart(String url, 8694320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu String userAgent, 8704320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu String contentDisposition, 8714320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu String mimeType, 8724320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu long contentLength) { 8734320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu if (mDownloadListener != null) { 874245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 875a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onDownloadStart"); 8764320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu mDownloadListener.onDownloadStart(url, 8774320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu userAgent, 8784320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu contentDisposition, 8794320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu mimeType, 8804320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu contentLength); 881245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 8824320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu } 8834320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu } 8844320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu 8853c4cc4ad5269837048ffabfa3e749a30b6d17e25Alan Leung @Override 88648c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon public void showFileChooser(final ValueCallback<String[]> uploadFileCallback, 88748c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon final AwContentsClient.FileChooserParams fileChooserParams) { 88848c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon if (mWebChromeClient == null) { 88948c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon uploadFileCallback.onReceiveValue(null); 89048c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon return; 89148c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon } 89248c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon TraceEvent.begin(); 8938e97d006ca9d9ccf17428980786953b2cac3c933Selim Gurun FileChooserParamsAdapter adapter = new FileChooserParamsAdapter( 8948e97d006ca9d9ccf17428980786953b2cac3c933Selim Gurun fileChooserParams, mWebView.getContext()); 89548c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon if (TRACE) Log.d(TAG, "showFileChooser"); 896e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun ValueCallback<Uri[]> callbackAdapter = new ValueCallback<Uri[]>() { 897e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun private boolean mCompleted; 898e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun @Override 899e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun public void onReceiveValue(Uri[] uriList) { 900e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun if (mCompleted) { 901e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun throw new IllegalStateException("showFileChooser result was already called"); 902e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun } 903e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun mCompleted = true; 904e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun String s[] = null; 905e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun if (uriList != null) { 906e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun s = new String[uriList.length]; 907e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun for(int i = 0; i < uriList.length; i++) { 908e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun s[i] = uriList[i].toString(); 909e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun } 910e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun } 911e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun uploadFileCallback.onReceiveValue(s); 912e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun } 913e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun }; 91412399ba4bb12154b7897cf88bee04aca0adeb770Ben Murdoch 91512399ba4bb12154b7897cf88bee04aca0adeb770Ben Murdoch // Invoke the new callback introduced in Lollipop. If the app handles 91612399ba4bb12154b7897cf88bee04aca0adeb770Ben Murdoch // it, we're done here. 9178e97d006ca9d9ccf17428980786953b2cac3c933Selim Gurun if (mWebChromeClient.onShowFileChooser(mWebView, callbackAdapter, adapter)) { 91848c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon return; 91948c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon } 92012399ba4bb12154b7897cf88bee04aca0adeb770Ben Murdoch 92112399ba4bb12154b7897cf88bee04aca0adeb770Ben Murdoch // If the app did not handle it and we are running on Lollipop or newer, then 92212399ba4bb12154b7897cf88bee04aca0adeb770Ben Murdoch // abort. 92312399ba4bb12154b7897cf88bee04aca0adeb770Ben Murdoch if (mWebView.getContext().getApplicationInfo().targetSdkVersion >= 92412399ba4bb12154b7897cf88bee04aca0adeb770Ben Murdoch Build.VERSION_CODES.LOLLIPOP) { 92548c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon uploadFileCallback.onReceiveValue(null); 92648c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon return; 92748c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon } 92812399ba4bb12154b7897cf88bee04aca0adeb770Ben Murdoch 92912399ba4bb12154b7897cf88bee04aca0adeb770Ben Murdoch // Otherwise, for older apps, attempt to invoke the legacy (hidden) API for 93012399ba4bb12154b7897cf88bee04aca0adeb770Ben Murdoch // backwards compatibility. 93148c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon ValueCallback<Uri> innerCallback = new ValueCallback<Uri>() { 932e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun private boolean mCompleted; 93348c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon @Override 93448c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon public void onReceiveValue(Uri uri) { 935e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun if (mCompleted) { 936e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun throw new IllegalStateException("showFileChooser result was already called"); 937e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun } 938e37101b580615162e33ff59e7e8dac72427b00deSelim Gurun mCompleted = true; 93948c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon uploadFileCallback.onReceiveValue( 94048c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon uri == null ? null : new String[] { uri.toString() }); 94148c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon } 94248c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon }; 94348c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon if (TRACE) Log.d(TAG, "openFileChooser"); 94448c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon mWebChromeClient.openFileChooser(innerCallback, fileChooserParams.acceptTypes, 94548c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon fileChooserParams.capture ? "*" : ""); 94648c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon TraceEvent.end(); 94748c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon } 94848c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon 94948c8233468f8c735d8504c8410b86cc373d679edJonathan Dixon @Override 9503520eb778d668dc76ca4541c69abd568b9d02691Mikhail Naganov public void onScaleChangedScaled(float oldScale, float newScale) { 951245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 952a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, " onScaleChangedScaled"); 9533c4cc4ad5269837048ffabfa3e749a30b6d17e25Alan Leung mWebViewClient.onScaleChanged(mWebView, oldScale, newScale); 954245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 9553c4cc4ad5269837048ffabfa3e749a30b6d17e25Alan Leung } 9564320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu 9572729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai @Override 958bbe58198e8cce0c35c42809aebc965aa2b476e1cTao Bai public void onShowCustomView(View view, CustomViewCallback cb) { 959245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 96033e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen if (mWebChromeClient != null) { 961a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onShowCustomView"); 96233e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen mWebChromeClient.onShowCustomView(view, cb); 96333e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen } 964245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 965e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu } 966e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu 9672729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai @Override 968782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai public void onHideCustomView() { 969245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 97033e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen if (mWebChromeClient != null) { 971a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "onHideCustomView"); 97233e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen mWebChromeClient.onHideCustomView(); 97333e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen } 974245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 975782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai } 976782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai 977782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai @Override 9782729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai protected View getVideoLoadingProgressView() { 979245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 98033e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen View result; 98133e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen if (mWebChromeClient != null) { 982a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "getVideoLoadingProgressView"); 98333e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen result = mWebChromeClient.getVideoLoadingProgressView(); 98433e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen } else { 98533e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen result = null; 98633e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen } 987245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 988245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon return result; 9892729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai } 9902729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai 991be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai @Override 992be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai public Bitmap getDefaultVideoPoster() { 993245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.begin(); 994780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles) Bitmap result = null; 99533e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen if (mWebChromeClient != null) { 996a66d54c9f62ace5182635c4bf74449fb62f9d464Jonathan Dixon if (TRACE) Log.d(TAG, "getDefaultVideoPoster"); 99733e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen result = mWebChromeClient.getDefaultVideoPoster(); 998780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles) } 999780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles) if (result == null) { 1000780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles) // The ic_media_video_poster icon is transparent so we need to draw it on a gray 1001780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles) // background. 1002780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles) Bitmap poster = BitmapFactory.decodeResource( 1003780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles) mWebView.getContext().getResources(), 10040657a5e0b853cb639b1b5a5a195125f9d6221a11Marcin Kosiba R.drawable.ic_media_video_poster); 1005780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles) result = Bitmap.createBitmap(poster.getWidth(), poster.getHeight(), poster.getConfig()); 1006780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles) result.eraseColor(Color.GRAY); 1007780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles) Canvas canvas = new Canvas(result); 1008780460e70baa6eeb9dd596248384c6dd6a05673fTorne (Richard Coles) canvas.drawBitmap(poster, 0f, 0f, null); 100933e0aee95766f7091948865f4753eae3ed6f6306Kristian Monsen } 1010245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon TraceEvent.end(); 1011245b3a6a2a7850a46536a423594286e04e702006Jonathan Dixon return result; 1012be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai } 1013be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai 1014750453815989696ae449df0e58556cd16ebe63c0Tao Bai // TODO: Move to upstream. 101546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private static class AwHttpAuthHandlerAdapter extends android.webkit.HttpAuthHandler { 101646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private AwHttpAuthHandler mAwHandler; 101746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 101846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public AwHttpAuthHandlerAdapter(AwHttpAuthHandler awHandler) { 101946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mAwHandler = awHandler; 102046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 102146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 102246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 102346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void proceed(String username, String password) { 102446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (username == null) { 102546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) username = ""; 102646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 102746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 102846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (password == null) { 102946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) password = ""; 103046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 103146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mAwHandler.proceed(username, password); 103246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 103346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 103446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 103546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void cancel() { 103646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mAwHandler.cancel(); 103746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 103846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 103946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 104046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean useHttpAuthUsernamePassword() { 1041d32343c77868461af07738ac7abd802000490d3dBen Murdoch return mAwHandler.isFirstAttempt(); 104246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 104346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 1044750453815989696ae449df0e58556cd16ebe63c0Tao Bai 1045750453815989696ae449df0e58556cd16ebe63c0Tao Bai // TODO: Move to the upstream once the PermissionRequest is part of SDK. 1046c0bac61af98d8597256114c3366cd23051ed2674Tao Bai public static class PermissionRequestAdapter extends PermissionRequest { 1047c0bac61af98d8597256114c3366cd23051ed2674Tao Bai // TODO: Move the below definitions to AwPermissionRequest. 1048c0bac61af98d8597256114c3366cd23051ed2674Tao Bai private static long BITMASK_RESOURCE_VIDEO_CAPTURE = 1 << 1; 1049c0bac61af98d8597256114c3366cd23051ed2674Tao Bai private static long BITMASK_RESOURCE_AUDIO_CAPTURE = 1 << 2; 1050c0bac61af98d8597256114c3366cd23051ed2674Tao Bai private static long BITMASK_RESOURCE_PROTECTED_MEDIA_ID = 1 << 3; 1051c0bac61af98d8597256114c3366cd23051ed2674Tao Bai 1052c0bac61af98d8597256114c3366cd23051ed2674Tao Bai public static long toAwPermissionResources(String[] resources) { 1053c0bac61af98d8597256114c3366cd23051ed2674Tao Bai long result = 0; 1054c0bac61af98d8597256114c3366cd23051ed2674Tao Bai for (String resource : resources) { 1055c0bac61af98d8597256114c3366cd23051ed2674Tao Bai if (resource.equals(PermissionRequest.RESOURCE_VIDEO_CAPTURE)) 1056c0bac61af98d8597256114c3366cd23051ed2674Tao Bai result |= BITMASK_RESOURCE_VIDEO_CAPTURE; 1057c0bac61af98d8597256114c3366cd23051ed2674Tao Bai else if (resource.equals(PermissionRequest.RESOURCE_AUDIO_CAPTURE)) 1058c0bac61af98d8597256114c3366cd23051ed2674Tao Bai result |= BITMASK_RESOURCE_AUDIO_CAPTURE; 1059c0bac61af98d8597256114c3366cd23051ed2674Tao Bai else if (resource.equals(PermissionRequest.RESOURCE_PROTECTED_MEDIA_ID)) 1060c0bac61af98d8597256114c3366cd23051ed2674Tao Bai result |= BITMASK_RESOURCE_PROTECTED_MEDIA_ID; 1061c0bac61af98d8597256114c3366cd23051ed2674Tao Bai } 1062c0bac61af98d8597256114c3366cd23051ed2674Tao Bai return result; 1063c0bac61af98d8597256114c3366cd23051ed2674Tao Bai } 1064c0bac61af98d8597256114c3366cd23051ed2674Tao Bai 1065c0bac61af98d8597256114c3366cd23051ed2674Tao Bai private static String[] toPermissionResources(long resources) { 1066c0bac61af98d8597256114c3366cd23051ed2674Tao Bai ArrayList<String> result = new ArrayList<String>(); 1067c0bac61af98d8597256114c3366cd23051ed2674Tao Bai if ((resources & BITMASK_RESOURCE_VIDEO_CAPTURE) != 0) 1068c0bac61af98d8597256114c3366cd23051ed2674Tao Bai result.add(PermissionRequest.RESOURCE_VIDEO_CAPTURE); 1069c0bac61af98d8597256114c3366cd23051ed2674Tao Bai if ((resources & BITMASK_RESOURCE_AUDIO_CAPTURE) != 0) 1070c0bac61af98d8597256114c3366cd23051ed2674Tao Bai result.add(PermissionRequest.RESOURCE_AUDIO_CAPTURE); 1071c0bac61af98d8597256114c3366cd23051ed2674Tao Bai if ((resources & BITMASK_RESOURCE_PROTECTED_MEDIA_ID) != 0) 1072c0bac61af98d8597256114c3366cd23051ed2674Tao Bai result.add(PermissionRequest.RESOURCE_PROTECTED_MEDIA_ID); 1073c0bac61af98d8597256114c3366cd23051ed2674Tao Bai String[] resource_array = new String[result.size()]; 1074c0bac61af98d8597256114c3366cd23051ed2674Tao Bai return result.toArray(resource_array); 1075c0bac61af98d8597256114c3366cd23051ed2674Tao Bai } 1076c0bac61af98d8597256114c3366cd23051ed2674Tao Bai 1077750453815989696ae449df0e58556cd16ebe63c0Tao Bai private AwPermissionRequest mAwPermissionRequest; 1078c0bac61af98d8597256114c3366cd23051ed2674Tao Bai private String[] mResources; 1079750453815989696ae449df0e58556cd16ebe63c0Tao Bai 1080b6e8dc172dcd850cf57321a9c574b184275c85fbTao Bai public PermissionRequestAdapter(AwPermissionRequest awPermissionRequest) { 1081750453815989696ae449df0e58556cd16ebe63c0Tao Bai assert awPermissionRequest != null; 1082750453815989696ae449df0e58556cd16ebe63c0Tao Bai mAwPermissionRequest = awPermissionRequest; 1083750453815989696ae449df0e58556cd16ebe63c0Tao Bai } 1084750453815989696ae449df0e58556cd16ebe63c0Tao Bai 1085750453815989696ae449df0e58556cd16ebe63c0Tao Bai @Override 1086750453815989696ae449df0e58556cd16ebe63c0Tao Bai public Uri getOrigin() { 1087750453815989696ae449df0e58556cd16ebe63c0Tao Bai return mAwPermissionRequest.getOrigin(); 1088750453815989696ae449df0e58556cd16ebe63c0Tao Bai } 1089750453815989696ae449df0e58556cd16ebe63c0Tao Bai 1090750453815989696ae449df0e58556cd16ebe63c0Tao Bai @Override 1091c0bac61af98d8597256114c3366cd23051ed2674Tao Bai public String[] getResources() { 1092c0bac61af98d8597256114c3366cd23051ed2674Tao Bai synchronized (this) { 1093c0bac61af98d8597256114c3366cd23051ed2674Tao Bai if (mResources == null) { 1094c0bac61af98d8597256114c3366cd23051ed2674Tao Bai mResources = toPermissionResources(mAwPermissionRequest.getResources()); 1095c0bac61af98d8597256114c3366cd23051ed2674Tao Bai } 1096c0bac61af98d8597256114c3366cd23051ed2674Tao Bai return mResources; 1097c0bac61af98d8597256114c3366cd23051ed2674Tao Bai } 1098750453815989696ae449df0e58556cd16ebe63c0Tao Bai } 1099750453815989696ae449df0e58556cd16ebe63c0Tao Bai 1100750453815989696ae449df0e58556cd16ebe63c0Tao Bai @Override 1101c0bac61af98d8597256114c3366cd23051ed2674Tao Bai public void grant(String[] resources) { 1102c0bac61af98d8597256114c3366cd23051ed2674Tao Bai long requestedResource = mAwPermissionRequest.getResources(); 1103c0bac61af98d8597256114c3366cd23051ed2674Tao Bai if ((requestedResource & toAwPermissionResources(resources)) == requestedResource) 1104750453815989696ae449df0e58556cd16ebe63c0Tao Bai mAwPermissionRequest.grant(); 1105750453815989696ae449df0e58556cd16ebe63c0Tao Bai else 1106750453815989696ae449df0e58556cd16ebe63c0Tao Bai mAwPermissionRequest.deny(); 1107750453815989696ae449df0e58556cd16ebe63c0Tao Bai } 1108750453815989696ae449df0e58556cd16ebe63c0Tao Bai 1109750453815989696ae449df0e58556cd16ebe63c0Tao Bai @Override 1110750453815989696ae449df0e58556cd16ebe63c0Tao Bai public void deny() { 1111750453815989696ae449df0e58556cd16ebe63c0Tao Bai mAwPermissionRequest.deny(); 1112750453815989696ae449df0e58556cd16ebe63c0Tao Bai } 1113750453815989696ae449df0e58556cd16ebe63c0Tao Bai 1114750453815989696ae449df0e58556cd16ebe63c0Tao Bai } 111546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)} 1116