bool RenderTextLineBoxes::containsOffset(const RenderText& renderer, unsigned offset, OffsetType type) const { for (auto box = m_first; box; box = box->nextTextBox()) { if (offset < box->start() && !renderer.containsReversedText()) return false; unsigned boxEnd = box->start() + box->len(); if (offset >= box->start() && offset <= boxEnd) { if (offset == boxEnd && (type == CharacterOffset || box->isLineBreak())) continue; if (type == CharacterOffset) return true; // Return false for offsets inside composed characters. return !offset || offset == static_cast<unsigned>(renderer.nextOffset(renderer.previousOffset(offset))); } } return false; }
bool Position::inRenderedText() const { if (isNull() || !node()->isTextNode()) return false; RenderObject *renderer = node()->renderer(); if (!renderer) return false; RenderText *textRenderer = static_cast<RenderText *>(renderer); for (InlineTextBox *box = textRenderer->firstTextBox(); box; box = box->nextTextBox()) { if (offset() < box->m_start && !textRenderer->containsReversedText()) { // The offset we're looking for is before this node // this means the offset must be in content that is // not rendered. Return false. return false; } if (box->containsCaretOffset(offset())) // Return false for offsets inside composed characters. return offset() == 0 || offset() == textRenderer->nextOffset(textRenderer->previousOffset(offset())); } return false; }