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

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

Issue 2277903003: Fix selectionDirection after setting value of TEXTAREA/INPUT. (Closed)
Patch Set: Revert DCHECK_LE Created 4 years, 3 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
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 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 setSelectionRange(newSelectionStart, newSelectionEnd, SelectionHasNoDirectio n); 263 setSelectionRange(newSelectionStart, newSelectionEnd, SelectionHasNoDirectio n);
264 } 264 }
265 265
266 void HTMLTextFormControlElement::setSelectionRangeForBinding(int start, int end, const String& directionString) 266 void HTMLTextFormControlElement::setSelectionRangeForBinding(int start, int end, const String& directionString)
267 { 267 {
268 TextFieldSelectionDirection direction = SelectionHasNoDirection; 268 TextFieldSelectionDirection direction = SelectionHasNoDirection;
269 if (directionString == "forward") 269 if (directionString == "forward")
270 direction = SelectionHasForwardDirection; 270 direction = SelectionHasForwardDirection;
271 else if (directionString == "backward") 271 else if (directionString == "backward")
272 direction = SelectionHasBackwardDirection; 272 direction = SelectionHasBackwardDirection;
273 273 setSelectionRange(start, end, direction);
274 if (direction == SelectionHasNoDirection && document().frame() && document() .frame()->editor().behavior().shouldConsiderSelectionAsDirectional())
275 direction = SelectionHasForwardDirection;
276
277 return setSelectionRange(start, end, direction);
278 } 274 }
279 275
280 static Position positionForIndex(HTMLElement* innerEditor, int index) 276 static Position positionForIndex(HTMLElement* innerEditor, int index)
281 { 277 {
282 DCHECK_GE(index, 0); 278 DCHECK_GE(index, 0);
283 if (index == 0) { 279 if (index == 0) {
284 Node* node = NodeTraversal::next(*innerEditor, innerEditor); 280 Node* node = NodeTraversal::next(*innerEditor, innerEditor);
285 if (node && node->isTextNode()) 281 if (node && node->isTextNode())
286 return Position(node, 0); 282 return Position(node, 0);
287 return Position(innerEditor, 0); 283 return Position(innerEditor, 0);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
344 } 340 }
345 341
346 void HTMLTextFormControlElement::setSelectionRange(int start, int end, TextField SelectionDirection direction, NeedToDispatchSelectEvent eventBehaviour) 342 void HTMLTextFormControlElement::setSelectionRange(int start, int end, TextField SelectionDirection direction, NeedToDispatchSelectEvent eventBehaviour)
347 { 343 {
348 if (openShadowRoot() || !isTextFormControl()) 344 if (openShadowRoot() || !isTextFormControl())
349 return; 345 return;
350 const int editorValueLength = static_cast<int>(innerEditorValue().length()); 346 const int editorValueLength = static_cast<int>(innerEditorValue().length());
351 DCHECK_GE(editorValueLength, 0); 347 DCHECK_GE(editorValueLength, 0);
352 end = std::max(std::min(end, editorValueLength), 0); 348 end = std::max(std::min(end, editorValueLength), 0);
353 start = std::min(std::max(start, 0), end); 349 start = std::min(std::max(start, 0), end);
350 LocalFrame* frame = document().frame();
351 if (direction == SelectionHasNoDirection && frame && frame->editor().behavio r().shouldConsiderSelectionAsDirectional())
352 direction = SelectionHasForwardDirection;
354 cacheSelection(start, end, direction); 353 cacheSelection(start, end, direction);
355 354
356 if (document().focusedElement() != this) { 355 if (document().focusedElement() != this) {
357 if (eventBehaviour == DispatchSelectEvent) 356 if (eventBehaviour == DispatchSelectEvent)
358 scheduleSelectEvent(); 357 scheduleSelectEvent();
359 return; 358 return;
360 } 359 }
361 360
362 LocalFrame* frame = document().frame();
363 HTMLElement* innerEditor = innerEditorElement(); 361 HTMLElement* innerEditor = innerEditorElement();
364 if (!frame || !innerEditor) 362 if (!frame || !innerEditor)
365 return; 363 return;
366 364
367 Position startPosition = positionForIndex(innerEditor, start); 365 Position startPosition = positionForIndex(innerEditor, start);
368 Position endPosition = start == end ? startPosition : positionForIndex(inner Editor, end); 366 Position endPosition = start == end ? startPosition : positionForIndex(inner Editor, end);
369 367
370 DCHECK_EQ(start, indexForPosition(innerEditor, startPosition)); 368 DCHECK_EQ(start, indexForPosition(innerEditor, startPosition));
371 DCHECK_EQ(end, indexForPosition(innerEditor, endPosition)); 369 DCHECK_EQ(end, indexForPosition(innerEditor, endPosition));
372 370
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
464 case SelectionHasBackwardDirection: 462 case SelectionHasBackwardDirection:
465 return backward; 463 return backward;
466 } 464 }
467 465
468 NOTREACHED(); 466 NOTREACHED();
469 return none; 467 return none;
470 } 468 }
471 469
472 const AtomicString& HTMLTextFormControlElement::selectionDirection() const 470 const AtomicString& HTMLTextFormControlElement::selectionDirection() const
473 { 471 {
474 if (!isTextFormControl()) 472 // Ensured by HTMLInputElement::selectionDirectionForBinding().
475 return directionString(SelectionHasNoDirection); 473 DCHECK(isTextFormControl());
476 if (document().focusedElement() != this) 474 if (document().focusedElement() != this)
477 return directionString(m_cachedSelectionDirection); 475 return directionString(m_cachedSelectionDirection);
478
479 return directionString(computeSelectionDirection()); 476 return directionString(computeSelectionDirection());
480 } 477 }
481 478
482 TextFieldSelectionDirection HTMLTextFormControlElement::computeSelectionDirectio n() const 479 TextFieldSelectionDirection HTMLTextFormControlElement::computeSelectionDirectio n() const
483 { 480 {
484 DCHECK(isTextFormControl()); 481 DCHECK(isTextFormControl());
485 LocalFrame* frame = document().frame(); 482 LocalFrame* frame = document().frame();
486 if (!frame) 483 if (!frame)
487 return SelectionHasNoDirection; 484 return SelectionHasNoDirection;
488 485
(...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after
1024 } 1021 }
1025 1022
1026 void HTMLTextFormControlElement::copyNonAttributePropertiesFromElement(const Ele ment& source) 1023 void HTMLTextFormControlElement::copyNonAttributePropertiesFromElement(const Ele ment& source)
1027 { 1024 {
1028 const HTMLTextFormControlElement& sourceElement = static_cast<const HTMLText FormControlElement&>(source); 1025 const HTMLTextFormControlElement& sourceElement = static_cast<const HTMLText FormControlElement&>(source);
1029 m_lastChangeWasUserEdit = sourceElement.m_lastChangeWasUserEdit; 1026 m_lastChangeWasUserEdit = sourceElement.m_lastChangeWasUserEdit;
1030 HTMLFormControlElement::copyNonAttributePropertiesFromElement(source); 1027 HTMLFormControlElement::copyNonAttributePropertiesFromElement(source);
1031 } 1028 }
1032 1029
1033 } // namespace blink 1030 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698