TextDirection SelectionModifier::directionOfSelection() const { InlineBox* startBox = nullptr; InlineBox* endBox = nullptr; // Cache the VisiblePositions because visibleStart() and visibleEnd() // can cause layout, which has the potential to invalidate lineboxes. VisiblePosition startPosition = m_selection.visibleStart(); VisiblePosition endPosition = m_selection.visibleEnd(); if (startPosition.isNotNull()) startBox = computeInlineBoxPosition(startPosition).inlineBox; if (endPosition.isNotNull()) endBox = computeInlineBoxPosition(endPosition).inlineBox; if (startBox && endBox && startBox->direction() == endBox->direction()) return startBox->direction(); return directionOfEnclosingBlock(); }
RenderedPosition::RenderedPosition(const Position& position, TextAffinity affinity) : m_layoutObject(nullptr) , m_inlineBox(nullptr) , m_offset(0) , m_prevLeafChild(uncachedInlineBox()) , m_nextLeafChild(uncachedInlineBox()) { if (position.isNull()) return; InlineBoxPosition boxPosition = computeInlineBoxPosition(position, affinity); m_inlineBox = boxPosition.inlineBox; m_offset = boxPosition.offsetInBox; if (m_inlineBox) m_layoutObject = &m_inlineBox->layoutObject(); else m_layoutObject = layoutObjectFromPosition(position); }