From 9b95ab17ecdaf1e3501f0deb7580cb2b5492331a Mon Sep 17 00:00:00 2001 From: Grace Kloba Date: Thu, 1 Apr 2010 16:07:30 -0700 Subject: [PATCH] Instead of holding an ApplicationContext, JWebCoreJavaBridge will have a reference of the current window's main WebView. It is only non-null if the WebView's window has the focus. Extract setActive() from onWindowFocusChanged() so that onAttachedToWindow() can call it directly. The old way has a mis-matching call to onWindowFocusChanged. Fix http://b/issue?id=2559152 --- core/java/android/webkit/BrowserFrame.java | 2 +- .../android/webkit/JWebCoreJavaBridge.java | 38 +++++++++++++++---- core/java/android/webkit/WebView.java | 25 ++++++++---- 3 files changed, 50 insertions(+), 15 deletions(-) diff --git a/core/java/android/webkit/BrowserFrame.java b/core/java/android/webkit/BrowserFrame.java index beac0b8f98b4a..219a469c2de9b 100644 --- a/core/java/android/webkit/BrowserFrame.java +++ b/core/java/android/webkit/BrowserFrame.java @@ -188,7 +188,7 @@ class BrowserFrame extends Handler { // Create a global JWebCoreJavaBridge to handle timers and // cookies in the WebCore thread. if (sJavaBridge == null) { - sJavaBridge = new JWebCoreJavaBridge(appContext); + sJavaBridge = new JWebCoreJavaBridge(); // set WebCore native cache size ActivityManager am = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE); diff --git a/core/java/android/webkit/JWebCoreJavaBridge.java b/core/java/android/webkit/JWebCoreJavaBridge.java index 9dc70794d215b..e76669361d5ea 100644 --- a/core/java/android/webkit/JWebCoreJavaBridge.java +++ b/core/java/android/webkit/JWebCoreJavaBridge.java @@ -16,7 +16,6 @@ package android.webkit; -import android.content.Context; import android.os.Handler; import android.os.Message; import android.util.Log; @@ -43,7 +42,9 @@ final class JWebCoreJavaBridge extends Handler { private boolean mTimerPaused; private boolean mHasDeferredTimers; - private Context mContext; + // keep track of the main WebView attached to the current window so that we + // can get the proper Context. + private WebView mCurrentMainWebView; /* package */ static final int REFRESH_PLUGINS = 100; @@ -52,8 +53,7 @@ final class JWebCoreJavaBridge extends Handler { * Construct a new JWebCoreJavaBridge to interface with * WebCore timers and cookies. */ - public JWebCoreJavaBridge(Context context) { - mContext = context; + public JWebCoreJavaBridge() { nativeConstructor(); } @@ -62,6 +62,22 @@ final class JWebCoreJavaBridge extends Handler { nativeFinalize(); } + synchronized void setActiveWebView(WebView webview) { + if (mCurrentMainWebView != null) { + // it is possible if there is a sub-WebView. Do nothing. + return; + } + mCurrentMainWebView = webview; + } + + synchronized void removeActiveWebView(WebView webview) { + if (mCurrentMainWebView != webview) { + // it is possible if there is a sub-WebView. Do nothing. + return; + } + mCurrentMainWebView = null; + } + /** * Call native timer callbacks. */ @@ -238,9 +254,17 @@ final class JWebCoreJavaBridge extends Handler { return CertTool.getKeyStrengthList(); } - private String getSignedPublicKey(int index, String challenge, String url) { - // generateKeyPair expects organizations which we don't have. Ignore url. - return CertTool.getSignedPublicKey(mContext, index, challenge); + synchronized private String getSignedPublicKey(int index, String challenge, + String url) { + if (mCurrentMainWebView != null) { + // generateKeyPair expects organizations which we don't have. Ignore + // url. + return CertTool.getSignedPublicKey( + mCurrentMainWebView.getContext(), index, challenge); + } else { + Log.e(LOGTAG, "There is no active WebView for getSignedPublicKey"); + return ""; + } } private native void nativeConstructor(); diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 9acfda55bb4a1..74229b8449218 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -3916,13 +3916,14 @@ public class WebView extends AbsoluteLayout @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); - if (hasWindowFocus()) onWindowFocusChanged(true); + if (hasWindowFocus()) setActive(true); } @Override protected void onDetachedFromWindow() { clearTextEntry(false); dismissZoomControl(); + if (hasWindowFocus()) setActive(false); super.onDetachedFromWindow(); } @@ -3949,11 +3950,8 @@ public class WebView extends AbsoluteLayout public void onGlobalFocusChanged(View oldFocus, View newFocus) { } - // To avoid drawing the cursor ring, and remove the TextView when our window - // loses focus. - @Override - public void onWindowFocusChanged(boolean hasWindowFocus) { - if (hasWindowFocus) { + private void setActive(boolean active) { + if (active) { if (hasFocus()) { // If our window regained focus, and we have focus, then begin // drawing the cursor ring @@ -3973,7 +3971,8 @@ public class WebView extends AbsoluteLayout // false for the first parameter } } else { - if (getSettings().getBuiltInZoomControls() && !getZoomButtonsController().isVisible()) { + if (getSettings().getBuiltInZoomControls() + && !getZoomButtonsController().isVisible()) { /* * The zoom controls come in their own window, so our window * loses focus. Our policy is to not draw the cursor ring if @@ -3994,6 +3993,18 @@ public class WebView extends AbsoluteLayout setFocusControllerInactive(); } invalidate(); + } + + // To avoid drawing the cursor ring, and remove the TextView when our window + // loses focus. + @Override + public void onWindowFocusChanged(boolean hasWindowFocus) { + setActive(hasWindowFocus); + if (hasWindowFocus) { + BrowserFrame.sJavaBridge.setActiveWebView(this); + } else { + BrowserFrame.sJavaBridge.removeActiveWebView(this); + } super.onWindowFocusChanged(hasWindowFocus); }