diff options
| author | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 18:28:45 -0800 |
|---|---|---|
| committer | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 18:28:45 -0800 |
| commit | d83a98f4ce9cfa908f5c54bbd70f03eec07e7553 (patch) | |
| tree | 4b825dc642cb6eb9a060e54bf8d69288fbee4904 /core/java/android/webkit/CallbackProxy.java | |
| parent | 076357b8567458d4b6dfdcf839ef751634cd2bfb (diff) | |
auto import from //depot/cupcake/@135843
Diffstat (limited to 'core/java/android/webkit/CallbackProxy.java')
| -rw-r--r-- | core/java/android/webkit/CallbackProxy.java | 1018 |
1 files changed, 0 insertions, 1018 deletions
diff --git a/core/java/android/webkit/CallbackProxy.java b/core/java/android/webkit/CallbackProxy.java deleted file mode 100644 index 4f8e5e4fbcbe..000000000000 --- a/core/java/android/webkit/CallbackProxy.java +++ /dev/null @@ -1,1018 +0,0 @@ -/* - * Copyright (C) 2007 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.webkit; - -import android.app.AlertDialog; -import android.content.ActivityNotFoundException; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.graphics.Bitmap; -import android.net.Uri; -import android.net.http.SslCertificate; -import android.net.http.SslError; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.os.SystemClock; -import android.util.Config; -import android.util.Log; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.EditText; -import android.widget.TextView; -import com.android.internal.R; - -import java.net.MalformedURLException; -import java.net.URL; -import java.util.HashMap; - -/** - * This class is a proxy class for handling WebCore -> UI thread messaging. All - * the callback functions are called from the WebCore thread and messages are - * posted to the UI thread for the actual client callback. - */ -/* - * This class is created in the UI thread so its handler and any private classes - * that extend Handler will operate in the UI thread. - */ -class CallbackProxy extends Handler { - // Logging tag - private static final String LOGTAG = "CallbackProxy"; - // Instance of WebViewClient that is the client callback. - private volatile WebViewClient mWebViewClient; - // Instance of WebChromeClient for handling all chrome functions. - private volatile WebChromeClient mWebChromeClient; - // Instance of WebView for handling UI requests. - private final WebView mWebView; - // Client registered callback listener for download events - private volatile DownloadListener mDownloadListener; - // Keep track of multiple progress updates. - private boolean mProgressUpdatePending; - // Keep track of the last progress amount. - private volatile int mLatestProgress; - // Back/Forward list - private final WebBackForwardList mBackForwardList; - // Used to call startActivity during url override. - private final Context mContext; - - // Message Ids - private static final int PAGE_STARTED = 100; - private static final int RECEIVED_ICON = 101; - private static final int RECEIVED_TITLE = 102; - private static final int OVERRIDE_URL = 103; - private static final int AUTH_REQUEST = 104; - private static final int SSL_ERROR = 105; - private static final int PROGRESS = 106; - private static final int UPDATE_VISITED = 107; - private static final int LOAD_RESOURCE = 108; - private static final int CREATE_WINDOW = 109; - private static final int CLOSE_WINDOW = 110; - private static final int SAVE_PASSWORD = 111; - private static final int JS_ALERT = 112; - private static final int JS_CONFIRM = 113; - private static final int JS_PROMPT = 114; - private static final int JS_UNLOAD = 115; - private static final int ASYNC_KEYEVENTS = 116; - private static final int TOO_MANY_REDIRECTS = 117; - private static final int DOWNLOAD_FILE = 118; - private static final int REPORT_ERROR = 119; - private static final int RESEND_POST_DATA = 120; - private static final int PAGE_FINISHED = 121; - private static final int REQUEST_FOCUS = 122; - private static final int SCALE_CHANGED = 123; - private static final int RECEIVED_CERTIFICATE = 124; - private static final int SWITCH_OUT_HISTORY = 125; - - // Message triggered by the client to resume execution - private static final int NOTIFY = 200; - - // Result transportation object for returning results across thread - // boundaries. - private class ResultTransport<E> { - // Private result object - private E mResult; - - public synchronized void setResult(E result) { - mResult = result; - } - - public synchronized E getResult() { - return mResult; - } - } - - /** - * Construct a new CallbackProxy. - */ - public CallbackProxy(Context context, WebView w) { - // Used to start a default activity. - mContext = context; - mWebView = w; - mBackForwardList = new WebBackForwardList(); - } - - /** - * Set the WebViewClient. - * @param client An implementation of WebViewClient. - */ - public void setWebViewClient(WebViewClient client) { - mWebViewClient = client; - } - - /** - * Set the WebChromeClient. - * @param client An implementation of WebChromeClient. - */ - public void setWebChromeClient(WebChromeClient client) { - mWebChromeClient = client; - } - - /** - * Set the client DownloadListener. - * @param client An implementation of DownloadListener. - */ - public void setDownloadListener(DownloadListener client) { - mDownloadListener = client; - } - - /** - * Get the Back/Forward list to return to the user or to update the cached - * history list. - */ - public WebBackForwardList getBackForwardList() { - return mBackForwardList; - } - - /** - * Called by the UI side. Calling overrideUrlLoading from the WebCore - * side will post a message to call this method. - */ - public boolean uiOverrideUrlLoading(String overrideUrl) { - if (overrideUrl == null || overrideUrl.length() == 0) { - return false; - } - boolean override = false; - if (mWebViewClient != null) { - override = mWebViewClient.shouldOverrideUrlLoading(mWebView, - overrideUrl); - } else { - Intent intent = new Intent(Intent.ACTION_VIEW, - Uri.parse(overrideUrl)); - intent.addCategory(Intent.CATEGORY_BROWSABLE); - try { - mContext.startActivity(intent); - override = true; - } catch (ActivityNotFoundException ex) { - // If no application can handle the URL, assume that the - // browser can handle it. - } - } - return override; - } - - /** - * Called by UI side. - */ - public boolean uiOverrideKeyEvent(KeyEvent event) { - if (mWebViewClient != null) { - return mWebViewClient.shouldOverrideKeyEvent(mWebView, event); - } - return false; - } - - @Override - public void handleMessage(Message msg) { - // We don't have to do synchronization because this function operates - // in the UI thread. The WebViewClient and WebChromeClient functions - // that check for a non-null callback are ok because java ensures atomic - // 32-bit reads and writes. - switch (msg.what) { - case PAGE_STARTED: - if (mWebViewClient != null) { - mWebViewClient.onPageStarted(mWebView, - msg.getData().getString("url"), - (Bitmap) msg.obj); - } - break; - - case PAGE_FINISHED: - if (mWebViewClient != null) { - mWebViewClient.onPageFinished(mWebView, (String) msg.obj); - } - break; - - case RECEIVED_ICON: - if (mWebChromeClient != null) { - mWebChromeClient.onReceivedIcon(mWebView, (Bitmap) msg.obj); - } - break; - - case RECEIVED_TITLE: - if (mWebChromeClient != null) { - mWebChromeClient.onReceivedTitle(mWebView, - (String) msg.obj); - } - break; - - case TOO_MANY_REDIRECTS: - Message cancelMsg = - (Message) msg.getData().getParcelable("cancelMsg"); - Message continueMsg = - (Message) msg.getData().getParcelable("continueMsg"); - if (mWebViewClient != null) { - mWebViewClient.onTooManyRedirects(mWebView, cancelMsg, - continueMsg); - } else { - cancelMsg.sendToTarget(); - } - break; - - case REPORT_ERROR: - if (mWebViewClient != null) { - int reasonCode = msg.arg1; - final String description = msg.getData().getString("description"); - final String failUrl = msg.getData().getString("failingUrl"); - mWebViewClient.onReceivedError(mWebView, reasonCode, - description, failUrl); - } - break; - - case RESEND_POST_DATA: - Message resend = - (Message) msg.getData().getParcelable("resend"); - Message dontResend = - (Message) msg.getData().getParcelable("dontResend"); - if (mWebViewClient != null) { - mWebViewClient.onFormResubmission(mWebView, dontResend, - resend); - } else { - dontResend.sendToTarget(); - } - break; - - case OVERRIDE_URL: - String overrideUrl = msg.getData().getString("url"); - boolean override = uiOverrideUrlLoading(overrideUrl); - ResultTransport<Boolean> result = - (ResultTransport<Boolean>) msg.obj; - synchronized (this) { - result.setResult(override); - notify(); - } - break; - - case AUTH_REQUEST: - if (mWebViewClient != null) { - HttpAuthHandler handler = (HttpAuthHandler) msg.obj; - String host = msg.getData().getString("host"); - String realm = msg.getData().getString("realm"); - mWebViewClient.onReceivedHttpAuthRequest(mWebView, handler, - host, realm); - } - break; - - case SSL_ERROR: - if (mWebViewClient != null) { - HashMap<String, Object> map = - (HashMap<String, Object>) msg.obj; - mWebViewClient.onReceivedSslError(mWebView, - (SslErrorHandler) map.get("handler"), - (SslError) map.get("error")); - } - break; - - case PROGRESS: - // Synchronize to ensure mLatestProgress is not modified after - // setProgress is called and before mProgressUpdatePending is - // changed. - synchronized (this) { - if (mWebChromeClient != null) { - mWebChromeClient.onProgressChanged(mWebView, - mLatestProgress); - } - mProgressUpdatePending = false; - } - break; - - case UPDATE_VISITED: - if (mWebViewClient != null) { - mWebViewClient.doUpdateVisitedHistory(mWebView, - (String) msg.obj, msg.arg1 != 0); - } - break; - - case LOAD_RESOURCE: - if (mWebViewClient != null) { - mWebViewClient.onLoadResource(mWebView, (String) msg.obj); - } - break; - - case DOWNLOAD_FILE: - if (mDownloadListener != null) { - String url = msg.getData().getString("url"); - String userAgent = msg.getData().getString("userAgent"); - String contentDisposition = - msg.getData().getString("contentDisposition"); - String mimetype = msg.getData().getString("mimetype"); - Long contentLength = msg.getData().getLong("contentLength"); - - mDownloadListener.onDownloadStart(url, userAgent, - contentDisposition, mimetype, contentLength); - } - break; - - case CREATE_WINDOW: - if (mWebChromeClient != null) { - if (!mWebChromeClient.onCreateWindow(mWebView, - msg.arg1 == 1, msg.arg2 == 1, - (Message) msg.obj)) { - synchronized (this) { - notify(); - } - } - } - break; - - case REQUEST_FOCUS: - if (mWebChromeClient != null) { - mWebChromeClient.onRequestFocus(mWebView); - } - break; - - case CLOSE_WINDOW: - if (mWebChromeClient != null) { - mWebChromeClient.onCloseWindow((WebView) msg.obj); - } - break; - - case SAVE_PASSWORD: - Bundle bundle = msg.getData(); - String schemePlusHost = bundle.getString("host"); - String username = bundle.getString("username"); - String password = bundle.getString("password"); - // If the client returned false it means that the notify message - // will not be sent and we should notify WebCore ourselves. - if (!mWebView.onSavePassword(schemePlusHost, username, password, - (Message) msg.obj)) { - synchronized (this) { - notify(); - } - } - break; - - case ASYNC_KEYEVENTS: - if (mWebViewClient != null) { - mWebViewClient.onUnhandledKeyEvent(mWebView, - (KeyEvent) msg.obj); - } - break; - - case JS_ALERT: - if (mWebChromeClient != null) { - final JsResult res = (JsResult) msg.obj; - String message = msg.getData().getString("message"); - String url = msg.getData().getString("url"); - if (!mWebChromeClient.onJsAlert(mWebView, url, message, - res)) { - new AlertDialog.Builder(mContext) - .setTitle(getJsDialogTitle(url)) - .setMessage(message) - .setPositiveButton(R.string.ok, - new AlertDialog.OnClickListener() { - public void onClick( - DialogInterface dialog, - int which) { - res.confirm(); - } - }) - .setCancelable(false) - .show(); - } - res.setReady(); - } - break; - - case JS_CONFIRM: - if (mWebChromeClient != null) { - final JsResult res = (JsResult) msg.obj; - String message = msg.getData().getString("message"); - String url = msg.getData().getString("url"); - if (!mWebChromeClient.onJsConfirm(mWebView, url, message, - res)) { - new AlertDialog.Builder(mContext) - .setTitle(getJsDialogTitle(url)) - .setMessage(message) - .setPositiveButton(R.string.ok, - new DialogInterface.OnClickListener() { - public void onClick( - DialogInterface dialog, - int which) { - res.confirm(); - }}) - .setNegativeButton(R.string.cancel, - new DialogInterface.OnClickListener() { - public void onClick( - DialogInterface dialog, - int which) { - res.cancel(); - }}) - .show(); - } - // Tell the JsResult that it is ready for client - // interaction. - res.setReady(); - } - break; - - case JS_PROMPT: - if (mWebChromeClient != null) { - final JsPromptResult res = (JsPromptResult) msg.obj; - String message = msg.getData().getString("message"); - String defaultVal = msg.getData().getString("default"); - String url = msg.getData().getString("url"); - if (!mWebChromeClient.onJsPrompt(mWebView, url, message, - defaultVal, res)) { - final LayoutInflater factory = LayoutInflater - .from(mContext); - final View view = factory.inflate(R.layout.js_prompt, - null); - final EditText v = (EditText) view - .findViewById(R.id.value); - v.setText(defaultVal); - ((TextView) view.findViewById(R.id.message)) - .setText(message); - new AlertDialog.Builder(mContext) - .setTitle(getJsDialogTitle(url)) - .setView(view) - .setPositiveButton(R.string.ok, - new DialogInterface.OnClickListener() { - public void onClick( - DialogInterface dialog, - int whichButton) { - res.confirm(v.getText() - .toString()); - } - }) - .setNegativeButton(R.string.cancel, - new DialogInterface.OnClickListener() { - public void onClick( - DialogInterface dialog, - int whichButton) { - res.cancel(); - } - }) - .setOnCancelListener( - new DialogInterface.OnCancelListener() { - public void onCancel( - DialogInterface dialog) { - res.cancel(); - } - }) - .show(); - } - // Tell the JsResult that it is ready for client - // interaction. - res.setReady(); - } - break; - - case JS_UNLOAD: - if (mWebChromeClient != null) { - final JsResult res = (JsResult) msg.obj; - String message = msg.getData().getString("message"); - String url = msg.getData().getString("url"); - if (!mWebChromeClient.onJsBeforeUnload(mWebView, url, - message, res)) { - final String m = mContext.getString( - R.string.js_dialog_before_unload, message); - new AlertDialog.Builder(mContext) - .setMessage(m) - .setPositiveButton(R.string.ok, - new DialogInterface.OnClickListener() { - public void onClick( - DialogInterface dialog, - int which) { - res.confirm(); - } - }) - .setNegativeButton(R.string.cancel, - new DialogInterface.OnClickListener() { - public void onClick( - DialogInterface dialog, - int which) { - res.cancel(); - } - }) - .show(); - } - res.setReady(); - } - break; - - case RECEIVED_CERTIFICATE: - mWebView.setCertificate((SslCertificate) msg.obj); - break; - - case NOTIFY: - synchronized (this) { - notify(); - } - break; - - case SCALE_CHANGED: - if (mWebViewClient != null) { - mWebViewClient.onScaleChanged(mWebView, msg.getData() - .getFloat("old"), msg.getData().getFloat("new")); - } - break; - - case SWITCH_OUT_HISTORY: - mWebView.switchOutDrawHistory(); - break; - } - } - - /** - * Return the latest progress. - */ - public int getProgress() { - return mLatestProgress; - } - - /** - * Called by WebCore side to switch out of history Picture drawing mode - */ - void switchOutDrawHistory() { - sendMessage(obtainMessage(SWITCH_OUT_HISTORY)); - } - - private String getJsDialogTitle(String url) { - String title = url; - if (URLUtil.isDataUrl(url)) { - // For data: urls, we just display 'JavaScript' similar to Safari. - title = mContext.getString(R.string.js_dialog_title_default); - } else { - try { - URL aUrl = new URL(url); - // For example: "The page at 'http://www.mit.edu' says:" - title = mContext.getString(R.string.js_dialog_title, - aUrl.getProtocol() + "://" + aUrl.getHost()); - } catch (MalformedURLException ex) { - // do nothing. just use the url as the title - } - } - return title; - } - - //-------------------------------------------------------------------------- - // WebViewClient functions. - // NOTE: shouldOverrideKeyEvent is never called from the WebCore thread so - // it is not necessary to include it here. - //-------------------------------------------------------------------------- - - // Performance probe - private long mWebCoreThreadTime; - - public void onPageStarted(String url, Bitmap favicon) { - // Do an unsynchronized quick check to avoid posting if no callback has - // been set. - if (mWebViewClient == null) { - return; - } - // Performance probe - if (false) { - mWebCoreThreadTime = SystemClock.currentThreadTimeMillis(); - Network.getInstance(mContext).startTiming(); - } - Message msg = obtainMessage(PAGE_STARTED); - msg.obj = favicon; - msg.getData().putString("url", url); - sendMessage(msg); - } - - public void onPageFinished(String url) { - // Do an unsynchronized quick check to avoid posting if no callback has - // been set. - if (mWebViewClient == null) { - return; - } - // Performance probe - if (false) { - Log.d("WebCore", "WebCore thread used " + - (SystemClock.currentThreadTimeMillis() - mWebCoreThreadTime) - + " ms"); - Network.getInstance(mContext).stopTiming(); - } - Message msg = obtainMessage(PAGE_FINISHED, url); - sendMessage(msg); - } - - public void onTooManyRedirects(Message cancelMsg, Message continueMsg) { - // Do an unsynchronized quick check to avoid posting if no callback has - // been set. - if (mWebViewClient == null) { - cancelMsg.sendToTarget(); - return; - } - - Message msg = obtainMessage(TOO_MANY_REDIRECTS); - Bundle bundle = msg.getData(); - bundle.putParcelable("cancelMsg", cancelMsg); - bundle.putParcelable("continueMsg", continueMsg); - sendMessage(msg); - } - - public void onReceivedError(int errorCode, String description, - String failingUrl) { - // Do an unsynchronized quick check to avoid posting if no callback has - // been set. - if (mWebViewClient == null) { - return; - } - - Message msg = obtainMessage(REPORT_ERROR); - msg.arg1 = errorCode; - msg.getData().putString("description", description); - msg.getData().putString("failingUrl", failingUrl); - sendMessage(msg); - } - - public void onFormResubmission(Message dontResend, - Message resend) { - // Do an unsynchronized quick check to avoid posting if no callback has - // been set. - if (mWebViewClient == null) { - dontResend.sendToTarget(); - return; - } - - Message msg = obtainMessage(RESEND_POST_DATA); - Bundle bundle = msg.getData(); - bundle.putParcelable("resend", resend); - bundle.putParcelable("dontResend", dontResend); - sendMessage(msg); - } - - /** - * Called by the WebCore side - */ - public boolean shouldOverrideUrlLoading(String url) { - // We have a default behavior if no client exists so always send the - // message. - ResultTransport<Boolean> res = new ResultTransport<Boolean>(); - Message msg = obtainMessage(OVERRIDE_URL); - msg.getData().putString("url", url); - msg.obj = res; - synchronized (this) { - sendMessage(msg); - try { - wait(); - } catch (InterruptedException e) { - Log.e(LOGTAG, "Caught exception while waiting for overrideUrl"); - Log.e(LOGTAG, Log.getStackTraceString(e)); - } - } - return res.getResult().booleanValue(); - } - - public void onReceivedHttpAuthRequest(HttpAuthHandler handler, - String hostName, String realmName) { - // Do an unsynchronized quick check to avoid posting if no callback has - // been set. - if (mWebViewClient == null) { - handler.cancel(); - return; - } - Message msg = obtainMessage(AUTH_REQUEST, handler); - msg.getData().putString("host", hostName); - msg.getData().putString("realm", realmName); - sendMessage(msg); - } - /** - * @hide - hide this because it contains a parameter of type SslError. - * SslError is located in a hidden package. - */ - public void onReceivedSslError(SslErrorHandler handler, SslError error) { - // Do an unsynchronized quick check to avoid posting if no callback has - // been set. - if (mWebViewClient == null) { - handler.cancel(); - return; - } - Message msg = obtainMessage(SSL_ERROR); - //, handler); - HashMap<String, Object> map = new HashMap(); - map.put("handler", handler); - map.put("error", error); - msg.obj = map; - sendMessage(msg); - } - /** - * @hide - hide this because it contains a parameter of type SslCertificate, - * which is located in a hidden package. - */ - - public void onReceivedCertificate(SslCertificate certificate) { - // Do an unsynchronized quick check to avoid posting if no callback has - // been set. - if (mWebViewClient == null) { - return; - } - // here, certificate can be null (if the site is not secure) - sendMessage(obtainMessage(RECEIVED_CERTIFICATE, certificate)); - } - - public void doUpdateVisitedHistory(String url, boolean isReload) { - // Do an unsynchronized quick check to avoid posting if no callback has - // been set. - if (mWebViewClient == null) { - return; - } - sendMessage(obtainMessage(UPDATE_VISITED, isReload ? 1 : 0, 0, url)); - } - - public void onLoadResource(String url) { - // Do an unsynchronized quick check to avoid posting if no callback has - // been set. - if (mWebViewClient == null) { - return; - } - sendMessage(obtainMessage(LOAD_RESOURCE, url)); - } - - public void onUnhandledKeyEvent(KeyEvent event) { - // Do an unsynchronized quick check to avoid posting if no callback has - // been set. - if (mWebViewClient == null) { - return; - } - sendMessage(obtainMessage(ASYNC_KEYEVENTS, event)); - } - - public void onScaleChanged(float oldScale, float newScale) { - // Do an unsynchronized quick check to avoid posting if no callback has - // been set. - if (mWebViewClient == null) { - return; - } - Message msg = obtainMessage(SCALE_CHANGED); - Bundle bundle = msg.getData(); - bundle.putFloat("old", oldScale); - bundle.putFloat("new", newScale); - sendMessage(msg); - } - - //-------------------------------------------------------------------------- - // DownloadListener functions. - //-------------------------------------------------------------------------- - - /** - * Starts a download if a download listener has been registered, otherwise - * return false. - */ - public boolean onDownloadStart(String url, String userAgent, - String contentDisposition, String mimetype, long contentLength) { - // Do an unsynchronized quick check to avoid posting if no callback has - // been set. - if (mDownloadListener == null) { - // Cancel the download if there is no browser client. - return false; - } - - Message msg = obtainMessage(DOWNLOAD_FILE); - Bundle bundle = msg.getData(); - bundle.putString("url", url); - bundle.putString("userAgent", userAgent); - bundle.putString("mimetype", mimetype); - bundle.putLong("contentLength", contentLength); - bundle.putString("contentDisposition", contentDisposition); - sendMessage(msg); - return true; - } - - - //-------------------------------------------------------------------------- - // WebView specific functions that do not interact with a client. These - // functions just need to operate within the UI thread. - //-------------------------------------------------------------------------- - - public boolean onSavePassword(String schemePlusHost, String username, - String password, Message resumeMsg) { - // resumeMsg should be null at this point because we want to create it - // within the CallbackProxy. - if (Config.DEBUG) { - junit.framework.Assert.assertNull(resumeMsg); - } - resumeMsg = obtainMessage(NOTIFY); - - Message msg = obtainMessage(SAVE_PASSWORD, resumeMsg); - Bundle bundle = msg.getData(); - bundle.putString("host", schemePlusHost); - bundle.putString("username", username); - bundle.putString("password", password); - synchronized (this) { - sendMessage(msg); - try { - wait(); - } catch (InterruptedException e) { - Log.e(LOGTAG, - "Caught exception while waiting for onSavePassword"); - Log.e(LOGTAG, Log.getStackTraceString(e)); - } - } - // Doesn't matter here - return false; - } - - //-------------------------------------------------------------------------- - // WebChromeClient methods - //-------------------------------------------------------------------------- - - public void onProgressChanged(int newProgress) { - // Synchronize so that mLatestProgress is up-to-date. - synchronized (this) { - mLatestProgress = newProgress; - if (mWebChromeClient == null) { - return; - } - if (!mProgressUpdatePending) { - sendEmptyMessage(PROGRESS); - mProgressUpdatePending = true; - } - } - } - - public WebView createWindow(boolean dialog, boolean userGesture) { - // Do an unsynchronized quick check to avoid posting if no callback has - // been set. - if (mWebChromeClient == null) { - return null; - } - - WebView.WebViewTransport transport = mWebView.new WebViewTransport(); - final Message msg = obtainMessage(NOTIFY); - msg.obj = transport; - synchronized (this) { - sendMessage(obtainMessage(CREATE_WINDOW, dialog ? 1 : 0, - userGesture ? 1 : 0, msg)); - try { - wait(); - } catch (InterruptedException e) { - Log.e(LOGTAG, - "Caught exception while waiting for createWindow"); - Log.e(LOGTAG, Log.getStackTraceString(e)); - } - } - - WebView w = transport.getWebView(); - if (w != null) { - w.getWebViewCore().initializeSubwindow(); - } - return w; - } - - public void onRequestFocus() { - // Do an unsynchronized quick check to avoid posting if no callback has - // been set. - if (mWebChromeClient == null) { - return; - } - - sendEmptyMessage(REQUEST_FOCUS); - } - - public void onCloseWindow(WebView window) { - // Do an unsynchronized quick check to avoid posting if no callback has - // been set. - if (mWebChromeClient == null) { - return; - } - sendMessage(obtainMessage(CLOSE_WINDOW, window)); - } - - public void onReceivedIcon(Bitmap icon) { - if (Config.DEBUG && mBackForwardList.getCurrentItem() == null) { - throw new AssertionError(); - } - mBackForwardList.getCurrentItem().setFavicon(icon); - // Do an unsynchronized quick check to avoid posting if no callback has - // been set. - if (mWebChromeClient == null) { - return; - } - sendMessage(obtainMessage(RECEIVED_ICON, icon)); - } - - public void onReceivedTitle(String title) { - // Do an unsynchronized quick check to avoid posting if no callback has - // been set. - if (mWebChromeClient == null) { - return; - } - sendMessage(obtainMessage(RECEIVED_TITLE, title)); - } - - public void onJsAlert(String url, String message) { - // Do an unsynchronized quick check to avoid posting if no callback has - // been set. - if (mWebChromeClient == null) { - return; - } - JsResult result = new JsResult(this, false); - Message alert = obtainMessage(JS_ALERT, result); - alert.getData().putString("message", message); - alert.getData().putString("url", url); - synchronized (this) { - sendMessage(alert); - try { - wait(); - } catch (InterruptedException e) { - Log.e(LOGTAG, "Caught exception while waiting for jsAlert"); - Log.e(LOGTAG, Log.getStackTraceString(e)); - } - } - } - - public boolean onJsConfirm(String url, String message) { - // Do an unsynchronized quick check to avoid posting if no callback has - // been set. - if (mWebChromeClient == null) { - return false; - } - JsResult result = new JsResult(this, false); - Message confirm = obtainMessage(JS_CONFIRM, result); - confirm.getData().putString("message", message); - confirm.getData().putString("url", url); - synchronized (this) { - sendMessage(confirm); - try { - wait(); - } catch (InterruptedException e) { - Log.e(LOGTAG, "Caught exception while waiting for jsConfirm"); - Log.e(LOGTAG, Log.getStackTraceString(e)); - } - } - return result.getResult(); - } - - public String onJsPrompt(String url, String message, String defaultValue) { - // Do an unsynchronized quick check to avoid posting if no callback has - // been set. - if (mWebChromeClient == null) { - return null; - } - JsPromptResult result = new JsPromptResult(this); - Message prompt = obtainMessage(JS_PROMPT, result); - prompt.getData().putString("message", message); - prompt.getData().putString("default", defaultValue); - prompt.getData().putString("url", url); - synchronized (this) { - sendMessage(prompt); - try { - wait(); - } catch (InterruptedException e) { - Log.e(LOGTAG, "Caught exception while waiting for jsPrompt"); - Log.e(LOGTAG, Log.getStackTraceString(e)); - } - } - return result.getStringResult(); - } - - public boolean onJsBeforeUnload(String url, String message) { - // Do an unsynchronized quick check to avoid posting if no callback has - // been set. - if (mWebChromeClient == null) { - return true; - } - JsResult result = new JsResult(this, true); - Message confirm = obtainMessage(JS_UNLOAD, result); - confirm.getData().putString("message", message); - confirm.getData().putString("url", url); - synchronized (this) { - sendMessage(confirm); - try { - wait(); - } catch (InterruptedException e) { - Log.e(LOGTAG, "Caught exception while waiting for jsUnload"); - Log.e(LOGTAG, Log.getStackTraceString(e)); - } - } - return result.getResult(); - } -} |
