WebViewContentsClientAdapter.java revision d7fde5118cb6e238163c9755ab581b82eea47dba
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
304d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch    /**
305d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch     * @see AwContentsClient#onRequestFocus()
306d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch     */
307d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch    /* @Override */
308d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch    public void onRequestFocus() {
309d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch        mWebChromeClient.onRequestFocus(mWebView);
310d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch    }
311d7fde5118cb6e238163c9755ab581b82eea47dbaBen Murdoch
31246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //--------------------------------------------------------------------------------------------
31346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //                        Trivial Chrome -> WebViewClient mappings.
31446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //--------------------------------------------------------------------------------------------
31546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
31646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
31746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onPageStarted(String)
31846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
31946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
32046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onPageStarted(String url) {
32146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        //TODO: Can't get the favicon till b/6094807 is fixed.
32246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onPageStarted(mWebView, url, null);
32346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
32446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
32546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
32646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onPageFinished(String)
32746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
32846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
32946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onPageFinished(String url) {
33046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onPageFinished(mWebView, url);
33146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
33246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // HACK: Fake a picture listener update, to allow CTS tests to progress.
33346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // TODO: Remove when we have real picture listener updates implemented.
33446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        if (mPictureListener != null) {
33546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
33646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                @Override
33746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                public void run() {
33846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                    UnimplementedWebViewApi.invoke();
33946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                    if (mPictureListener != null) {
34046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                        mPictureListener.onNewPicture(mWebView, new Picture());
34146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                    }
34246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                }
34346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }, 100);
34446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
34546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
34646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
34746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
34846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onReceivedError(int,String,String)
34946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
35046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
35146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onReceivedError(int errorCode, String description, String failingUrl) {
35246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onReceivedError(mWebView, errorCode, description, failingUrl);
35346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
35446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
35546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
35646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onUpdateTitle(String)
35746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
35846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
35946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onUpdateTitle(String title) {
36046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebChromeClient.onReceivedTitle(mWebView, title);
36146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
36246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
36346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
36446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
36546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#shouldOverrideKeyEvent(KeyEvent)
36646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
36746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
36846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public boolean shouldOverrideKeyEvent(KeyEvent event) {
36946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        return mWebViewClient.shouldOverrideKeyEvent(mWebView, event);
37046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
37146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
37246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
37346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //--------------------------------------------------------------------------------------------
37446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //                 More complicated mappings (including behavior choices)
37546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //--------------------------------------------------------------------------------------------
37646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
37746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
37846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onTabCrash()
37946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
38046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
38146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onTabCrash() {
38246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // The WebViewClassic implementation used a single process, so any crash would
38346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // cause the application to terminate.  WebViewChromium should have the same
38446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // behavior as long as we run the renderer in-process. This needs to be revisited
38546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // if we change that decision.
38646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        Log.e(TAG, "Renderer crash reported.");
38746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebChromeClient.onCloseWindow(mWebView);
38846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
38946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
39046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //--------------------------------------------------------------------------------------------
39146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //                                     The TODO section
39246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    //--------------------------------------------------------------------------------------------
39346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
39446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
39546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
39646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onImeEvent()
39746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
39846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
39946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onImeEvent() {
40046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
40146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
40246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
40346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onEvaluateJavaScriptResult(int,String)
40446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
40546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
40646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onEvaluateJavaScriptResult(int id, String jsonResult) {
40746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
40846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
40946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    /**
41046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     * @see ContentViewClient#onStartContentIntent(Context, String)
41146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)     */
41246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
41346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onStartContentIntent(Context context, String contentUrl) {
41446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
41546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
41646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private static class SimpleJsResultReceiver implements JsResult.ResultReceiver {
41746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        private JsResultReceiver mChromeResultReceiver;
41846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
41946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public SimpleJsResultReceiver(JsResultReceiver receiver) {
42046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mChromeResultReceiver = receiver;
42146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
42246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
42346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
42446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public void onJsResultComplete(JsResult result) {
42546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            if (result.getResult()) {
42646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                mChromeResultReceiver.confirm();
42746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            } else {
42846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                mChromeResultReceiver.cancel();
42946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
43046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
43146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
43246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
43346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private static class JsPromptResultReceiverAdapter implements JsResult.ResultReceiver {
43446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        private JsPromptResultReceiver mChromeResultReceiver;
43546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        private JsPromptResult mPromptResult;
43646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
43746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public JsPromptResultReceiverAdapter(JsPromptResultReceiver receiver) {
43846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mChromeResultReceiver = receiver;
43946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // We hold onto the JsPromptResult here, just to avoid the need to downcast
44046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // in onJsResultComplete.
44146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mPromptResult = new JsPromptResult(this);
44246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
44346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
44446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public JsPromptResult getPromptResult() {
44546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return mPromptResult;
44646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
44746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
44846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
44946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public void onJsResultComplete(JsResult result) {
45046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            if (result != mPromptResult) throw new RuntimeException("incorrect JsResult instance");
45146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            if (mPromptResult.getResult()) {
45246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                mChromeResultReceiver.confirm(mPromptResult.getStringResult());
45346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            } else {
45446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                mChromeResultReceiver.cancel();
45546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
45646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
45746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
45846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
45946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
46046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void handleJsAlert(String url, String message, JsResultReceiver receiver) {
46146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        JsResult res = new JsResult(new SimpleJsResultReceiver(receiver));
46246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebChromeClient.onJsAlert(mWebView, url, message, res);
46346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // TODO: Handle the case of the client returning false;
46446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
46546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
46646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
46746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void handleJsBeforeUnload(String url, String message, JsResultReceiver receiver) {
46846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        JsResult res = new JsResult(new SimpleJsResultReceiver(receiver));
46946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebChromeClient.onJsBeforeUnload(mWebView, url, message, res);
47046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // TODO: Handle the case of the client returning false;
47146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
47246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
47346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
47446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void handleJsConfirm(String url, String message, JsResultReceiver receiver) {
47546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        JsResult res = new JsResult(new SimpleJsResultReceiver(receiver));
47646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebChromeClient.onJsConfirm(mWebView, url, message, res);
47746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // TODO: Handle the case of the client returning false;
47846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
47946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
48046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
48146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void handleJsPrompt(String url, String message, String defaultValue,
48246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            JsPromptResultReceiver receiver) {
48346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        JsPromptResult res = new JsPromptResultReceiverAdapter(receiver).getPromptResult();
48446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebChromeClient.onJsPrompt(mWebView, url, message, defaultValue, res);
48546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        // TODO: Handle the case of the client returning false;
48646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
48746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
48846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    @Override
48946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    public void onReceivedHttpAuthRequest(AwHttpAuthHandler handler, String host, String realm) {
49046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        mWebViewClient.onReceivedHttpAuthRequest(mWebView,
49146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                new AwHttpAuthHandlerAdapter(handler), host, realm);
49246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
49346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
494251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu    @Override
495251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu    public void onFormResubmission(Message dontResend, Message resend) {
496251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu        mWebViewClient.onFormResubmission(mWebView, dontResend, resend);
497251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu    }
498251a1c8d0a987b0df24e19904d0c0ef492304286Bo Liu
4994320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    @Override
5004320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    public void onDownloadStart(String url,
5014320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                String userAgent,
5024320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                String contentDisposition,
5034320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                String mimeType,
5044320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                long contentLength) {
5054320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu        if (mDownloadListener != null) {
5064320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu            mDownloadListener.onDownloadStart(url,
5074320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                              userAgent,
5084320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                              contentDisposition,
5094320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                              mimeType,
5104320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu                                              contentLength);
5114320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu        }
5124320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu    }
5134320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu
5144320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu
51546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    private static class AwHttpAuthHandlerAdapter extends android.webkit.HttpAuthHandler {
51646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        private AwHttpAuthHandler mAwHandler;
51746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
51846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public AwHttpAuthHandlerAdapter(AwHttpAuthHandler awHandler) {
51946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mAwHandler = awHandler;
52046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
52146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
52246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
52346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public void proceed(String username, String password) {
52446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            if (username == null) {
52546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                username = "";
52646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
52746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
52846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            if (password == null) {
52946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)                password = "";
53046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            }
53146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mAwHandler.proceed(username, password);
53246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
53346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
53446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
53546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public void cancel() {
53646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            mAwHandler.cancel();
53746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
53846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)
53946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        @Override
54046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        public boolean useHttpAuthUsernamePassword() {
54146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // The documentation for this method says:
54246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // Gets whether the credentials stored for the current host (i.e. the host
54346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // for which {@link WebViewClient#onReceivedHttpAuthRequest} was called)
54446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // are suitable for use. Credentials are not suitable if they have
54546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // previously been rejected by the server for the current request.
54646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // @return whether the credentials are suitable for use
54746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            //
54846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // The CTS tests point out that it always returns true (at odds with
54946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // the documentation).
55046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // TODO: Decide whether to follow the docs or follow the classic
55146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // implementation and update the docs. For now the latter, as it's
55246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // easiest.  (though not updating docs until this is resolved).
55346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            // See b/6204427.
55446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)            return true;
55546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)        }
55646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)    }
55746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)}
558