Bug 870219. Add a way for chrome JS that's implementing a WebIDL interface to get/set event handlers sanely on content objects. r=smaug

This commit is contained in:
Boris Zbarsky 2013-05-09 13:07:16 -04:00
Родитель f53244c6cc
Коммит 77a92c2959
5 изменённых файлов: 58 добавлений и 11 удалений

Просмотреть файл

@ -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<nsIAtom> type = do_GetAtom(aType);
return GetEventHandler(type);
}
void SetEventHandler(const nsAString& aType, EventHandlerNonNull* aHandler,
ErrorResult& rv)
{
nsCOMPtr<nsIAtom> 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)

Просмотреть файл

@ -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

Просмотреть файл

@ -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()
{

Просмотреть файл

@ -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);
};

Просмотреть файл

@ -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