mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
eacbf18e37
--HG-- rename : content/events/src/DOMWheelEvent.cpp => dom/events/DOMWheelEvent.cpp rename : content/events/src/DOMWheelEvent.h => dom/events/DOMWheelEvent.h rename : content/events/src/EventTarget.cpp => dom/events/EventTarget.cpp rename : content/events/public/EventTarget.h => dom/events/EventTarget.h rename : content/events/public/MutationEvent.h => dom/events/MutationEvent.h rename : content/events/src/PointerEvent.cpp => dom/events/PointerEvent.cpp rename : content/events/src/PointerEvent.h => dom/events/PointerEvent.h rename : content/events/src/SpeechRecognitionError.cpp => dom/events/SpeechRecognitionError.cpp rename : content/events/src/SpeechRecognitionError.h => dom/events/SpeechRecognitionError.h rename : content/events/src/TextComposition.cpp => dom/events/TextComposition.cpp rename : content/events/src/TextComposition.h => dom/events/TextComposition.h rename : content/events/src/Touch.cpp => dom/events/Touch.cpp rename : content/events/src/Touch.h => dom/events/Touch.h rename : content/events/crashtests/104310-1.html => dom/events/crashtests/104310-1.html rename : content/events/crashtests/116206-1.html => dom/events/crashtests/116206-1.html rename : content/events/crashtests/135345-1.html => dom/events/crashtests/135345-1.html rename : content/events/crashtests/422009-1.xhtml => dom/events/crashtests/422009-1.xhtml rename : content/events/crashtests/457776-1.html => dom/events/crashtests/457776-1.html rename : content/events/crashtests/496308-1.html => dom/events/crashtests/496308-1.html rename : content/events/crashtests/682637-1.html => dom/events/crashtests/682637-1.html rename : content/events/crashtests/crashtests.list => dom/events/crashtests/crashtests.list rename : content/events/crashtests/eventctor-nulldictionary.html => dom/events/crashtests/eventctor-nulldictionary.html rename : content/events/crashtests/eventctor-nullstorage.html => dom/events/crashtests/eventctor-nullstorage.html rename : content/events/crashtests/recursive-DOMNodeInserted.html => dom/events/crashtests/recursive-DOMNodeInserted.html rename : content/events/crashtests/recursive-onload.html => dom/events/crashtests/recursive-onload.html rename : content/events/src/moz.build => dom/events/moz.build rename : content/events/src/nsAsyncDOMEvent.cpp => dom/events/nsAsyncDOMEvent.cpp rename : content/events/public/nsAsyncDOMEvent.h => dom/events/nsAsyncDOMEvent.h rename : content/events/src/nsContentEventHandler.cpp => dom/events/nsContentEventHandler.cpp rename : content/events/src/nsContentEventHandler.h => dom/events/nsContentEventHandler.h rename : content/events/src/nsDOMAnimationEvent.cpp => dom/events/nsDOMAnimationEvent.cpp rename : content/events/src/nsDOMAnimationEvent.h => dom/events/nsDOMAnimationEvent.h rename : content/events/src/nsDOMBeforeUnloadEvent.cpp => dom/events/nsDOMBeforeUnloadEvent.cpp rename : content/events/src/nsDOMBeforeUnloadEvent.h => dom/events/nsDOMBeforeUnloadEvent.h rename : content/events/src/nsDOMClipboardEvent.cpp => dom/events/nsDOMClipboardEvent.cpp rename : content/events/src/nsDOMClipboardEvent.h => dom/events/nsDOMClipboardEvent.h rename : content/events/src/nsDOMCommandEvent.cpp => dom/events/nsDOMCommandEvent.cpp rename : content/events/src/nsDOMCommandEvent.h => dom/events/nsDOMCommandEvent.h rename : content/events/src/nsDOMCompositionEvent.cpp => dom/events/nsDOMCompositionEvent.cpp rename : content/events/src/nsDOMCompositionEvent.h => dom/events/nsDOMCompositionEvent.h rename : content/events/src/nsDOMDataContainerEvent.cpp => dom/events/nsDOMDataContainerEvent.cpp rename : content/events/src/nsDOMDataContainerEvent.h => dom/events/nsDOMDataContainerEvent.h rename : content/events/src/nsDOMDataTransfer.cpp => dom/events/nsDOMDataTransfer.cpp rename : content/events/src/nsDOMDataTransfer.h => dom/events/nsDOMDataTransfer.h rename : content/events/src/nsDOMDeviceMotionEvent.cpp => dom/events/nsDOMDeviceMotionEvent.cpp rename : content/events/src/nsDOMDeviceMotionEvent.h => dom/events/nsDOMDeviceMotionEvent.h rename : content/events/src/nsDOMDragEvent.cpp => dom/events/nsDOMDragEvent.cpp rename : content/events/src/nsDOMDragEvent.h => dom/events/nsDOMDragEvent.h rename : content/events/src/nsDOMEvent.cpp => dom/events/nsDOMEvent.cpp rename : content/events/src/nsDOMEvent.h => dom/events/nsDOMEvent.h rename : content/events/src/nsDOMEventTargetHelper.cpp => dom/events/nsDOMEventTargetHelper.cpp rename : content/events/src/nsDOMEventTargetHelper.h => dom/events/nsDOMEventTargetHelper.h rename : content/events/src/nsDOMFocusEvent.cpp => dom/events/nsDOMFocusEvent.cpp rename : content/events/src/nsDOMFocusEvent.h => dom/events/nsDOMFocusEvent.h rename : content/events/public/nsDOMKeyNameList.h => dom/events/nsDOMKeyNameList.h rename : content/events/src/nsDOMKeyboardEvent.cpp => dom/events/nsDOMKeyboardEvent.cpp rename : content/events/src/nsDOMKeyboardEvent.h => dom/events/nsDOMKeyboardEvent.h rename : content/events/src/nsDOMMessageEvent.cpp => dom/events/nsDOMMessageEvent.cpp rename : content/events/src/nsDOMMessageEvent.h => dom/events/nsDOMMessageEvent.h rename : content/events/src/nsDOMMouseEvent.cpp => dom/events/nsDOMMouseEvent.cpp rename : content/events/src/nsDOMMouseEvent.h => dom/events/nsDOMMouseEvent.h rename : content/events/src/nsDOMMouseScrollEvent.cpp => dom/events/nsDOMMouseScrollEvent.cpp rename : content/events/src/nsDOMMouseScrollEvent.h => dom/events/nsDOMMouseScrollEvent.h rename : content/events/src/nsDOMMutationEvent.cpp => dom/events/nsDOMMutationEvent.cpp rename : content/events/src/nsDOMMutationEvent.h => dom/events/nsDOMMutationEvent.h rename : content/events/src/nsDOMNotifyAudioAvailableEvent.cpp => dom/events/nsDOMNotifyAudioAvailableEvent.cpp rename : content/events/src/nsDOMNotifyAudioAvailableEvent.h => dom/events/nsDOMNotifyAudioAvailableEvent.h rename : content/events/src/nsDOMNotifyPaintEvent.cpp => dom/events/nsDOMNotifyPaintEvent.cpp rename : content/events/src/nsDOMNotifyPaintEvent.h => dom/events/nsDOMNotifyPaintEvent.h rename : content/events/src/nsDOMScrollAreaEvent.cpp => dom/events/nsDOMScrollAreaEvent.cpp rename : content/events/src/nsDOMScrollAreaEvent.h => dom/events/nsDOMScrollAreaEvent.h rename : content/events/src/nsDOMSimpleGestureEvent.cpp => dom/events/nsDOMSimpleGestureEvent.cpp rename : content/events/src/nsDOMSimpleGestureEvent.h => dom/events/nsDOMSimpleGestureEvent.h rename : content/events/src/nsDOMTextEvent.cpp => dom/events/nsDOMTextEvent.cpp rename : content/events/src/nsDOMTextEvent.h => dom/events/nsDOMTextEvent.h rename : content/events/src/nsDOMTouchEvent.cpp => dom/events/nsDOMTouchEvent.cpp rename : content/events/src/nsDOMTouchEvent.h => dom/events/nsDOMTouchEvent.h rename : content/events/src/nsDOMTransitionEvent.cpp => dom/events/nsDOMTransitionEvent.cpp rename : content/events/src/nsDOMTransitionEvent.h => dom/events/nsDOMTransitionEvent.h rename : content/events/src/nsDOMUIEvent.cpp => dom/events/nsDOMUIEvent.cpp rename : content/events/src/nsDOMUIEvent.h => dom/events/nsDOMUIEvent.h rename : content/events/src/nsDOMXULCommandEvent.cpp => dom/events/nsDOMXULCommandEvent.cpp rename : content/events/src/nsDOMXULCommandEvent.h => dom/events/nsDOMXULCommandEvent.h rename : content/events/src/nsEventDispatcher.cpp => dom/events/nsEventDispatcher.cpp rename : content/events/public/nsEventDispatcher.h => dom/events/nsEventDispatcher.h rename : content/events/src/nsEventListenerManager.cpp => dom/events/nsEventListenerManager.cpp rename : content/events/src/nsEventListenerManager.h => dom/events/nsEventListenerManager.h rename : content/events/src/nsEventListenerService.cpp => dom/events/nsEventListenerService.cpp rename : content/events/src/nsEventListenerService.h => dom/events/nsEventListenerService.h rename : content/events/public/nsEventNameList.h => dom/events/nsEventNameList.h rename : content/events/src/nsEventStateManager.cpp => dom/events/nsEventStateManager.cpp rename : content/events/src/nsEventStateManager.h => dom/events/nsEventStateManager.h rename : content/events/public/nsEventStates.h => dom/events/nsEventStates.h rename : content/events/public/nsIEventListenerService.idl => dom/events/nsIEventListenerService.idl rename : dom/base/nsIJSEventListener.h => dom/events/nsIJSEventListener.h rename : content/events/src/nsIMEStateManager.cpp => dom/events/nsIMEStateManager.cpp rename : content/events/src/nsIMEStateManager.h => dom/events/nsIMEStateManager.h rename : content/events/public/nsIPrivateTextEvent.h => dom/events/nsIPrivateTextEvent.h rename : content/events/public/nsIPrivateTextRange.h => dom/events/nsIPrivateTextRange.h rename : dom/src/events/nsJSEventListener.cpp => dom/events/nsJSEventListener.cpp rename : dom/src/events/nsJSEventListener.h => dom/events/nsJSEventListener.h rename : content/events/src/nsPaintRequest.cpp => dom/events/nsPaintRequest.cpp rename : content/events/src/nsPaintRequest.h => dom/events/nsPaintRequest.h rename : content/events/src/nsPrivateTextRange.cpp => dom/events/nsPrivateTextRange.cpp rename : content/events/src/nsPrivateTextRange.h => dom/events/nsPrivateTextRange.h rename : content/events/public/nsVKList.h => dom/events/nsVKList.h rename : content/events/test/bug226361_iframe.xhtml => dom/events/test/bug226361_iframe.xhtml rename : content/events/test/bug299673.js => dom/events/test/bug299673.js rename : content/events/test/bug322588-popup.html => dom/events/test/bug322588-popup.html rename : content/events/test/bug415498-doc1.html => dom/events/test/bug415498-doc1.html rename : content/events/test/bug415498-doc2.html => dom/events/test/bug415498-doc2.html rename : content/events/test/bug426082.html => dom/events/test/bug426082.html rename : content/events/test/bug457672.html => dom/events/test/bug457672.html rename : content/events/test/bug591249_iframe.xul => dom/events/test/bug591249_iframe.xul rename : content/events/test/bug602962.xul => dom/events/test/bug602962.xul rename : content/events/test/bug656379-1.html => dom/events/test/bug656379-1.html rename : content/events/test/chrome.ini => dom/events/test/chrome.ini rename : content/events/test/empty.js => dom/events/test/empty.js rename : content/events/test/file_bug679494.html => dom/events/test/file_bug679494.html rename : content/events/test/mochitest.ini => dom/events/test/mochitest.ini rename : content/events/test/test_addEventListenerExtraArg.html => dom/events/test/test_addEventListenerExtraArg.html rename : content/events/test/test_all_synthetic_events.html => dom/events/test/test_all_synthetic_events.html rename : content/events/test/test_bug226361.xhtml => dom/events/test/test_bug226361.xhtml rename : content/events/test/test_bug238987.html => dom/events/test/test_bug238987.html rename : content/events/test/test_bug288392.html => dom/events/test/test_bug288392.html rename : content/events/test/test_bug299673-1.html => dom/events/test/test_bug299673-1.html rename : content/events/test/test_bug299673-2.html => dom/events/test/test_bug299673-2.html rename : content/events/test/test_bug322588.html => dom/events/test/test_bug322588.html rename : content/events/test/test_bug328885.html => dom/events/test/test_bug328885.html rename : content/events/test/test_bug336682.js => dom/events/test/test_bug336682.js rename : content/events/test/test_bug336682_1.html => dom/events/test/test_bug336682_1.html rename : content/events/test/test_bug336682_2.xul => dom/events/test/test_bug336682_2.xul rename : content/events/test/test_bug367781.html => dom/events/test/test_bug367781.html rename : content/events/test/test_bug368835.html => dom/events/test/test_bug368835.html rename : content/events/test/test_bug379120.html => dom/events/test/test_bug379120.html rename : content/events/test/test_bug391568.xhtml => dom/events/test/test_bug391568.xhtml rename : content/events/test/test_bug402089.html => dom/events/test/test_bug402089.html rename : content/events/test/test_bug405632.html => dom/events/test/test_bug405632.html rename : content/events/test/test_bug409604.html => dom/events/test/test_bug409604.html rename : content/events/test/test_bug412567.html => dom/events/test/test_bug412567.html rename : content/events/test/test_bug415498.xul => dom/events/test/test_bug415498.xul rename : content/events/test/test_bug422132.html => dom/events/test/test_bug422132.html rename : content/events/test/test_bug426082.html => dom/events/test/test_bug426082.html rename : content/events/test/test_bug427537.html => dom/events/test/test_bug427537.html rename : content/events/test/test_bug428988.html => dom/events/test/test_bug428988.html rename : content/events/test/test_bug432698.html => dom/events/test/test_bug432698.html rename : content/events/test/test_bug443985.html => dom/events/test/test_bug443985.html rename : content/events/test/test_bug447736.html => dom/events/test/test_bug447736.html rename : content/events/test/test_bug448602.html => dom/events/test/test_bug448602.html rename : content/events/test/test_bug450876.html => dom/events/test/test_bug450876.html rename : content/events/test/test_bug456273.html => dom/events/test/test_bug456273.html rename : content/events/test/test_bug457672.html => dom/events/test/test_bug457672.html rename : content/events/test/test_bug489671.html => dom/events/test/test_bug489671.html rename : content/events/test/test_bug493251.html => dom/events/test/test_bug493251.html rename : content/events/test/test_bug502818.html => dom/events/test/test_bug502818.html rename : content/events/test/test_bug508479.html => dom/events/test/test_bug508479.html rename : content/events/test/test_bug517851.html => dom/events/test/test_bug517851.html rename : content/events/test/test_bug534833.html => dom/events/test/test_bug534833.html rename : content/events/test/test_bug545268.html => dom/events/test/test_bug545268.html rename : content/events/test/test_bug547996-1.html => dom/events/test/test_bug547996-1.html rename : content/events/test/test_bug547996-2.xhtml => dom/events/test/test_bug547996-2.xhtml rename : content/events/test/test_bug556493.html => dom/events/test/test_bug556493.html rename : content/events/test/test_bug563329.html => dom/events/test/test_bug563329.html rename : content/events/test/test_bug574663.html => dom/events/test/test_bug574663.html rename : content/events/test/test_bug586961.xul => dom/events/test/test_bug586961.xul rename : content/events/test/test_bug591249.xul => dom/events/test/test_bug591249.xul rename : content/events/test/test_bug591815.html => dom/events/test/test_bug591815.html rename : content/events/test/test_bug593959.html => dom/events/test/test_bug593959.html rename : content/events/test/test_bug602962.xul => dom/events/test/test_bug602962.xul rename : content/events/test/test_bug603008.html => dom/events/test/test_bug603008.html rename : content/events/test/test_bug605242.html => dom/events/test/test_bug605242.html rename : content/events/test/test_bug607464.html => dom/events/test/test_bug607464.html rename : content/events/test/test_bug613634.html => dom/events/test/test_bug613634.html rename : content/events/test/test_bug615597.html => dom/events/test/test_bug615597.html rename : content/events/test/test_bug617528.xul => dom/events/test/test_bug617528.xul rename : content/events/test/test_bug624127.html => dom/events/test/test_bug624127.html rename : content/events/test/test_bug635465.html => dom/events/test/test_bug635465.html rename : content/events/test/test_bug641477.html => dom/events/test/test_bug641477.html rename : content/events/test/test_bug648573.html => dom/events/test/test_bug648573.html rename : content/events/test/test_bug650493.html => dom/events/test/test_bug650493.html rename : content/events/test/test_bug656379-1.html => dom/events/test/test_bug656379-1.html rename : content/events/test/test_bug656379-2.html => dom/events/test/test_bug656379-2.html rename : content/events/test/test_bug656954.html => dom/events/test/test_bug656954.html rename : content/events/test/test_bug659071.html => dom/events/test/test_bug659071.html rename : content/events/test/test_bug659350.html => dom/events/test/test_bug659350.html rename : content/events/test/test_bug662678.html => dom/events/test/test_bug662678.html rename : content/events/test/test_bug667612.html => dom/events/test/test_bug667612.html rename : content/events/test/test_bug667919-1.html => dom/events/test/test_bug667919-1.html rename : content/events/test/test_bug679494.xul => dom/events/test/test_bug679494.xul rename : content/events/test/test_bug689564.html => dom/events/test/test_bug689564.html rename : content/events/test/test_bug698929.html => dom/events/test/test_bug698929.html rename : content/events/test/test_bug741666.html => dom/events/test/test_bug741666.html rename : content/events/test/test_bug742376.html => dom/events/test/test_bug742376.html rename : content/events/test/test_bug812744.html => dom/events/test/test_bug812744.html rename : content/events/test/test_bug822898.html => dom/events/test/test_bug822898.html rename : content/events/test/test_bug847597.html => dom/events/test/test_bug847597.html rename : content/events/test/test_bug855741.html => dom/events/test/test_bug855741.html rename : content/events/test/test_bug864040.html => dom/events/test/test_bug864040.html rename : content/events/test/test_bug930374-chrome.html => dom/events/test/test_bug930374-chrome.html rename : content/events/test/test_bug930374-content.html => dom/events/test/test_bug930374-content.html rename : content/events/test/test_bug944011.html => dom/events/test/test_bug944011.html rename : content/events/test/test_bug944847.html => dom/events/test/test_bug944847.html rename : content/events/test/test_bug946632.html => dom/events/test/test_bug946632.html rename : content/events/test/test_clickevent_on_input.html => dom/events/test/test_clickevent_on_input.html rename : content/events/test/test_continuous_wheel_events.html => dom/events/test/test_continuous_wheel_events.html rename : content/events/test/test_dblclick_explicit_original_target.html => dom/events/test/test_dblclick_explicit_original_target.html rename : content/events/test/test_dom_keyboard_event.html => dom/events/test/test_dom_keyboard_event.html rename : content/events/test/test_dom_mouse_event.html => dom/events/test/test_dom_mouse_event.html rename : content/events/test/test_dom_wheel_event.html => dom/events/test/test_dom_wheel_event.html rename : content/events/test/test_draggableprop.html => dom/events/test/test_draggableprop.html rename : content/events/test/test_dragstart.html => dom/events/test/test_dragstart.html rename : content/events/test/test_eventctors.html => dom/events/test/test_eventctors.html rename : content/events/test/test_eventctors.xul => dom/events/test/test_eventctors.xul rename : content/events/test/test_focus_disabled.html => dom/events/test/test_focus_disabled.html rename : content/events/test/test_messageEvent.html => dom/events/test/test_messageEvent.html rename : content/events/test/test_moz_mouse_pixel_scroll_event.html => dom/events/test/test_moz_mouse_pixel_scroll_event.html rename : content/events/test/test_wheel_default_action.html => dom/events/test/test_wheel_default_action.html rename : content/events/test/window_bug493251.html => dom/events/test/window_bug493251.html rename : content/events/test/window_bug617528.xul => dom/events/test/window_bug617528.xul rename : content/events/test/window_bug659071.html => dom/events/test/window_bug659071.html rename : content/events/test/window_wheel_default_action.html => dom/events/test/window_wheel_default_action.html extra : rebase_source : 5eb1db8f1791b8842ddc683e3c0ea13e4e3a933b
580 lines
19 KiB
C++
580 lines
19 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef nsEventListenerManager_h__
|
|
#define nsEventListenerManager_h__
|
|
|
|
#include "mozilla/BasicEvents.h"
|
|
#include "mozilla/dom/EventListenerBinding.h"
|
|
#include "mozilla/MemoryReporting.h"
|
|
#include "nsCOMPtr.h"
|
|
#include "nsCycleCollectionParticipant.h"
|
|
#include "nsGkAtoms.h"
|
|
#include "nsIDOMEventListener.h"
|
|
#include "nsIJSEventListener.h"
|
|
#include "nsTObserverArray.h"
|
|
|
|
class nsIDOMEvent;
|
|
struct EventTypeData;
|
|
class nsEventTargetChainItem;
|
|
class nsPIDOMWindow;
|
|
class nsIEventListenerInfo;
|
|
class nsIScriptContext;
|
|
|
|
struct nsListenerStruct;
|
|
class nsEventListenerManager;
|
|
|
|
template<class T> class nsCOMArray;
|
|
|
|
namespace mozilla {
|
|
namespace dom {
|
|
|
|
class EventTarget;
|
|
|
|
typedef CallbackObjectHolder<EventListener, nsIDOMEventListener>
|
|
EventListenerHolder;
|
|
|
|
struct EventListenerFlags
|
|
{
|
|
friend struct ::nsListenerStruct;
|
|
friend class ::nsEventListenerManager;
|
|
private:
|
|
// If mListenerIsJSListener is true, the listener is implemented by JS.
|
|
// Otherwise, it's implemented by native code or JS but it's wrapped.
|
|
bool mListenerIsJSListener : 1;
|
|
|
|
public:
|
|
// If mCapture is true, it means the listener captures the event. Otherwise,
|
|
// it's listening at bubbling phase.
|
|
bool mCapture : 1;
|
|
// If mInSystemGroup is true, the listener is listening to the events in the
|
|
// system group.
|
|
bool mInSystemGroup : 1;
|
|
// If mAllowUntrustedEvents is true, the listener is listening to the
|
|
// untrusted events too.
|
|
bool mAllowUntrustedEvents : 1;
|
|
|
|
EventListenerFlags() :
|
|
mListenerIsJSListener(false),
|
|
mCapture(false), mInSystemGroup(false), mAllowUntrustedEvents(false)
|
|
{
|
|
}
|
|
|
|
bool Equals(const EventListenerFlags& aOther) const
|
|
{
|
|
return (mCapture == aOther.mCapture &&
|
|
mInSystemGroup == aOther.mInSystemGroup &&
|
|
mListenerIsJSListener == aOther.mListenerIsJSListener &&
|
|
mAllowUntrustedEvents == aOther.mAllowUntrustedEvents);
|
|
}
|
|
|
|
bool EqualsIgnoringTrustness(const EventListenerFlags& aOther) const
|
|
{
|
|
return (mCapture == aOther.mCapture &&
|
|
mInSystemGroup == aOther.mInSystemGroup &&
|
|
mListenerIsJSListener == aOther.mListenerIsJSListener);
|
|
}
|
|
|
|
bool operator==(const EventListenerFlags& aOther) const
|
|
{
|
|
return Equals(aOther);
|
|
}
|
|
};
|
|
|
|
inline EventListenerFlags TrustedEventsAtBubble()
|
|
{
|
|
EventListenerFlags flags;
|
|
return flags;
|
|
}
|
|
|
|
inline EventListenerFlags TrustedEventsAtCapture()
|
|
{
|
|
EventListenerFlags flags;
|
|
flags.mCapture = true;
|
|
return flags;
|
|
}
|
|
|
|
inline EventListenerFlags AllEventsAtBubbe()
|
|
{
|
|
EventListenerFlags flags;
|
|
flags.mAllowUntrustedEvents = true;
|
|
return flags;
|
|
}
|
|
|
|
inline EventListenerFlags AllEventsAtCapture()
|
|
{
|
|
EventListenerFlags flags;
|
|
flags.mCapture = true;
|
|
flags.mAllowUntrustedEvents = true;
|
|
return flags;
|
|
}
|
|
|
|
inline EventListenerFlags TrustedEventsAtSystemGroupBubble()
|
|
{
|
|
EventListenerFlags flags;
|
|
flags.mInSystemGroup = true;
|
|
return flags;
|
|
}
|
|
|
|
inline EventListenerFlags TrustedEventsAtSystemGroupCapture()
|
|
{
|
|
EventListenerFlags flags;
|
|
flags.mCapture = true;
|
|
flags.mInSystemGroup = true;
|
|
return flags;
|
|
}
|
|
|
|
inline EventListenerFlags AllEventsAtSystemGroupBubble()
|
|
{
|
|
EventListenerFlags flags;
|
|
flags.mInSystemGroup = true;
|
|
flags.mAllowUntrustedEvents = true;
|
|
return flags;
|
|
}
|
|
|
|
inline EventListenerFlags AllEventsAtSystemGroupCapture()
|
|
{
|
|
EventListenerFlags flags;
|
|
flags.mCapture = true;
|
|
flags.mInSystemGroup = true;
|
|
flags.mAllowUntrustedEvents = true;
|
|
return flags;
|
|
}
|
|
|
|
} // namespace dom
|
|
} // namespace mozilla
|
|
|
|
typedef enum
|
|
{
|
|
eNativeListener = 0,
|
|
eJSEventListener,
|
|
eWrappedJSListener,
|
|
eWebIDLListener,
|
|
eListenerTypeCount
|
|
} nsListenerType;
|
|
|
|
struct nsListenerStruct
|
|
{
|
|
mozilla::dom::EventListenerHolder mListener;
|
|
nsCOMPtr<nsIAtom> mTypeAtom; // for the main thread
|
|
nsString mTypeString; // for non-main-threads
|
|
uint16_t mEventType;
|
|
uint8_t mListenerType;
|
|
bool mListenerIsHandler : 1;
|
|
bool mHandlerIsString : 1;
|
|
bool mAllEvents : 1;
|
|
|
|
mozilla::dom::EventListenerFlags mFlags;
|
|
|
|
nsIJSEventListener* GetJSListener() const {
|
|
return (mListenerType == eJSEventListener) ?
|
|
static_cast<nsIJSEventListener *>(mListener.GetXPCOMCallback()) : nullptr;
|
|
}
|
|
|
|
nsListenerStruct()
|
|
{
|
|
MOZ_ASSERT(sizeof(mListenerType) == 1);
|
|
MOZ_ASSERT(eListenerTypeCount < 255);
|
|
}
|
|
|
|
~nsListenerStruct()
|
|
{
|
|
if ((mListenerType == eJSEventListener) && mListener) {
|
|
static_cast<nsIJSEventListener*>(mListener.GetXPCOMCallback())->Disconnect();
|
|
}
|
|
}
|
|
|
|
MOZ_ALWAYS_INLINE bool IsListening(const mozilla::WidgetEvent* aEvent) const
|
|
{
|
|
if (mFlags.mInSystemGroup != aEvent->mFlags.mInSystemGroup) {
|
|
return false;
|
|
}
|
|
// FIXME Should check !mFlags.mCapture when the event is in target
|
|
// phase because capture phase event listeners should not be fired.
|
|
// But it breaks at least <xul:dialog>'s buttons. Bug 235441.
|
|
return ((mFlags.mCapture && aEvent->mFlags.mInCapturePhase) ||
|
|
(!mFlags.mCapture && aEvent->mFlags.mInBubblingPhase));
|
|
}
|
|
};
|
|
|
|
/*
|
|
* Event listener manager
|
|
*/
|
|
|
|
class nsEventListenerManager
|
|
{
|
|
|
|
public:
|
|
nsEventListenerManager(mozilla::dom::EventTarget* aTarget);
|
|
virtual ~nsEventListenerManager();
|
|
|
|
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(nsEventListenerManager)
|
|
|
|
NS_DECL_CYCLE_COLLECTION_NATIVE_CLASS(nsEventListenerManager)
|
|
|
|
void AddEventListener(const nsAString& aType,
|
|
nsIDOMEventListener* aListener,
|
|
bool aUseCapture,
|
|
bool aWantsUntrusted)
|
|
{
|
|
mozilla::dom::EventListenerHolder holder(aListener);
|
|
AddEventListener(aType, holder, aUseCapture, aWantsUntrusted);
|
|
}
|
|
void AddEventListener(const nsAString& aType,
|
|
mozilla::dom::EventListener* aListener,
|
|
bool aUseCapture,
|
|
bool aWantsUntrusted)
|
|
{
|
|
mozilla::dom::EventListenerHolder holder(aListener);
|
|
AddEventListener(aType, holder, aUseCapture, aWantsUntrusted);
|
|
}
|
|
void RemoveEventListener(const nsAString& aType,
|
|
nsIDOMEventListener* aListener,
|
|
bool aUseCapture)
|
|
{
|
|
mozilla::dom::EventListenerHolder holder(aListener);
|
|
RemoveEventListener(aType, holder, aUseCapture);
|
|
}
|
|
void RemoveEventListener(const nsAString& aType,
|
|
mozilla::dom::EventListener* aListener,
|
|
bool aUseCapture)
|
|
{
|
|
mozilla::dom::EventListenerHolder holder(aListener);
|
|
RemoveEventListener(aType, holder, aUseCapture);
|
|
}
|
|
|
|
void AddListenerForAllEvents(nsIDOMEventListener* aListener,
|
|
bool aUseCapture,
|
|
bool aWantsUntrusted,
|
|
bool aSystemEventGroup);
|
|
void RemoveListenerForAllEvents(nsIDOMEventListener* aListener,
|
|
bool aUseCapture,
|
|
bool aSystemEventGroup);
|
|
|
|
/**
|
|
* Sets events listeners of all types.
|
|
* @param an event listener
|
|
*/
|
|
void AddEventListenerByType(nsIDOMEventListener *aListener,
|
|
const nsAString& type,
|
|
const mozilla::dom::EventListenerFlags& aFlags)
|
|
{
|
|
mozilla::dom::EventListenerHolder holder(aListener);
|
|
AddEventListenerByType(holder, type, aFlags);
|
|
}
|
|
void AddEventListenerByType(const mozilla::dom::EventListenerHolder& aListener,
|
|
const nsAString& type,
|
|
const mozilla::dom::EventListenerFlags& aFlags);
|
|
void RemoveEventListenerByType(nsIDOMEventListener *aListener,
|
|
const nsAString& type,
|
|
const mozilla::dom::EventListenerFlags& aFlags)
|
|
{
|
|
mozilla::dom::EventListenerHolder holder(aListener);
|
|
RemoveEventListenerByType(holder, type, aFlags);
|
|
}
|
|
void RemoveEventListenerByType(const mozilla::dom::EventListenerHolder& aListener,
|
|
const nsAString& type,
|
|
const mozilla::dom::EventListenerFlags& aFlags);
|
|
|
|
/**
|
|
* Sets the current "inline" event listener for aName to be a
|
|
* function compiled from aFunc if !aDeferCompilation. If
|
|
* aDeferCompilation, then we assume that we can get the string from
|
|
* mTarget later and compile lazily.
|
|
*/
|
|
// XXXbz does that play correctly with nodes being adopted across
|
|
// documents? Need to double-check the spec here.
|
|
nsresult SetEventHandler(nsIAtom *aName,
|
|
const nsAString& aFunc,
|
|
uint32_t aLanguage,
|
|
bool aDeferCompilation,
|
|
bool aPermitUntrustedEvents);
|
|
/**
|
|
* Remove the current "inline" event listener for aName.
|
|
*/
|
|
void RemoveEventHandler(nsIAtom *aName, const nsAString& aTypeString);
|
|
|
|
void HandleEvent(nsPresContext* aPresContext,
|
|
mozilla::WidgetEvent* aEvent,
|
|
nsIDOMEvent** aDOMEvent,
|
|
mozilla::dom::EventTarget* aCurrentTarget,
|
|
nsEventStatus* aEventStatus)
|
|
{
|
|
if (mListeners.IsEmpty() || aEvent->mFlags.mPropagationStopped) {
|
|
return;
|
|
}
|
|
|
|
if (!mMayHaveCapturingListeners && !aEvent->mFlags.mInBubblingPhase) {
|
|
return;
|
|
}
|
|
|
|
if (!mMayHaveSystemGroupListeners && aEvent->mFlags.mInSystemGroup) {
|
|
return;
|
|
}
|
|
|
|
// Check if we already know that there is no event listener for the event.
|
|
if (mNoListenerForEvent == aEvent->message &&
|
|
(mNoListenerForEvent != NS_USER_DEFINED_EVENT ||
|
|
mNoListenerForEventAtom == aEvent->userType)) {
|
|
return;
|
|
}
|
|
HandleEventInternal(aPresContext, aEvent, aDOMEvent, aCurrentTarget,
|
|
aEventStatus);
|
|
}
|
|
|
|
/**
|
|
* Tells the event listener manager that its target (which owns it) is
|
|
* no longer using it (and could go away).
|
|
*/
|
|
void Disconnect();
|
|
|
|
/**
|
|
* Allows us to quickly determine if we have mutation listeners registered.
|
|
*/
|
|
bool HasMutationListeners();
|
|
|
|
/**
|
|
* Allows us to quickly determine whether we have unload or beforeunload
|
|
* listeners registered.
|
|
*/
|
|
bool HasUnloadListeners();
|
|
|
|
/**
|
|
* Returns the mutation bits depending on which mutation listeners are
|
|
* registered to this listener manager.
|
|
* @note If a listener is an nsIDOMMutationListener, all possible mutation
|
|
* event bits are returned. All bits are also returned if one of the
|
|
* event listeners is registered to handle DOMSubtreeModified events.
|
|
*/
|
|
uint32_t MutationListenerBits();
|
|
|
|
/**
|
|
* Returns true if there is at least one event listener for aEventName.
|
|
*/
|
|
bool HasListenersFor(const nsAString& aEventName);
|
|
|
|
/**
|
|
* Returns true if there is at least one event listener for aEventNameWithOn.
|
|
* Note that aEventNameWithOn must start with "on"!
|
|
*/
|
|
bool HasListenersFor(nsIAtom* aEventNameWithOn);
|
|
|
|
/**
|
|
* Returns true if there is at least one event listener.
|
|
*/
|
|
bool HasListeners();
|
|
|
|
/**
|
|
* Sets aList to the list of nsIEventListenerInfo objects representing the
|
|
* listeners managed by this listener manager.
|
|
*/
|
|
nsresult GetListenerInfo(nsCOMArray<nsIEventListenerInfo>* aList);
|
|
|
|
uint32_t GetIdentifierForEvent(nsIAtom* aEvent);
|
|
|
|
static void Shutdown();
|
|
|
|
/**
|
|
* Returns true if there may be a paint event listener registered,
|
|
* false if there definitely isn't.
|
|
*/
|
|
bool MayHavePaintEventListener() { return mMayHavePaintEventListener; }
|
|
|
|
/**
|
|
* Returns true if there may be a MozAudioAvailable event listener registered,
|
|
* false if there definitely isn't.
|
|
*/
|
|
bool MayHaveAudioAvailableEventListener() { return mMayHaveAudioAvailableEventListener; }
|
|
|
|
/**
|
|
* Returns true if there may be a touch event listener registered,
|
|
* false if there definitely isn't.
|
|
*/
|
|
bool MayHaveTouchEventListener() { return mMayHaveTouchEventListener; }
|
|
|
|
bool MayHaveMouseEnterLeaveEventListener() { return mMayHaveMouseEnterLeaveEventListener; }
|
|
|
|
size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const;
|
|
|
|
uint32_t ListenerCount() const
|
|
{
|
|
return mListeners.Length();
|
|
}
|
|
|
|
void MarkForCC();
|
|
|
|
mozilla::dom::EventTarget* GetTarget() { return mTarget; }
|
|
protected:
|
|
void HandleEventInternal(nsPresContext* aPresContext,
|
|
mozilla::WidgetEvent* aEvent,
|
|
nsIDOMEvent** aDOMEvent,
|
|
mozilla::dom::EventTarget* aCurrentTarget,
|
|
nsEventStatus* aEventStatus);
|
|
|
|
nsresult HandleEventSubType(nsListenerStruct* aListenerStruct,
|
|
nsIDOMEvent* aDOMEvent,
|
|
mozilla::dom::EventTarget* aCurrentTarget);
|
|
|
|
/**
|
|
* Compile the "inline" event listener for aListenerStruct. The
|
|
* body of the listener can be provided in aBody; if this is null we
|
|
* will look for it on mTarget.
|
|
*/
|
|
nsresult CompileEventHandlerInternal(nsListenerStruct *aListenerStruct,
|
|
const nsAString* aBody);
|
|
|
|
/**
|
|
* Find the nsListenerStruct for the "inline" event listener for aTypeAtom.
|
|
*/
|
|
nsListenerStruct* FindEventHandler(uint32_t aEventType, nsIAtom* aTypeAtom,
|
|
const nsAString& aTypeString);
|
|
|
|
/**
|
|
* Set the "inline" event listener for aName to aHandler. aHandler may be
|
|
* have no actual handler set to indicate that we should lazily get and
|
|
* compile the string for this listener, but in that case aContext and
|
|
* aScopeGlobal must be non-null. Otherwise, aContext and aScopeGlobal are
|
|
* allowed to be null. The nsListenerStruct that results, if any, is returned
|
|
* in aListenerStruct.
|
|
*/
|
|
nsListenerStruct* SetEventHandlerInternal(JS::Handle<JSObject*> aScopeGlobal,
|
|
nsIAtom* aName,
|
|
const nsAString& aTypeString,
|
|
const nsEventHandler& aHandler,
|
|
bool aPermitUntrustedEvents);
|
|
|
|
bool IsDeviceType(uint32_t aType);
|
|
void EnableDevice(uint32_t aType);
|
|
void DisableDevice(uint32_t aType);
|
|
|
|
public:
|
|
/**
|
|
* Set the "inline" event listener for aEventName to aHandler. If
|
|
* aHandler is null, this will actually remove the event listener
|
|
*/
|
|
void SetEventHandler(nsIAtom* aEventName,
|
|
const nsAString& aTypeString,
|
|
mozilla::dom::EventHandlerNonNull* aHandler);
|
|
void SetEventHandler(mozilla::dom::OnErrorEventHandlerNonNull* aHandler);
|
|
void SetEventHandler(mozilla::dom::OnBeforeUnloadEventHandlerNonNull* aHandler);
|
|
|
|
/**
|
|
* Get the value of the "inline" event listener for aEventName.
|
|
* This may cause lazy compilation if the listener is uncompiled.
|
|
*
|
|
* Note: It's the caller's responsibility to make sure to call the right one
|
|
* of these methods. In particular, "onerror" events use
|
|
* OnErrorEventHandlerNonNull for some event targets and EventHandlerNonNull
|
|
* for others.
|
|
*/
|
|
mozilla::dom::EventHandlerNonNull* GetEventHandler(nsIAtom *aEventName,
|
|
const nsAString& aTypeString)
|
|
{
|
|
const nsEventHandler* handler =
|
|
GetEventHandlerInternal(aEventName, aTypeString);
|
|
return handler ? handler->EventHandler() : nullptr;
|
|
}
|
|
mozilla::dom::OnErrorEventHandlerNonNull* GetOnErrorEventHandler()
|
|
{
|
|
const nsEventHandler* handler;
|
|
if (mIsMainThreadELM) {
|
|
handler = GetEventHandlerInternal(nsGkAtoms::onerror, EmptyString());
|
|
} else {
|
|
handler = GetEventHandlerInternal(nullptr, NS_LITERAL_STRING("error"));
|
|
}
|
|
return handler ? handler->OnErrorEventHandler() : nullptr;
|
|
}
|
|
mozilla::dom::OnBeforeUnloadEventHandlerNonNull* GetOnBeforeUnloadEventHandler()
|
|
{
|
|
const nsEventHandler* handler =
|
|
GetEventHandlerInternal(nsGkAtoms::onbeforeunload, EmptyString());
|
|
return handler ? handler->OnBeforeUnloadEventHandler() : nullptr;
|
|
}
|
|
|
|
protected:
|
|
/**
|
|
* Helper method for implementing the various Get*EventHandler above. Will
|
|
* return null if we don't have an event handler for this event name.
|
|
*/
|
|
const nsEventHandler* GetEventHandlerInternal(nsIAtom* aEventName,
|
|
const nsAString& aTypeString);
|
|
|
|
void AddEventListener(const nsAString& aType,
|
|
const mozilla::dom::EventListenerHolder& aListener,
|
|
bool aUseCapture,
|
|
bool aWantsUntrusted);
|
|
void RemoveEventListener(const nsAString& aType,
|
|
const mozilla::dom::EventListenerHolder& aListener,
|
|
bool aUseCapture);
|
|
|
|
void AddEventListenerInternal(
|
|
const mozilla::dom::EventListenerHolder& aListener,
|
|
uint32_t aType,
|
|
nsIAtom* aTypeAtom,
|
|
const nsAString& aTypeString,
|
|
const mozilla::dom::EventListenerFlags& aFlags,
|
|
bool aHandler = false,
|
|
bool aAllEvents = false);
|
|
void RemoveEventListenerInternal(
|
|
const mozilla::dom::EventListenerHolder& aListener,
|
|
uint32_t aType,
|
|
nsIAtom* aUserType,
|
|
const nsAString& aTypeString,
|
|
const mozilla::dom::EventListenerFlags& aFlags,
|
|
bool aAllEvents = false);
|
|
void RemoveAllListeners();
|
|
const EventTypeData* GetTypeDataForIID(const nsIID& aIID);
|
|
const EventTypeData* GetTypeDataForEventName(nsIAtom* aName);
|
|
nsPIDOMWindow* GetInnerWindowForTarget();
|
|
already_AddRefed<nsPIDOMWindow> GetTargetAsInnerWindow() const;
|
|
|
|
bool ListenerCanHandle(nsListenerStruct* aLs, mozilla::WidgetEvent* aEvent);
|
|
|
|
already_AddRefed<nsIScriptGlobalObject>
|
|
GetScriptGlobalAndDocument(nsIDocument** aDoc);
|
|
|
|
uint32_t mMayHavePaintEventListener : 1;
|
|
uint32_t mMayHaveMutationListeners : 1;
|
|
uint32_t mMayHaveCapturingListeners : 1;
|
|
uint32_t mMayHaveSystemGroupListeners : 1;
|
|
uint32_t mMayHaveAudioAvailableEventListener : 1;
|
|
uint32_t mMayHaveTouchEventListener : 1;
|
|
uint32_t mMayHaveMouseEnterLeaveEventListener : 1;
|
|
uint32_t mClearingListeners : 1;
|
|
uint32_t mIsMainThreadELM : 1;
|
|
uint32_t mNoListenerForEvent : 23;
|
|
|
|
nsAutoTObserverArray<nsListenerStruct, 2> mListeners;
|
|
mozilla::dom::EventTarget* mTarget; //WEAK
|
|
nsCOMPtr<nsIAtom> mNoListenerForEventAtom;
|
|
|
|
friend class ELMCreationDetector;
|
|
static uint32_t sMainThreadCreatedCount;
|
|
};
|
|
|
|
/**
|
|
* NS_AddSystemEventListener() is a helper function for implementing
|
|
* EventTarget::AddSystemEventListener().
|
|
*/
|
|
inline nsresult
|
|
NS_AddSystemEventListener(mozilla::dom::EventTarget* aTarget,
|
|
const nsAString& aType,
|
|
nsIDOMEventListener *aListener,
|
|
bool aUseCapture,
|
|
bool aWantsUntrusted)
|
|
{
|
|
nsEventListenerManager* listenerManager =
|
|
aTarget->GetOrCreateListenerManager();
|
|
NS_ENSURE_STATE(listenerManager);
|
|
mozilla::dom::EventListenerFlags flags;
|
|
flags.mInSystemGroup = true;
|
|
flags.mCapture = aUseCapture;
|
|
flags.mAllowUntrustedEvents = aWantsUntrusted;
|
|
listenerManager->AddEventListenerByType(aListener, aType, flags);
|
|
return NS_OK;
|
|
}
|
|
|
|
#endif // nsEventListenerManager_h__
|