Bug 857884 - Use dom::EventTarget more in content/ and dom/ Part 3 r=Ms2ger

This commit is contained in:
David Zbarsky 2013-04-14 14:27:33 -04:00
parent 6e22249506
commit 045fad43d6
3 changed files with 34 additions and 36 deletions

View File

@ -580,14 +580,12 @@ nsXBLService::AttachGlobalKeyHandler(EventTarget* aTarget)
// the listener already exists, so skip this
if (contentNode && contentNode->GetProperty(nsGkAtoms::listener))
return NS_OK;
nsCOMPtr<nsIDOMElement> elt(do_QueryInterface(contentNode));
// Create the key handler
nsXBLWindowKeyHandler* handler;
NS_NewXBLWindowKeyHandler(elt, piTarget, &handler); // This addRef's
if (!handler)
return NS_ERROR_FAILURE;
nsRefPtr<nsXBLWindowKeyHandler> handler =
NS_NewXBLWindowKeyHandler(elt, piTarget);
// listen to these events
manager->AddEventListenerByType(handler, NS_LITERAL_STRING("keydown"),
@ -598,12 +596,11 @@ nsXBLService::AttachGlobalKeyHandler(EventTarget* aTarget)
dom::TrustedEventsAtSystemGroupBubble());
if (contentNode)
return contentNode->SetProperty(nsGkAtoms::listener, handler,
return contentNode->SetProperty(nsGkAtoms::listener, handler.forget().get(),
nsPropertyTable::SupportsDtorFunc, true);
// release the handler. The reference will be maintained by the event target,
// The reference to the handler will be maintained by the event target,
// and, if there is a content node, the property.
NS_RELEASE(handler);
return NS_OK;
}

View File

@ -165,7 +165,7 @@ nsXBLSpecialDocInfo* nsXBLWindowKeyHandler::sXBLSpecialDocInfo = nullptr;
uint32_t nsXBLWindowKeyHandler::sRefCnt = 0;
nsXBLWindowKeyHandler::nsXBLWindowKeyHandler(nsIDOMElement* aElement,
nsIDOMEventTarget* aTarget)
EventTarget* aTarget)
: mTarget(aTarget),
mHandler(nullptr),
mUserHandler(nullptr)
@ -234,7 +234,7 @@ BuildHandlerChain(nsIContent* aContent, nsXBLPrototypeHandler** aResult)
nsresult
nsXBLWindowKeyHandler::EnsureHandlers(bool *aIsEditor)
{
nsCOMPtr<nsIDOMElement> el = GetElement();
nsCOMPtr<Element> el = GetElement();
NS_ENSURE_STATE(!mWeakPtrForElement || el);
if (el) {
// We are actually a XUL <keyset>.
@ -316,8 +316,8 @@ nsXBLWindowKeyHandler::WalkHandlers(nsIDOMKeyEvent* aKeyEvent, nsIAtom* aEventTy
bool isEditor;
nsresult rv = EnsureHandlers(&isEditor);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIDOMElement> el = GetElement();
nsCOMPtr<Element> el = GetElement();
if (!el) {
if (mUserHandler) {
WalkHandlersInternal(aKeyEvent, aEventType, mUserHandler);
@ -500,10 +500,10 @@ nsXBLWindowKeyHandler::WalkHandlersAndExecute(nsIDOMKeyEvent* aKeyEvent,
// and that it has something to do (oncommand of the <key> or its
// <command> is non-empty).
nsCOMPtr<nsIContent> elt = currHandler->GetHandlerElement();
nsCOMPtr<nsIDOMElement> commandElt;
nsCOMPtr<Element> commandElt;
// See if we're in a XUL doc.
nsCOMPtr<nsIDOMElement> el = GetElement();
nsCOMPtr<Element> el = GetElement();
if (el && elt) {
// We are. Obtain our command attribute.
nsAutoString command;
@ -542,11 +542,11 @@ nsXBLWindowKeyHandler::WalkHandlersAndExecute(nsIDOMKeyEvent* aKeyEvent,
}
nsCOMPtr<EventTarget> piTarget;
nsCOMPtr<nsIDOMElement> element = GetElement();
nsCOMPtr<Element> element = GetElement();
if (element) {
piTarget = do_QueryInterface(commandElt);
piTarget = commandElt;
} else {
piTarget = do_QueryInterface(mTarget);
piTarget = mTarget;
}
rv = currHandler->ExecuteHandler(piTarget, aKeyEvent);
@ -558,24 +558,19 @@ nsXBLWindowKeyHandler::WalkHandlersAndExecute(nsIDOMKeyEvent* aKeyEvent,
return false;
}
already_AddRefed<nsIDOMElement>
already_AddRefed<Element>
nsXBLWindowKeyHandler::GetElement()
{
nsCOMPtr<nsIDOMElement> element = do_QueryReferent(mWeakPtrForElement);
nsIDOMElement* el = nullptr;
element.swap(el);
return el;
nsCOMPtr<Element> element = do_QueryReferent(mWeakPtrForElement);
return element.forget();
}
///////////////////////////////////////////////////////////////////////////////////
nsresult
NS_NewXBLWindowKeyHandler(nsIDOMElement* aElement, nsIDOMEventTarget* aTarget,
nsXBLWindowKeyHandler** aResult)
already_AddRefed<nsXBLWindowKeyHandler>
NS_NewXBLWindowKeyHandler(nsIDOMElement* aElement, EventTarget* aTarget)
{
*aResult = new nsXBLWindowKeyHandler(aElement, aTarget);
if (!*aResult)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(*aResult);
return NS_OK;
nsRefPtr<nsXBLWindowKeyHandler> result =
new nsXBLWindowKeyHandler(aElement, aTarget);
return result.forget();
}

View File

@ -17,10 +17,17 @@ class nsIDOMEventTarget;
class nsXBLSpecialDocInfo;
class nsXBLPrototypeHandler;
namespace mozilla {
namespace dom {
class Element;
class EventTarget;
}
}
class nsXBLWindowKeyHandler : public nsIDOMEventListener
{
public:
nsXBLWindowKeyHandler(nsIDOMElement* aElement, nsIDOMEventTarget* aTarget);
nsXBLWindowKeyHandler(nsIDOMElement* aElement, mozilla::dom::EventTarget* aTarget);
virtual ~nsXBLWindowKeyHandler();
NS_DECL_ISUPPORTS
@ -56,10 +63,10 @@ protected:
// Returns the element which was passed as a parameter to the constructor,
// unless the element has been removed from the document.
already_AddRefed<nsIDOMElement> GetElement();
already_AddRefed<mozilla::dom::Element> GetElement();
// Using weak pointer to the DOM Element.
nsWeakPtr mWeakPtrForElement;
nsIDOMEventTarget* mTarget; // weak ref
mozilla::dom::EventTarget* mTarget; // weak ref
// these are not owning references; the prototype handlers are owned
// by the prototype bindings which are owned by the docinfo.
@ -71,9 +78,8 @@ protected:
static uint32_t sRefCnt;
};
nsresult
already_AddRefed<nsXBLWindowKeyHandler>
NS_NewXBLWindowKeyHandler(nsIDOMElement* aElement,
nsIDOMEventTarget* aTarget,
nsXBLWindowKeyHandler** aResult);
mozilla::dom::EventTarget* aTarget);
#endif