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
diff --git a/core/java/android/webkit/BrowserFrame.java b/core/java/android/webkit/BrowserFrame.java
index beac0b8..219a469 100644
--- a/core/java/android/webkit/BrowserFrame.java
+++ b/core/java/android/webkit/BrowserFrame.java
@@ -188,7 +188,7 @@
// 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 9dc7079..e766693 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 @@
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 @@
* Construct a new JWebCoreJavaBridge to interface with
* WebCore timers and cookies.
*/
- public JWebCoreJavaBridge(Context context) {
- mContext = context;
+ public JWebCoreJavaBridge() {
nativeConstructor();
}
@@ -62,6 +62,22 @@
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 @@
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 9acfda55..74229b8 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -3916,13 +3916,14 @@
@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 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 @@
// 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 @@
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);
}