19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.webkit;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19fba3197d9e28f087ce41e0fc2446e76936764889Grace Klobaimport android.app.Activity;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.AlertDialog;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ActivityNotFoundException;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.DialogInterface;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.http.SslCertificate;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.http.SslError;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
33ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.provider.Browser;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.EditText;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.TextView;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.R;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.MalformedURLException;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.URL;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
459497c5f8c4bc7c47789e5ccde01179abc31ffeb2Narayan Kamathimport java.util.List;
464ae32f5f11f2914196d6d0d195dcbc59d37b92bcBen Murdochimport java.util.Map;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class is a proxy class for handling WebCore -> UI thread messaging. All
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the callback functions are called from the WebCore thread and messages are
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * posted to the UI thread for the actual client callback.
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class is created in the UI thread so its handler and any private classes
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that extend Handler will operate in the UI thread.
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass CallbackProxy extends Handler {
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Logging tag
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String LOGTAG = "CallbackProxy";
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Instance of WebViewClient that is the client callback.
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private volatile WebViewClient mWebViewClient;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Instance of WebChromeClient for handling all chrome functions.
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private volatile WebChromeClient mWebChromeClient;
643c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon    // Instance of WebViewClassic for handling UI requests.
653c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon    private final WebViewClassic mWebView;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Client registered callback listener for download events
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private volatile DownloadListener mDownloadListener;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Keep track of multiple progress updates.
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mProgressUpdatePending;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Keep track of the last progress amount.
715a4fbd6c20e36410bed07c0b6b655412c6eb71d5Grace Kloba    // Start with 100 to indicate it is not in load for the empty page.
725a4fbd6c20e36410bed07c0b6b655412c6eb71d5Grace Kloba    private volatile int mLatestProgress = 100;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Back/Forward list
74fcc1f75bdf21a89f0a40c323efae4d6a817cced5Jesse Greenwald    private final WebBackForwardListClassic mBackForwardList;
750b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott    // Back/Forward list client
760b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott    private volatile WebBackForwardListClient mWebBackForwardListClient;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Used to call startActivity during url override.
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Context mContext;
79d78ad29b0929b86d6084b618fbec83027294fff1Michael Kolb    // block messages flag for destroy
80d78ad29b0929b86d6084b618fbec83027294fff1Michael Kolb    private boolean mBlockMessages;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
82fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    // Message IDs
83fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int PAGE_STARTED                         = 100;
84fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int RECEIVED_ICON                        = 101;
85fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int RECEIVED_TITLE                       = 102;
86fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int OVERRIDE_URL                         = 103;
87fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int AUTH_REQUEST                         = 104;
88fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int SSL_ERROR                            = 105;
89fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int PROGRESS                             = 106;
90fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int UPDATE_VISITED                       = 107;
91fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int LOAD_RESOURCE                        = 108;
92fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int CREATE_WINDOW                        = 109;
93fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int CLOSE_WINDOW                         = 110;
94fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int SAVE_PASSWORD                        = 111;
95fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int JS_ALERT                             = 112;
96fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int JS_CONFIRM                           = 113;
97fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int JS_PROMPT                            = 114;
98fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int JS_UNLOAD                            = 115;
99fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int ASYNC_KEYEVENTS                      = 116;
100fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int DOWNLOAD_FILE                        = 118;
101fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int REPORT_ERROR                         = 119;
102fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int RESEND_POST_DATA                     = 120;
103fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int PAGE_FINISHED                        = 121;
104fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int REQUEST_FOCUS                        = 122;
105fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int SCALE_CHANGED                        = 123;
106fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int RECEIVED_CERTIFICATE                 = 124;
107fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int SWITCH_OUT_HISTORY                   = 125;
108fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int EXCEEDED_DATABASE_QUOTA              = 126;
109fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int REACHED_APPCACHE_MAXSIZE             = 127;
110fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int JS_TIMEOUT                           = 128;
111fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int ADD_MESSAGE_TO_CONSOLE               = 129;
112fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int GEOLOCATION_PERMISSIONS_SHOW_PROMPT  = 130;
113fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int GEOLOCATION_PERMISSIONS_HIDE_PROMPT  = 131;
114fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int RECEIVED_TOUCH_ICON_URL              = 132;
115fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int GET_VISITED_HISTORY                  = 133;
116fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int OPEN_FILE_CHOOSER                    = 134;
117fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int ADD_HISTORY_ITEM                     = 135;
118fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int HISTORY_INDEX_CHANGED                = 136;
119fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int AUTH_CREDENTIALS                     = 137;
120fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int AUTO_LOGIN                           = 140;
121fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int CLIENT_CERT_REQUEST                  = 141;
122fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int PROCEEDED_AFTER_SSL_ERROR            = 144;
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Message triggered by the client to resume execution
125fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    private static final int NOTIFY                               = 200;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Result transportation object for returning results across thread
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // boundaries.
1297ec19876c95584c2114982826b2006557b0728d6Cary Clark    private static class ResultTransport<E> {
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Private result object
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private E mResult;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
133dbad320bf3a4ae44717aa8dff4ec1791a3820259Grace Kloba        public ResultTransport(E defaultResult) {
134dbad320bf3a4ae44717aa8dff4ec1791a3820259Grace Kloba            mResult = defaultResult;
135dbad320bf3a4ae44717aa8dff4ec1791a3820259Grace Kloba        }
136dbad320bf3a4ae44717aa8dff4ec1791a3820259Grace Kloba
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public synchronized void setResult(E result) {
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResult = result;
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public synchronized E getResult() {
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mResult;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1462377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon    private class JsResultReceiver implements JsResult.ResultReceiver {
1472377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon        // This prevents a user from interacting with the result before WebCore is
1482377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon        // ready to handle it.
1492377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon        private boolean mReady;
1502377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon        // Tells us if the user tried to confirm or cancel the result before WebCore
1512377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon        // is ready.
1522377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon        private boolean mTriedToNotifyBeforeReady;
1532377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon
1542377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon        public JsPromptResult mJsResult = new JsPromptResult(this);
1552377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon
1562377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon        final void setReady() {
1572377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon            mReady = true;
1582377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon            if (mTriedToNotifyBeforeReady) {
1592377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon                notifyCallbackProxy();
1602377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon            }
1612377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon        }
1622377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon
1632377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon        /* Wake up the WebCore thread. */
1642377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon        @Override
1652377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon        public void onJsResultComplete(JsResult result) {
1662377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon            if (mReady) {
1672377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon                notifyCallbackProxy();
1682377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon            } else {
1692377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon                mTriedToNotifyBeforeReady = true;
1702377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon            }
1712377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon        }
1722377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon
1732377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon        private void notifyCallbackProxy() {
1742377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon            synchronized (CallbackProxy.this) {
1752377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon                CallbackProxy.this.notify();
1762377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon            }
1772377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon        }
1782377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon}
1792377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Construct a new CallbackProxy.
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1833c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon    public CallbackProxy(Context context, WebViewClassic w) {
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Used to start a default activity.
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWebView = w;
187fcc1f75bdf21a89f0a40c323efae4d6a817cced5Jesse Greenwald        mBackForwardList = new WebBackForwardListClassic(this);
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
190d78ad29b0929b86d6084b618fbec83027294fff1Michael Kolb    protected synchronized void blockMessages() {
191d78ad29b0929b86d6084b618fbec83027294fff1Michael Kolb        mBlockMessages = true;
192d78ad29b0929b86d6084b618fbec83027294fff1Michael Kolb    }
193d78ad29b0929b86d6084b618fbec83027294fff1Michael Kolb
194d78ad29b0929b86d6084b618fbec83027294fff1Michael Kolb    protected synchronized boolean messagesBlocked() {
195d78ad29b0929b86d6084b618fbec83027294fff1Michael Kolb        return mBlockMessages;
196d78ad29b0929b86d6084b618fbec83027294fff1Michael Kolb    }
197d78ad29b0929b86d6084b618fbec83027294fff1Michael Kolb
1986ddf44d81538fbcc8c0732ea53770bc23a6d7cf7Michael Kolb    protected void shutdown() {
199d78ad29b0929b86d6084b618fbec83027294fff1Michael Kolb        removeCallbacksAndMessages(null);
2006ddf44d81538fbcc8c0732ea53770bc23a6d7cf7Michael Kolb        setWebViewClient(null);
2016ddf44d81538fbcc8c0732ea53770bc23a6d7cf7Michael Kolb        setWebChromeClient(null);
2026ddf44d81538fbcc8c0732ea53770bc23a6d7cf7Michael Kolb    }
2036ddf44d81538fbcc8c0732ea53770bc23a6d7cf7Michael Kolb
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the WebViewClient.
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param client An implementation of WebViewClient.
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setWebViewClient(WebViewClient client) {
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWebViewClient = client;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
21394ab3b6d0e9a5a914c7706ed1888c9d27756f7e4Grace Kloba     * Get the WebViewClient.
21494ab3b6d0e9a5a914c7706ed1888c9d27756f7e4Grace Kloba     * @return the current WebViewClient instance.
21594ab3b6d0e9a5a914c7706ed1888c9d27756f7e4Grace Kloba     */
21694ab3b6d0e9a5a914c7706ed1888c9d27756f7e4Grace Kloba    public WebViewClient getWebViewClient() {
21794ab3b6d0e9a5a914c7706ed1888c9d27756f7e4Grace Kloba       return mWebViewClient;
21894ab3b6d0e9a5a914c7706ed1888c9d27756f7e4Grace Kloba    }
21994ab3b6d0e9a5a914c7706ed1888c9d27756f7e4Grace Kloba
22094ab3b6d0e9a5a914c7706ed1888c9d27756f7e4Grace Kloba    /**
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the WebChromeClient.
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param client An implementation of WebChromeClient.
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setWebChromeClient(WebChromeClient client) {
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWebChromeClient = client;
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2296fa2958059a08390ed2b87b8572f8847ad9999e4Andrei Popescu     * Get the WebChromeClient.
2306fa2958059a08390ed2b87b8572f8847ad9999e4Andrei Popescu     * @return the current WebChromeClient instance.
2316fa2958059a08390ed2b87b8572f8847ad9999e4Andrei Popescu     */
2326fa2958059a08390ed2b87b8572f8847ad9999e4Andrei Popescu    public WebChromeClient getWebChromeClient() {
2336fa2958059a08390ed2b87b8572f8847ad9999e4Andrei Popescu       return mWebChromeClient;
2346fa2958059a08390ed2b87b8572f8847ad9999e4Andrei Popescu    }
2356fa2958059a08390ed2b87b8572f8847ad9999e4Andrei Popescu
2366fa2958059a08390ed2b87b8572f8847ad9999e4Andrei Popescu    /**
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the client DownloadListener.
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param client An implementation of DownloadListener.
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setDownloadListener(DownloadListener client) {
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownloadListener = client;
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the Back/Forward list to return to the user or to update the cached
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * history list.
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
248fcc1f75bdf21a89f0a40c323efae4d6a817cced5Jesse Greenwald    public WebBackForwardListClassic getBackForwardList() {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mBackForwardList;
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2520b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott    void setWebBackForwardListClient(WebBackForwardListClient client) {
2530b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott        mWebBackForwardListClient = client;
2540b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott    }
2550b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott
2560b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott    WebBackForwardListClient getWebBackForwardListClient() {
2570b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott        return mWebBackForwardListClient;
2580b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott    }
2590b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by the UI side.  Calling overrideUrlLoading from the WebCore
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * side will post a message to call this method.
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean uiOverrideUrlLoading(String overrideUrl) {
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (overrideUrl == null || overrideUrl.length() == 0) {
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean override = false;
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWebViewClient != null) {
2703c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon            override = mWebViewClient.shouldOverrideUrlLoading(mWebView.getWebView(),
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    overrideUrl);
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Intent intent = new Intent(Intent.ACTION_VIEW,
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uri.parse(overrideUrl));
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            intent.addCategory(Intent.CATEGORY_BROWSABLE);
276ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            // If another application is running a WebView and launches the
277ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            // Browser through this Intent, we want to reuse the same window if
278ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            // possible.
279ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project            intent.putExtra(Browser.EXTRA_APPLICATION_ID,
280ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                    mContext.getPackageName());
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mContext.startActivity(intent);
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                override = true;
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (ActivityNotFoundException ex) {
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If no application can handle the URL, assume that the
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // browser can handle it.
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return override;
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by UI side.
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean uiOverrideKeyEvent(KeyEvent event) {
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWebViewClient != null) {
2973c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon            return mWebViewClient.shouldOverrideKeyEvent(mWebView.getWebView(), event);
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void handleMessage(Message msg) {
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // We don't have to do synchronization because this function operates
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // in the UI thread. The WebViewClient and WebChromeClient functions
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // that check for a non-null callback are ok because java ensures atomic
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // 32-bit reads and writes.
308d78ad29b0929b86d6084b618fbec83027294fff1Michael Kolb        if (messagesBlocked()) return;
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (msg.what) {
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case PAGE_STARTED:
311585f13f8dec4cbf55b3bc04d95425d647f0577b2Svetoslav Ganov                String startedUrl = msg.getData().getString("url");
312585f13f8dec4cbf55b3bc04d95425d647f0577b2Svetoslav Ganov                mWebView.onPageStarted(startedUrl);
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWebViewClient != null) {
3143c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon                    mWebViewClient.onPageStarted(mWebView.getWebView(), startedUrl,
3153c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon                            (Bitmap) msg.obj);
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case PAGE_FINISHED:
320405d785f86c1f32feaf1f0f93d1cd8df5cbcd151Leon Scroggins                String finishedUrl = (String) msg.obj;
321405d785f86c1f32feaf1f0f93d1cd8df5cbcd151Leon Scroggins                mWebView.onPageFinished(finishedUrl);
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWebViewClient != null) {
3233c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon                    mWebViewClient.onPageFinished(mWebView.getWebView(), finishedUrl);
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
326a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case RECEIVED_ICON:
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWebChromeClient != null) {
3293c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon                    mWebChromeClient.onReceivedIcon(mWebView.getWebView(), (Bitmap) msg.obj);
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3332ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott            case RECEIVED_TOUCH_ICON_URL:
3342ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott                if (mWebChromeClient != null) {
3353c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon                    mWebChromeClient.onReceivedTouchIconUrl(mWebView.getWebView(),
336d58ccff769e40a6c52e9f6e30e4016590e05ba9aPatrick Scott                            (String) msg.obj, msg.arg1 == 1);
3372ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott                }
3382ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott                break;
3392ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case RECEIVED_TITLE:
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWebChromeClient != null) {
3423c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon                    mWebChromeClient.onReceivedTitle(mWebView.getWebView(),
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            (String) msg.obj);
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case REPORT_ERROR:
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWebViewClient != null) {
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int reasonCode = msg.arg1;
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final String description  = msg.getData().getString("description");
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final String failUrl  = msg.getData().getString("failingUrl");
3523c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon                    mWebViewClient.onReceivedError(mWebView.getWebView(), reasonCode,
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            description, failUrl);
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case RESEND_POST_DATA:
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Message resend =
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        (Message) msg.getData().getParcelable("resend");
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Message dontResend =
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        (Message) msg.getData().getParcelable("dontResend");
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWebViewClient != null) {
3633c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon                    mWebViewClient.onFormResubmission(mWebView.getWebView(), dontResend,
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            resend);
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    dontResend.sendToTarget();
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case OVERRIDE_URL:
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String overrideUrl = msg.getData().getString("url");
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean override = uiOverrideUrlLoading(overrideUrl);
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ResultTransport<Boolean> result =
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        (ResultTransport<Boolean>) msg.obj;
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (this) {
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    result.setResult(override);
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    notify();
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case AUTH_REQUEST:
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWebViewClient != null) {
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    HttpAuthHandler handler = (HttpAuthHandler) msg.obj;
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String host = msg.getData().getString("host");
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String realm = msg.getData().getString("realm");
3863c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon                    mWebViewClient.onReceivedHttpAuthRequest(mWebView.getWebView(), handler,
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            host, realm);
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case SSL_ERROR:
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWebViewClient != null) {
393a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom                    HashMap<String, Object> map =
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        (HashMap<String, Object>) msg.obj;
3953c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon                    mWebViewClient.onReceivedSslError(mWebView.getWebView(),
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            (SslErrorHandler) map.get("handler"),
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            (SslError) map.get("error"));
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
401fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block            case PROCEEDED_AFTER_SSL_ERROR:
40273eeb7b5ed5f88750156b787c665f7d3769fc56aJonathan Dixon                if (mWebViewClient != null && mWebViewClient instanceof WebViewClientClassicExt) {
40373eeb7b5ed5f88750156b787c665f7d3769fc56aJonathan Dixon                    ((WebViewClientClassicExt) mWebViewClient).onProceededAfterSslError(
40473eeb7b5ed5f88750156b787c665f7d3769fc56aJonathan Dixon                            mWebView.getWebView(),
405fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block                            (SslError) msg.obj);
406fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block                }
407fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block                break;
408fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block
409a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom            case CLIENT_CERT_REQUEST:
41073eeb7b5ed5f88750156b787c665f7d3769fc56aJonathan Dixon                if (mWebViewClient != null  && mWebViewClient instanceof WebViewClientClassicExt) {
41173eeb7b5ed5f88750156b787c665f7d3769fc56aJonathan Dixon                    HashMap<String, Object> map = (HashMap<String, Object>) msg.obj;
41273eeb7b5ed5f88750156b787c665f7d3769fc56aJonathan Dixon                    ((WebViewClientClassicExt) mWebViewClient).onReceivedClientCertRequest(
41373eeb7b5ed5f88750156b787c665f7d3769fc56aJonathan Dixon                            mWebView.getWebView(),
414a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom                            (ClientCertRequestHandler) map.get("handler"),
415a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom                            (String) map.get("host_and_port"));
416a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom                }
417a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom                break;
418a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case PROGRESS:
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Synchronize to ensure mLatestProgress is not modified after
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // setProgress is called and before mProgressUpdatePending is
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // changed.
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (this) {
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mWebChromeClient != null) {
4253c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon                        mWebChromeClient.onProgressChanged(mWebView.getWebView(),
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                mLatestProgress);
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mProgressUpdatePending = false;
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case UPDATE_VISITED:
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWebViewClient != null) {
4343c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon                    mWebViewClient.doUpdateVisitedHistory(mWebView.getWebView(),
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            (String) msg.obj, msg.arg1 != 0);
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case LOAD_RESOURCE:
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWebViewClient != null) {
4413c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon                    mWebViewClient.onLoadResource(mWebView.getWebView(), (String) msg.obj);
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DOWNLOAD_FILE:
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mDownloadListener != null) {
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String url = msg.getData().getString("url");
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String userAgent = msg.getData().getString("userAgent");
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String contentDisposition =
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        msg.getData().getString("contentDisposition");
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String mimetype = msg.getData().getString("mimetype");
452a36dcfdfe0e93cf18ae2c98f92625a593d624bb7Selim Gurun                    String referer = msg.getData().getString("referer");
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Long contentLength = msg.getData().getLong("contentLength");
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
455a36dcfdfe0e93cf18ae2c98f92625a593d624bb7Selim Gurun                    if (mDownloadListener instanceof BrowserDownloadListener) {
456a36dcfdfe0e93cf18ae2c98f92625a593d624bb7Selim Gurun                        ((BrowserDownloadListener) mDownloadListener).onDownloadStart(url,
457a36dcfdfe0e93cf18ae2c98f92625a593d624bb7Selim Gurun                             userAgent, contentDisposition, mimetype, referer, contentLength);
458a36dcfdfe0e93cf18ae2c98f92625a593d624bb7Selim Gurun                    } else {
459a36dcfdfe0e93cf18ae2c98f92625a593d624bb7Selim Gurun                        mDownloadListener.onDownloadStart(url, userAgent,
460a36dcfdfe0e93cf18ae2c98f92625a593d624bb7Selim Gurun                             contentDisposition, mimetype, contentLength);
461a36dcfdfe0e93cf18ae2c98f92625a593d624bb7Selim Gurun                    }
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case CREATE_WINDOW:
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWebChromeClient != null) {
4673c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon                    if (!mWebChromeClient.onCreateWindow(mWebView.getWebView(),
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                msg.arg1 == 1, msg.arg2 == 1,
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                (Message) msg.obj)) {
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        synchronized (this) {
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            notify();
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
47421817f6e2924217a1c456f3ba7e9a359b00602d2Grace Kloba                    mWebView.dismissZoomControl();
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case REQUEST_FOCUS:
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWebChromeClient != null) {
4803c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon                    mWebChromeClient.onRequestFocus(mWebView.getWebView());
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case CLOSE_WINDOW:
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWebChromeClient != null) {
4863c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon                    mWebChromeClient.onCloseWindow(((WebViewClassic) msg.obj).getWebView());
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case SAVE_PASSWORD:
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Bundle bundle = msg.getData();
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String schemePlusHost = bundle.getString("host");
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String username = bundle.getString("username");
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String password = bundle.getString("password");
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If the client returned false it means that the notify message
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // will not be sent and we should notify WebCore ourselves.
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mWebView.onSavePassword(schemePlusHost, username, password,
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            (Message) msg.obj)) {
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    synchronized (this) {
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        notify();
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case ASYNC_KEYEVENTS:
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWebViewClient != null) {
5073c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon                    mWebViewClient.onUnhandledKeyEvent(mWebView.getWebView(),
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            (KeyEvent) msg.obj);
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5127df1985e86635af006be3dfa65987d60e290b5deBen Murdoch            case EXCEEDED_DATABASE_QUOTA:
5137df1985e86635af006be3dfa65987d60e290b5deBen Murdoch                if (mWebChromeClient != null) {
5147df1985e86635af006be3dfa65987d60e290b5deBen Murdoch                    HashMap<String, Object> map =
5157df1985e86635af006be3dfa65987d60e290b5deBen Murdoch                            (HashMap<String, Object>) msg.obj;
5167df1985e86635af006be3dfa65987d60e290b5deBen Murdoch                    String databaseIdentifier =
5177df1985e86635af006be3dfa65987d60e290b5deBen Murdoch                            (String) map.get("databaseIdentifier");
5187df1985e86635af006be3dfa65987d60e290b5deBen Murdoch                    String url = (String) map.get("url");
519285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block                    long quota =
520285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block                            ((Long) map.get("quota")).longValue();
521285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block                    long totalQuota =
522285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block                            ((Long) map.get("totalQuota")).longValue();
523285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block                    long estimatedDatabaseSize =
524285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block                            ((Long) map.get("estimatedDatabaseSize")).longValue();
5257df1985e86635af006be3dfa65987d60e290b5deBen Murdoch                    WebStorage.QuotaUpdater quotaUpdater =
5267df1985e86635af006be3dfa65987d60e290b5deBen Murdoch                        (WebStorage.QuotaUpdater) map.get("quotaUpdater");
5277df1985e86635af006be3dfa65987d60e290b5deBen Murdoch
5287df1985e86635af006be3dfa65987d60e290b5deBen Murdoch                    mWebChromeClient.onExceededDatabaseQuota(url,
529285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block                            databaseIdentifier, quota, estimatedDatabaseSize,
530285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block                            totalQuota, quotaUpdater);
53159e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu                }
53259e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu                break;
53359e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu
53459e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu            case REACHED_APPCACHE_MAXSIZE:
53559e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu                if (mWebChromeClient != null) {
53659e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu                    HashMap<String, Object> map =
53759e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu                            (HashMap<String, Object>) msg.obj;
538285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block                    long requiredStorage =
539285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block                            ((Long) map.get("requiredStorage")).longValue();
540285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block                    long quota =
541285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block                        ((Long) map.get("quota")).longValue();
54259e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu                    WebStorage.QuotaUpdater quotaUpdater =
54359e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu                        (WebStorage.QuotaUpdater) map.get("quotaUpdater");
54459e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu
545285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block                    mWebChromeClient.onReachedMaxAppCacheSize(requiredStorage,
546285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block                            quota, quotaUpdater);
5477df1985e86635af006be3dfa65987d60e290b5deBen Murdoch                }
5487df1985e86635af006be3dfa65987d60e290b5deBen Murdoch                break;
5497df1985e86635af006be3dfa65987d60e290b5deBen Murdoch
5504faee09c422a70439129e9fb40dd82f03d42c98dSteve Block            case GEOLOCATION_PERMISSIONS_SHOW_PROMPT:
5514faee09c422a70439129e9fb40dd82f03d42c98dSteve Block                if (mWebChromeClient != null) {
5524faee09c422a70439129e9fb40dd82f03d42c98dSteve Block                    HashMap<String, Object> map =
5534faee09c422a70439129e9fb40dd82f03d42c98dSteve Block                            (HashMap<String, Object>) msg.obj;
5544faee09c422a70439129e9fb40dd82f03d42c98dSteve Block                    String origin = (String) map.get("origin");
5554faee09c422a70439129e9fb40dd82f03d42c98dSteve Block                    GeolocationPermissions.Callback callback =
5564faee09c422a70439129e9fb40dd82f03d42c98dSteve Block                            (GeolocationPermissions.Callback)
5574faee09c422a70439129e9fb40dd82f03d42c98dSteve Block                            map.get("callback");
5584faee09c422a70439129e9fb40dd82f03d42c98dSteve Block                    mWebChromeClient.onGeolocationPermissionsShowPrompt(origin,
5594faee09c422a70439129e9fb40dd82f03d42c98dSteve Block                            callback);
5604faee09c422a70439129e9fb40dd82f03d42c98dSteve Block                }
5614faee09c422a70439129e9fb40dd82f03d42c98dSteve Block                break;
5624faee09c422a70439129e9fb40dd82f03d42c98dSteve Block
5634faee09c422a70439129e9fb40dd82f03d42c98dSteve Block            case GEOLOCATION_PERMISSIONS_HIDE_PROMPT:
5644faee09c422a70439129e9fb40dd82f03d42c98dSteve Block                if (mWebChromeClient != null) {
5654faee09c422a70439129e9fb40dd82f03d42c98dSteve Block                    mWebChromeClient.onGeolocationPermissionsHidePrompt();
5664faee09c422a70439129e9fb40dd82f03d42c98dSteve Block                }
5674faee09c422a70439129e9fb40dd82f03d42c98dSteve Block                break;
5684faee09c422a70439129e9fb40dd82f03d42c98dSteve Block
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case JS_ALERT:
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWebChromeClient != null) {
5712377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon                    final JsResultReceiver receiver = (JsResultReceiver) msg.obj;
5722377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon                    final JsResult res = receiver.mJsResult;
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String message = msg.getData().getString("message");
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String url = msg.getData().getString("url");
5753c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon                    if (!mWebChromeClient.onJsAlert(mWebView.getWebView(), url, message,
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            res)) {
5770406e48db9d445227d66277fd786059c0c1074ebBen Murdoch                        if (!canShowAlertDialog()) {
578fba3197d9e28f087ce41e0fc2446e76936764889Grace Kloba                            res.cancel();
5792377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon                            receiver.setReady();
580fba3197d9e28f087ce41e0fc2446e76936764889Grace Kloba                            break;
581fba3197d9e28f087ce41e0fc2446e76936764889Grace Kloba                        }
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        new AlertDialog.Builder(mContext)
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                .setTitle(getJsDialogTitle(url))
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                .setMessage(message)
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                .setPositiveButton(R.string.ok,
586fba3197d9e28f087ce41e0fc2446e76936764889Grace Kloba                                        new DialogInterface.OnClickListener() {
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            public void onClick(
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    DialogInterface dialog,
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    int which) {
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                res.confirm();
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            }
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        })
593fba3197d9e28f087ce41e0fc2446e76936764889Grace Kloba                                .setOnCancelListener(
594fba3197d9e28f087ce41e0fc2446e76936764889Grace Kloba                                        new DialogInterface.OnCancelListener() {
595fba3197d9e28f087ce41e0fc2446e76936764889Grace Kloba                                            public void onCancel(
596fba3197d9e28f087ce41e0fc2446e76936764889Grace Kloba                                                    DialogInterface dialog) {
597fba3197d9e28f087ce41e0fc2446e76936764889Grace Kloba                                                res.cancel();
598fba3197d9e28f087ce41e0fc2446e76936764889Grace Kloba                                            }
599fba3197d9e28f087ce41e0fc2446e76936764889Grace Kloba                                        })
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                .show();
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6022377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon                    receiver.setReady();
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case JS_CONFIRM:
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWebChromeClient != null) {
6082377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon                    final JsResultReceiver receiver = (JsResultReceiver) msg.obj;
6092377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon                    final JsResult res = receiver.mJsResult;
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String message = msg.getData().getString("message");
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String url = msg.getData().getString("url");
6123c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon                    if (!mWebChromeClient.onJsConfirm(mWebView.getWebView(), url, message,
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            res)) {
6140406e48db9d445227d66277fd786059c0c1074ebBen Murdoch                        if (!canShowAlertDialog()) {
615fba3197d9e28f087ce41e0fc2446e76936764889Grace Kloba                            res.cancel();
6162377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon                            receiver.setReady();
617fba3197d9e28f087ce41e0fc2446e76936764889Grace Kloba                            break;
618fba3197d9e28f087ce41e0fc2446e76936764889Grace Kloba                        }
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        new AlertDialog.Builder(mContext)
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                .setTitle(getJsDialogTitle(url))
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                .setMessage(message)
622a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom                                .setPositiveButton(R.string.ok,
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        new DialogInterface.OnClickListener() {
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            public void onClick(
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    DialogInterface dialog,
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    int which) {
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                res.confirm();
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            }})
629a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom                                .setNegativeButton(R.string.cancel,
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        new DialogInterface.OnClickListener() {
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            public void onClick(
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    DialogInterface dialog,
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    int which) {
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                res.cancel();
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            }})
636336d7dcb105a43ee4de51fd0f26f277c63662f02Grace Kloba                                .setOnCancelListener(
637336d7dcb105a43ee4de51fd0f26f277c63662f02Grace Kloba                                        new DialogInterface.OnCancelListener() {
638336d7dcb105a43ee4de51fd0f26f277c63662f02Grace Kloba                                            public void onCancel(
639336d7dcb105a43ee4de51fd0f26f277c63662f02Grace Kloba                                                    DialogInterface dialog) {
640336d7dcb105a43ee4de51fd0f26f277c63662f02Grace Kloba                                                res.cancel();
641336d7dcb105a43ee4de51fd0f26f277c63662f02Grace Kloba                                            }
642336d7dcb105a43ee4de51fd0f26f277c63662f02Grace Kloba                                        })
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                .show();
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Tell the JsResult that it is ready for client
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // interaction.
6472377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon                    receiver.setReady();
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case JS_PROMPT:
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWebChromeClient != null) {
6532377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon                    final JsResultReceiver receiver = (JsResultReceiver) msg.obj;
6542377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon                    final JsPromptResult res = receiver.mJsResult;
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String message = msg.getData().getString("message");
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String defaultVal = msg.getData().getString("default");
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String url = msg.getData().getString("url");
6583c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon                    if (!mWebChromeClient.onJsPrompt(mWebView.getWebView(), url, message,
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                defaultVal, res)) {
6600406e48db9d445227d66277fd786059c0c1074ebBen Murdoch                        if (!canShowAlertDialog()) {
661fba3197d9e28f087ce41e0fc2446e76936764889Grace Kloba                            res.cancel();
6622377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon                            receiver.setReady();
663fba3197d9e28f087ce41e0fc2446e76936764889Grace Kloba                            break;
664fba3197d9e28f087ce41e0fc2446e76936764889Grace Kloba                        }
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        final LayoutInflater factory = LayoutInflater
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                .from(mContext);
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        final View view = factory.inflate(R.layout.js_prompt,
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                null);
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        final EditText v = (EditText) view
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                .findViewById(R.id.value);
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        v.setText(defaultVal);
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ((TextView) view.findViewById(R.id.message))
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                .setText(message);
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        new AlertDialog.Builder(mContext)
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                .setTitle(getJsDialogTitle(url))
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                .setView(view)
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                .setPositiveButton(R.string.ok,
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        new DialogInterface.OnClickListener() {
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            public void onClick(
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    DialogInterface dialog,
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    int whichButton) {
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                res.confirm(v.getText()
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        .toString());
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            }
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        })
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                .setNegativeButton(R.string.cancel,
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        new DialogInterface.OnClickListener() {
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            public void onClick(
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    DialogInterface dialog,
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    int whichButton) {
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                res.cancel();
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            }
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        })
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                .setOnCancelListener(
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        new DialogInterface.OnCancelListener() {
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            public void onCancel(
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    DialogInterface dialog) {
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                res.cancel();
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            }
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        })
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                .show();
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Tell the JsResult that it is ready for client
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // interaction.
7052377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon                    receiver.setReady();
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case JS_UNLOAD:
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWebChromeClient != null) {
7112377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon                    final JsResultReceiver receiver = (JsResultReceiver) msg.obj;
7122377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon                    final JsResult res = receiver.mJsResult;
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String message = msg.getData().getString("message");
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String url = msg.getData().getString("url");
7153c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon                    if (!mWebChromeClient.onJsBeforeUnload(mWebView.getWebView(), url,
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            message, res)) {
7170406e48db9d445227d66277fd786059c0c1074ebBen Murdoch                        if (!canShowAlertDialog()) {
718fba3197d9e28f087ce41e0fc2446e76936764889Grace Kloba                            res.cancel();
7192377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon                            receiver.setReady();
720fba3197d9e28f087ce41e0fc2446e76936764889Grace Kloba                            break;
721fba3197d9e28f087ce41e0fc2446e76936764889Grace Kloba                        }
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        final String m = mContext.getString(
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                R.string.js_dialog_before_unload, message);
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        new AlertDialog.Builder(mContext)
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                .setMessage(m)
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                .setPositiveButton(R.string.ok,
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        new DialogInterface.OnClickListener() {
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            public void onClick(
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    DialogInterface dialog,
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    int which) {
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                res.confirm();
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            }
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        })
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                .setNegativeButton(R.string.cancel,
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        new DialogInterface.OnClickListener() {
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            public void onClick(
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    DialogInterface dialog,
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    int which) {
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                res.cancel();
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            }
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        })
742df9cae4de32039d518974794641b301ee3406a1bGeorge Mount                                .setOnCancelListener(
743df9cae4de32039d518974794641b301ee3406a1bGeorge Mount                                        new DialogInterface.OnCancelListener() {
744df9cae4de32039d518974794641b301ee3406a1bGeorge Mount                                            @Override
745df9cae4de32039d518974794641b301ee3406a1bGeorge Mount                                            public void onCancel(
746df9cae4de32039d518974794641b301ee3406a1bGeorge Mount                                                    DialogInterface dialog) {
747df9cae4de32039d518974794641b301ee3406a1bGeorge Mount                                                res.cancel();
748df9cae4de32039d518974794641b301ee3406a1bGeorge Mount                                            }
749df9cae4de32039d518974794641b301ee3406a1bGeorge Mount                                        })
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                .show();
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
7522377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon                    receiver.setReady();
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
75681e41434b3421a89e3e967e866238719e8468bd5Guang Zhu            case JS_TIMEOUT:
75781e41434b3421a89e3e967e866238719e8468bd5Guang Zhu                if(mWebChromeClient != null) {
7582377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon                    final JsResultReceiver receiver = (JsResultReceiver) msg.obj;
7592377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon                    final JsResult res = receiver.mJsResult;
76081e41434b3421a89e3e967e866238719e8468bd5Guang Zhu                    if(mWebChromeClient.onJsTimeout()) {
76181e41434b3421a89e3e967e866238719e8468bd5Guang Zhu                        res.confirm();
76281e41434b3421a89e3e967e866238719e8468bd5Guang Zhu                    } else {
76381e41434b3421a89e3e967e866238719e8468bd5Guang Zhu                        res.cancel();
76481e41434b3421a89e3e967e866238719e8468bd5Guang Zhu                    }
7652377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon                    receiver.setReady();
76681e41434b3421a89e3e967e866238719e8468bd5Guang Zhu                }
76781e41434b3421a89e3e967e866238719e8468bd5Guang Zhu                break;
76881e41434b3421a89e3e967e866238719e8468bd5Guang Zhu
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case RECEIVED_CERTIFICATE:
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWebView.setCertificate((SslCertificate) msg.obj);
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case NOTIFY:
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                synchronized (this) {
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    notify();
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case SCALE_CHANGED:
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mWebViewClient != null) {
7813c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon                    mWebViewClient.onScaleChanged(mWebView.getWebView(), msg.getData()
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            .getFloat("old"), msg.getData().getFloat("new"));
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case SWITCH_OUT_HISTORY:
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWebView.switchOutDrawHistory();
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
7896262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch
7906262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch            case ADD_MESSAGE_TO_CONSOLE:
7915fe721f5f55d60bd8c244322aef484e549a6de9dPatrick Scott                if (mWebChromeClient == null) {
7925fe721f5f55d60bd8c244322aef484e549a6de9dPatrick Scott                    break;
7935fe721f5f55d60bd8c244322aef484e549a6de9dPatrick Scott                }
7946262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch                String message = msg.getData().getString("message");
7956262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch                String sourceID = msg.getData().getString("sourceID");
7966262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch                int lineNumber = msg.getData().getInt("lineNumber");
7973141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                int msgLevel = msg.getData().getInt("msgLevel");
7983141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                int numberOfMessageLevels = ConsoleMessage.MessageLevel.values().length;
7993141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                // Sanity bounds check as we'll index an array with msgLevel
8003141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                if (msgLevel < 0 || msgLevel >= numberOfMessageLevels) {
8013141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                    msgLevel = 0;
8023141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                }
8033141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch
8043141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                ConsoleMessage.MessageLevel messageLevel =
8053141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                        ConsoleMessage.MessageLevel.values()[msgLevel];
8063141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch
8073141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                if (!mWebChromeClient.onConsoleMessage(new ConsoleMessage(message, sourceID,
8083141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                        lineNumber, messageLevel))) {
8093141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                    // If false was returned the user did not provide their own console function so
8103141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                    //  we should output some default messages to the system log.
8113141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                    String logTag = "Web Console";
8123141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                    String logMessage = message + " at " + sourceID + ":" + lineNumber;
8133141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch
8143141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                    switch (messageLevel) {
8153141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                        case TIP:
8163141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                            Log.v(logTag, logMessage);
8173141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                            break;
8183141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                        case LOG:
8193141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                            Log.i(logTag, logMessage);
8203141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                            break;
8213141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                        case WARNING:
8223141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                            Log.w(logTag, logMessage);
8233141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                            break;
8243141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                        case ERROR:
8253141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                            Log.e(logTag, logMessage);
8263141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                            break;
8273141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                        case DEBUG:
8283141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                            Log.d(logTag, logMessage);
8293141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                            break;
8303141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                    }
8313141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch                }
8323141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch
8336262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch                break;
834194e345eb0fbfd170dcebb81a2bb7d93e8f93f94Leon Clarke
835194e345eb0fbfd170dcebb81a2bb7d93e8f93f94Leon Clarke            case GET_VISITED_HISTORY:
836194e345eb0fbfd170dcebb81a2bb7d93e8f93f94Leon Clarke                if (mWebChromeClient != null) {
837194e345eb0fbfd170dcebb81a2bb7d93e8f93f94Leon Clarke                    mWebChromeClient.getVisitedHistory((ValueCallback<String[]>)msg.obj);
838194e345eb0fbfd170dcebb81a2bb7d93e8f93f94Leon Clarke                }
839194e345eb0fbfd170dcebb81a2bb7d93e8f93f94Leon Clarke                break;
84070ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins
84170ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins            case OPEN_FILE_CHOOSER:
84270ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins                if (mWebChromeClient != null) {
8434ae32f5f11f2914196d6d0d195dcbc59d37b92bcBen Murdoch                    UploadFileMessageData data = (UploadFileMessageData)msg.obj;
844be716920e70541c9b334c9389d335f1aa1ed7124Ben Murdoch                    mWebChromeClient.openFileChooser(data.getUploadFile(), data.getAcceptType(),
845be716920e70541c9b334c9389d335f1aa1ed7124Ben Murdoch                            data.getCapture());
84670ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins                }
84770ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins                break;
8480b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott
8490b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott            case ADD_HISTORY_ITEM:
8500b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott                if (mWebBackForwardListClient != null) {
8510b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott                    mWebBackForwardListClient.onNewHistoryItem(
8520b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott                            (WebHistoryItem) msg.obj);
8530b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott                }
8540b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott                break;
8550b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott
8560b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott            case HISTORY_INDEX_CHANGED:
8570b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott                if (mWebBackForwardListClient != null) {
8580b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott                    mWebBackForwardListClient.onIndexChanged(
8590b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott                            (WebHistoryItem) msg.obj, msg.arg1);
8600b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott                }
8610b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott                break;
86285a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott            case AUTH_CREDENTIALS: {
8630348440e4ad665f9fa7ed73a5c6b533e183a9e1fSteve Block                String host = msg.getData().getString("host");
8640348440e4ad665f9fa7ed73a5c6b533e183a9e1fSteve Block                String realm = msg.getData().getString("realm");
8650348440e4ad665f9fa7ed73a5c6b533e183a9e1fSteve Block                username = msg.getData().getString("username");
8660348440e4ad665f9fa7ed73a5c6b533e183a9e1fSteve Block                password = msg.getData().getString("password");
8670348440e4ad665f9fa7ed73a5c6b533e183a9e1fSteve Block                mWebView.setHttpAuthUsernamePassword(
8680348440e4ad665f9fa7ed73a5c6b533e183a9e1fSteve Block                        host, realm, username, password);
869c6a90a59b342114d760d899e09d8def672b49ca8Steve Block                break;
87085a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott            }
87185a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott            case AUTO_LOGIN: {
87285a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott                if (mWebViewClient != null) {
87385a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott                    String realm = msg.getData().getString("realm");
87485a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott                    String account = msg.getData().getString("account");
87585a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott                    String args = msg.getData().getString("args");
8763c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon                    mWebViewClient.onReceivedLoginRequest(mWebView.getWebView(), realm,
87785a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott                            account, args);
87885a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott                }
87985a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott                break;
88085a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott            }
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the latest progress.
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getProgress() {
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mLatestProgress;
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by WebCore side to switch out of history Picture drawing mode
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void switchOutDrawHistory() {
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(obtainMessage(SWITCH_OUT_HISTORY));
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String getJsDialogTitle(String url) {
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String title = url;
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (URLUtil.isDataUrl(url)) {
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // For data: urls, we just display 'JavaScript' similar to Safari.
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            title = mContext.getString(R.string.js_dialog_title_default);
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                URL aUrl = new URL(url);
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // For example: "The page at 'http://www.mit.edu' says:"
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                title = mContext.getString(R.string.js_dialog_title,
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        aUrl.getProtocol() + "://" + aUrl.getHost());
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (MalformedURLException ex) {
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // do nothing. just use the url as the title
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return title;
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //--------------------------------------------------------------------------
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // WebViewClient functions.
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // NOTE: shouldOverrideKeyEvent is never called from the WebCore thread so
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // it is not necessary to include it here.
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //--------------------------------------------------------------------------
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Performance probe
923f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba    private static final boolean PERF_PROBE = false;
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mWebCoreThreadTime;
925f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba    private long mWebCoreIdleTime;
926f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba
927f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba    /*
928f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba     * If PERF_PROBE is true, this block needs to be added to MessageQueue.java.
929f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba     * startWait() and finishWait() should be called before and after wait().
930f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba
931f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba    private WaitCallback mWaitCallback = null;
932f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba    public static interface WaitCallback {
933f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba        void startWait();
934f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba        void finishWait();
935f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba    }
936f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba    public final void setWaitCallback(WaitCallback callback) {
937f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba        mWaitCallback = callback;
938f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba    }
939f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba    */
940f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba
941f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba    // un-comment this block if PERF_PROBE is true
942f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba    /*
943f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba    private IdleCallback mIdleCallback = new IdleCallback();
944f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba
945f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba    private final class IdleCallback implements MessageQueue.WaitCallback {
946f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba        private long mStartTime = 0;
947f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba
948f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba        public void finishWait() {
949f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba            mWebCoreIdleTime += SystemClock.uptimeMillis() - mStartTime;
950f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba        }
951f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba
952f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba        public void startWait() {
953f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba            mStartTime = SystemClock.uptimeMillis();
954f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba        }
955f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba    }
956f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba    */
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onPageStarted(String url, Bitmap favicon) {
959a0d767c8226babdc23c84d685d89d279b48f6c7eSteve Block        // We need to send the message even if no WebViewClient is set, because we need to call
960a0d767c8226babdc23c84d685d89d279b48f6c7eSteve Block        // WebView.onPageStarted().
961a0d767c8226babdc23c84d685d89d279b48f6c7eSteve Block
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Performance probe
963f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba        if (PERF_PROBE) {
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWebCoreThreadTime = SystemClock.currentThreadTimeMillis();
965f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba            mWebCoreIdleTime = 0;
966f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba            // un-comment this if PERF_PROBE is true
967f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba//            Looper.myQueue().setWaitCallback(mIdleCallback);
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = obtainMessage(PAGE_STARTED);
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.obj = favicon;
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.getData().putString("url", url);
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(msg);
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onPageFinished(String url) {
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Performance probe
977f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba        if (PERF_PROBE) {
978f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba            // un-comment this if PERF_PROBE is true
979f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba//            Looper.myQueue().setWaitCallback(null);
980a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom            Log.d("WebCore", "WebCore thread used " +
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (SystemClock.currentThreadTimeMillis() - mWebCoreThreadTime)
982f099481c26a412b8193847b4c1a145c9f2d59abaGrace Kloba                    + " ms and idled " + mWebCoreIdleTime + " ms");
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = obtainMessage(PAGE_FINISHED, url);
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(msg);
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9886a5b0ecae5dc89a951e1e204bc007f50f944c5d1Patrick Scott    // Because this method is public and because CallbackProxy is mistakenly
9896a5b0ecae5dc89a951e1e204bc007f50f944c5d1Patrick Scott    // party of the public classes, we cannot remove this method.
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onTooManyRedirects(Message cancelMsg, Message continueMsg) {
9916a5b0ecae5dc89a951e1e204bc007f50f944c5d1Patrick Scott        // deprecated.
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onReceivedError(int errorCode, String description,
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String failingUrl) {
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Do an unsynchronized quick check to avoid posting if no callback has
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // been set.
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWebViewClient == null) {
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = obtainMessage(REPORT_ERROR);
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.arg1 = errorCode;
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.getData().putString("description", description);
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.getData().putString("failingUrl", failingUrl);
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(msg);
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom    public void onFormResubmission(Message dontResend,
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Message resend) {
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Do an unsynchronized quick check to avoid posting if no callback has
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // been set.
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWebViewClient == null) {
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dontResend.sendToTarget();
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = obtainMessage(RESEND_POST_DATA);
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Bundle bundle = msg.getData();
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.putParcelable("resend", resend);
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.putParcelable("dontResend", dontResend);
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(msg);
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by the WebCore side
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean shouldOverrideUrlLoading(String url) {
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // We have a default behavior if no client exists so always send the
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // message.
1031dbad320bf3a4ae44717aa8dff4ec1791a3820259Grace Kloba        ResultTransport<Boolean> res = new ResultTransport<Boolean>(false);
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = obtainMessage(OVERRIDE_URL);
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.getData().putString("url", url);
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.obj = res;
1035cba778dc21ed13711ec020c12a64836bce3c2742Ben Murdoch        sendMessageToUiThreadSync(msg);
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return res.getResult().booleanValue();
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onReceivedHttpAuthRequest(HttpAuthHandler handler,
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String hostName, String realmName) {
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Do an unsynchronized quick check to avoid posting if no callback has
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // been set.
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWebViewClient == null) {
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handler.cancel();
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = obtainMessage(AUTH_REQUEST, handler);
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.getData().putString("host", hostName);
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.getData().putString("realm", realmName);
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(msg);
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1052c6a90a59b342114d760d899e09d8def672b49ca8Steve Block
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onReceivedSslError(SslErrorHandler handler, SslError error) {
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Do an unsynchronized quick check to avoid posting if no callback has
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // been set.
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWebViewClient == null) {
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handler.cancel();
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = obtainMessage(SSL_ERROR);
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        HashMap<String, Object> map = new HashMap();
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        map.put("handler", handler);
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        map.put("error", error);
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.obj = map;
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(msg);
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10679a0cd15eec572e1322c2c328b2e5acea9f2d9210Steve Block
1068fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    public void onProceededAfterSslError(SslError error) {
106973eeb7b5ed5f88750156b787c665f7d3769fc56aJonathan Dixon        if (mWebViewClient == null || !(mWebViewClient instanceof WebViewClientClassicExt)) {
1070fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block            return;
1071fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block        }
1072fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block        Message msg = obtainMessage(PROCEEDED_AFTER_SSL_ERROR);
1073fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block        msg.obj = error;
1074fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block        sendMessage(msg);
1075fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block    }
1076fe33a75cc8883dc5d50dd5a2fb0eac702f2a6992Steve Block
1077a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom    public void onReceivedClientCertRequest(ClientCertRequestHandler handler, String host_and_port) {
1078a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom        // Do an unsynchronized quick check to avoid posting if no callback has
1079a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom        // been set.
108073eeb7b5ed5f88750156b787c665f7d3769fc56aJonathan Dixon        if (mWebViewClient == null || !(mWebViewClient instanceof WebViewClientClassicExt)) {
1081a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom            handler.cancel();
1082a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom            return;
1083a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom        }
1084a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom        Message msg = obtainMessage(CLIENT_CERT_REQUEST);
1085a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom        HashMap<String, Object> map = new HashMap();
1086a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom        map.put("handler", handler);
1087a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom        map.put("host_and_port", host_and_port);
1088a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom        msg.obj = map;
1089a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom        sendMessage(msg);
1090a14775949c97a616196f5293209b092ee3d4e9a9Brian Carlstrom    }
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onReceivedCertificate(SslCertificate certificate) {
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // here, certificate can be null (if the site is not secure)
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(obtainMessage(RECEIVED_CERTIFICATE, certificate));
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void doUpdateVisitedHistory(String url, boolean isReload) {
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Do an unsynchronized quick check to avoid posting if no callback has
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // been set.
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWebViewClient == null) {
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(obtainMessage(UPDATE_VISITED, isReload ? 1 : 0, 0, url));
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1106c12544a201667383bc3dfb4bd3ad62d98cacd24fPatrick Scott    WebResourceResponse shouldInterceptRequest(String url) {
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWebViewClient == null) {
1108c12544a201667383bc3dfb4bd3ad62d98cacd24fPatrick Scott            return null;
1109c12544a201667383bc3dfb4bd3ad62d98cacd24fPatrick Scott        }
1110c12544a201667383bc3dfb4bd3ad62d98cacd24fPatrick Scott        // Note: This method does _not_ send a message.
1111c12544a201667383bc3dfb4bd3ad62d98cacd24fPatrick Scott        WebResourceResponse r =
11123c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon                mWebViewClient.shouldInterceptRequest(mWebView.getWebView(), url);
1113c12544a201667383bc3dfb4bd3ad62d98cacd24fPatrick Scott        if (r == null) {
1114c12544a201667383bc3dfb4bd3ad62d98cacd24fPatrick Scott            sendMessage(obtainMessage(LOAD_RESOURCE, url));
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1116c12544a201667383bc3dfb4bd3ad62d98cacd24fPatrick Scott        return r;
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onUnhandledKeyEvent(KeyEvent event) {
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Do an unsynchronized quick check to avoid posting if no callback has
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // been set.
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWebViewClient == null) {
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(obtainMessage(ASYNC_KEYEVENTS, event));
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onScaleChanged(float oldScale, float newScale) {
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Do an unsynchronized quick check to avoid posting if no callback has
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // been set.
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWebViewClient == null) {
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = obtainMessage(SCALE_CHANGED);
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Bundle bundle = msg.getData();
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.putFloat("old", oldScale);
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.putFloat("new", newScale);
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(msg);
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
114185a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott    void onReceivedLoginRequest(String realm, String account, String args) {
114285a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott        // Do an unsynchronized quick check to avoid posting if no callback has
114385a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott        // been set.
114485a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott        if (mWebViewClient == null) {
114585a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott            return;
114685a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott        }
114785a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott        Message msg = obtainMessage(AUTO_LOGIN);
114885a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott        Bundle bundle = msg.getData();
114985a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott        bundle.putString("realm", realm);
115085a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott        bundle.putString("account", account);
115185a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott        bundle.putString("args", args);
115285a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott        sendMessage(msg);
115385a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott    }
115485a50ff48b2331913cc87f483eafba9f231c8c8cPatrick Scott
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //--------------------------------------------------------------------------
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // DownloadListener functions.
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //--------------------------------------------------------------------------
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Starts a download if a download listener has been registered, otherwise
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * return false.
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onDownloadStart(String url, String userAgent,
1164a36dcfdfe0e93cf18ae2c98f92625a593d624bb7Selim Gurun            String contentDisposition, String mimetype, String referer,
1165a36dcfdfe0e93cf18ae2c98f92625a593d624bb7Selim Gurun            long contentLength) {
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Do an unsynchronized quick check to avoid posting if no callback has
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // been set.
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDownloadListener == null) {
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Cancel the download if there is no browser client.
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = obtainMessage(DOWNLOAD_FILE);
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Bundle bundle = msg.getData();
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.putString("url", url);
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.putString("userAgent", userAgent);
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.putString("mimetype", mimetype);
1178a36dcfdfe0e93cf18ae2c98f92625a593d624bb7Selim Gurun        bundle.putString("referer", referer);
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.putLong("contentLength", contentLength);
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.putString("contentDisposition", contentDisposition);
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(msg);
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //--------------------------------------------------------------------------
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // WebView specific functions that do not interact with a client. These
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // functions just need to operate within the UI thread.
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //--------------------------------------------------------------------------
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onSavePassword(String schemePlusHost, String username,
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String password, Message resumeMsg) {
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // resumeMsg should be null at this point because we want to create it
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // within the CallbackProxy.
11952e5c150e746647a1ce5c10e1708debbf06c45ea7Derek Sollenberger        if (DebugFlags.CALLBACK_PROXY) {
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            junit.framework.Assert.assertNull(resumeMsg);
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        resumeMsg = obtainMessage(NOTIFY);
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = obtainMessage(SAVE_PASSWORD, resumeMsg);
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Bundle bundle = msg.getData();
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.putString("host", schemePlusHost);
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.putString("username", username);
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bundle.putString("password", password);
1205cba778dc21ed13711ec020c12a64836bce3c2742Ben Murdoch        sendMessageToUiThreadSync(msg);
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Doesn't matter here
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12100348440e4ad665f9fa7ed73a5c6b533e183a9e1fSteve Block    public void onReceivedHttpAuthCredentials(String host, String realm,
12110348440e4ad665f9fa7ed73a5c6b533e183a9e1fSteve Block            String username, String password) {
12120348440e4ad665f9fa7ed73a5c6b533e183a9e1fSteve Block        Message msg = obtainMessage(AUTH_CREDENTIALS);
12130348440e4ad665f9fa7ed73a5c6b533e183a9e1fSteve Block        msg.getData().putString("host", host);
12140348440e4ad665f9fa7ed73a5c6b533e183a9e1fSteve Block        msg.getData().putString("realm", realm);
12150348440e4ad665f9fa7ed73a5c6b533e183a9e1fSteve Block        msg.getData().putString("username", username);
12160348440e4ad665f9fa7ed73a5c6b533e183a9e1fSteve Block        msg.getData().putString("password", password);
12170348440e4ad665f9fa7ed73a5c6b533e183a9e1fSteve Block        sendMessage(msg);
12180348440e4ad665f9fa7ed73a5c6b533e183a9e1fSteve Block    }
12190348440e4ad665f9fa7ed73a5c6b533e183a9e1fSteve Block
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //--------------------------------------------------------------------------
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // WebChromeClient methods
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //--------------------------------------------------------------------------
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onProgressChanged(int newProgress) {
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Synchronize so that mLatestProgress is up-to-date.
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (this) {
122720ca1177703a7d5bc64d2e5db11046bd9e051c03Grace Kloba            // update mLatestProgress even mWebChromeClient is null as
122820ca1177703a7d5bc64d2e5db11046bd9e051c03Grace Kloba            // WebView.getProgress() needs it
122920ca1177703a7d5bc64d2e5db11046bd9e051c03Grace Kloba            if (mLatestProgress == newProgress) {
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12323613385fbc5368715e7af1a6676b7bb63fafcf09Leon Scroggins            mLatestProgress = newProgress;
123320ca1177703a7d5bc64d2e5db11046bd9e051c03Grace Kloba            if (mWebChromeClient == null) {
123420ca1177703a7d5bc64d2e5db11046bd9e051c03Grace Kloba                return;
123520ca1177703a7d5bc64d2e5db11046bd9e051c03Grace Kloba            }
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!mProgressUpdatePending) {
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sendEmptyMessage(PROGRESS);
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProgressUpdatePending = true;
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
124397147286d1992ef699ce81f7b72b7b415483ef9fPatrick Scott    public BrowserFrame createWindow(boolean dialog, boolean userGesture) {
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Do an unsynchronized quick check to avoid posting if no callback has
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // been set.
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWebChromeClient == null) {
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12503c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon        WebView.WebViewTransport transport =
12513c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon            mWebView.getWebView().new WebViewTransport();
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Message msg = obtainMessage(NOTIFY);
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        msg.obj = transport;
1254cba778dc21ed13711ec020c12a64836bce3c2742Ben Murdoch        sendMessageToUiThreadSync(obtainMessage(CREATE_WINDOW, dialog ? 1 : 0,
1255cba778dc21ed13711ec020c12a64836bce3c2742Ben Murdoch                userGesture ? 1 : 0, msg));
12563c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon        WebViewClassic w = WebViewClassic.fromWebView(transport.getWebView());
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (w != null) {
125897147286d1992ef699ce81f7b72b7b415483ef9fPatrick Scott            WebViewCore core = w.getWebViewCore();
125997147286d1992ef699ce81f7b72b7b415483ef9fPatrick Scott            // If WebView.destroy() has been called, core may be null.  Skip
126097147286d1992ef699ce81f7b72b7b415483ef9fPatrick Scott            // initialization in that case and return null.
126197147286d1992ef699ce81f7b72b7b415483ef9fPatrick Scott            if (core != null) {
126297147286d1992ef699ce81f7b72b7b415483ef9fPatrick Scott                core.initializeSubwindow();
126397147286d1992ef699ce81f7b72b7b415483ef9fPatrick Scott                return core.getBrowserFrame();
126497147286d1992ef699ce81f7b72b7b415483ef9fPatrick Scott            }
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
126697147286d1992ef699ce81f7b72b7b415483ef9fPatrick Scott        return null;
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onRequestFocus() {
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Do an unsynchronized quick check to avoid posting if no callback has
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // been set.
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWebChromeClient == null) {
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendEmptyMessage(REQUEST_FOCUS);
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12793c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon    public void onCloseWindow(WebViewClassic window) {
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Do an unsynchronized quick check to avoid posting if no callback has
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // been set.
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWebChromeClient == null) {
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(obtainMessage(CLOSE_WINDOW, window));
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onReceivedIcon(Bitmap icon) {
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // The current item might be null if the icon was already stored in the
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // database and this is a new WebView.
1291fcc1f75bdf21a89f0a40c323efae4d6a817cced5Jesse Greenwald        WebHistoryItemClassic i = mBackForwardList.getCurrentItem();
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (i != null) {
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            i.setFavicon(icon);
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Do an unsynchronized quick check to avoid posting if no callback has
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // been set.
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWebChromeClient == null) {
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(obtainMessage(RECEIVED_ICON, icon));
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1303d58ccff769e40a6c52e9f6e30e4016590e05ba9aPatrick Scott    /* package */ void onReceivedTouchIconUrl(String url, boolean precomposed) {
13042ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott        // We should have a current item but we do not want to crash so check
13052ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott        // for null.
1306fcc1f75bdf21a89f0a40c323efae4d6a817cced5Jesse Greenwald        WebHistoryItemClassic i = mBackForwardList.getCurrentItem();
13072ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott        if (i != null) {
1308372dfc8bd40446e04ea22f2752cc99f0566fa077Ben Murdoch            i.setTouchIconUrl(url, precomposed);
13092ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott        }
13102ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott        // Do an unsynchronized quick check to avoid posting if no callback has
13112ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott        // been set.
13122ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott        if (mWebChromeClient == null) {
13132ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott            return;
13142ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott        }
1315d58ccff769e40a6c52e9f6e30e4016590e05ba9aPatrick Scott        sendMessage(obtainMessage(RECEIVED_TOUCH_ICON_URL,
1316d58ccff769e40a6c52e9f6e30e4016590e05ba9aPatrick Scott                precomposed ? 1 : 0, 0, url));
13172ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott    }
13182ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onReceivedTitle(String title) {
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Do an unsynchronized quick check to avoid posting if no callback has
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // been set.
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWebChromeClient == null) {
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sendMessage(obtainMessage(RECEIVED_TITLE, title));
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onJsAlert(String url, String message) {
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Do an unsynchronized quick check to avoid posting if no callback has
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // been set.
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWebChromeClient == null) {
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13342377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon        JsResultReceiver result = new JsResultReceiver();
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message alert = obtainMessage(JS_ALERT, result);
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        alert.getData().putString("message", message);
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        alert.getData().putString("url", url);
1338cba778dc21ed13711ec020c12a64836bce3c2742Ben Murdoch        sendMessageToUiThreadSync(alert);
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onJsConfirm(String url, String message) {
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Do an unsynchronized quick check to avoid posting if no callback has
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // been set.
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWebChromeClient == null) {
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13472377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon        JsResultReceiver result = new JsResultReceiver();
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message confirm = obtainMessage(JS_CONFIRM, result);
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        confirm.getData().putString("message", message);
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        confirm.getData().putString("url", url);
1351cba778dc21ed13711ec020c12a64836bce3c2742Ben Murdoch        sendMessageToUiThreadSync(confirm);
13522377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon        return result.mJsResult.getResult();
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String onJsPrompt(String url, String message, String defaultValue) {
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Do an unsynchronized quick check to avoid posting if no callback has
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // been set.
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWebChromeClient == null) {
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13612377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon        JsResultReceiver result = new JsResultReceiver();
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message prompt = obtainMessage(JS_PROMPT, result);
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        prompt.getData().putString("message", message);
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        prompt.getData().putString("default", defaultValue);
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        prompt.getData().putString("url", url);
1366cba778dc21ed13711ec020c12a64836bce3c2742Ben Murdoch        sendMessageToUiThreadSync(prompt);
13672377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon        return result.mJsResult.getStringResult();
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onJsBeforeUnload(String url, String message) {
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Do an unsynchronized quick check to avoid posting if no callback has
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // been set.
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mWebChromeClient == null) {
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13762377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon        JsResultReceiver result = new JsResultReceiver();
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message confirm = obtainMessage(JS_UNLOAD, result);
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        confirm.getData().putString("message", message);
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        confirm.getData().putString("url", url);
1380cba778dc21ed13711ec020c12a64836bce3c2742Ben Murdoch        sendMessageToUiThreadSync(confirm);
13812377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon        return result.mJsResult.getResult();
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13837df1985e86635af006be3dfa65987d60e290b5deBen Murdoch
13847df1985e86635af006be3dfa65987d60e290b5deBen Murdoch    /**
13857df1985e86635af006be3dfa65987d60e290b5deBen Murdoch     * Called by WebViewCore to inform the Java side that the current origin
13867df1985e86635af006be3dfa65987d60e290b5deBen Murdoch     * has overflowed it's database quota. Called in the WebCore thread so
13877df1985e86635af006be3dfa65987d60e290b5deBen Murdoch     * posts a message to the UI thread that will prompt the WebChromeClient
13887df1985e86635af006be3dfa65987d60e290b5deBen Murdoch     * for what to do. On return back to C++ side, the WebCore thread will
13897df1985e86635af006be3dfa65987d60e290b5deBen Murdoch     * sleep pending a new quota value.
13907df1985e86635af006be3dfa65987d60e290b5deBen Murdoch     * @param url The URL that caused the quota overflow.
13917df1985e86635af006be3dfa65987d60e290b5deBen Murdoch     * @param databaseIdentifier The identifier of the database that the
13927df1985e86635af006be3dfa65987d60e290b5deBen Murdoch     *     transaction that caused the overflow was running on.
1393285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block     * @param quota The current quota the origin is allowed.
1394285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block     * @param estimatedDatabaseSize The estimated size of the database.
1395285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block     * @param totalQuota is the sum of all origins' quota.
13967df1985e86635af006be3dfa65987d60e290b5deBen Murdoch     * @param quotaUpdater An instance of a class encapsulating a callback
13977df1985e86635af006be3dfa65987d60e290b5deBen Murdoch     *     to WebViewCore to run when the decision to allow or deny more
13987df1985e86635af006be3dfa65987d60e290b5deBen Murdoch     *     quota has been made.
13997df1985e86635af006be3dfa65987d60e290b5deBen Murdoch     */
14007df1985e86635af006be3dfa65987d60e290b5deBen Murdoch    public void onExceededDatabaseQuota(
1401285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block            String url, String databaseIdentifier, long quota,
1402285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block            long estimatedDatabaseSize, long totalQuota,
1403d497d87650dd79f7d6a4751d79598d68ceb4b789Ben Murdoch            WebStorage.QuotaUpdater quotaUpdater) {
14047df1985e86635af006be3dfa65987d60e290b5deBen Murdoch        if (mWebChromeClient == null) {
1405285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block            // Native-side logic prevents the quota being updated to a smaller
1406285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block            // value.
1407285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block            quotaUpdater.updateQuota(quota);
14087df1985e86635af006be3dfa65987d60e290b5deBen Murdoch            return;
14097df1985e86635af006be3dfa65987d60e290b5deBen Murdoch        }
14107df1985e86635af006be3dfa65987d60e290b5deBen Murdoch
14117df1985e86635af006be3dfa65987d60e290b5deBen Murdoch        Message exceededQuota = obtainMessage(EXCEEDED_DATABASE_QUOTA);
14127df1985e86635af006be3dfa65987d60e290b5deBen Murdoch        HashMap<String, Object> map = new HashMap();
14137df1985e86635af006be3dfa65987d60e290b5deBen Murdoch        map.put("databaseIdentifier", databaseIdentifier);
14147df1985e86635af006be3dfa65987d60e290b5deBen Murdoch        map.put("url", url);
1415285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block        map.put("quota", quota);
1416285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block        map.put("estimatedDatabaseSize", estimatedDatabaseSize);
1417285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block        map.put("totalQuota", totalQuota);
14187df1985e86635af006be3dfa65987d60e290b5deBen Murdoch        map.put("quotaUpdater", quotaUpdater);
14197df1985e86635af006be3dfa65987d60e290b5deBen Murdoch        exceededQuota.obj = map;
14207df1985e86635af006be3dfa65987d60e290b5deBen Murdoch        sendMessage(exceededQuota);
14217df1985e86635af006be3dfa65987d60e290b5deBen Murdoch    }
14227df1985e86635af006be3dfa65987d60e290b5deBen Murdoch
142310e4d2068aa687e30dd4e5fcae6417f66874823bGuang Zhu    /**
142459e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu     * Called by WebViewCore to inform the Java side that the appcache has
142559e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu     * exceeded its max size.
1426285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block     * @param requiredStorage is the amount of storage, in bytes, that would be
1427285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block     * needed in order for the last appcache operation to succeed.
1428285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block     * @param quota is the current quota (for all origins).
142959e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu     * @param quotaUpdater An instance of a class encapsulating a callback
143059e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu     * to WebViewCore to run when the decision to allow or deny a bigger
143159e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu     * app cache size has been made.
143259e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu     */
1433285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block    public void onReachedMaxAppCacheSize(long requiredStorage,
1434285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block            long quota, WebStorage.QuotaUpdater quotaUpdater) {
143559e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu        if (mWebChromeClient == null) {
1436285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block            // Native-side logic prevents the quota being updated to a smaller
1437285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block            // value.
1438285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block            quotaUpdater.updateQuota(quota);
143959e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu            return;
144059e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu        }
144159e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu
144259e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu        Message msg = obtainMessage(REACHED_APPCACHE_MAXSIZE);
144359e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu        HashMap<String, Object> map = new HashMap();
1444285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block        map.put("requiredStorage", requiredStorage);
1445285ddfc8abfcdd252c50477b34c13f8173f9f3f4Steve Block        map.put("quota", quota);
144659e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu        map.put("quotaUpdater", quotaUpdater);
144759e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu        msg.obj = map;
144859e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu        sendMessage(msg);
144959e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu    }
145059e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu
145159e2ad93bf37c7ded44c033d38fe7c972e2f4118Andrei Popescu    /**
14524faee09c422a70439129e9fb40dd82f03d42c98dSteve Block     * Called by WebViewCore to instruct the browser to display a prompt to ask
14534faee09c422a70439129e9fb40dd82f03d42c98dSteve Block     * the user to set the Geolocation permission state for the given origin.
14544faee09c422a70439129e9fb40dd82f03d42c98dSteve Block     * @param origin The origin requesting Geolocation permsissions.
14554faee09c422a70439129e9fb40dd82f03d42c98dSteve Block     * @param callback The callback to call once a permission state has been
14564faee09c422a70439129e9fb40dd82f03d42c98dSteve Block     *     obtained.
14574faee09c422a70439129e9fb40dd82f03d42c98dSteve Block     */
14584faee09c422a70439129e9fb40dd82f03d42c98dSteve Block    public void onGeolocationPermissionsShowPrompt(String origin,
14594faee09c422a70439129e9fb40dd82f03d42c98dSteve Block            GeolocationPermissions.Callback callback) {
14604faee09c422a70439129e9fb40dd82f03d42c98dSteve Block        if (mWebChromeClient == null) {
14614faee09c422a70439129e9fb40dd82f03d42c98dSteve Block            return;
14624faee09c422a70439129e9fb40dd82f03d42c98dSteve Block        }
14634faee09c422a70439129e9fb40dd82f03d42c98dSteve Block
14644faee09c422a70439129e9fb40dd82f03d42c98dSteve Block        Message showMessage =
14654faee09c422a70439129e9fb40dd82f03d42c98dSteve Block                obtainMessage(GEOLOCATION_PERMISSIONS_SHOW_PROMPT);
14664faee09c422a70439129e9fb40dd82f03d42c98dSteve Block        HashMap<String, Object> map = new HashMap();
14674faee09c422a70439129e9fb40dd82f03d42c98dSteve Block        map.put("origin", origin);
14684faee09c422a70439129e9fb40dd82f03d42c98dSteve Block        map.put("callback", callback);
14694faee09c422a70439129e9fb40dd82f03d42c98dSteve Block        showMessage.obj = map;
14704faee09c422a70439129e9fb40dd82f03d42c98dSteve Block        sendMessage(showMessage);
14714faee09c422a70439129e9fb40dd82f03d42c98dSteve Block    }
14724faee09c422a70439129e9fb40dd82f03d42c98dSteve Block
14734faee09c422a70439129e9fb40dd82f03d42c98dSteve Block    /**
14744faee09c422a70439129e9fb40dd82f03d42c98dSteve Block     * Called by WebViewCore to instruct the browser to hide the Geolocation
14754faee09c422a70439129e9fb40dd82f03d42c98dSteve Block     * permissions prompt.
14764faee09c422a70439129e9fb40dd82f03d42c98dSteve Block     */
14774faee09c422a70439129e9fb40dd82f03d42c98dSteve Block    public void onGeolocationPermissionsHidePrompt() {
14784faee09c422a70439129e9fb40dd82f03d42c98dSteve Block        if (mWebChromeClient == null) {
14794faee09c422a70439129e9fb40dd82f03d42c98dSteve Block            return;
14804faee09c422a70439129e9fb40dd82f03d42c98dSteve Block        }
14814faee09c422a70439129e9fb40dd82f03d42c98dSteve Block
14824faee09c422a70439129e9fb40dd82f03d42c98dSteve Block        Message hideMessage = obtainMessage(GEOLOCATION_PERMISSIONS_HIDE_PROMPT);
14834faee09c422a70439129e9fb40dd82f03d42c98dSteve Block        sendMessage(hideMessage);
14844faee09c422a70439129e9fb40dd82f03d42c98dSteve Block    }
14854faee09c422a70439129e9fb40dd82f03d42c98dSteve Block
14864faee09c422a70439129e9fb40dd82f03d42c98dSteve Block    /**
14876262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch     * Called by WebViewCore when we have a message to be added to the JavaScript
14886262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch     * error console. Sends a message to the Java side with the details.
14896262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch     * @param message The message to add to the console.
14906262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch     * @param lineNumber The lineNumber of the source file on which the error
14916262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch     *     occurred.
14926262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch     * @param sourceID The filename of the source file in which the error
14936262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch     *     occurred.
14943141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch     * @param msgLevel The message level, corresponding to the MessageLevel enum in
14953141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch     *     WebCore/page/Console.h
14966262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch     */
14973141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch    public void addMessageToConsole(String message, int lineNumber, String sourceID, int msgLevel) {
14986262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch        if (mWebChromeClient == null) {
14996262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch            return;
15006262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch        }
15016262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch
15026262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch        Message msg = obtainMessage(ADD_MESSAGE_TO_CONSOLE);
15036262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch        msg.getData().putString("message", message);
15046262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch        msg.getData().putString("sourceID", sourceID);
15056262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch        msg.getData().putInt("lineNumber", lineNumber);
15063141e0a62abe57e93e5d716895a2a57cc052bb50Ben Murdoch        msg.getData().putInt("msgLevel", msgLevel);
15076262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch        sendMessage(msg);
15086262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch    }
15096262ae5c9df44c0673cebaeaf7f655094f5b5485Ben Murdoch
151081e41434b3421a89e3e967e866238719e8468bd5Guang Zhu    public boolean onJsTimeout() {
151181e41434b3421a89e3e967e866238719e8468bd5Guang Zhu        //always interrupt timedout JS by default
151281e41434b3421a89e3e967e866238719e8468bd5Guang Zhu        if (mWebChromeClient == null) {
151381e41434b3421a89e3e967e866238719e8468bd5Guang Zhu            return true;
151481e41434b3421a89e3e967e866238719e8468bd5Guang Zhu        }
15152377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon        JsResultReceiver result = new JsResultReceiver();
151681e41434b3421a89e3e967e866238719e8468bd5Guang Zhu        Message timeout = obtainMessage(JS_TIMEOUT, result);
1517cba778dc21ed13711ec020c12a64836bce3c2742Ben Murdoch        sendMessageToUiThreadSync(timeout);
15182377b99f6c6f8dba94c28089330e29933b04d601Jonathan Dixon        return result.mJsResult.getResult();
151981e41434b3421a89e3e967e866238719e8468bd5Guang Zhu    }
1520194e345eb0fbfd170dcebb81a2bb7d93e8f93f94Leon Clarke
1521194e345eb0fbfd170dcebb81a2bb7d93e8f93f94Leon Clarke    public void getVisitedHistory(ValueCallback<String[]> callback) {
1522194e345eb0fbfd170dcebb81a2bb7d93e8f93f94Leon Clarke        if (mWebChromeClient == null) {
1523194e345eb0fbfd170dcebb81a2bb7d93e8f93f94Leon Clarke            return;
1524194e345eb0fbfd170dcebb81a2bb7d93e8f93f94Leon Clarke        }
1525194e345eb0fbfd170dcebb81a2bb7d93e8f93f94Leon Clarke        Message msg = obtainMessage(GET_VISITED_HISTORY);
1526194e345eb0fbfd170dcebb81a2bb7d93e8f93f94Leon Clarke        msg.obj = callback;
1527194e345eb0fbfd170dcebb81a2bb7d93e8f93f94Leon Clarke        sendMessage(msg);
1528194e345eb0fbfd170dcebb81a2bb7d93e8f93f94Leon Clarke    }
152970ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins
15304ae32f5f11f2914196d6d0d195dcbc59d37b92bcBen Murdoch    private static class UploadFileMessageData {
15314ae32f5f11f2914196d6d0d195dcbc59d37b92bcBen Murdoch        private UploadFile mCallback;
15324ae32f5f11f2914196d6d0d195dcbc59d37b92bcBen Murdoch        private String mAcceptType;
1533be716920e70541c9b334c9389d335f1aa1ed7124Ben Murdoch        private String mCapture;
15344ae32f5f11f2914196d6d0d195dcbc59d37b92bcBen Murdoch
1535be716920e70541c9b334c9389d335f1aa1ed7124Ben Murdoch        public UploadFileMessageData(UploadFile uploadFile, String acceptType, String capture) {
15364ae32f5f11f2914196d6d0d195dcbc59d37b92bcBen Murdoch            mCallback = uploadFile;
15374ae32f5f11f2914196d6d0d195dcbc59d37b92bcBen Murdoch            mAcceptType = acceptType;
1538be716920e70541c9b334c9389d335f1aa1ed7124Ben Murdoch            mCapture = capture;
15394ae32f5f11f2914196d6d0d195dcbc59d37b92bcBen Murdoch        }
15404ae32f5f11f2914196d6d0d195dcbc59d37b92bcBen Murdoch
15414ae32f5f11f2914196d6d0d195dcbc59d37b92bcBen Murdoch        public UploadFile getUploadFile() {
15424ae32f5f11f2914196d6d0d195dcbc59d37b92bcBen Murdoch            return mCallback;
15434ae32f5f11f2914196d6d0d195dcbc59d37b92bcBen Murdoch        }
15444ae32f5f11f2914196d6d0d195dcbc59d37b92bcBen Murdoch
15454ae32f5f11f2914196d6d0d195dcbc59d37b92bcBen Murdoch        public String getAcceptType() {
15464ae32f5f11f2914196d6d0d195dcbc59d37b92bcBen Murdoch            return mAcceptType;
15474ae32f5f11f2914196d6d0d195dcbc59d37b92bcBen Murdoch        }
1548be716920e70541c9b334c9389d335f1aa1ed7124Ben Murdoch
1549be716920e70541c9b334c9389d335f1aa1ed7124Ben Murdoch        public String getCapture() {
1550be716920e70541c9b334c9389d335f1aa1ed7124Ben Murdoch            return mCapture;
1551be716920e70541c9b334c9389d335f1aa1ed7124Ben Murdoch        }
15524ae32f5f11f2914196d6d0d195dcbc59d37b92bcBen Murdoch    }
15534ae32f5f11f2914196d6d0d195dcbc59d37b92bcBen Murdoch
155470ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins    private class UploadFile implements ValueCallback<Uri> {
155570ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins        private Uri mValue;
155670ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins        public void onReceiveValue(Uri value) {
155770ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins            mValue = value;
155870ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins            synchronized (CallbackProxy.this) {
155970ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins                CallbackProxy.this.notify();
156070ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins            }
156170ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins        }
156270ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins        public Uri getResult() {
156370ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins            return mValue;
156470ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins        }
156570ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins    }
156670ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins
156770ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins    /**
156870ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins     * Called by WebViewCore to open a file chooser.
156970ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins     */
1570be716920e70541c9b334c9389d335f1aa1ed7124Ben Murdoch    /* package */ Uri openFileChooser(String acceptType, String capture) {
157170ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins        if (mWebChromeClient == null) {
157270ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins            return null;
157370ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins        }
157470ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins        Message myMessage = obtainMessage(OPEN_FILE_CHOOSER);
157570ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins        UploadFile uploadFile = new UploadFile();
1576be716920e70541c9b334c9389d335f1aa1ed7124Ben Murdoch        UploadFileMessageData data = new UploadFileMessageData(uploadFile, acceptType, capture);
15774ae32f5f11f2914196d6d0d195dcbc59d37b92bcBen Murdoch        myMessage.obj = data;
1578cba778dc21ed13711ec020c12a64836bce3c2742Ben Murdoch        sendMessageToUiThreadSync(myMessage);
157970ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins        return uploadFile.getResult();
158070ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins    }
15810b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott
15820b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott    void onNewHistoryItem(WebHistoryItem item) {
15830b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott        if (mWebBackForwardListClient == null) {
15840b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott            return;
15850b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott        }
15860b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott        Message msg = obtainMessage(ADD_HISTORY_ITEM, item);
15870b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott        sendMessage(msg);
15880b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott    }
15890b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott
15900b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott    void onIndexChanged(WebHistoryItem item, int index) {
15910b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott        if (mWebBackForwardListClient == null) {
15920b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott            return;
15930b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott        }
15940b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott        Message msg = obtainMessage(HISTORY_INDEX_CHANGED, index, 0, item);
15950b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott        sendMessage(msg);
15960b2e84b32af48f4b2b17c72adcf12ad29ec7bb7aPatrick Scott    }
15976312de2a9a2cf7304d91b7f78c3dff2db59b918cBen Murdoch
15980406e48db9d445227d66277fd786059c0c1074ebBen Murdoch    boolean canShowAlertDialog() {
15990406e48db9d445227d66277fd786059c0c1074ebBen Murdoch        // We can only display the alert dialog if mContext is
16000406e48db9d445227d66277fd786059c0c1074ebBen Murdoch        // an Activity context.
16010406e48db9d445227d66277fd786059c0c1074ebBen Murdoch        // FIXME: Should we display dialogs if mContext does
16020406e48db9d445227d66277fd786059c0c1074ebBen Murdoch        // not have the window focus (e.g. if the user is viewing
16030406e48db9d445227d66277fd786059c0c1074ebBen Murdoch        // another Activity when the alert should be displayed?
16040406e48db9d445227d66277fd786059c0c1074ebBen Murdoch        // See bug 3166409
16050406e48db9d445227d66277fd786059c0c1074ebBen Murdoch        return mContext instanceof Activity;
16060406e48db9d445227d66277fd786059c0c1074ebBen Murdoch    }
16079497c5f8c4bc7c47789e5ccde01179abc31ffeb2Narayan Kamath
1608cba778dc21ed13711ec020c12a64836bce3c2742Ben Murdoch    private synchronized void sendMessageToUiThreadSync(Message msg) {
1609cba778dc21ed13711ec020c12a64836bce3c2742Ben Murdoch        sendMessage(msg);
1610cba778dc21ed13711ec020c12a64836bce3c2742Ben Murdoch        WebCoreThreadWatchdog.pause();
1611cba778dc21ed13711ec020c12a64836bce3c2742Ben Murdoch        try {
1612cba778dc21ed13711ec020c12a64836bce3c2742Ben Murdoch            wait();
1613cba778dc21ed13711ec020c12a64836bce3c2742Ben Murdoch        } catch (InterruptedException e) {
1614cba778dc21ed13711ec020c12a64836bce3c2742Ben Murdoch            Log.e(LOGTAG, "Caught exception waiting for synchronous UI message to be processed");
1615cba778dc21ed13711ec020c12a64836bce3c2742Ben Murdoch            Log.e(LOGTAG, Log.getStackTraceString(e));
1616cba778dc21ed13711ec020c12a64836bce3c2742Ben Murdoch        }
1617cba778dc21ed13711ec020c12a64836bce3c2742Ben Murdoch        WebCoreThreadWatchdog.resume();
1618cba778dc21ed13711ec020c12a64836bce3c2742Ben Murdoch    }
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1620