Position Position::equivalentDeepPosition() const { if (isNull() || node()->isAtomicNode()) return *this; NodeImpl *child = 0; Position pos(*this); if (offset() >= (int)node()->childNodeCount()) { child = node()->lastChild(); pos = Position(child, child->caretMaxOffset()); ASSERT(child); while (!child->isAtomicNode() && pos.node()->hasChildNodes()) { child = pos.node()->lastChild(); ASSERT(child); pos = Position(child, child->caretMaxOffset()); } } else { child = node()->childNode(offset()); ASSERT(child); pos = Position(child, 0); while (!child->isAtomicNode() && pos.node()->hasChildNodes()) { child = pos.node()->firstChild(); ASSERT(child); pos = Position(child, 0); } } return pos; }
Position VisiblePosition::deepEquivalent(const Position &pos) { NodeImpl *node = pos.node(); long offset = pos.offset(); if (!node) return Position(); if (isAtomicNode(node)) return pos; if (offset >= (long)node->childNodeCount()) { do { NodeImpl *child = node->lastChild(); if (!child) break; node = child; } while (!isAtomicNode(node)); return Position(node, node->caretMaxOffset()); } node = node->childNode(offset); ASSERT(node); while (!isAtomicNode(node)) { NodeImpl *child = node->firstChild(); if (!child) break; node = child; } return Position(node, 0); }