bool AccessibleCaret::Intersects(const AccessibleCaret& aCaret) const { MOZ_ASSERT(mPresShell == aCaret.mPresShell); if (!IsVisuallyVisible() || !aCaret.IsVisuallyVisible()) { return false; } nsRect rect = nsLayoutUtils::GetRectRelativeToFrame(CaretElement(), RootFrame()); nsRect rhsRect = nsLayoutUtils::GetRectRelativeToFrame(aCaret.CaretElement(), RootFrame()); return rect.Intersects(rhsRect); }
bool AccessibleCaret::Contains(const nsPoint& aPoint) const { if (!IsVisuallyVisible()) { return false; } nsRect rect = nsLayoutUtils::GetRectRelativeToFrame(CaretImageElement(), RootFrame()); return rect.Contains(aPoint); }
AccessibleCaret::PositionChangedResult AccessibleCaret::SetPosition(nsIFrame* aFrame, int32_t aOffset) { if (!CustomContentContainerFrame()) { return PositionChangedResult::NotChanged; } nsRect imaginaryCaretRectInFrame = nsCaret::GetGeometryForFrame(aFrame, aOffset, nullptr); imaginaryCaretRectInFrame = nsLayoutUtils::ClampRectToScrollFrames(aFrame, imaginaryCaretRectInFrame); if (imaginaryCaretRectInFrame.IsEmpty()) { // Don't bother to set the caret position since it's invisible. mImaginaryCaretRect = nsRect(); mZoomLevel = 0.0f; return PositionChangedResult::Invisible; } nsRect imaginaryCaretRect = imaginaryCaretRectInFrame; nsLayoutUtils::TransformRect(aFrame, RootFrame(), imaginaryCaretRect); float zoomLevel = GetZoomLevel(); if (imaginaryCaretRect.IsEqualEdges(mImaginaryCaretRect) && FuzzyEqualsMultiplicative(zoomLevel, mZoomLevel)) { return PositionChangedResult::NotChanged; } mImaginaryCaretRect = imaginaryCaretRect; mZoomLevel = zoomLevel; // SetCaretElementStyle() and SetSelectionBarElementStyle() require the // input rect relative to container frame. nsRect imaginaryCaretRectInContainerFrame = imaginaryCaretRectInFrame; nsLayoutUtils::TransformRect(aFrame, CustomContentContainerFrame(), imaginaryCaretRectInContainerFrame); SetCaretElementStyle(imaginaryCaretRectInContainerFrame, mZoomLevel); SetSelectionBarElementStyle(imaginaryCaretRectInContainerFrame, mZoomLevel); return PositionChangedResult::Changed; }