diff --git a/content/events/src/nsDOMEvent.cpp b/content/events/src/nsDOMEvent.cpp index 5094059276a8..3eeeb6b895e0 100644 --- a/content/events/src/nsDOMEvent.cpp +++ b/content/events/src/nsDOMEvent.cpp @@ -140,9 +140,9 @@ nsDOMEvent::nsDOMEvent(nsPresContext* aPresContext, nsEvent* aEvent) // Get the explicit original target (if it's anonymous make it null) { - nsCOMPtr content = GetTargetFromFrame(); - mTmpRealOriginalTarget = do_QueryInterface(content); - mExplicitOriginalTarget = mTmpRealOriginalTarget; + mExplicitOriginalTarget = GetTargetFromFrame(); + mTmpRealOriginalTarget = mExplicitOriginalTarget; + nsCOMPtr content = do_QueryInterface(mExplicitOriginalTarget); if (content && content->IsInAnonymousSubtree()) { mExplicitOriginalTarget = nsnull; } @@ -199,9 +199,7 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsDOMEvent) } NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mPresContext); NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mTmpRealOriginalTarget) - // Always set mExplicitOriginalTarget to null, when - // mTmpRealOriginalTarget doesn't point to any object! - tmp->mExplicitOriginalTarget = nsnull; + NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mExplicitOriginalTarget) NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsDOMEvent) @@ -236,6 +234,7 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsDOMEvent) } NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NATIVE_MEMBER(mPresContext.get(), nsPresContext) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mTmpRealOriginalTarget) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mExplicitOriginalTarget) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END // nsIDOMEventInterface @@ -289,7 +288,7 @@ nsDOMEvent::GetCurrentTarget(nsIDOMEventTarget** aCurrentTarget) // // Get the actual event target node (may have been retargeted for mouse events) // -already_AddRefed +already_AddRefed nsDOMEvent::GetTargetFromFrame() { if (!mPresContext) { return nsnull; } @@ -302,7 +301,12 @@ nsDOMEvent::GetTargetFromFrame() // get the real content nsCOMPtr realEventContent; targetFrame->GetContentForEvent(mPresContext, mEvent, getter_AddRefs(realEventContent)); - return realEventContent.forget(); + if (!realEventContent) { return nsnull; } + + // Finally, we have the real content. QI it and return. + nsIDOMEventTarget* target = nsnull; + CallQueryInterface(realEventContent, &target); + return target; } NS_IMETHODIMP diff --git a/content/events/src/nsDOMEvent.h b/content/events/src/nsDOMEvent.h index 4f1a03b48abe..327d4a516b9e 100644 --- a/content/events/src/nsDOMEvent.h +++ b/content/events/src/nsDOMEvent.h @@ -206,13 +206,13 @@ protected: // Internal helper functions nsresult SetEventType(const nsAString& aEventTypeArg); - already_AddRefed GetTargetFromFrame(); + already_AddRefed GetTargetFromFrame(); nsresult ReportWrongPropertyAccessWarning(const char* aPropertyName); nsEvent* mEvent; nsRefPtr mPresContext; nsCOMPtr mTmpRealOriginalTarget; - nsIDOMEventTarget* mExplicitOriginalTarget; + nsCOMPtr mExplicitOriginalTarget; nsString mCachedType; PRPackedBool mEventIsInternal; PRPackedBool mPrivateDataDuplicated;