WebViewContentsClientAdapter.java revision 6832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820
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; 356832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsenimport android.webkit.JsDialogHelper; 3646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.JsPromptResult; 3746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.JsResult; 3862c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurunimport android.webkit.SslErrorHandler; 39809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liuimport android.webkit.ValueCallback; 4046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebChromeClient; 41e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liuimport android.webkit.WebChromeClient.CustomViewCallback; 4246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebResourceResponse; 4346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebView; 4446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewClient; 4546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 4646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.AwContentsClient; 4746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.AwHttpAuthHandler; 4846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.InterceptedRequestData; 4946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.JsPromptResultReceiver; 5046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.JsResultReceiver; 5146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.ContentView; 5246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.ContentViewClient; 5346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 5446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.net.URISyntaxException; 5546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 5646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)/** 5746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * An adapter class that forwards the callbacks from {@link ContentViewClient} 5846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * to the appropriate {@link WebViewClient} or {@link WebChromeClient}. 5946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 6046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * An instance of this class is associated with one {@link WebViewChromium} 6146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * instance. A WebViewChromium is a WebView implementation provider (that is 6246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * android.webkit.WebView delegates all functionality to it) and has exactly 6346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * one corresponding {@link ContentView} instance. 6446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 6546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * A {@link ContentViewClient} may be shared between multiple {@link ContentView}s, 6646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * and hence multiple WebViews. Many WebViewClient methods pass the source 6746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * WebView as an argument. This means that we either need to pass the 6846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * corresponding ContentView to the corresponding ContentViewClient methods, 6946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * or use an instance of ContentViewClientAdapter per WebViewChromium, to 7046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * allow the source WebView to be injected by ContentViewClientAdapter. We 7146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * choose the latter, because it makes for a cleaner design. 7246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 7346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)public class WebViewContentsClientAdapter extends AwContentsClient { 7446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private static final String TAG = "ContentViewClientAdapter"; 7546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The WebView instance that this adapter is serving. 7646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private final WebView mWebView; 7746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The WebViewClient instance that was passed to WebView.setWebViewClient(). 7846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private WebViewClient mWebViewClient; 7946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The WebViewClient instance that was passed to WebView.setContentViewClient(). 8046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private WebChromeClient mWebChromeClient; 8146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The listener receiving find-in-page API results. 8246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private WebView.FindListener mFindListener; 8346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The listener receiving notifications of screen updates. 8446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private WebView.PictureListener mPictureListener; 8546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 864320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu private DownloadListener mDownloadListener; 874320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu 889b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch private Handler mUiThreadHandler; 899b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 909b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch private static final int NEW_WEBVIEW_CREATED = 100; 919b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 9246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 9346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * Adapter constructor. 9446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 9546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @param webView the {@link WebView} instance that this adapter is serving. 9646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 9746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) WebViewContentsClientAdapter(WebView webView) { 9846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (webView == null) { 9946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) throw new IllegalArgumentException("webView can't be null"); 10046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 10146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 10246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebView = webView; 10346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) setWebViewClient(null); 10446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) setWebChromeClient(null); 1059b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 1069b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch mUiThreadHandler = new Handler() { 1079b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 1089b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch @Override 1099b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch public void handleMessage(Message msg) { 1109b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch switch(msg.what) { 1119b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch case NEW_WEBVIEW_CREATED: 1121ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch WebView.WebViewTransport t = (WebView.WebViewTransport) msg.obj; 1131ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch WebView newWebView = t.getWebView(); 1141ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch if (newWebView == null) { 1151ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch throw new IllegalArgumentException( 1161ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch "Must provide a new WebView for the new window."); 1171ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch } 1181ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch if (newWebView == mWebView) { 1191ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch throw new IllegalArgumentException( 1201ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch "Parent WebView cannot host it's own popup window. Please " + 1211ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch "use WebSettings.setSupportMultipleWindows(false)"); 1221ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch } 1231ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch 1241ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch if (newWebView.copyBackForwardList().getSize() != 0) { 1251ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch throw new IllegalArgumentException( 1261ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch "New WebView for popup window must not have been previously " + 1271ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch "navigated."); 1281ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch } 1291ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch 1301ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch WebViewChromium.completeWindowCreation(mWebView, newWebView); 1319b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch break; 1329b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch default: 1339b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch throw new IllegalStateException(); 1349b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch } 1359b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch } 1369b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch }; 1379b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 13846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 13946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 14046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // WebViewClassic is coded in such a way that even if a null WebViewClient is set, 14146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // certain actions take place. 14246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // We choose to replicate this behavior by using a NullWebViewClient implementation (also known 14346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // as the Null Object pattern) rather than duplicating the WebViewClassic approach in 14446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // ContentView. 14546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) static class NullWebViewClient extends WebViewClient { 14646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 14746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) { 14846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // TODO: Investigate more and add a test case. 14946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // This is a copy of what Clank does. The WebViewCore key handling code and Clank key 15046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // handling code differ enough that it's not trivial to figure out how keycodes are 15146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // being filtered. 15246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) int keyCode = event.getKeyCode(); 15346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (keyCode == KeyEvent.KEYCODE_MENU || 15446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_HOME || 15546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_BACK || 15646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_CALL || 15746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_ENDCALL || 15846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_POWER || 15946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_HEADSETHOOK || 16046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_CAMERA || 16146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_FOCUS || 16246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || 16346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_VOLUME_MUTE || 16446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) keyCode == KeyEvent.KEYCODE_VOLUME_UP) { 16546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return true; 16646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 16746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return false; 16846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 16946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 17046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 17146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean shouldOverrideUrlLoading(WebView view, String url) { 17246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) Intent intent; 17346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Perform generic parsing of the URI to turn it into an Intent. 17446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) try { 17546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME); 17646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } catch (URISyntaxException ex) { 17746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) Log.w(TAG, "Bad URI " + url + ": " + ex.getMessage()); 17846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return false; 17946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 18046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Sanitize the Intent, ensuring web pages can not bypass browser 18146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // security (only access to BROWSABLE activities). 18246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) intent.addCategory(Intent.CATEGORY_BROWSABLE); 18346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) intent.setComponent(null); 18446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Pass the package name as application ID so that the intent from the 18546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // same application can be opened in the same tab. 186fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu intent.putExtra(Browser.EXTRA_APPLICATION_ID, 187fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu view.getContext().getPackageName()); 18846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) try { 189fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu view.getContext().startActivity(intent); 19046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } catch (ActivityNotFoundException ex) { 19146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) Log.w(TAG, "No application can handle " + url); 19246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return false; 19346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 19446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return true; 19546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 19646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 19746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 19846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) void setWebViewClient(WebViewClient client) { 19946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (client != null) { 20046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient = client; 20146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } else { 202fe742c86d6f6e12bd339c9c2efd947d55c910e2dBo Liu mWebViewClient = new NullWebViewClient(); 20346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 20446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 20546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 20646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) void setWebChromeClient(WebChromeClient client) { 20746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (client != null) { 20846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebChromeClient = client; 20946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } else { 21046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // WebViewClassic doesn't implement any special behavior for a null WebChromeClient. 21146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebChromeClient = new WebChromeClient(); 21246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 21346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 21446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 2154320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu void setDownloadListener(DownloadListener listener) { 2164320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu mDownloadListener = listener; 2174320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu } 2184320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu 21946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) void setFindListener(WebView.FindListener listener) { 22046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mFindListener = listener; 22146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 22246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 22346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) void setPictureListener(WebView.PictureListener listener) { 22446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mPictureListener = listener; 22546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 22646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 22746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //-------------------------------------------------------------------------------------------- 22846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Adapter for WebContentsDelegate methods. 22946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //-------------------------------------------------------------------------------------------- 23046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 23146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 232809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu * @see AwContentsClient#getVisitedHistory 233809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu */ 234809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu @Override 235809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu public void getVisitedHistory(ValueCallback<String[]> callback) { 236809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu mWebChromeClient.getVisitedHistory(callback); 237809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu } 238809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu 239809cfd05f0ac95dda1a754b0a3b6283112f12defBo Liu /** 2405e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu * @see AwContentsClient#doUpdateVisiteHistory(String, boolean) 2415e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu */ 2425e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu @Override 2435e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu public void doUpdateVisitedHistory(String url, boolean isReload) { 2445e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu mWebViewClient.doUpdateVisitedHistory(mWebView, url, isReload); 2455e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu } 2465e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu 2475e59ff9ab94d503528ef61ccd1c71adb887b5e01Bo Liu /** 24846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#onProgressChanged(int) 24946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 25046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 25146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onProgressChanged(int progress) { 25246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebChromeClient.onProgressChanged(mWebView, progress); 25346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 25446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 25546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 25646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#shouldInterceptRequest(java.lang.String) 25746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 25846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 25946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public InterceptedRequestData shouldInterceptRequest(String url) { 26046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) WebResourceResponse response = mWebViewClient.shouldInterceptRequest(mWebView, url); 26146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (response == null) return null; 26246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return new InterceptedRequestData( 26346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) response.getMimeType(), 26446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) response.getEncoding(), 26546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) response.getData()); 26646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 26746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 268f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon // TODO: remove this overload, and mark shouldOverrideUrlLoading as @Override 269f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon public boolean shouldIgnoreNavigation(String url) { 270f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon return this.shouldOverrideUrlLoading(url); 271f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon } 272f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon 27346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 274f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon * @see AwContentsClient#shouldOverrideUrlLoading(java.lang.String) 27546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 276f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon //@Override 277f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon public boolean shouldOverrideUrlLoading(String url) { 27846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return mWebViewClient.shouldOverrideUrlLoading(mWebView, url); 27946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 28046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 28146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 28246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#onUnhandledKeyEvent(android.view.KeyEvent) 28346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 28446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 28546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onUnhandledKeyEvent(KeyEvent event) { 28646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onUnhandledKeyEvent(mWebView, event); 28746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 28846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 28946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 29046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#onConsoleMessage(android.webkit.ConsoleMessage) 29146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 29246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 29346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean onConsoleMessage(ConsoleMessage consoleMessage) { 29446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return mWebChromeClient.onConsoleMessage(consoleMessage); 29546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 29646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 29746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 29846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#onFindResultReceived(int,int,boolean) 29946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 30046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 30146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onFindResultReceived(int activeMatchOrdinal, int numberOfMatches, 30246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) boolean isDoneCounting) { 30346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (mFindListener == null) return; 30446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mFindListener.onFindResultReceived(activeMatchOrdinal, numberOfMatches, isDoneCounting); 30546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 30646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 3075ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil /** 3085ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil * @See AwContentsClient#onNewPicture(Picture) 3095ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil */ 3109c5a40623b62737244deb2d04a98830d7ffa8404Leandro Gracia Gil @Override 3115ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil public void onNewPicture(Picture picture) { 3125ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil if (mPictureListener == null) return; 3135ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil mPictureListener.onNewPicture(mWebView, picture); 3145ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil } 3155ca5f5c6e538735aa0d0c840eb745cdc4e4a34bbLeandro Gracia Gil 31646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 31746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onLoadResource(String url) { 31846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onLoadResource(mWebView, url); 31946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 32046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 3219b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch @Override 3229b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch public boolean onCreateWindow(boolean isDialog, boolean isUserGesture) { 3239b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch Message m = mUiThreadHandler.obtainMessage( 3249b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch NEW_WEBVIEW_CREATED, mWebView.new WebViewTransport()); 3251ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch return mWebChromeClient.onCreateWindow(mWebView, isDialog, isUserGesture, m); 3269b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch } 3279b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 328d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch /** 329d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch * @see AwContentsClient#onCloseWindow() 330d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch */ 331d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch /* @Override */ 332d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch public void onCloseWindow() { 333d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch mWebChromeClient.onCloseWindow(mWebView); 334d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch } 335d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch 336d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch /** 337d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch * @see AwContentsClient#onRequestFocus() 338d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch */ 339d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch /* @Override */ 340d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch public void onRequestFocus() { 341d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch mWebChromeClient.onRequestFocus(mWebView); 342d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch } 343d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch 3441e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch /** 345690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun * @see AwContentsClient#onReceivedTouchIconUrl(String url, boolean precomposed) 346690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun */ 347690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun @Override 348690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun public void onReceivedTouchIconUrl(String url, boolean precomposed) { 349690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun mWebChromeClient.onReceivedTouchIconUrl(mWebView, url, precomposed); 350690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun } 351690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun 352690b7c64c2aaae62680d137fca34c7fac5176ed2Selim Gurun /** 3531e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch * @see AwContentsClient#onReceivedIcon(Bitmap bitmap) 3541e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch */ 3551e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch @Override 3561e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch public void onReceivedIcon(Bitmap bitmap) { 3571e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch mWebChromeClient.onReceivedIcon(mWebView, bitmap); 3581e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch } 3591e2928bab700c1a4c5a99d4e8c87e259866beb1dBen Murdoch 36046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //-------------------------------------------------------------------------------------------- 36146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Trivial Chrome -> WebViewClient mappings. 36246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //-------------------------------------------------------------------------------------------- 36346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 36446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 36546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onPageStarted(String) 36646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 36746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 36846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onPageStarted(String url) { 369f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon mWebViewClient.onPageStarted(mWebView, url, mWebView.getFavicon()); 37046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 37146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 37246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 37346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onPageFinished(String) 37446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 37546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 37646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onPageFinished(String url) { 37746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onPageFinished(mWebView, url); 378e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch 379e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // See b/8208948 380e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // This fakes an onNewPicture callback after onPageFinished to allow 381e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // CTS tests to run in an un-flaky manner. This is required as the 382e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // path for sending Picture updates in Chromium are decoupled from the 383e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // page loading callbacks, i.e. the Chrome compositor may draw our 384e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // content and send the Picture before onPageStarted or onPageFinished 385e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // are invoked. The CTS harness discards any pictures it receives before 386e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // onPageStarted is invoked, so in the case we get the Picture before that and 387e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // no further updates after onPageStarted, we'll fail the test by timing 388e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // out waiting for a Picture. 389e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // To ensure backwards compatibility, we need to defer sending Picture updates 390e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // until onPageFinished has been invoked. This work is being done 391e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch // upstream, and we can revert this hack when it lands. 392e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch if (mPictureListener != null) { 393e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { 394e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch @Override 395e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch public void run() { 396e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch UnimplementedWebViewApi.invoke(); 397e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch if (mPictureListener != null) { 398e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch mPictureListener.onNewPicture(mWebView, null); 399e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch } 400e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch } 401e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch }, 100); 402e51e2365d481a173bd2275e2b3f8d62f0d99898dBen Murdoch } 40346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 40446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 40546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 40646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onReceivedError(int,String,String) 40746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 40846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 40946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onReceivedError(int errorCode, String description, String failingUrl) { 41046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onReceivedError(mWebView, errorCode, description, failingUrl); 41146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 41246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 413f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon // TODO: remove this method, and mark onReceivedTitle as @Override 414f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon public void onUpdateTitle(String title) { 415f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon onReceivedTitle(title); 416f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon } 417f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon 41846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 419f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon * @see ContentViewClient#onReceivedTitle(String) 42046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 421f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon //@Override 422f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon public void onReceivedTitle(String title) { 42346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebChromeClient.onReceivedTitle(mWebView, title); 42446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 42546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 42646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 42746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 42846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#shouldOverrideKeyEvent(KeyEvent) 42946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 43046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 43146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean shouldOverrideKeyEvent(KeyEvent event) { 432b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon // TODO(joth): The expression here is a workaround for http://b/7697782 :- 433b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon // 1. The check for system key should be made in AwContents or ContentViewCore, 434b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon // before shouldOverrideKeyEvent() is called at all. 435b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon // 2. shouldOverrideKeyEvent() should be called in onKeyDown/onKeyUp, not from 436b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon // dispatchKeyEvent(). 437b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon return event.isSystem() || 438b5d9eb0196b542499722ffcc8ede41c0eae53516Jonathan Dixon mWebViewClient.shouldOverrideKeyEvent(mWebView, event); 43946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 44046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 44146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 44246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 44346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onStartContentIntent(Context, String) 4443e9ca893bb8fb7e0038c04bd04ae78f40233db4fBo Liu * Callback when detecting a click on a content link. 44546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 446f909ca91bfefe7344f9a0e2c684150df1376d9a4Jonathan Dixon // TODO: Delete this method when removed from base class. 44746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onStartContentIntent(Context context, String contentUrl) { 4483e9ca893bb8fb7e0038c04bd04ae78f40233db4fBo Liu mWebViewClient.shouldOverrideUrlLoading(mWebView, contentUrl); 44946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 45046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 4516832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen @Override 4526832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen public void onGeolocationPermissionsShowPrompt(String origin, 4536832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen GeolocationPermissions.Callback callback) { 4546832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen mWebChromeClient.onGeolocationPermissionsShowPrompt(origin, callback); 4556832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } 45646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 4576832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen @Override 4586832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen public void onGeolocationPermissionsHidePrompt() { 4596832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen mWebChromeClient.onGeolocationPermissionsHidePrompt(); 46046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 46146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 46246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private static class JsPromptResultReceiverAdapter implements JsResult.ResultReceiver { 4636832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen private JsPromptResultReceiver mChromePromptResultReceiver; 4646832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen private JsResultReceiver mChromeResultReceiver; 4656832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen // We hold onto the JsPromptResult here, just to avoid the need to downcast 4666832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen // in onJsResultComplete. 4676832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen private final JsPromptResult mPromptResult = new JsPromptResult(this); 46846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 46946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public JsPromptResultReceiverAdapter(JsPromptResultReceiver receiver) { 4706832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen mChromePromptResultReceiver = receiver; 4716832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } 4726832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen 4736832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen public JsPromptResultReceiverAdapter(JsResultReceiver receiver) { 47446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mChromeResultReceiver = receiver; 47546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 47646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 47746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public JsPromptResult getPromptResult() { 47846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return mPromptResult; 47946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 48046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 48146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 48246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onJsResultComplete(JsResult result) { 4836832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen if (mChromePromptResultReceiver != null) { 4846832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen if (mPromptResult.getResult()) { 4856832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen mChromePromptResultReceiver.confirm(mPromptResult.getStringResult()); 4866832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } else { 4876832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen mChromePromptResultReceiver.cancel(); 4886832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } 48946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } else { 4906832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen if (mPromptResult.getResult()) { 4916832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen mChromeResultReceiver.confirm(); 4926832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } else { 4936832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen mChromeResultReceiver.cancel(); 4946832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } 49546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 49646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 49746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 49846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 49946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 50046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void handleJsAlert(String url, String message, JsResultReceiver receiver) { 5016832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen final JsPromptResult res = new JsPromptResultReceiverAdapter(receiver).getPromptResult(); 5026832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen if (!mWebChromeClient.onJsAlert(mWebView, url, message, res)) { 5036832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen new JsDialogHelper(res, JsDialogHelper.ALERT, null, message, url) 5046832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen .showDialog(mWebView.getContext()); 5056832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } 50646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 50746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 50846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 50946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void handleJsBeforeUnload(String url, String message, JsResultReceiver receiver) { 5106832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen final JsPromptResult res = new JsPromptResultReceiverAdapter(receiver).getPromptResult(); 5116832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen if (!mWebChromeClient.onJsBeforeUnload(mWebView, url, message, res)) { 5126832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen new JsDialogHelper(res, JsDialogHelper.UNLOAD, null, message, url) 5136832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen .showDialog(mWebView.getContext()); 5146832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } 51546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 51646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 51746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 51846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void handleJsConfirm(String url, String message, JsResultReceiver receiver) { 5196832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen final JsPromptResult res = new JsPromptResultReceiverAdapter(receiver).getPromptResult(); 5206832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen if (!mWebChromeClient.onJsConfirm(mWebView, url, message, res)) { 5216832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen new JsDialogHelper(res, JsDialogHelper.CONFIRM, null, message, url) 5226832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen .showDialog(mWebView.getContext()); 5236832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } 52446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 52546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 52646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 52746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void handleJsPrompt(String url, String message, String defaultValue, 52846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) JsPromptResultReceiver receiver) { 5296832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen final JsPromptResult res = new JsPromptResultReceiverAdapter(receiver).getPromptResult(); 5306832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen if (!mWebChromeClient.onJsPrompt(mWebView, url, message, defaultValue, res)) { 5316832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen new JsDialogHelper(res, JsDialogHelper.PROMPT, defaultValue, message, url) 5326832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen .showDialog(mWebView.getContext()); 5336832aa63c94ee9ea1ebbee7e7e40b7d2dda0e820Kristian Monsen } 53446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 53546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 53646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 53746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onReceivedHttpAuthRequest(AwHttpAuthHandler handler, String host, String realm) { 53846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onReceivedHttpAuthRequest(mWebView, 53946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) new AwHttpAuthHandlerAdapter(handler), host, realm); 54046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 54146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 542251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu @Override 54362c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun public void onReceivedSslError(final ValueCallback<Boolean> callback, SslError error) { 54462c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun SslErrorHandler handler = new SslErrorHandler() { 54562c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun @Override 54662c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun public void proceed() { 54762c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun postProceed(true); 54862c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun } 54962c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun @Override 55062c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun public void cancel() { 55162c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun postProceed(false); 55262c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun } 55362c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun private void postProceed(final boolean proceed) { 55462c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun post(new Runnable() { 55562c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun @Override 55662c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun public void run() { 55762c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun callback.onReceiveValue(proceed); 55862c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun } 55962c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun }); 56062c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun } 56162c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun }; 56262c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun mWebViewClient.onReceivedSslError(mWebView, handler, error); 56362c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun } 56462c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun 56562c1f9e94fbc64193ded0449b96dd2a44f810061Selim Gurun @Override 56697a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu public void onReceivedLoginRequest(String realm, String account, String args) { 56797a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu mWebViewClient.onReceivedLoginRequest(mWebView, realm, account, args); 56897a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu } 56997a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu 57097a5fe19fb8224fd8ce867edf6692eceb5fd70d1Bo Liu @Override 571251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu public void onFormResubmission(Message dontResend, Message resend) { 572251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu mWebViewClient.onFormResubmission(mWebView, dontResend, resend); 573251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu } 574251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu 5754320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu @Override 5764320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu public void onDownloadStart(String url, 5774320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu String userAgent, 5784320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu String contentDisposition, 5794320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu String mimeType, 5804320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu long contentLength) { 5814320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu if (mDownloadListener != null) { 5824320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu mDownloadListener.onDownloadStart(url, 5834320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu userAgent, 5844320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu contentDisposition, 5854320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu mimeType, 5864320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu contentLength); 5874320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu } 5884320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu } 5894320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu 5903c4cc4ad5269837048ffabfa3e749a30b6d17e25Alan Leung @Override 5913520eb778d668dc76ca4541c69abd568b9d02691Mikhail Naganov public void onScaleChangedScaled(float oldScale, float newScale) { 5923c4cc4ad5269837048ffabfa3e749a30b6d17e25Alan Leung mWebViewClient.onScaleChanged(mWebView, oldScale, newScale); 5933c4cc4ad5269837048ffabfa3e749a30b6d17e25Alan Leung } 5944320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu 5952729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai @Override 596e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu public void onShowCustomView(View view, 597e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu int requestedOrientation, CustomViewCallback cb) { 598e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu mWebChromeClient.onShowCustomView(view, requestedOrientation, cb); 599e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu } 600e98a8a77d3f27ef6f5d34a17c845b66b1998fc06Bo Liu 6012729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai @Override 602782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai public void onHideCustomView() { 603782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai mWebChromeClient.onHideCustomView(); 604782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai } 605782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai 606782fea892aaa4a0867547697d49f6a1dd265d437Tao Bai @Override 6072729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai protected View getVideoLoadingProgressView() { 6082729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai return mWebChromeClient.getVideoLoadingProgressView(); 6092729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai } 6102729ce59ec2479c72f2422f49c2f0f0a121ee5b4Tao Bai 611be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai @Override 612be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai public Bitmap getDefaultVideoPoster() { 613be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai return mWebChromeClient.getDefaultVideoPoster(); 614be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai } 615be2a57c401cf1bb65d541b0bef30d71962d22488Tao Bai 61646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private static class AwHttpAuthHandlerAdapter extends android.webkit.HttpAuthHandler { 61746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private AwHttpAuthHandler mAwHandler; 61846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 61946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public AwHttpAuthHandlerAdapter(AwHttpAuthHandler awHandler) { 62046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mAwHandler = awHandler; 62146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 62246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 62346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 62446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void proceed(String username, String password) { 62546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (username == null) { 62646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) username = ""; 62746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 62846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 62946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (password == null) { 63046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) password = ""; 63146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 63246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mAwHandler.proceed(username, password); 63346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 63446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 63546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 63646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void cancel() { 63746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mAwHandler.cancel(); 63846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 63946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 64046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 64146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean useHttpAuthUsernamePassword() { 642d32343c77868461af07738ac7abd802000490d3dBen Murdoch return mAwHandler.isFirstAttempt(); 64346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 64446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 64546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)} 646