int HTMLTextFormControlElement::selectionEnd() const { if (!isTextFormControl()) return 0; if (document()->focusedNode() != this && hasCachedSelection()) return m_cachedSelectionEnd; return computeSelectionEnd(); }
const AtomicString& HTMLTextFormControlElement::selectionDirection() const { if (!isTextFormControl()) return directionString(SelectionHasNoDirection); if (document()->focusedNode() != this && hasCachedSelection()) return directionString(m_cachedSelectionDirection); return directionString(computeSelectionDirection()); }
int HTMLTextFormControlElement::selectionStart() const { if (!isTextFormControl()) return 0; if (document().focusedElement() != this && hasCachedSelection()) return m_cachedSelectionStart; return computeSelectionStart(); }
int HTMLTextFormControlElement::selectionEnd() const { if (!isTextFormControl()) return 0; #if defined(S_CLEAR_SELECTION_ONAUTOFOCUS) if (document().focusedElement() != this) #else if (document().focusedElement() != this && hasCachedSelection()) #endif return m_cachedSelectionEnd; return computeSelectionEnd(); }
void HTMLTextAreaElement::updateFocusAppearance(bool restorePreviousSelection) { if (!restorePreviousSelection || !hasCachedSelection()) { // If this is the first focus, set a caret at the beginning of the text. // This matches some browsers' behavior; see bug 11746 Comment #15. // http://bugs.webkit.org/show_bug.cgi?id=11746#c15 setSelectionRange(0, 0); } else restoreCachedSelection(); if (document()->frame()) document()->frame()->selection()->revealSelection(); }
const AtomicString& HTMLTextFormControlElement::selectionDirection() const { if (!isTextFormControl()) return directionString(SelectionHasNoDirection); #if defined(S_CLEAR_SELECTION_ONAUTOFOCUS) if (document().focusedElement() != this) #else if (document().focusedElement() != this && hasCachedSelection()) #endif return directionString(m_cachedSelectionDirection); return directionString(computeSelectionDirection()); }
PassRefPtr<Range> HTMLTextFormControlElement::selection() const { #if defined(S_CLEAR_SELECTION_ONAUTOFOCUS) if (!renderer() || !isTextFormControl()) #else if (!renderer() || !isTextFormControl() || !hasCachedSelection()) #endif return 0; int start = m_cachedSelectionStart; int end = m_cachedSelectionEnd; ASSERT(start <= end); HTMLElement* innerText = innerTextElement(); if (!innerText) return 0; if (!innerText->firstChild()) return Range::create(document(), innerText, 0, innerText, 0); int offset = 0; Node* startNode = 0; Node* endNode = 0; for (Node* node = innerText->firstChild(); node; node = NodeTraversal::next(*node, innerText)) { ASSERT(!node->firstChild()); ASSERT(node->isTextNode() || node->hasTagName(brTag)); int length = node->isTextNode() ? lastOffsetInNode(node) : 1; if (offset <= start && start <= offset + length) setContainerAndOffsetForRange(node, start - offset, startNode, start); if (offset <= end && end <= offset + length) { setContainerAndOffsetForRange(node, end - offset, endNode, end); break; } offset += length; } if (!startNode || !endNode) return 0; return Range::create(document(), startNode, start, endNode, end); }
void HTMLTextAreaElement::updateFocusAppearance(bool restorePreviousSelection) { ASSERT(renderer()); ASSERT(!document()->childNeedsAndNotInStyleRecalc()); if (!restorePreviousSelection || !hasCachedSelection()) { #if ENABLE(ON_FIRST_TEXTAREA_FOCUS_SELECT_ALL) // Devices with trackballs or d-pads may focus on a textarea in route // to another focusable node. By selecting all text, the next movement // can more readily be interpreted as moving to the next node. select(); #else // If this is the first focus, set a caret at the beginning of the text. // This matches some browsers' behavior; see bug 11746 Comment #15. // http://bugs.webkit.org/show_bug.cgi?id=11746#c15 setSelectionRange(0, 0); #endif } else restoreCachedSelection(); if (document()->frame()) document()->frame()->selection()->revealSelection(); }