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);
     }