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

Commit dc9f2b66 authored by Shimeng (Simon) Wang's avatar Shimeng (Simon) Wang
Browse files

DO NOT MERGE

Use a static variable and methods for the current WebView.

sJavaBridge may not exist by the time onWindowFocusChanged is called.
To avoid an NPE, just static methods that modify a global field.
JWebCoreJavaBridge is a global object anyway so using a static field
will be fine.  To avoid any garbage collection issues, store the
WebView in a WeakReference.

Bug: 2908023
Change-Id: I05e9261f2c3d13c10c73c9b34f3aeea1d12a08a6
parent 3d7606aa
Loading
Loading
Loading
Loading
+13 −9
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@ import android.os.Handler;
import android.os.Message;
import android.util.Log;

import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.Set;

final class JWebCoreJavaBridge extends Handler {
@@ -44,7 +46,8 @@ final class JWebCoreJavaBridge extends Handler {

    // keep track of the main WebView attached to the current window so that we
    // can get the proper Context.
    private WebView mCurrentMainWebView;
    private static WeakReference<WebView> sCurrentMainWebView =
            new WeakReference<WebView>(null);

    /* package */
    static final int REFRESH_PLUGINS = 100;
@@ -62,20 +65,20 @@ final class JWebCoreJavaBridge extends Handler {
        nativeFinalize();
    }

    synchronized void setActiveWebView(WebView webview) {
        if (mCurrentMainWebView != null) {
    static synchronized void setActiveWebView(WebView webview) {
        if (sCurrentMainWebView.get() != null) {
            // it is possible if there is a sub-WebView. Do nothing.
            return;
        }
        mCurrentMainWebView = webview;
        sCurrentMainWebView = new WeakReference<WebView>(webview);
    }

    synchronized void removeActiveWebView(WebView webview) {
        if (mCurrentMainWebView != webview) {
    static synchronized void removeActiveWebView(WebView webview) {
        if (sCurrentMainWebView.get() != webview) {
            // it is possible if there is a sub-WebView. Do nothing.
            return;
        }
        mCurrentMainWebView = null;
        sCurrentMainWebView.clear();
    }

    /**
@@ -256,11 +259,12 @@ final class JWebCoreJavaBridge extends Handler {

    synchronized private String getSignedPublicKey(int index, String challenge,
            String url) {
        if (mCurrentMainWebView != null) {
        WebView current = sCurrentMainWebView.get();
        if (current != null) {
            // generateKeyPair expects organizations which we don't have. Ignore
            // url.
            return CertTool.getSignedPublicKey(
                    mCurrentMainWebView.getContext(), index, challenge);
                    current.getContext(), index, challenge);
        } else {
            Log.e(LOGTAG, "There is no active WebView for getSignedPublicKey");
            return "";
+2 −2
Original line number Diff line number Diff line
@@ -4502,9 +4502,9 @@ public class WebView extends AbsoluteLayout
    public void onWindowFocusChanged(boolean hasWindowFocus) {
        setActive(hasWindowFocus);
        if (hasWindowFocus) {
            BrowserFrame.sJavaBridge.setActiveWebView(this);
            JWebCoreJavaBridge.setActiveWebView(this);
        } else {
            BrowserFrame.sJavaBridge.removeActiveWebView(this);
            JWebCoreJavaBridge.removeActiveWebView(this);
        }
        super.onWindowFocusChanged(hasWindowFocus);
    }