Bug 1461738 - 2. Don't unregister listeners in GeckoSessionHandler; r?esawin
Unregistering listeners when we clear a delegate can lead to some event
races between the Gecko and UI thread. It's unclear to me if
unregistering events actually has much benefit, so I think we should
just not unregister events at all.
MozReview-Commit-ID: FS63NfbKgac
--- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSessionHandler.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSessionHandler.java
@@ -14,20 +14,20 @@ import org.mozilla.gecko.util.GeckoBundl
import android.util.Log;
/* package */ abstract class GeckoSessionHandler<Delegate>
implements BundleEventListener {
private static final String LOGTAG = "GeckoSessionHandler";
private static final boolean DEBUG = false;
- private Delegate mDelegate;
private final String mModuleName;
private final String[] mEvents;
-
+ private Delegate mDelegate;
+ private boolean mRegisteredListeners;
/* package */ GeckoSessionHandler(final String module,
final GeckoSession session,
final String[] events) {
session.handlersCount++;
mModuleName = module;
mEvents = events;
@@ -37,50 +37,34 @@ import android.util.Log;
return mDelegate;
}
public void setDelegate(final Delegate delegate, final GeckoSession session) {
if (mDelegate == delegate) {
return;
}
- final boolean unsettingOldDelegate = mDelegate != null &&
- delegate == null;
- final boolean settingNewDelegate = mDelegate == null &&
- delegate != null;
-
- if (unsettingOldDelegate) {
- unregister(session);
- }
-
mDelegate = delegate;
- if (settingNewDelegate) {
- register(session);
+ if (!mRegisteredListeners && delegate != null) {
+ session.getEventDispatcher().registerUiThreadListener(this, mEvents);
+ mRegisteredListeners = true;
}
// If session is not open, we will update module state during session opening.
if (!session.isOpen()) {
return;
}
final GeckoBundle msg = new GeckoBundle(2);
msg.putString("module", mModuleName);
msg.putBoolean("enabled", isEnabled());
session.getEventDispatcher().dispatch("GeckoView:UpdateModuleState", msg);
}
- private void unregister(final GeckoSession session) {
- session.getEventDispatcher().unregisterUiThreadListener(this, mEvents);
- }
-
- private void register(final GeckoSession session) {
- session.getEventDispatcher().registerUiThreadListener(this, mEvents);
- }
-
public String getName() {
return mModuleName;
}
public boolean isEnabled() {
return mDelegate != null;
}
@@ -88,17 +72,17 @@ import android.util.Log;
public void handleMessage(final String event, final GeckoBundle message,
final EventCallback callback) {
if (DEBUG) {
Log.d(LOGTAG, mModuleName + " handleMessage: event = " + event);
}
if (mDelegate != null) {
handleMessage(mDelegate, event, message, callback);
- } else {
+ } else if (callback != null) {
callback.sendError("No delegate registered");
}
}
protected abstract void handleMessage(final Delegate delegate,
final String event,
final GeckoBundle message,
final EventCallback callback);