This is an automated email from the git hooks/post-receive script.
richard pushed a commit to branch base-browser-102.5.0esr-12.0-1 in repository tor-browser.
commit 51c19d603d5e2eabfa8228856ba4482b4bb08051 Author: Emilio Cobos Álvarez emilio@crisal.io AuthorDate: Thu Oct 20 10:16:58 2022 +0000
Bug 1795815 - Fix cursor intersection detection on OOP iframes. r=smaug, a=dmeehan
Differential Revision: https://phabricator.services.mozilla.com/D159783 --- dom/base/DOMIntersectionObserver.cpp | 13 +++++++++++++ dom/base/DOMIntersectionObserver.h | 2 ++ dom/events/EventStateManager.cpp | 23 +++++++++++------------ 3 files changed, 26 insertions(+), 12 deletions(-)
diff --git a/dom/base/DOMIntersectionObserver.cpp b/dom/base/DOMIntersectionObserver.cpp index 78450a64c816..773ea62574ff 100644 --- a/dom/base/DOMIntersectionObserver.cpp +++ b/dom/base/DOMIntersectionObserver.cpp @@ -667,6 +667,19 @@ IntersectionOutput DOMIntersectionObserver::Intersect( return {isSimilarOrigin, rootBounds, targetRect, intersectionRect}; }
+IntersectionOutput DOMIntersectionObserver::Intersect( + const IntersectionInput& aInput, const nsRect& aTargetRect) { + nsRect rootBounds = aInput.mRootRect; + rootBounds.Inflate(aInput.mRootMargin); + auto intersectionRect = + EdgeInclusiveIntersection(aInput.mRootRect, aTargetRect); + if (intersectionRect && aInput.mRemoteDocumentVisibleRect) { + intersectionRect = EdgeInclusiveIntersection( + *intersectionRect, *aInput.mRemoteDocumentVisibleRect); + } + return {true, rootBounds, aTargetRect, intersectionRect}; +} + // https://w3c.github.io/IntersectionObserver/#update-intersection-observations... // (step 2) void DOMIntersectionObserver::Update(Document* aDocument, diff --git a/dom/base/DOMIntersectionObserver.h b/dom/base/DOMIntersectionObserver.h index 4b16a7e3a2da..ce985543af90 100644 --- a/dom/base/DOMIntersectionObserver.h +++ b/dom/base/DOMIntersectionObserver.h @@ -152,6 +152,8 @@ class DOMIntersectionObserver final : public nsISupports, const Document& aDocument, const nsINode* aRoot, const StyleRect<LengthPercentage>* aRootMargin); static IntersectionOutput Intersect(const IntersectionInput&, Element&); + // Intersects with a given rect, already relative to the root frame. + static IntersectionOutput Intersect(const IntersectionInput&, const nsRect&);
void Update(Document* aDocument, DOMHighResTimeStamp time); MOZ_CAN_RUN_SCRIPT void Notify(); diff --git a/dom/events/EventStateManager.cpp b/dom/events/EventStateManager.cpp index 736fd054e813..e5abeff2f50e 100644 --- a/dom/events/EventStateManager.cpp +++ b/dom/events/EventStateManager.cpp @@ -33,6 +33,7 @@ #include "mozilla/dom/BrowsingContext.h" #include "mozilla/dom/CanonicalBrowsingContext.h" #include "mozilla/dom/ContentChild.h" +#include "mozilla/dom/DOMIntersectionObserver.h" #include "mozilla/dom/DragEvent.h" #include "mozilla/dom/Event.h" #include "mozilla/dom/FrameLoaderBinding.h" @@ -4033,23 +4034,19 @@ static bool ShouldBlockCustomCursor(nsPresContext* aPresContext, return false; }
- // We don't want to deal with iframes, just let them do their thing unless - // they intersect UI. - // - // TODO(emilio, bug 1525561): In a fission world, we should have a better way - // to find the event coordinates relative to the content area. - nsPresContext* topLevel = - aPresContext->GetInProcessRootContentDocumentPresContext(); - if (!topLevel) { + auto input = DOMIntersectionObserver::ComputeInput(*aPresContext->Document(), + nullptr, nullptr); + + if (!input.mRootFrame) { return false; }
nsPoint point = nsLayoutUtils::GetEventCoordinatesRelativeTo( - aEvent, RelativeTo{topLevel->PresShell()->GetRootFrame()}); + aEvent, RelativeTo{input.mRootFrame});
// The cursor size won't be affected by our full zoom in the parent process, // so undo that before checking the rect. - float zoom = topLevel->GetFullZoom(); + float zoom = aPresContext->GetFullZoom();
// Also adjust for accessibility cursor scaling factor. zoom /= LookAndFeel::GetFloat(LookAndFeel::FloatID::CursorScale, 1.0f); @@ -4059,8 +4056,10 @@ static bool ShouldBlockCustomCursor(nsPresContext* aPresContext, nsPoint hotspot(CSSPixel::ToAppUnits(aCursor.mHotspot.x / zoom), CSSPixel::ToAppUnits(aCursor.mHotspot.y / zoom));
- nsRect cursorRect(point - hotspot, size); - return !topLevel->GetVisibleArea().Contains(cursorRect); + const nsRect cursorRect(point - hotspot, size); + auto output = DOMIntersectionObserver::Intersect(input, cursorRect); + return !output.mIntersectionRect || + !(*output.mIntersectionRect == cursorRect); }
static gfx::IntPoint ComputeHotspot(imgIContainer* aContainer,