void DragCaretController::setCaretPosition(const VisiblePosition& position) { m_position = position; setCaretRectNeedsUpdate(); Document* document = 0; if (Node* node = m_position.deepEquivalent().deprecatedNode()) { document = &node->document(); } if (m_position.isNull() || m_position.isOrphan()) { clearCaretRect(); } else { document->updateRenderTreeIfNeeded(); updateCaretRect(document, m_position); } }
IntRect FrameCaret::absoluteCaretBounds() { DCHECK_NE(m_frame->document()->lifecycle().state(), DocumentLifecycle::InPaintInvalidation); DCHECK(!m_frame->document()->needsLayoutTreeUpdate()); DocumentLifecycle::DisallowTransitionScope disallowTransition( m_frame->document()->lifecycle()); if (!isActive()) { clearCaretRect(); } else { if (enclosingTextFormControl(caretPosition().position())) { if (isVisuallyEquivalentCandidate(caretPosition().position())) updateCaretRect(caretPosition()); else updateCaretRect(createVisiblePosition(caretPosition())); } else { updateCaretRect(createVisiblePosition(caretPosition())); } } return absoluteBoundsForLocalRect(caretPosition().anchorNode(), localCaretRectWithoutUpdate()); }