Bug 1287706 part 3 - Make EventListenerHandler::Listener movable. r?smaug
MozReview-Commit-ID: F86qndZHNxB
--- a/dom/events/EventListenerManager.cpp
+++ b/dom/events/EventListenerManager.cpp
@@ -664,16 +664,20 @@ EventListenerManager::ListenerCanHandle(
const WidgetEvent* aEvent,
EventMessage aEventMessage) const
{
MOZ_ASSERT(aEventMessage == aEvent->mMessage ||
aEventMessage == GetLegacyEventMessage(aEvent->mMessage),
"aEvent and aEventMessage should agree, modulo legacyness");
+ // The listener has been removed, it cannot handle anything.
+ if (aListener->mListenerType == Listener::eNoListener) {
+ return false;
+ }
// This is slightly different from EVENT_TYPE_EQUALS in that it returns
// true even when aEvent->mMessage == eUnidentifiedEvent and
// aListener=>mEventMessage != eUnidentifiedEvent as long as the atoms are
// the same
if (aListener->mAllEvents) {
return true;
}
if (aEvent->mMessage == eUnidentifiedEvent) {
--- a/dom/events/EventListenerManager.h
+++ b/dom/events/EventListenerManager.h
@@ -180,17 +180,18 @@ public:
{
EventListenerHolder mListener;
nsCOMPtr<nsIAtom> mTypeAtom; // for the main thread
nsString mTypeString; // for non-main-threads
EventMessage mEventMessage;
enum ListenerType : uint8_t
{
- eNativeListener = 0,
+ eNoListener,
+ eNativeListener,
eJSEventListener,
eWrappedJSListener,
eWebIDLListener,
};
ListenerType mListenerType;
bool mListenerIsHandler : 1;
bool mHandlerIsString : 1;
@@ -203,16 +204,36 @@ public:
{
return (mListenerType == eJSEventListener) ?
static_cast<JSEventHandler*>(mListener.GetXPCOMCallback()) :
nullptr;
}
Listener() = default;
+ Listener(Listener&& aOther)
+ : mListener(Move(aOther.mListener))
+ , mTypeAtom(aOther.mTypeAtom.forget())
+ , mTypeString(aOther.mTypeString)
+ , mEventMessage(aOther.mEventMessage)
+ , mListenerType(aOther.mListenerType)
+ , mListenerIsHandler(aOther.mListenerIsHandler)
+ , mHandlerIsString(aOther.mHandlerIsString)
+ , mAllEvents(aOther.mAllEvents)
+ , mIsChrome(aOther.mIsChrome)
+ {
+ aOther.mTypeString.Truncate();
+ aOther.mEventMessage = eVoidEvent;
+ aOther.mListenerType = eNoListener;
+ aOther.mListenerIsHandler = false;
+ aOther.mHandlerIsString = false;
+ aOther.mAllEvents = false;
+ aOther.mIsChrome = false;
+ }
+
~Listener()
{
if ((mListenerType == eJSEventListener) && mListener) {
static_cast<JSEventHandler*>(
mListener.GetXPCOMCallback())->Disconnect();
}
}