diff options
author | FranklinDM <mrmineshafter17@gmail.com> | 2023-03-03 21:28:44 +0800 |
---|---|---|
committer | FranklinDM <mrmineshafter17@gmail.com> | 2023-03-04 21:32:10 +0800 |
commit | 4390724666af7d72d4334301acc410b2aa0f3b17 (patch) | |
tree | 9158f521fc15a03ac7b836cafa4487e86e65cf89 /dom/events | |
parent | a69e82b0d7d0617ba1e02257bb92491cafe9470a (diff) | |
download | uxp-4390724666af7d72d4334301acc410b2aa0f3b17.tar.gz |
Issue #2135 - Bug 1323815: FocusEvent.relatedTarget should work consistently with MouseEvent.relatedTarget
* This incorporates changes from Bug 1413102.
Diffstat (limited to 'dom/events')
-rwxr-xr-x | dom/events/Event.cpp | 20 | ||||
-rwxr-xr-x | dom/events/Event.h | 3 | ||||
-rw-r--r-- | dom/events/FocusEvent.cpp | 6 | ||||
-rw-r--r-- | dom/events/FocusEvent.h | 2 | ||||
-rw-r--r-- | dom/events/MouseEvent.cpp | 22 |
5 files changed, 28 insertions, 25 deletions
diff --git a/dom/events/Event.cpp b/dom/events/Event.cpp index 7d7acb5e0a..31a39a5609 100755 --- a/dom/events/Event.cpp +++ b/dom/events/Event.cpp @@ -557,6 +557,26 @@ Event::SetEventType(const nsAString& aEventTypeArg) mEvent->SetDefaultComposedInNativeAnonymousContent(); } +already_AddRefed<EventTarget> +Event::EnsureWebAccessibleRelatedTarget(EventTarget* aRelatedTarget) +{ + nsCOMPtr<EventTarget> relatedTarget = aRelatedTarget; + if (relatedTarget) { + nsCOMPtr<nsIContent> content = do_QueryInterface(relatedTarget); + + if (content && content->ChromeOnlyAccess() && + !nsContentUtils::CanAccessNativeAnon()) { + content = content->FindFirstNonChromeOnlyAccessContent(); + relatedTarget = do_QueryInterface(content); + } + + if (relatedTarget) { + relatedTarget = relatedTarget->GetTargetForDOMEvent(); + } + } + return relatedTarget.forget(); +} + void Event::InitEvent(const nsAString& aEventTypeArg, bool aCanBubbleArg, diff --git a/dom/events/Event.h b/dom/events/Event.h index 5e7678b356..e48428f741 100755 --- a/dom/events/Event.h +++ b/dom/events/Event.h @@ -287,6 +287,9 @@ protected: mEvent->SetComposed(aComposed); } + already_AddRefed<EventTarget> + EnsureWebAccessibleRelatedTarget(EventTarget* aRelatedTarget); + mozilla::WidgetEvent* mEvent; RefPtr<nsPresContext> mPresContext; nsCOMPtr<EventTarget> mExplicitOriginalTarget; diff --git a/dom/events/FocusEvent.cpp b/dom/events/FocusEvent.cpp index 02fce7c939..48c22d8d23 100644 --- a/dom/events/FocusEvent.cpp +++ b/dom/events/FocusEvent.cpp @@ -30,14 +30,14 @@ NS_IMETHODIMP FocusEvent::GetRelatedTarget(nsIDOMEventTarget** aRelatedTarget) { NS_ENSURE_ARG_POINTER(aRelatedTarget); - NS_IF_ADDREF(*aRelatedTarget = GetRelatedTarget()); + *aRelatedTarget = GetRelatedTarget().take(); return NS_OK; } -EventTarget* +already_AddRefed<EventTarget> FocusEvent::GetRelatedTarget() { - return mEvent->AsFocusEvent()->mRelatedTarget; + return EnsureWebAccessibleRelatedTarget(mEvent->AsFocusEvent()->mRelatedTarget); } void diff --git a/dom/events/FocusEvent.h b/dom/events/FocusEvent.h index 055555716d..f2e0a6ea70 100644 --- a/dom/events/FocusEvent.h +++ b/dom/events/FocusEvent.h @@ -32,7 +32,7 @@ public: nsPresContext* aPresContext, InternalFocusEvent* aEvent); - EventTarget* GetRelatedTarget(); + already_AddRefed<EventTarget> GetRelatedTarget(); static already_AddRefed<FocusEvent> Constructor(const GlobalObject& aGlobal, const nsAString& aType, diff --git a/dom/events/MouseEvent.cpp b/dom/events/MouseEvent.cpp index 72f0df4260..bf1423b2f4 100644 --- a/dom/events/MouseEvent.cpp +++ b/dom/events/MouseEvent.cpp @@ -300,27 +300,7 @@ MouseEvent::GetRelatedTarget() break; } - if (relatedTarget) { - nsCOMPtr<nsIContent> content = do_QueryInterface(relatedTarget); - nsCOMPtr<nsIContent> currentTarget = - do_QueryInterface(mEvent->mCurrentTarget); - - nsIContent* shadowRelatedTarget = GetShadowRelatedTarget(currentTarget, content); - if (shadowRelatedTarget) { - relatedTarget = shadowRelatedTarget; - } - - if (content && content->ChromeOnlyAccess() && - !nsContentUtils::CanAccessNativeAnon()) { - relatedTarget = do_QueryInterface(content->FindFirstNonChromeOnlyAccessContent()); - } - - if (relatedTarget) { - relatedTarget = relatedTarget->GetTargetForDOMEvent(); - } - return relatedTarget.forget(); - } - return nullptr; + return EnsureWebAccessibleRelatedTarget(relatedTarget); } void |