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

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

Issue 258063005: Blink does not respect input.selectionStart and input.selectionEnd for some cases (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 7 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 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 272
273 void HTMLTextFormControlElement::setSelectionRange(int start, int end, TextField SelectionDirection direction) 273 void HTMLTextFormControlElement::setSelectionRange(int start, int end, TextField SelectionDirection direction)
274 { 274 {
275 document().updateLayoutIgnorePendingStylesheets(); 275 document().updateLayoutIgnorePendingStylesheets();
276 276
277 if (!renderer() || !renderer()->isTextControl()) 277 if (!renderer() || !renderer()->isTextControl())
278 return; 278 return;
279 279
280 end = max(end, 0); 280 end = max(end, 0);
281 start = min(max(start, 0), end); 281 start = min(max(start, 0), end);
282 cacheSelection(start, end, direction);
tkent 2014/04/29 23:55:44 What happens if |start| or |end| is larger than va
harpreet.sk 2014/04/30 14:36:27 The browser will displays the caret at end of the
282 283
283 if (!hasVisibleTextArea(renderer(), innerTextElement())) { 284 if (!hasVisibleTextArea(renderer(), innerTextElement()))
284 cacheSelection(start, end, direction);
285 return; 285 return;
286 }
287 VisiblePosition startPosition = visiblePositionForIndex(start); 286 VisiblePosition startPosition = visiblePositionForIndex(start);
288 VisiblePosition endPosition; 287 VisiblePosition endPosition;
289 if (start == end) 288 if (start == end)
290 endPosition = startPosition; 289 endPosition = startPosition;
291 else 290 else
292 endPosition = visiblePositionForIndex(end); 291 endPosition = visiblePositionForIndex(end);
293 292
294 // startPosition and endPosition can be null position for example when 293 // startPosition and endPosition can be null position for example when
295 // "-webkit-user-select: none" style attribute is specified. 294 // "-webkit-user-select: none" style attribute is specified.
296 if (startPosition.isNotNull() && endPosition.isNotNull()) { 295 if (startPosition.isNotNull() && endPosition.isNotNull()) {
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
465 void HTMLTextFormControlElement::restoreCachedSelection() 464 void HTMLTextFormControlElement::restoreCachedSelection()
466 { 465 {
467 setSelectionRange(m_cachedSelectionStart, m_cachedSelectionEnd, m_cachedSele ctionDirection); 466 setSelectionRange(m_cachedSelectionStart, m_cachedSelectionEnd, m_cachedSele ctionDirection);
468 } 467 }
469 468
470 void HTMLTextFormControlElement::selectionChanged(bool userTriggered) 469 void HTMLTextFormControlElement::selectionChanged(bool userTriggered)
471 { 470 {
472 if (!renderer() || !isTextFormControl()) 471 if (!renderer() || !isTextFormControl())
473 return; 472 return;
474 473
475 // selectionStart() or selectionEnd() will return cached selection when this node doesn't have focus
476 cacheSelection(computeSelectionStart(), computeSelectionEnd(), computeSelect ionDirection());
477
478 if (LocalFrame* frame = document().frame()) { 474 if (LocalFrame* frame = document().frame()) {
479 if (frame->selection().isRange() && userTriggered) 475 if (frame->selection().isRange() && userTriggered)
480 dispatchEvent(Event::createBubble(EventTypeNames::select)); 476 dispatchEvent(Event::createBubble(EventTypeNames::select));
481 } 477 }
482 } 478 }
483 479
484 void HTMLTextFormControlElement::parseAttribute(const QualifiedName& name, const AtomicString& value) 480 void HTMLTextFormControlElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
485 { 481 {
486 if (name == placeholderAttr) { 482 if (name == placeholderAttr) {
487 updatePlaceholderVisibility(true); 483 updatePlaceholderVisibility(true);
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
645 641
646 return "ltr"; 642 return "ltr";
647 } 643 }
648 644
649 HTMLElement* HTMLTextFormControlElement::innerTextElement() const 645 HTMLElement* HTMLTextFormControlElement::innerTextElement() const
650 { 646 {
651 return toHTMLElement(userAgentShadowRoot()->getElementById(ShadowElementName s::innerEditor())); 647 return toHTMLElement(userAgentShadowRoot()->getElementById(ShadowElementName s::innerEditor()));
652 } 648 }
653 649
654 } // namespace Webcore 650 } // namespace Webcore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698