Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9b95ab17 authored by Grace Kloba's avatar Grace Kloba
Browse files

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
parent 70c22a48
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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);
+31 −7
Original line number Diff line number Diff line
@@ -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();
+18 −7
Original line number Diff line number Diff line
@@ -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);
    }