WebViewContentsClientAdapter.java revision 3e9ca893bb8fb7e0038c04bd04ae78f40233db4f
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; 2246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.graphics.Picture; 2346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Handler; 2446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Looper; 25251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liuimport android.os.Message; 2646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.provider.Browser; 2746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.util.Log; 2846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.KeyEvent; 2946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.ConsoleMessage; 304320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liuimport android.webkit.DownloadListener; 3146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.JsPromptResult; 3246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.JsResult; 3346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebChromeClient; 3446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebResourceResponse; 3546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebView; 3646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewClient; 3746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 3846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.AwContentsClient; 3946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.AwHttpAuthHandler; 4046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.InterceptedRequestData; 4146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.JsPromptResultReceiver; 4246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.JsResultReceiver; 4346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.ContentView; 4446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.ContentViewClient; 4546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 4646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.net.URISyntaxException; 4746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 4846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)/** 4946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * An adapter class that forwards the callbacks from {@link ContentViewClient} 5046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * to the appropriate {@link WebViewClient} or {@link WebChromeClient}. 5146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 5246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * An instance of this class is associated with one {@link WebViewChromium} 5346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * instance. A WebViewChromium is a WebView implementation provider (that is 5446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * android.webkit.WebView delegates all functionality to it) and has exactly 5546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * one corresponding {@link ContentView} instance. 5646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 5746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * A {@link ContentViewClient} may be shared between multiple {@link ContentView}s, 5846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * and hence multiple WebViews. Many WebViewClient methods pass the source 5946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * WebView as an argument. This means that we either need to pass the 6046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * corresponding ContentView to the corresponding ContentViewClient methods, 6146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * or use an instance of ContentViewClientAdapter per WebViewChromium, to 6246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * allow the source WebView to be injected by ContentViewClientAdapter. We 6346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * choose the latter, because it makes for a cleaner design. 6446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 6546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)public class WebViewContentsClientAdapter extends AwContentsClient { 6646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private static final String TAG = "ContentViewClientAdapter"; 6746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The WebView instance that this adapter is serving. 6846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private final WebView mWebView; 6946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The WebViewClient instance that was passed to WebView.setWebViewClient(). 7046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private WebViewClient mWebViewClient; 7146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The WebViewClient instance that was passed to WebView.setContentViewClient(). 7246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private WebChromeClient mWebChromeClient; 7346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The listener receiving find-in-page API results. 7446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private WebView.FindListener mFindListener; 7546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The listener receiving notifications of screen updates. 7646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private WebView.PictureListener mPictureListener; 7746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 784320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu private DownloadListener mDownloadListener; 794320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu 809b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch private Handler mUiThreadHandler; 819b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 829b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch private static final int NEW_WEBVIEW_CREATED = 100; 839b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 8446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 8546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * Adapter constructor. 8646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 8746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @param webView the {@link WebView} instance that this adapter is serving. 8846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 8946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) WebViewContentsClientAdapter(WebView webView) { 9046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (webView == null) { 9146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) throw new IllegalArgumentException("webView can't be null"); 9246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 9346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 9446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebView = webView; 9546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) setWebViewClient(null); 9646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) setWebChromeClient(null); 979b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 989b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch mUiThreadHandler = new Handler() { 999b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 1009b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch @Override 1019b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch public void handleMessage(Message msg) { 1029b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch switch(msg.what) { 1039b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch case NEW_WEBVIEW_CREATED: 1041ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch WebView.WebViewTransport t = (WebView.WebViewTransport) msg.obj; 1051ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch WebView newWebView = t.getWebView(); 1061ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch if (newWebView == null) { 1071ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch throw new IllegalArgumentException( 1081ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch "Must provide a new WebView for the new window."); 1091ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch } 1101ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch if (newWebView == mWebView) { 1111ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch throw new IllegalArgumentException( 1121ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch "Parent WebView cannot host it's own popup window. Please " + 1131ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch "use WebSettings.setSupportMultipleWindows(false)"); 1141ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch } 1151ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch 1161ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch if (newWebView.copyBackForwardList().getSize() != 0) { 1171ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch throw new IllegalArgumentException( 1181ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch "New WebView for popup window must not have been previously " + 1191ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch "navigated."); 1201ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch } 1211ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch 1221ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch WebViewChromium.completeWindowCreation(mWebView, newWebView); 1239b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch break; 1249b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch default: 1259b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch throw new IllegalStateException(); 1269b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch } 1279b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch } 1289b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch }; 1299b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 13046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 13146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 13246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // WebViewClassic is coded in such a way that even if a null WebViewClient is set, 13346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // certain actions take place. 13446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // We choose to replicate this behavior by using a NullWebViewClient implementation (also known 13546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // as the Null Object pattern) rather than duplicating the WebViewClassic approach in 13646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // ContentView. 13746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) static class NullWebViewClient extends WebViewClient { 13846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The Context that was passed to the WebView by the external client app. 13946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private final Context mContext; 14046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 14146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) NullWebViewClient(Context context) { 14246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mContext = context; 14346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 14446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 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. 18546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) intent.putExtra(Browser.EXTRA_APPLICATION_ID, mContext.getPackageName()); 18646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) try { 18746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mContext.startActivity(intent); 18846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } catch (ActivityNotFoundException ex) { 18946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) Log.w(TAG, "No application can handle " + url); 19046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return false; 19146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 19246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return true; 19346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 19446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 19546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 19646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) void setWebViewClient(WebViewClient client) { 19746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (client != null) { 19846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient = client; 19946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } else { 20046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient = new NullWebViewClient(mWebView.getContext()); 20146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 20246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 20346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 20446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) void setWebChromeClient(WebChromeClient client) { 20546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (client != null) { 20646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebChromeClient = client; 20746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } else { 20846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // WebViewClassic doesn't implement any special behavior for a null WebChromeClient. 20946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebChromeClient = new WebChromeClient(); 21046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 21146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 21246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 2134320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu void setDownloadListener(DownloadListener listener) { 2144320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu mDownloadListener = listener; 2154320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu } 2164320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu 21746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) void setFindListener(WebView.FindListener listener) { 21846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mFindListener = listener; 21946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 22046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 22146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) void setPictureListener(WebView.PictureListener listener) { 22246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mPictureListener = listener; 22346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 22446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 22546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //-------------------------------------------------------------------------------------------- 22646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Adapter for WebContentsDelegate methods. 22746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //-------------------------------------------------------------------------------------------- 22846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 22946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 23046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#onProgressChanged(int) 23146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 23246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 23346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onProgressChanged(int progress) { 23446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebChromeClient.onProgressChanged(mWebView, progress); 23546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 23646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 23746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 23846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#shouldInterceptRequest(java.lang.String) 23946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 24046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 24146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public InterceptedRequestData shouldInterceptRequest(String url) { 24246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) WebResourceResponse response = mWebViewClient.shouldInterceptRequest(mWebView, url); 24346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (response == null) return null; 24446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return new InterceptedRequestData( 24546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) response.getMimeType(), 24646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) response.getEncoding(), 24746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) response.getData()); 24846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 24946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 25046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 25146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#shouldIgnoreNavigation(java.lang.String) 25246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 25346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 25446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean shouldIgnoreNavigation(String url) { 25546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return mWebViewClient.shouldOverrideUrlLoading(mWebView, url); 25646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 25746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 25846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 25946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#onUnhandledKeyEvent(android.view.KeyEvent) 26046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 26146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 26246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onUnhandledKeyEvent(KeyEvent event) { 26346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onUnhandledKeyEvent(mWebView, event); 26446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 26546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 26646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 26746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#onConsoleMessage(android.webkit.ConsoleMessage) 26846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 26946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 27046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean onConsoleMessage(ConsoleMessage consoleMessage) { 27146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return mWebChromeClient.onConsoleMessage(consoleMessage); 27246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 27346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 27446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 27546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see AwContentsClient#onFindResultReceived(int,int,boolean) 27646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 27746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 27846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onFindResultReceived(int activeMatchOrdinal, int numberOfMatches, 27946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) boolean isDoneCounting) { 28046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (mFindListener == null) return; 28146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mFindListener.onFindResultReceived(activeMatchOrdinal, numberOfMatches, isDoneCounting); 28246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 28346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 28446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 28546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onLoadResource(String url) { 28646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onLoadResource(mWebView, url); 28746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 28846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 2899b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch @Override 2909b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch public boolean onCreateWindow(boolean isDialog, boolean isUserGesture) { 2919b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch Message m = mUiThreadHandler.obtainMessage( 2929b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch NEW_WEBVIEW_CREATED, mWebView.new WebViewTransport()); 2931ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch return mWebChromeClient.onCreateWindow(mWebView, isDialog, isUserGesture, m); 2949b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch } 2959b5e2bd7d0951a560aa848ff5e74b45560fee045Ben Murdoch 296d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch /** 297d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch * @see AwContentsClient#onCloseWindow() 298d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch */ 299d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch /* @Override */ 300d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch public void onCloseWindow() { 301d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch mWebChromeClient.onCloseWindow(mWebView); 302d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch } 303d988b42ca3f28aea23dc968b2f7ed79dae868fc6Ben Murdoch 30446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //-------------------------------------------------------------------------------------------- 30546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Trivial Chrome -> WebViewClient mappings. 30646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //-------------------------------------------------------------------------------------------- 30746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 30846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 30946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onPageStarted(String) 31046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 31146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 31246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onPageStarted(String url) { 31346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //TODO: Can't get the favicon till b/6094807 is fixed. 31446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onPageStarted(mWebView, url, null); 31546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 31646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 31746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 31846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onPageFinished(String) 31946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 32046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 32146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onPageFinished(String url) { 32246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onPageFinished(mWebView, url); 32346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 32446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // HACK: Fake a picture listener update, to allow CTS tests to progress. 32546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // TODO: Remove when we have real picture listener updates implemented. 32646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (mPictureListener != null) { 32746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { 32846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 32946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void run() { 33046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) UnimplementedWebViewApi.invoke(); 33146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (mPictureListener != null) { 33246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mPictureListener.onNewPicture(mWebView, new Picture()); 33346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 33446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 33546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) }, 100); 33646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 33746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 33846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 33946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 34046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onReceivedError(int,String,String) 34146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 34246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 34346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onReceivedError(int errorCode, String description, String failingUrl) { 34446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onReceivedError(mWebView, errorCode, description, failingUrl); 34546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 34646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 34746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 34846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onUpdateTitle(String) 34946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 35046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 35146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onUpdateTitle(String title) { 35246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebChromeClient.onReceivedTitle(mWebView, title); 35346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 35446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 35546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 35646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 35746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#shouldOverrideKeyEvent(KeyEvent) 35846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 35946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 36046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean shouldOverrideKeyEvent(KeyEvent event) { 36146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return mWebViewClient.shouldOverrideKeyEvent(mWebView, event); 36246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 36346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 36446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 36546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //-------------------------------------------------------------------------------------------- 36646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // More complicated mappings (including behavior choices) 36746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //-------------------------------------------------------------------------------------------- 36846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 36946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 37046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onTabCrash() 37146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 37246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 37346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onTabCrash() { 37446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The WebViewClassic implementation used a single process, so any crash would 37546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // cause the application to terminate. WebViewChromium should have the same 37646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // behavior as long as we run the renderer in-process. This needs to be revisited 37746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // if we change that decision. 37846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) Log.e(TAG, "Renderer crash reported."); 37946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebChromeClient.onCloseWindow(mWebView); 38046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 38146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 38246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //-------------------------------------------------------------------------------------------- 38346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The TODO section 38446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) //-------------------------------------------------------------------------------------------- 38546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 38646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 38746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 38846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onImeEvent() 38946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 39046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 39146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onImeEvent() { 39246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 39346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 39446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 39546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onEvaluateJavaScriptResult(int,String) 39646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 39746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 39846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onEvaluateJavaScriptResult(int id, String jsonResult) { 39946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 40046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 40146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) /** 40246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * @see ContentViewClient#onStartContentIntent(Context, String) 4033e9ca893bb8fb7e0038c04bd04ae78f40233db4fBo Liu * Callback when detecting a click on a content link. 40446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 40546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 40646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onStartContentIntent(Context context, String contentUrl) { 4073e9ca893bb8fb7e0038c04bd04ae78f40233db4fBo Liu mWebViewClient.shouldOverrideUrlLoading(mWebView, contentUrl); 40846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 40946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 41046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private static class SimpleJsResultReceiver implements JsResult.ResultReceiver { 41146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private JsResultReceiver mChromeResultReceiver; 41246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 41346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public SimpleJsResultReceiver(JsResultReceiver receiver) { 41446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mChromeResultReceiver = receiver; 41546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 41646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 41746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 41846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onJsResultComplete(JsResult result) { 41946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (result.getResult()) { 42046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mChromeResultReceiver.confirm(); 42146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } else { 42246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mChromeResultReceiver.cancel(); 42346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 42446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 42546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 42646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 42746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private static class JsPromptResultReceiverAdapter implements JsResult.ResultReceiver { 42846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private JsPromptResultReceiver mChromeResultReceiver; 42946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private JsPromptResult mPromptResult; 43046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 43146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public JsPromptResultReceiverAdapter(JsPromptResultReceiver receiver) { 43246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mChromeResultReceiver = receiver; 43346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // We hold onto the JsPromptResult here, just to avoid the need to downcast 43446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // in onJsResultComplete. 43546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mPromptResult = new JsPromptResult(this); 43646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 43746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 43846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public JsPromptResult getPromptResult() { 43946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return mPromptResult; 44046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 44146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 44246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 44346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onJsResultComplete(JsResult result) { 44446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (result != mPromptResult) throw new RuntimeException("incorrect JsResult instance"); 44546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (mPromptResult.getResult()) { 44646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mChromeResultReceiver.confirm(mPromptResult.getStringResult()); 44746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } else { 44846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mChromeResultReceiver.cancel(); 44946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 45046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 45146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 45246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 45346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 45446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void handleJsAlert(String url, String message, JsResultReceiver receiver) { 45546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) JsResult res = new JsResult(new SimpleJsResultReceiver(receiver)); 45646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebChromeClient.onJsAlert(mWebView, url, message, res); 45746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // TODO: Handle the case of the client returning false; 45846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 45946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 46046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 46146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void handleJsBeforeUnload(String url, String message, JsResultReceiver receiver) { 46246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) JsResult res = new JsResult(new SimpleJsResultReceiver(receiver)); 46346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebChromeClient.onJsBeforeUnload(mWebView, url, message, res); 46446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // TODO: Handle the case of the client returning false; 46546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 46646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 46746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 46846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void handleJsConfirm(String url, String message, JsResultReceiver receiver) { 46946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) JsResult res = new JsResult(new SimpleJsResultReceiver(receiver)); 47046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebChromeClient.onJsConfirm(mWebView, url, message, res); 47146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // TODO: Handle the case of the client returning false; 47246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 47346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 47446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 47546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void handleJsPrompt(String url, String message, String defaultValue, 47646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) JsPromptResultReceiver receiver) { 47746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) JsPromptResult res = new JsPromptResultReceiverAdapter(receiver).getPromptResult(); 47846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebChromeClient.onJsPrompt(mWebView, url, message, defaultValue, res); 47946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // TODO: Handle the case of the client returning false; 48046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 48146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 48246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 48346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onReceivedHttpAuthRequest(AwHttpAuthHandler handler, String host, String realm) { 48446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewClient.onReceivedHttpAuthRequest(mWebView, 48546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) new AwHttpAuthHandlerAdapter(handler), host, realm); 48646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 48746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 488251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu @Override 489251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu public void onFormResubmission(Message dontResend, Message resend) { 490251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu mWebViewClient.onFormResubmission(mWebView, dontResend, resend); 491251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu } 492251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu 4934320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu @Override 4944320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu public void onDownloadStart(String url, 4954320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu String userAgent, 4964320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu String contentDisposition, 4974320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu String mimeType, 4984320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu long contentLength) { 4994320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu if (mDownloadListener != null) { 5004320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu mDownloadListener.onDownloadStart(url, 5014320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu userAgent, 5024320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu contentDisposition, 5034320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu mimeType, 5044320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu contentLength); 5054320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu } 5064320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu } 5074320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu 5084320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu 50946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private static class AwHttpAuthHandlerAdapter extends android.webkit.HttpAuthHandler { 51046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private AwHttpAuthHandler mAwHandler; 51146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 51246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public AwHttpAuthHandlerAdapter(AwHttpAuthHandler awHandler) { 51346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mAwHandler = awHandler; 51446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 51546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 51646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 51746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void proceed(String username, String password) { 51846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (username == null) { 51946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) username = ""; 52046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 52146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 52246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (password == null) { 52346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) password = ""; 52446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 52546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mAwHandler.proceed(username, password); 52646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 52746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 52846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 52946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void cancel() { 53046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mAwHandler.cancel(); 53146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 53246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 53346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 53446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean useHttpAuthUsernamePassword() { 53546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The documentation for this method says: 53646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Gets whether the credentials stored for the current host (i.e. the host 53746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // for which {@link WebViewClient#onReceivedHttpAuthRequest} was called) 53846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // are suitable for use. Credentials are not suitable if they have 53946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // previously been rejected by the server for the current request. 54046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // @return whether the credentials are suitable for use 54146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // 54246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The CTS tests point out that it always returns true (at odds with 54346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // the documentation). 54446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // TODO: Decide whether to follow the docs or follow the classic 54546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // implementation and update the docs. For now the latter, as it's 54646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // easiest. (though not updating docs until this is resolved). 54746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // See b/6204427. 54846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return true; 54946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 55046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 55146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)} 552