WebViewContentsClientAdapter.java revision 690b7c64c2aaae62680d137fca34c7fac5176ed2
146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)/* 246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * Copyright (C) 2012 The Android Open Source Project 346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License"); 546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * you may not use this file except in compliance with the License. 646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * You may obtain a copy of the License at 746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * http://www.apache.org/licenses/LICENSE-2.0 946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 1046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * Unless required by applicable law or agreed to in writing, software 1146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS, 1246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * See the License for the specific language governing permissions and 1446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * limitations under the License. 1546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 1646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 1746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)package com.android.webview.chromium; 1846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 1946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.content.ActivityNotFoundException; 2046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.content.Context; 2146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.content.Intent; 221e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdochimport android.graphics.Bitmap; 2346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.graphics.Picture; 2462c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurunimport android.net.http.SslError; 2546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Handler; 2646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Looper; 27251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liuimport android.os.Message; 2846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.provider.Browser; 2946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.util.Log; 3046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.KeyEvent; 31e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liuimport android.view.View; 3246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.ConsoleMessage; 334320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liuimport android.webkit.DownloadListener; 34885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsenimport android.webkit.GeolocationPermissions; 3546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.JsPromptResult; 3646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.JsResult; 3762c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurunimport android.webkit.SslErrorHandler; 38809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liuimport android.webkit.ValueCallback; 3946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebChromeClient; 40e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liuimport android.webkit.WebChromeClient.CustomViewCallback; 4146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebResourceResponse; 4246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebView; 4346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewClient; 4446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 4546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.AwContentsClient; 4646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.AwHttpAuthHandler; 4746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.InterceptedRequestData; 4846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.JsPromptResultReceiver; 4946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.JsResultReceiver; 5046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.ContentView; 5146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.ContentViewClient; 5246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 5346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.net.URISyntaxException; 5446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 5546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)/** 5646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * An adapter class that forwards the callbacks from {@link ContentViewClient} 5746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * to the appropriate {@link WebViewClient} or {@link WebChromeClient}. 5846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 5946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * An instance of this class is associated with one {@link WebViewChromium} 6046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * instance. A WebViewChromium is a WebView implementation provider (that is 6146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * android.webkit.WebView delegates all functionality to it) and has exactly 6246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * one corresponding {@link ContentView} instance. 6346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 6446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * A {@link ContentViewClient} may be shared between multiple {@link ContentView}s, 6546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * and hence multiple WebViews. Many WebViewClient methods pass the source 6646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * WebView as an argument. This means that we either need to pass the 6746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * corresponding ContentView to the corresponding ContentViewClient methods, 6846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * or use an instance of ContentViewClientAdapter per WebViewChromium, to 6946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * allow the source WebView to be injected by ContentViewClientAdapter. We 7046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * choose the latter, because it makes for a cleaner design. 7146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 7246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)public class WebViewContentsClientAdapter extends AwContentsClient { 7346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private static final String TAG = "ContentViewClientAdapter"; 7446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The WebView instance that this adapter is serving. 7546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private final WebView mWebView; 7646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The WebViewClient instance that was passed to WebView.setWebViewClient(). 7746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private WebViewClient mWebViewClient; 7846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The WebViewClient instance that was passed to WebView.setContentViewClient(). 7946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private WebChromeClient mWebChromeClient; 8046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The listener receiving find-in-page API results. 8146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private WebView.FindListener mFindListener; 8246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The listener receiving notifications of screen updates. 8346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private WebView.PictureListener mPictureListener; 8446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 854320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu private DownloadListener mDownloadListener; 864320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu 879b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch private Handler mUiThreadHandler; 889b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 899b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch private static final int NEW_WEBVIEW_CREATED = 100; 909b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 9146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 9246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * Adapter constructor. 9346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 9446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @param webView the {@link WebView} instance that this adapter is serving. 9546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 9646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) WebViewContentsClientAdapter(WebView webView) { 9746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (webView == null) { 9846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) throw new IllegalArgumentException("webView can't be null"); 9946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 10046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 10146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebView = webView; 10246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) setWebViewClient(null); 10346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) setWebChromeClient(null); 1049b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 1059b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch mUiThreadHandler = new Handler() { 1069b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 1079b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch @Override 1089b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch public void handleMessage(Message msg) { 1099b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch switch(msg.what) { 1109b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch case NEW_WEBVIEW_CREATED: 1111ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch WebView.WebViewTransport t = (WebView.WebViewTransport) msg.obj; 1121ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch WebView newWebView = t.getWebView(); 1131ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch if (newWebView == null) { 1141ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch throw new IllegalArgumentException( 1151ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch "Must provide a new WebView for the new window."); 1161ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch } 1171ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch if (newWebView == mWebView) { 1181ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch throw new IllegalArgumentException( 1191ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch "Parent WebView cannot host it's own popup window. Please " + 1201ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch "use WebSettings.setSupportMultipleWindows(false)"); 1211ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch } 1221ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch 1231ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch if (newWebView.copyBackForwardList().getSize() != 0) { 1241ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch throw new IllegalArgumentException( 1251ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch "New WebView for popup window must not have been previously " + 1261ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch "navigated."); 1271ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch } 1281ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch 1291ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch WebViewChromium.completeWindowCreation(mWebView, newWebView); 1309b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch break; 1319b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch default: 1329b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch throw new IllegalStateException(); 1339b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch } 1349b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch } 1359b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch }; 1369b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 13746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 13846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 13946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // WebViewClassic is coded in such a way that even if a null WebViewClient is set, 14046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // certain actions take place. 14146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // We choose to replicate this behavior by using a NullWebViewClient implementation (also known 14246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // as the Null Object pattern) rather than duplicating the WebViewClassic approach in 14346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // ContentView. 14446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) static class NullWebViewClient extends WebViewClient { 14546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 14646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) { 14746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // TODO: Investigate more and add a test case. 14846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // This is a copy of what Clank does. The WebViewCore key handling code and Clank key 14946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // handling code differ enough that it's not trivial to figure out how keycodes are 15046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // being filtered. 15146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) int keyCode = event.getKeyCode(); 15246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (keyCode == KeyEvent.KEYCODE_MENU || 15346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_HOME || 15446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_BACK || 15546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_CALL || 15646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_ENDCALL || 15746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_POWER || 15846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_HEADSETHOOK || 15946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_CAMERA || 16046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_FOCUS || 16146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || 16246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_VOLUME_MUTE || 16346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_VOLUME_UP) { 16446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return true; 16546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 16646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return false; 16746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 16846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 16946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 17046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean shouldOverrideUrlLoading(WebView view, String url) { 17146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) Intent intent; 17246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Perform generic parsing of the URI to turn it into an Intent. 17346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) try { 17446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME); 17546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } catch (URISyntaxException ex) { 17646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) Log.w(TAG, "Bad URI " + url + ": " + ex.getMessage()); 17746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return false; 17846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 17946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Sanitize the Intent, ensuring web pages can not bypass browser 18046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // security (only access to BROWSABLE activities). 18146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) intent.addCategory(Intent.CATEGORY_BROWSABLE); 18246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) intent.setComponent(null); 18346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Pass the package name as application ID so that the intent from the 18446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // same application can be opened in the same tab. 185fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu intent.putExtra(Browser.EXTRA_APPLICATION_ID, 186fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu view.getContext().getPackageName()); 18746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) try { 188fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu view.getContext().startActivity(intent); 18946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } catch (ActivityNotFoundException ex) { 19046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) Log.w(TAG, "No application can handle " + url); 19146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return false; 19246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 19346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return true; 19446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 19546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 19646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 19746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) void setWebViewClient(WebViewClient client) { 19846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (client != null) { 19946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient = client; 20046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } else { 201fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu mWebViewClient = new NullWebViewClient(); 20246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 20346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 20446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 20546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) void setWebChromeClient(WebChromeClient client) { 20646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (client != null) { 20746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebChromeClient = client; 20846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } else { 20946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // WebViewClassic doesn't implement any special behavior for a null WebChromeClient. 21046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebChromeClient = new WebChromeClient(); 21146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 21246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 21346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 2144320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu void setDownloadListener(DownloadListener listener) { 2154320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu mDownloadListener = listener; 2164320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu } 2174320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu 21846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) void setFindListener(WebView.FindListener listener) { 21946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mFindListener = listener; 22046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 22146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 22246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) void setPictureListener(WebView.PictureListener listener) { 22346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mPictureListener = listener; 22446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 22546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 22646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //-------------------------------------------------------------------------------------------- 22746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Adapter for WebContentsDelegate methods. 22846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //-------------------------------------------------------------------------------------------- 22946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 23046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 231809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu * @see AwContentsClient#getVisitedHistory 232809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu */ 233809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu @Override 234809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu public void getVisitedHistory(ValueCallback<String[]> callback) { 235809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu mWebChromeClient.getVisitedHistory(callback); 236809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu } 237809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu 238809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu /** 2395e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu * @see AwContentsClient#doUpdateVisiteHistory(String, boolean) 2405e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu */ 2415e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu @Override 2425e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu public void doUpdateVisitedHistory(String url, boolean isReload) { 2435e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu mWebViewClient.doUpdateVisitedHistory(mWebView, url, isReload); 2445e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu } 2455e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu 2465e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu /** 24746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#onProgressChanged(int) 24846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 24946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 25046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onProgressChanged(int progress) { 25146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebChromeClient.onProgressChanged(mWebView, progress); 25246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 25346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 25446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 25546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#shouldInterceptRequest(java.lang.String) 25646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 25746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 25846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public InterceptedRequestData shouldInterceptRequest(String url) { 25946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) WebResourceResponse response = mWebViewClient.shouldInterceptRequest(mWebView, url); 26046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (response == null) return null; 26146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return new InterceptedRequestData( 26246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) response.getMimeType(), 26346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) response.getEncoding(), 26446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) response.getData()); 26546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 26646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 26746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 26846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#shouldIgnoreNavigation(java.lang.String) 26946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 27046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 27146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean shouldIgnoreNavigation(String url) { 27246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return mWebViewClient.shouldOverrideUrlLoading(mWebView, url); 27346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 27446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 27546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 27646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#onUnhandledKeyEvent(android.view.KeyEvent) 27746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 27846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 27946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onUnhandledKeyEvent(KeyEvent event) { 28046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onUnhandledKeyEvent(mWebView, event); 28146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 28246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 28346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 28446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#onConsoleMessage(android.webkit.ConsoleMessage) 28546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 28646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 28746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean onConsoleMessage(ConsoleMessage consoleMessage) { 28846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return mWebChromeClient.onConsoleMessage(consoleMessage); 28946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 29046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 29146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 29246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#onFindResultReceived(int,int,boolean) 29346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 29446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 29546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onFindResultReceived(int activeMatchOrdinal, int numberOfMatches, 29646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) boolean isDoneCounting) { 29746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (mFindListener == null) return; 29846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mFindListener.onFindResultReceived(activeMatchOrdinal, numberOfMatches, isDoneCounting); 29946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 30046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 3015ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil /** 3025ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil * @See AwContentsClient#onNewPicture(Picture) 3035ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil */ 3049c5a40623b62737244deb2d04a98830d7ffa8404Leandro Gracia Gil @Override 3055ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil public void onNewPicture(Picture picture) { 3065ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil if (mPictureListener == null) return; 3075ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil mPictureListener.onNewPicture(mWebView, picture); 3085ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil } 3095ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil 31046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 31146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onLoadResource(String url) { 31246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onLoadResource(mWebView, url); 31346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 31446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 3159b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch @Override 3169b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch public boolean onCreateWindow(boolean isDialog, boolean isUserGesture) { 3179b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch Message m = mUiThreadHandler.obtainMessage( 3189b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch NEW_WEBVIEW_CREATED, mWebView.new WebViewTransport()); 3191ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch return mWebChromeClient.onCreateWindow(mWebView, isDialog, isUserGesture, m); 3209b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch } 3219b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 322d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch /** 323d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch * @see AwContentsClient#onCloseWindow() 324d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch */ 325d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch /* @Override */ 326d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch public void onCloseWindow() { 327d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch mWebChromeClient.onCloseWindow(mWebView); 328d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch } 329d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch 330d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch /** 331d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch * @see AwContentsClient#onRequestFocus() 332d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch */ 333d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch /* @Override */ 334d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch public void onRequestFocus() { 335d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch mWebChromeClient.onRequestFocus(mWebView); 336d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch } 337d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch 3381e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch /** 339690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun * @see AwContentsClient#onReceivedTouchIconUrl(String url, boolean precomposed) 340690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun */ 341690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun @Override 342690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun public void onReceivedTouchIconUrl(String url, boolean precomposed) { 343690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun mWebChromeClient.onReceivedTouchIconUrl(mWebView, url, precomposed); 344690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun } 345690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun 346690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun /** 3471e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch * @see AwContentsClient#onReceivedIcon(Bitmap bitmap) 3481e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch */ 3491e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch @Override 3501e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch public void onReceivedIcon(Bitmap bitmap) { 3511e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch mWebChromeClient.onReceivedIcon(mWebView, bitmap); 3521e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch } 3531e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch 35446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //-------------------------------------------------------------------------------------------- 35546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Trivial Chrome -> WebViewClient mappings. 35646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //-------------------------------------------------------------------------------------------- 35746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 35846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 35946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onPageStarted(String) 36046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 36146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 36246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onPageStarted(String url) { 36346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //TODO: Can't get the favicon till b/6094807 is fixed. 36446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onPageStarted(mWebView, url, null); 36546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 36646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 36746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 36846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onPageFinished(String) 36946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 37046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 37146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onPageFinished(String url) { 37246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onPageFinished(mWebView, url); 373e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch 374e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // See b/8208948 375e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // This fakes an onNewPicture callback after onPageFinished to allow 376e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // CTS tests to run in an un-flaky manner. This is required as the 377e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // path for sending Picture updates in Chromium are decoupled from the 378e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // page loading callbacks, i.e. the Chrome compositor may draw our 379e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // content and send the Picture before onPageStarted or onPageFinished 380e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // are invoked. The CTS harness discards any pictures it receives before 381e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // onPageStarted is invoked, so in the case we get the Picture before that and 382e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // no further updates after onPageStarted, we'll fail the test by timing 383e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // out waiting for a Picture. 384e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // To ensure backwards compatibility, we need to defer sending Picture updates 385e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // until onPageFinished has been invoked. This work is being done 386e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // upstream, and we can revert this hack when it lands. 387e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch if (mPictureListener != null) { 388e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { 389e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch @Override 390e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch public void run() { 391e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch UnimplementedWebViewApi.invoke(); 392e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch if (mPictureListener != null) { 393e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch mPictureListener.onNewPicture(mWebView, null); 394e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch } 395e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch } 396e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch }, 100); 397e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch } 39846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 39946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 40046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 40146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onReceivedError(int,String,String) 40246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 40346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 40446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onReceivedError(int errorCode, String description, String failingUrl) { 40546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onReceivedError(mWebView, errorCode, description, failingUrl); 40646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 40746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 40846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 40946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onUpdateTitle(String) 41046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 41146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 41246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onUpdateTitle(String title) { 41346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebChromeClient.onReceivedTitle(mWebView, title); 41446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 41546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 41646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 41746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 41846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#shouldOverrideKeyEvent(KeyEvent) 41946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 42046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 42146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean shouldOverrideKeyEvent(KeyEvent event) { 422b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon // TODO(joth): The expression here is a workaround for http://b/7697782 :- 423b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon // 1. The check for system key should be made in AwContents or ContentViewCore, 424b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon // before shouldOverrideKeyEvent() is called at all. 425b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon // 2. shouldOverrideKeyEvent() should be called in onKeyDown/onKeyUp, not from 426b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon // dispatchKeyEvent(). 427b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon return event.isSystem() || 428b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon mWebViewClient.shouldOverrideKeyEvent(mWebView, event); 42946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 43046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 43146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 43246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //-------------------------------------------------------------------------------------------- 43346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // More complicated mappings (including behavior choices) 43446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //-------------------------------------------------------------------------------------------- 43546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 43646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 43746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onTabCrash() 43846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 43946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 44046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onTabCrash() { 44146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The WebViewClassic implementation used a single process, so any crash would 44246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // cause the application to terminate. WebViewChromium should have the same 44346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // behavior as long as we run the renderer in-process. This needs to be revisited 44446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // if we change that decision. 44546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) Log.e(TAG, "Renderer crash reported."); 44646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebChromeClient.onCloseWindow(mWebView); 44746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 44846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 44946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //-------------------------------------------------------------------------------------------- 45046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The TODO section 45146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //-------------------------------------------------------------------------------------------- 45246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 45346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 45446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 45546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onImeEvent() 45646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 45746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 45846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onImeEvent() { 45946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 46046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 46146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 46246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onStartContentIntent(Context, String) 4633e9ca893bb8fb7e0038c04bd04ae78f40233db4fBo Liu * Callback when detecting a click on a content link. 46446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 46546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 46646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onStartContentIntent(Context context, String contentUrl) { 4673e9ca893bb8fb7e0038c04bd04ae78f40233db4fBo Liu mWebViewClient.shouldOverrideUrlLoading(mWebView, contentUrl); 46846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 46946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 47046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private static class SimpleJsResultReceiver implements JsResult.ResultReceiver { 47146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private JsResultReceiver mChromeResultReceiver; 47246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 47346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public SimpleJsResultReceiver(JsResultReceiver receiver) { 47446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mChromeResultReceiver = receiver; 47546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 47646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 47746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 47846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onJsResultComplete(JsResult result) { 47946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (result.getResult()) { 48046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mChromeResultReceiver.confirm(); 48146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } else { 48246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mChromeResultReceiver.cancel(); 48346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 48446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 48546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 48646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 48746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private static class JsPromptResultReceiverAdapter implements JsResult.ResultReceiver { 48846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private JsPromptResultReceiver mChromeResultReceiver; 48946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private JsPromptResult mPromptResult; 49046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 49146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public JsPromptResultReceiverAdapter(JsPromptResultReceiver receiver) { 49246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mChromeResultReceiver = receiver; 49346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // We hold onto the JsPromptResult here, just to avoid the need to downcast 49446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // in onJsResultComplete. 49546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mPromptResult = new JsPromptResult(this); 49646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 49746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 49846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public JsPromptResult getPromptResult() { 49946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return mPromptResult; 50046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 50146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 50246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 50346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onJsResultComplete(JsResult result) { 50446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (result != mPromptResult) throw new RuntimeException("incorrect JsResult instance"); 50546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (mPromptResult.getResult()) { 50646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mChromeResultReceiver.confirm(mPromptResult.getStringResult()); 50746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } else { 50846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mChromeResultReceiver.cancel(); 50946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 51046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 51146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 51246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 51346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 514885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsen public void onGeolocationPermissionsShowPrompt(String origin, 515885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsen GeolocationPermissions.Callback callback) { 516885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsen mWebChromeClient.onGeolocationPermissionsShowPrompt(origin, callback); 517885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsen } 518885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsen 519885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsen @Override 520885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsen public void onGeolocationPermissionsHidePrompt() { 521885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsen mWebChromeClient.onGeolocationPermissionsHidePrompt(); 522885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsen } 523885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsen 524885c764368483b3082be2eccfab3c8a9f72f95b1Kristian Monsen @Override 52546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void handleJsAlert(String url, String message, JsResultReceiver receiver) { 52646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) JsResult res = new JsResult(new SimpleJsResultReceiver(receiver)); 52746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebChromeClient.onJsAlert(mWebView, url, message, res); 52846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // TODO: Handle the case of the client returning false; 52946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 53046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 53146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 53246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void handleJsBeforeUnload(String url, String message, JsResultReceiver receiver) { 53346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) JsResult res = new JsResult(new SimpleJsResultReceiver(receiver)); 53446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebChromeClient.onJsBeforeUnload(mWebView, url, message, res); 53546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // TODO: Handle the case of the client returning false; 53646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 53746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 53846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 53946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void handleJsConfirm(String url, String message, JsResultReceiver receiver) { 54046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) JsResult res = new JsResult(new SimpleJsResultReceiver(receiver)); 54146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebChromeClient.onJsConfirm(mWebView, url, message, res); 54246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // TODO: Handle the case of the client returning false; 54346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 54446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 54546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 54646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void handleJsPrompt(String url, String message, String defaultValue, 54746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) JsPromptResultReceiver receiver) { 54846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) JsPromptResult res = new JsPromptResultReceiverAdapter(receiver).getPromptResult(); 54946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebChromeClient.onJsPrompt(mWebView, url, message, defaultValue, res); 55046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // TODO: Handle the case of the client returning false; 55146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 55246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 55346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 55446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onReceivedHttpAuthRequest(AwHttpAuthHandler handler, String host, String realm) { 55546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onReceivedHttpAuthRequest(mWebView, 55646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) new AwHttpAuthHandlerAdapter(handler), host, realm); 55746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 55846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 559251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu @Override 56062c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun public void onReceivedSslError(final ValueCallback<Boolean> callback, SslError error) { 56162c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun SslErrorHandler handler = new SslErrorHandler() { 56262c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun @Override 56362c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun public void proceed() { 56462c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun postProceed(true); 56562c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun } 56662c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun @Override 56762c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun public void cancel() { 56862c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun postProceed(false); 56962c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun } 57062c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun private void postProceed(final boolean proceed) { 57162c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun post(new Runnable() { 57262c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun @Override 57362c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun public void run() { 57462c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun callback.onReceiveValue(proceed); 57562c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun } 57662c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun }); 57762c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun } 57862c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun }; 57962c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun mWebViewClient.onReceivedSslError(mWebView, handler, error); 58062c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun } 58162c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun 58262c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun @Override 58397a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu public void onReceivedLoginRequest(String realm, String account, String args) { 58497a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu mWebViewClient.onReceivedLoginRequest(mWebView, realm, account, args); 58597a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu } 58697a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu 58797a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu @Override 588251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu public void onFormResubmission(Message dontResend, Message resend) { 589251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu mWebViewClient.onFormResubmission(mWebView, dontResend, resend); 590251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu } 591251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu 5924320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu @Override 5934320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu public void onDownloadStart(String url, 5944320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu String userAgent, 5954320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu String contentDisposition, 5964320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu String mimeType, 5974320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu long contentLength) { 5984320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu if (mDownloadListener != null) { 5994320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu mDownloadListener.onDownloadStart(url, 6004320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu userAgent, 6014320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu contentDisposition, 6024320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu mimeType, 6034320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu contentLength); 6044320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu } 6054320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu } 6064320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu 6073c4cc4ad5269837048ffabfa3e749a30b6d17e25Alan Leung @Override 6083520eb778d668dc76ca4541c69abd568b9d02691Mikhail Naganov public void onScaleChangedScaled(float oldScale, float newScale) { 6093c4cc4ad5269837048ffabfa3e749a30b6d17e25Alan Leung mWebViewClient.onScaleChanged(mWebView, oldScale, newScale); 6103c4cc4ad5269837048ffabfa3e749a30b6d17e25Alan Leung } 6114320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu 6122729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai @Override 613e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu public void onShowCustomView(View view, 614e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu int requestedOrientation, CustomViewCallback cb) { 615e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu mWebChromeClient.onShowCustomView(view, requestedOrientation, cb); 616e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu } 617e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu 6182729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai @Override 6192729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai protected View getVideoLoadingProgressView() { 6202729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai return mWebChromeClient.getVideoLoadingProgressView(); 6212729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai } 6222729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai 62346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private static class AwHttpAuthHandlerAdapter extends android.webkit.HttpAuthHandler { 62446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private AwHttpAuthHandler mAwHandler; 62546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 62646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public AwHttpAuthHandlerAdapter(AwHttpAuthHandler awHandler) { 62746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mAwHandler = awHandler; 62846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 62946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 63046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 63146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void proceed(String username, String password) { 63246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (username == null) { 63346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) username = ""; 63446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 63546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 63646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (password == null) { 63746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) password = ""; 63846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 63946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mAwHandler.proceed(username, password); 64046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 64146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 64246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 64346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void cancel() { 64446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mAwHandler.cancel(); 64546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 64646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 64746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 64846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean useHttpAuthUsernamePassword() { 649d32343c77868461af07738ac7abd802000490d3dBen Murdoch return mAwHandler.isFirstAttempt(); 65046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 65146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 65246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)} 653