From fbaf0bb26397aa498eb9156f06d5a6fe34dd7dd8 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 03:14:29 +0200 Subject: Merging upstream version 125.0.1. Signed-off-by: Daniel Baumann --- layout/xul/nsXULTooltipListener.cpp | 64 ++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 32 deletions(-) (limited to 'layout/xul/nsXULTooltipListener.cpp') 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 targetNode = nsINode::FromEventTargetOrNull(eventTarget); - if (targetNode && targetNode->IsContent() && - !targetNode->AsContent()->GetContainingShadow()) { - eventTarget = aEvent->GetTarget(); - } - - nsXULPopupManager* pm = nsXULPopupManager::GetInstance(); - if (pm) { + nsCOMPtr targetNode = + nsINode::FromEventTargetOrNull(aEvent->GetOriginalTarget()); + if (nsXULPopupManager* pm = nsXULPopupManager::GetInstance()) { nsCOMPtr tooltipNode = pm->GetLastTriggerTooltipNode(currentTooltip->GetComposedDoc()); @@ -98,8 +92,7 @@ void nsXULTooltipListener::MouseOut(Event* aEvent) { // tooltip appears positioned near the mouse. nsCOMPtr 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 currentTooltip = do_QueryReferent(mCurrentTooltip); - nsCOMPtr eventTarget = aEvent->GetComposedTarget(); - nsIContent* content = nsIContent::FromEventTargetOrNull(eventTarget); + auto* const mouseMoveTarget = + nsIContent::FromEventTargetOrNull(aEvent->GetOriginalTarget()); bool isSameTarget = true; nsCOMPtr 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 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(); -- cgit v1.2.3