summaryrefslogtreecommitdiffstats
path: root/layout/xul/nsXULTooltipListener.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 01:14:29 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 01:14:29 +0000
commitfbaf0bb26397aa498eb9156f06d5a6fe34dd7dd8 (patch)
tree4c1ccaf5486d4f2009f9a338a98a83e886e29c97 /layout/xul/nsXULTooltipListener.cpp
parentReleasing progress-linux version 124.0.1-1~progress7.99u1. (diff)
downloadfirefox-fbaf0bb26397aa498eb9156f06d5a6fe34dd7dd8.tar.xz
firefox-fbaf0bb26397aa498eb9156f06d5a6fe34dd7dd8.zip
Merging upstream version 125.0.1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'layout/xul/nsXULTooltipListener.cpp')
-rw-r--r--layout/xul/nsXULTooltipListener.cpp64
1 files changed, 32 insertions, 32 deletions
diff --git a/layout/xul/nsXULTooltipListener.cpp b/layout/xul/nsXULTooltipListener.cpp
index e8592dfc3a..77dfbb7a30 100644
--- a/layout/xul/nsXULTooltipListener.cpp
+++ b/layout/xul/nsXULTooltipListener.cpp
@@ -12,6 +12,7 @@
#include "mozilla/dom/Document.h"
#include "nsGkAtoms.h"
#include "nsMenuPopupFrame.h"
+#include "nsIContentInlines.h"
#include "nsIDragService.h"
#include "nsIDragSession.h"
#include "nsITreeView.h"
@@ -79,16 +80,9 @@ void nsXULTooltipListener::MouseOut(Event* aEvent) {
// check to see if the mouse left the targetNode, and if so,
// hide the tooltip
if (currentTooltip) {
- // which node did the mouse leave?
- EventTarget* eventTarget = aEvent->GetComposedTarget();
- nsCOMPtr<nsINode> targetNode = nsINode::FromEventTargetOrNull(eventTarget);
- if (targetNode && targetNode->IsContent() &&
- !targetNode->AsContent()->GetContainingShadow()) {
- eventTarget = aEvent->GetTarget();
- }
-
- nsXULPopupManager* pm = nsXULPopupManager::GetInstance();
- if (pm) {
+ nsCOMPtr<nsINode> targetNode =
+ nsINode::FromEventTargetOrNull(aEvent->GetOriginalTarget());
+ if (nsXULPopupManager* pm = nsXULPopupManager::GetInstance()) {
nsCOMPtr<nsINode> tooltipNode =
pm->GetLastTriggerTooltipNode(currentTooltip->GetComposedDoc());
@@ -98,8 +92,7 @@ void nsXULTooltipListener::MouseOut(Event* aEvent) {
// tooltip appears positioned near the mouse.
nsCOMPtr<EventTarget> relatedTarget =
aEvent->AsMouseEvent()->GetRelatedTarget();
- nsIContent* relatedContent =
- nsIContent::FromEventTargetOrNull(relatedTarget);
+ auto* relatedContent = nsIContent::FromEventTargetOrNull(relatedTarget);
if (tooltipNode == targetNode && relatedContent != currentTooltip) {
HideTooltip();
// reset special tree tracking
@@ -133,12 +126,12 @@ void nsXULTooltipListener::MouseMove(Event* aEvent) {
}
nsCOMPtr<nsIContent> currentTooltip = do_QueryReferent(mCurrentTooltip);
- nsCOMPtr<EventTarget> eventTarget = aEvent->GetComposedTarget();
- nsIContent* content = nsIContent::FromEventTargetOrNull(eventTarget);
+ auto* const mouseMoveTarget =
+ nsIContent::FromEventTargetOrNull(aEvent->GetOriginalTarget());
bool isSameTarget = true;
nsCOMPtr<nsIContent> tempContent = do_QueryReferent(mPreviousMouseMoveTarget);
- if (tempContent && tempContent != content) {
+ if (tempContent && tempContent != mouseMoveTarget) {
isSameTarget = false;
}
@@ -153,13 +146,15 @@ void nsXULTooltipListener::MouseMove(Event* aEvent) {
return;
}
mMouseScreenPoint = newMouseScreenPoint;
- mPreviousMouseMoveTarget = do_GetWeakReference(content);
+ mPreviousMouseMoveTarget = do_GetWeakReference(mouseMoveTarget);
- nsCOMPtr<nsIContent> sourceContent =
- do_QueryInterface(aEvent->GetCurrentTarget());
+ auto* const sourceContent =
+ nsIContent::FromEventTargetOrNull(aEvent->GetCurrentTarget());
mSourceNode = do_GetWeakReference(sourceContent);
mIsSourceTree = sourceContent->IsXULElement(nsGkAtoms::treechildren);
- if (mIsSourceTree) CheckTreeBodyMove(mouseEvent);
+ if (mIsSourceTree) {
+ CheckTreeBodyMove(mouseEvent);
+ }
// as the mouse moves, we want to make sure we reset the timer to show it,
// so that the delay is from when the mouse stops moving, not when it enters
@@ -184,14 +179,16 @@ void nsXULTooltipListener::MouseMove(Event* aEvent) {
// when hovering over an element inside it. The popupsinherittooltip
// attribute may be used to disable this behaviour, which is useful for
// large menu hierarchies such as bookmarks.
- if (!sourceContent->IsElement() ||
- !sourceContent->AsElement()->AttrValueIs(
- kNameSpaceID_None, nsGkAtoms::popupsinherittooltip,
- nsGkAtoms::_true, eCaseMatters)) {
- for (nsIContent* targetContent =
- nsIContent::FromEventTargetOrNull(eventTarget);
+ const bool allowTooltipCrossingPopup =
+ !sourceContent->GetParent() ||
+ (sourceContent->IsElement() &&
+ sourceContent->AsElement()->AttrValueIs(
+ kNameSpaceID_None, nsGkAtoms::popupsinherittooltip,
+ nsGkAtoms::_true, eCaseMatters));
+ if (!allowTooltipCrossingPopup) {
+ for (auto* targetContent = mouseMoveTarget;
targetContent && targetContent != sourceContent;
- targetContent = targetContent->GetParent()) {
+ targetContent = targetContent->GetFlattenedTreeParent()) {
if (targetContent->IsAnyOfXULElements(
nsGkAtoms::menupopup, nsGkAtoms::panel, nsGkAtoms::tooltip)) {
mSourceNode = nullptr;
@@ -200,13 +197,12 @@ void nsXULTooltipListener::MouseMove(Event* aEvent) {
}
}
- mTargetNode = do_GetWeakReference(eventTarget);
+ mTargetNode = do_GetWeakReference(mouseMoveTarget);
if (mTargetNode) {
nsresult rv = NS_NewTimerWithFuncCallback(
getter_AddRefs(mTooltipTimer), sTooltipCallback, this,
- LookAndFeel::GetInt(LookAndFeel::IntID::TooltipDelay, 500),
- nsITimer::TYPE_ONE_SHOT, "sTooltipCallback",
- GetMainThreadSerialEventTarget());
+ StaticPrefs::ui_tooltip_delay_ms(), nsITimer::TYPE_ONE_SHOT,
+ "sTooltipCallback", GetMainThreadSerialEventTarget());
if (NS_FAILED(rv)) {
mTargetNode = nullptr;
mSourceNode = nullptr;
@@ -215,7 +211,9 @@ void nsXULTooltipListener::MouseMove(Event* aEvent) {
return;
}
- if (mIsSourceTree) return;
+ if (mIsSourceTree) {
+ return;
+ }
// Hide the tooltip if it is currently showing.
if (currentTooltip) {
HideTooltip();
@@ -502,7 +500,9 @@ static void GetImmediateChild(nsIContent* aContent, nsAtom* aTag,
nsresult nsXULTooltipListener::FindTooltip(nsIContent* aTarget,
nsIContent** aTooltip) {
- if (!aTarget) return NS_ERROR_NULL_POINTER;
+ if (!aTarget) {
+ return NS_ERROR_NULL_POINTER;
+ }
// before we go on, make sure that target node still has a window
Document* document = aTarget->GetComposedDoc();