Bug 1268749 part 5 - Avoid dispatching unprefixed fullscreen events to content if unprefixed API is disabled. r=smaug
MozReview-Commit-ID: BLL7xr0EJu8
--- a/dom/events/EventListenerManager.cpp
+++ b/dom/events/EventListenerManager.cpp
@@ -280,16 +280,18 @@ EventListenerManager::AddEventListenerIn
listener->mListener = aListenerHolder;
listener->mEventMessage = aEventMessage;
listener->mTypeString = aTypeString;
listener->mTypeAtom = aTypeAtom;
listener->mFlags = aFlags;
listener->mListenerIsHandler = aHandler;
listener->mHandlerIsString = false;
listener->mAllEvents = aAllEvents;
+ listener->mIsChrome = mIsMainThreadELM &&
+ nsContentUtils::LegacyIsCallerChromeOrNativeCode();
// Detect the type of event listener.
nsCOMPtr<nsIXPConnectWrappedJS> wjs;
if (aFlags.mListenerIsJSListener) {
MOZ_ASSERT(!aListenerHolder.HasWebIDLCallback());
listener->mListenerType = Listener::eJSEventListener;
} else if (aListenerHolder.HasWebIDLCallback()) {
listener->mListenerType = Listener::eWebIDLListener;
@@ -674,16 +676,25 @@ EventListenerManager::ListenerCanHandle(
return true;
}
if (aEvent->mMessage == eUnidentifiedEvent) {
if (mIsMainThreadELM) {
return aListener->mTypeAtom == aEvent->mSpecifiedEventType;
}
return aListener->mTypeString.Equals(aEvent->mSpecifiedEventTypeString);
}
+ if (!nsContentUtils::IsUnprefixedFullscreenApiEnabled() &&
+ aEvent->IsTrusted() && (aEventMessage == eFullscreenChange ||
+ aEventMessage == eFullscreenError)) {
+ // If unprefixed Fullscreen API is not enabled, don't dispatch it
+ // to the content.
+ if (!aEvent->mFlags.mInSystemGroup && !aListener->mIsChrome) {
+ return false;
+ }
+ }
MOZ_ASSERT(mIsMainThreadELM);
return aListener->mEventMessage == aEventMessage;
}
void
EventListenerManager::AddEventListenerByType(
const EventListenerHolder& aListenerHolder,
const nsAString& aType,
--- a/dom/events/EventListenerManager.h
+++ b/dom/events/EventListenerManager.h
@@ -190,16 +190,17 @@ public:
eWebIDLListener,
eListenerTypeCount
};
uint8_t mListenerType;
bool mListenerIsHandler : 1;
bool mHandlerIsString : 1;
bool mAllEvents : 1;
+ bool mIsChrome : 1;
EventListenerFlags mFlags;
JSEventHandler* GetJSEventHandler() const
{
return (mListenerType == eJSEventListener) ?
static_cast<JSEventHandler*>(mListener.GetXPCOMCallback()) :
nullptr;