Bug 394735, cache event listener manager when dispatching events, r+sr+a=jst

git-svn-id: svn://10.0.0.236/trunk@233919 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
Olli.Pettay%helsinki.fi 2007-09-05 09:02:23 +00:00
parent e989c06c07
commit 02ba8ae9b0

View File

@ -138,14 +138,16 @@ public:
nsresult PostHandleEvent(nsEventChainPostVisitor& aVisitor);
nsCOMPtr<nsPIDOMEventTarget> mTarget;
nsEventTargetChainItem* mChild;
nsEventTargetChainItem* mParent;
PRUint16 mFlags;
PRUint16 mItemFlags;
nsCOMPtr<nsISupports> mItemData;
nsCOMPtr<nsPIDOMEventTarget> mTarget;
nsEventTargetChainItem* mChild;
nsEventTargetChainItem* mParent;
PRUint16 mFlags;
PRUint16 mItemFlags;
nsCOMPtr<nsISupports> mItemData;
// Event retargeting must happen whenever mNewTarget is non-null.
nsCOMPtr<nsISupports> mNewTarget;
nsCOMPtr<nsISupports> mNewTarget;
// Cache mTarget's event listener manager.
nsCOMPtr<nsIEventListenerManager> mManager;
};
nsEventTargetChainItem::nsEventTargetChainItem(nsISupports* aTarget,
@ -192,14 +194,18 @@ nsresult
nsEventTargetChainItem::HandleEvent(nsEventChainPostVisitor& aVisitor,
PRUint32 aFlags)
{
nsCOMPtr<nsIEventListenerManager> lm;
mTarget->GetListenerManager(PR_FALSE, getter_AddRefs(lm));
aVisitor.mEvent->currentTarget = CurrentTarget()->GetTargetForDOMEvent();
if (lm && aVisitor.mEvent->currentTarget) {
lm->HandleEvent(aVisitor.mPresContext, aVisitor.mEvent, &aVisitor.mDOMEvent,
aVisitor.mEvent->currentTarget, aFlags,
&aVisitor.mEventStatus);
aVisitor.mEvent->currentTarget = nsnull;
if (!mManager) {
mTarget->GetListenerManager(PR_FALSE, getter_AddRefs(mManager));
}
if (mManager) {
aVisitor.mEvent->currentTarget = CurrentTarget()->GetTargetForDOMEvent();
if (aVisitor.mEvent->currentTarget) {
mManager->HandleEvent(aVisitor.mPresContext, aVisitor.mEvent,
&aVisitor.mDOMEvent,
aVisitor.mEvent->currentTarget, aFlags,
&aVisitor.mEventStatus);
aVisitor.mEvent->currentTarget = nsnull;
}
}
return NS_OK;
}