am f34d9e20: am 61c3a13e: Merge "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." into froyo

Merge commit 'f34d9e20c7f4c5537beb4287c79b24ab351bcda4' into kraken

* commit 'f34d9e20c7f4c5537beb4287c79b24ab351bcda4':
  Instead of holding an ApplicationContext, JWebCoreJavaBridge
This commit is contained in:
Grace Kloba
2010-04-02 09:22:07 -07:00
committed by Android Git Automerger
3 changed files with 50 additions and 15 deletions

View File

@@ -188,7 +188,7 @@ class BrowserFrame extends Handler {
// Create a global JWebCoreJavaBridge to handle timers and // Create a global JWebCoreJavaBridge to handle timers and
// cookies in the WebCore thread. // cookies in the WebCore thread.
if (sJavaBridge == null) { if (sJavaBridge == null) {
sJavaBridge = new JWebCoreJavaBridge(appContext); sJavaBridge = new JWebCoreJavaBridge();
// set WebCore native cache size // set WebCore native cache size
ActivityManager am = (ActivityManager) context ActivityManager am = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE); .getSystemService(Context.ACTIVITY_SERVICE);

View File

@@ -16,7 +16,6 @@
package android.webkit; package android.webkit;
import android.content.Context;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
import android.util.Log; import android.util.Log;
@@ -43,7 +42,9 @@ final class JWebCoreJavaBridge extends Handler {
private boolean mTimerPaused; private boolean mTimerPaused;
private boolean mHasDeferredTimers; 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 */ /* package */
static final int REFRESH_PLUGINS = 100; static final int REFRESH_PLUGINS = 100;
@@ -52,8 +53,7 @@ final class JWebCoreJavaBridge extends Handler {
* Construct a new JWebCoreJavaBridge to interface with * Construct a new JWebCoreJavaBridge to interface with
* WebCore timers and cookies. * WebCore timers and cookies.
*/ */
public JWebCoreJavaBridge(Context context) { public JWebCoreJavaBridge() {
mContext = context;
nativeConstructor(); nativeConstructor();
} }
@@ -62,6 +62,22 @@ final class JWebCoreJavaBridge extends Handler {
nativeFinalize(); 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. * Call native timer callbacks.
*/ */
@@ -238,9 +254,17 @@ final class JWebCoreJavaBridge extends Handler {
return CertTool.getKeyStrengthList(); return CertTool.getKeyStrengthList();
} }
private String getSignedPublicKey(int index, String challenge, String url) { synchronized private String getSignedPublicKey(int index, String challenge,
// generateKeyPair expects organizations which we don't have. Ignore url. String url) {
return CertTool.getSignedPublicKey(mContext, index, challenge); 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(); private native void nativeConstructor();

View File

@@ -3916,13 +3916,14 @@ public class WebView extends AbsoluteLayout
@Override @Override
protected void onAttachedToWindow() { protected void onAttachedToWindow() {
super.onAttachedToWindow(); super.onAttachedToWindow();
if (hasWindowFocus()) onWindowFocusChanged(true); if (hasWindowFocus()) setActive(true);
} }
@Override @Override
protected void onDetachedFromWindow() { protected void onDetachedFromWindow() {
clearTextEntry(false); clearTextEntry(false);
dismissZoomControl(); dismissZoomControl();
if (hasWindowFocus()) setActive(false);
super.onDetachedFromWindow(); super.onDetachedFromWindow();
} }
@@ -3949,11 +3950,8 @@ public class WebView extends AbsoluteLayout
public void onGlobalFocusChanged(View oldFocus, View newFocus) { public void onGlobalFocusChanged(View oldFocus, View newFocus) {
} }
// To avoid drawing the cursor ring, and remove the TextView when our window private void setActive(boolean active) {
// loses focus. if (active) {
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
if (hasWindowFocus) {
if (hasFocus()) { if (hasFocus()) {
// If our window regained focus, and we have focus, then begin // If our window regained focus, and we have focus, then begin
// drawing the cursor ring // drawing the cursor ring
@@ -3973,7 +3971,8 @@ public class WebView extends AbsoluteLayout
// false for the first parameter // false for the first parameter
} }
} else { } else {
if (getSettings().getBuiltInZoomControls() && !getZoomButtonsController().isVisible()) { if (getSettings().getBuiltInZoomControls()
&& !getZoomButtonsController().isVisible()) {
/* /*
* The zoom controls come in their own window, so our window * The zoom controls come in their own window, so our window
* loses focus. Our policy is to not draw the cursor ring if * loses focus. Our policy is to not draw the cursor ring if
@@ -3994,6 +3993,18 @@ public class WebView extends AbsoluteLayout
setFocusControllerInactive(); setFocusControllerInactive();
} }
invalidate(); 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); super.onWindowFocusChanged(hasWindowFocus);
} }