summaryrefslogtreecommitdiff
path: root/dom/events
diff options
context:
space:
mode:
authorFranklinDM <mrmineshafter17@gmail.com>2023-03-03 21:28:44 +0800
committerFranklinDM <mrmineshafter17@gmail.com>2023-03-04 21:32:10 +0800
commit4390724666af7d72d4334301acc410b2aa0f3b17 (patch)
tree9158f521fc15a03ac7b836cafa4487e86e65cf89 /dom/events
parenta69e82b0d7d0617ba1e02257bb92491cafe9470a (diff)
downloaduxp-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-xdom/events/Event.cpp20
-rwxr-xr-xdom/events/Event.h3
-rw-r--r--dom/events/FocusEvent.cpp6
-rw-r--r--dom/events/FocusEvent.h2
-rw-r--r--dom/events/MouseEvent.cpp22
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