diff --git a/content/events/public/EventTarget.h b/content/events/public/EventTarget.h index 1c6c672f7241..d4d85c69f8fb 100644 --- a/content/events/public/EventTarget.h +++ b/content/events/public/EventTarget.h @@ -11,12 +11,15 @@ #include "nsIDOMEventListener.h" #include "mozilla/ErrorResult.h" #include "mozilla/dom/Nullable.h" +#include "nsIAtom.h" + class nsDOMEvent; namespace mozilla { namespace dom { class EventListener; +class EventHandlerNonNull; // IID for the dom::EventTarget interface #define NS_EVENTTARGET_IID \ @@ -43,6 +46,24 @@ public: bool aCapture, ErrorResult& aRv); bool DispatchEvent(nsDOMEvent& aEvent, ErrorResult& aRv); + + EventHandlerNonNull* GetEventHandler(const nsAString& aType) + { + nsCOMPtr type = do_GetAtom(aType); + return GetEventHandler(type); + } + + void SetEventHandler(const nsAString& aType, EventHandlerNonNull* aHandler, + ErrorResult& rv) + { + nsCOMPtr type = do_GetAtom(aType); + return SetEventHandler(type, aHandler, rv); + } + +protected: + EventHandlerNonNull* GetEventHandler(nsIAtom* aType); + void SetEventHandler(nsIAtom* aType, EventHandlerNonNull* aHandler, + ErrorResult& rv); }; NS_DEFINE_STATIC_IID_ACCESSOR(EventTarget, NS_EVENTTARGET_IID) diff --git a/content/events/src/EventTarget.cpp b/content/events/src/EventTarget.cpp index beae68758bca..befa0b39594e 100644 --- a/content/events/src/EventTarget.cpp +++ b/content/events/src/EventTarget.cpp @@ -22,5 +22,19 @@ EventTarget::RemoveEventListener(const nsAString& aType, } } +EventHandlerNonNull* +EventTarget::GetEventHandler(nsIAtom* aType) +{ + nsEventListenerManager* elm = GetListenerManager(false); + return elm ? elm->GetEventHandler(aType) : nullptr; +} + +void +EventTarget::SetEventHandler(nsIAtom* aType, EventHandlerNonNull* aHandler, + ErrorResult& rv) +{ + rv = GetListenerManager(true)->SetEventHandler(aType, aHandler); +} + } // namespace dom } // namespace mozilla diff --git a/content/events/src/nsDOMEventTargetHelper.h b/content/events/src/nsDOMEventTargetHelper.h index a5868cdf7462..2740e73db052 100644 --- a/content/events/src/nsDOMEventTargetHelper.h +++ b/content/events/src/nsDOMEventTargetHelper.h @@ -90,20 +90,11 @@ public: nsresult SetEventHandler(nsIAtom* aType, JSContext* aCx, const JS::Value& aValue); - void SetEventHandler(nsIAtom* aType, - mozilla::dom::EventHandlerNonNull* aHandler, - mozilla::ErrorResult& rv) - { - rv = GetListenerManager(true)->SetEventHandler(aType, aHandler); - } + using mozilla::dom::EventTarget::SetEventHandler; void GetEventHandler(nsIAtom* aType, JSContext* aCx, JS::Value* aValue); - mozilla::dom::EventHandlerNonNull* GetEventHandler(nsIAtom* aType) - { - nsEventListenerManager* elm = GetListenerManager(false); - return elm ? elm->GetEventHandler(aType) : nullptr; - } + using mozilla::dom::EventTarget::GetEventHandler; nsresult CheckInnerWindowCorrectness() { diff --git a/dom/webidl/EventTarget.webidl b/dom/webidl/EventTarget.webidl index c0b83a4ff790..2ead21ac25d6 100644 --- a/dom/webidl/EventTarget.webidl +++ b/dom/webidl/EventTarget.webidl @@ -27,3 +27,13 @@ interface EventTarget { [Throws] boolean dispatchEvent(Event event); }; + +// Mozilla extensions for use by JS-implemented event targets to +// implement on* properties. +partial interface EventTarget { + [ChromeOnly, Throws] + void setEventHandler(DOMString type, EventHandler handler); + + [ChromeOnly] + EventHandler getEventHandler(DOMString type); +}; diff --git a/dom/workers/EventTarget.h b/dom/workers/EventTarget.h index ead1d62610f8..077cb94e521f 100644 --- a/dom/workers/EventTarget.h +++ b/dom/workers/EventTarget.h @@ -63,6 +63,17 @@ public: { return mListenerManager.HasListeners(); } + + void SetEventHandler(JSContext*, const nsAString& aType, JSObject* aHandler, + ErrorResult& rv) + { + rv.Throw(NS_ERROR_NOT_IMPLEMENTED); + } + + JSObject* GetEventHandler(JSContext*, const nsAString& aType) + { + return nullptr; + } }; END_WORKERS_NAMESPACE