Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(255)

Side by Side Diff: Source/core/html/HTMLTextFormControlElement.cpp

Issue 404483002: Revert of "Blink does not respect input.selectionStart and input.selectionEnd for some cases" (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Dirk Mueller (mueller@kde.org) 4 * (C) 2001 Dirk Mueller (mueller@kde.org)
5 * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. 5 * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
6 * (C) 2006 Alexey Proskuryakov (ap@nypop.com) 6 * (C) 2006 Alexey Proskuryakov (ap@nypop.com)
7 * 7 *
8 * This library is free software; you can redistribute it and/or 8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public 9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 return setSelectionRange(start, end, direction); 277 return setSelectionRange(start, end, direction);
278 } 278 }
279 279
280 void HTMLTextFormControlElement::setSelectionRange(int start, int end, TextField SelectionDirection direction) 280 void HTMLTextFormControlElement::setSelectionRange(int start, int end, TextField SelectionDirection direction)
281 { 281 {
282 document().updateLayoutIgnorePendingStylesheets(); 282 document().updateLayoutIgnorePendingStylesheets();
283 283
284 if (!renderer() || !renderer()->isTextControl()) 284 if (!renderer() || !renderer()->isTextControl())
285 return; 285 return;
286 286
287 int textLength = innerEditorValue().length(); 287 end = std::max(end, 0);
288 end = std::max(std::min(end, textLength), 0); 288 start = std::min(std::max(start, 0), end);
289 start = std::max(std::min(start, end), 0);
290 cacheSelection(start, end, direction);
291 bool isCaretSelection = start == end;
292 bool shouldSetSelection = document().focusedElement() == this || (!isCaretSe lection && start < textLength);
293 289
294 if (!hasVisibleTextArea(renderer(), innerEditorElement())) 290 if (!hasVisibleTextArea(renderer(), innerEditorElement())) {
291 cacheSelection(start, end, direction);
295 return; 292 return;
296 293 }
297 LocalFrame* frame = document().frame();
298
299 if (!frame || !shouldSetSelection)
300 return;
301
302 VisiblePosition startPosition = visiblePositionForIndex(start); 294 VisiblePosition startPosition = visiblePositionForIndex(start);
303 VisiblePosition endPosition; 295 VisiblePosition endPosition;
304 if (start == end) 296 if (start == end)
305 endPosition = startPosition; 297 endPosition = startPosition;
306 else 298 else
307 endPosition = visiblePositionForIndex(end); 299 endPosition = visiblePositionForIndex(end);
308 300
309 // startPosition and endPosition can be null position for example when 301 // startPosition and endPosition can be null position for example when
310 // "-webkit-user-select: none" style attribute is specified. 302 // "-webkit-user-select: none" style attribute is specified.
311 if (startPosition.isNotNull() && endPosition.isNotNull()) { 303 if (startPosition.isNotNull() && endPosition.isNotNull()) {
312 ASSERT(startPosition.deepEquivalent().deprecatedNode()->shadowHost() == this 304 ASSERT(startPosition.deepEquivalent().deprecatedNode()->shadowHost() == this
313 && endPosition.deepEquivalent().deprecatedNode()->shadowHost() == th is); 305 && endPosition.deepEquivalent().deprecatedNode()->shadowHost() == th is);
314 } 306 }
315 VisibleSelection newSelection; 307 VisibleSelection newSelection;
316 if (direction == SelectionHasBackwardDirection) 308 if (direction == SelectionHasBackwardDirection)
317 newSelection = VisibleSelection(endPosition, startPosition); 309 newSelection = VisibleSelection(endPosition, startPosition);
318 else 310 else
319 newSelection = VisibleSelection(startPosition, endPosition); 311 newSelection = VisibleSelection(startPosition, endPosition);
320 newSelection.setIsDirectional(direction != SelectionHasNoDirection); 312 newSelection.setIsDirectional(direction != SelectionHasNoDirection);
321 313
322 frame->selection().setSelection(newSelection); 314 if (LocalFrame* frame = document().frame())
315 frame->selection().setSelection(newSelection);
323 } 316 }
324 317
325 VisiblePosition HTMLTextFormControlElement::visiblePositionForIndex(int index) c onst 318 VisiblePosition HTMLTextFormControlElement::visiblePositionForIndex(int index) c onst
326 { 319 {
327 if (index <= 0) 320 if (index <= 0)
328 return VisiblePosition(firstPositionInNode(innerEditorElement()), DOWNST REAM); 321 return VisiblePosition(firstPositionInNode(innerEditorElement()), DOWNST REAM);
329 RefPtrWillBeRawPtr<Range> range = Range::create(document()); 322 RefPtrWillBeRawPtr<Range> range = Range::create(document());
330 range->selectNodeContents(innerEditorElement(), ASSERT_NO_EXCEPTION); 323 range->selectNodeContents(innerEditorElement(), ASSERT_NO_EXCEPTION);
331 CharacterIterator it(range.get()); 324 CharacterIterator it(range.get());
332 it.advance(index - 1); 325 it.advance(index - 1);
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
479 void HTMLTextFormControlElement::restoreCachedSelection() 472 void HTMLTextFormControlElement::restoreCachedSelection()
480 { 473 {
481 setSelectionRange(m_cachedSelectionStart, m_cachedSelectionEnd, m_cachedSele ctionDirection); 474 setSelectionRange(m_cachedSelectionStart, m_cachedSelectionEnd, m_cachedSele ctionDirection);
482 } 475 }
483 476
484 void HTMLTextFormControlElement::selectionChanged(bool userTriggered) 477 void HTMLTextFormControlElement::selectionChanged(bool userTriggered)
485 { 478 {
486 if (!renderer() || !isTextFormControl()) 479 if (!renderer() || !isTextFormControl())
487 return; 480 return;
488 481
489 if (document().focusedElement() == this) 482 // selectionStart() or selectionEnd() will return cached selection when this node doesn't have focus
490 cacheSelection(computeSelectionStart(), computeSelectionEnd(), computeSe lectionDirection()); 483 cacheSelection(computeSelectionStart(), computeSelectionEnd(), computeSelect ionDirection());
491 484
492 if (LocalFrame* frame = document().frame()) { 485 if (LocalFrame* frame = document().frame()) {
493 if (frame->selection().isRange() && userTriggered) 486 if (frame->selection().isRange() && userTriggered)
494 dispatchEvent(Event::createBubble(EventTypeNames::select)); 487 dispatchEvent(Event::createBubble(EventTypeNames::select));
495 } 488 }
496 } 489 }
497 490
498 void HTMLTextFormControlElement::parseAttribute(const QualifiedName& name, const AtomicString& value) 491 void HTMLTextFormControlElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
499 { 492 {
500 if (name == placeholderAttr) { 493 if (name == placeholderAttr) {
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after
901 Text* textNode = toText(node); 894 Text* textNode = toText(node);
902 size_t firstLineBreak = textNode->data().find('\n', isPivotNode ? pi votPosition.offsetInContainerNode() : 0); 895 size_t firstLineBreak = textNode->data().find('\n', isPivotNode ? pi votPosition.offsetInContainerNode() : 0);
903 if (firstLineBreak != kNotFound) 896 if (firstLineBreak != kNotFound)
904 return Position(textNode, firstLineBreak + 1); 897 return Position(textNode, firstLineBreak + 1);
905 } 898 }
906 } 899 }
907 return endOfInnerText(textFormControl); 900 return endOfInnerText(textFormControl);
908 } 901 }
909 902
910 } // namespace Webcore 903 } // namespace Webcore
OLDNEW
« no previous file with comments | « LayoutTests/platform/win/fast/repaint/subtree-root-skipped-expected.txt ('k') | Source/core/html/forms/TextFieldInputType.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698