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; }
bool FuzzyEqualsCoordinate(float aValue1, float aValue2) { return FuzzyEqualsAdditive(aValue1, aValue2, COORDINATE_EPSILON) || FuzzyEqualsMultiplicative(aValue1, aValue2); }