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

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

Issue 189543012: Update <select> when any of its <option> children has "display: none" (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase + Layout Testcase Created 6 years, 9 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) 2010 Nokia Corporation and/or its subsidiary(-ies). 2 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
3 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 3 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
4 * (C) 1999 Antti Koivisto (koivisto@kde.org) 4 * (C) 1999 Antti Koivisto (koivisto@kde.org)
5 * (C) 2001 Dirk Mueller (mueller@kde.org) 5 * (C) 2001 Dirk Mueller (mueller@kde.org)
6 * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010, 2011 Apple Inc. All rights reserved. 6 * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010, 2011 Apple Inc. All rights reserved.
7 * (C) 2006 Alexey Proskuryakov (ap@nypop.com) 7 * (C) 2006 Alexey Proskuryakov (ap@nypop.com)
8 * Copyright (C) 2010 Google Inc. All rights reserved. 8 * Copyright (C) 2010 Google Inc. All rights reserved.
9 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) 9 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/)
10 * 10 *
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 , m_typeAhead(this) 67 , m_typeAhead(this)
68 , m_size(0) 68 , m_size(0)
69 , m_lastOnChangeIndex(-1) 69 , m_lastOnChangeIndex(-1)
70 , m_activeSelectionAnchorIndex(-1) 70 , m_activeSelectionAnchorIndex(-1)
71 , m_activeSelectionEndIndex(-1) 71 , m_activeSelectionEndIndex(-1)
72 , m_isProcessingUserDrivenChange(false) 72 , m_isProcessingUserDrivenChange(false)
73 , m_multiple(false) 73 , m_multiple(false)
74 , m_activeSelectionState(false) 74 , m_activeSelectionState(false)
75 , m_shouldRecalcListItems(false) 75 , m_shouldRecalcListItems(false)
76 , m_suggestedIndex(-1) 76 , m_suggestedIndex(-1)
77 , m_optionChildChangedTimer(this, &HTMLSelectElement::timerFired)
77 { 78 {
78 ScriptWrappable::init(this); 79 ScriptWrappable::init(this);
79 } 80 }
80 81
81 PassRefPtr<HTMLSelectElement> HTMLSelectElement::create(Document& document) 82 PassRefPtr<HTMLSelectElement> HTMLSelectElement::create(Document& document)
82 { 83 {
83 return adoptRef(new HTMLSelectElement(document, 0)); 84 return adoptRef(new HTMLSelectElement(document, 0));
84 } 85 }
85 86
86 PassRefPtr<HTMLSelectElement> HTMLSelectElement::create(Document& document, HTML FormElement* form) 87 PassRefPtr<HTMLSelectElement> HTMLSelectElement::create(Document& document, HTML FormElement* form)
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after
501 // Otherwise, it returns |listIndex|. 502 // Otherwise, it returns |listIndex|.
502 // Valid means that it is enabled and an option element. 503 // Valid means that it is enabled and an option element.
503 int HTMLSelectElement::nextValidIndex(int listIndex, SkipDirection direction, in t skip) const 504 int HTMLSelectElement::nextValidIndex(int listIndex, SkipDirection direction, in t skip) const
504 { 505 {
505 ASSERT(direction == -1 || direction == 1); 506 ASSERT(direction == -1 || direction == 1);
506 const Vector<HTMLElement*>& listItems = this->listItems(); 507 const Vector<HTMLElement*>& listItems = this->listItems();
507 int lastGoodIndex = listIndex; 508 int lastGoodIndex = listIndex;
508 int size = listItems.size(); 509 int size = listItems.size();
509 for (listIndex += direction; listIndex >= 0 && listIndex < size; listIndex + = direction) { 510 for (listIndex += direction; listIndex >= 0 && listIndex < size; listIndex + = direction) {
510 --skip; 511 --skip;
511 if (!listItems[listIndex]->isDisabledFormControl() && isHTMLOptionElemen t(*listItems[listIndex])) { 512 HTMLElement* element = listItems[listIndex];
512 lastGoodIndex = listIndex; 513 if (!isHTMLOptionElement(*element) || toHTMLOptionElement(element)->isDi sabledFormControl() || !toHTMLOptionElement(element)->isDisplayNone())
513 if (skip <= 0) 514 continue;
514 break; 515 lastGoodIndex = listIndex;
515 } 516 if (skip <= 0)
517 break;
516 } 518 }
517 return lastGoodIndex; 519 return lastGoodIndex;
518 } 520 }
519 521
520 int HTMLSelectElement::nextSelectableListIndex(int startIndex) const 522 int HTMLSelectElement::nextSelectableListIndex(int startIndex) const
521 { 523 {
522 return nextValidIndex(startIndex, SkipForwards, 1); 524 return nextValidIndex(startIndex, SkipForwards, 1);
523 } 525 }
524 526
525 int HTMLSelectElement::previousSelectableListIndex(int startIndex) const 527 int HTMLSelectElement::previousSelectableListIndex(int startIndex) const
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
618 { 620 {
619 ASSERT(renderer() && (renderer()->isListBox() || m_multiple)); 621 ASSERT(renderer() && (renderer()->isListBox() || m_multiple));
620 ASSERT(!listItems().size() || m_activeSelectionAnchorIndex >= 0); 622 ASSERT(!listItems().size() || m_activeSelectionAnchorIndex >= 0);
621 623
622 unsigned start = min(m_activeSelectionAnchorIndex, m_activeSelectionEndIndex ); 624 unsigned start = min(m_activeSelectionAnchorIndex, m_activeSelectionEndIndex );
623 unsigned end = max(m_activeSelectionAnchorIndex, m_activeSelectionEndIndex); 625 unsigned end = max(m_activeSelectionAnchorIndex, m_activeSelectionEndIndex);
624 626
625 const Vector<HTMLElement*>& items = listItems(); 627 const Vector<HTMLElement*>& items = listItems();
626 for (unsigned i = 0; i < items.size(); ++i) { 628 for (unsigned i = 0; i < items.size(); ++i) {
627 HTMLElement* element = items[i]; 629 HTMLElement* element = items[i];
628 if (!isHTMLOptionElement(*element) || toHTMLOptionElement(element)->isDi sabledFormControl()) 630 if (!isHTMLOptionElement(*element) || toHTMLOptionElement(element)->isDi sabledFormControl() || !toHTMLOptionElement(element)->isDisplayNone())
629 continue; 631 continue;
630 632
631 if (i >= start && i <= end) 633 if (i >= start && i <= end)
632 toHTMLOptionElement(element)->setSelectedState(m_activeSelectionStat e); 634 toHTMLOptionElement(element)->setSelectedState(m_activeSelectionStat e);
633 else if (deselectOtherOptions || i >= m_cachedStateForActiveSelection.si ze()) 635 else if (deselectOtherOptions || i >= m_cachedStateForActiveSelection.si ze())
634 toHTMLOptionElement(element)->setSelectedState(false); 636 toHTMLOptionElement(element)->setSelectedState(false);
635 else 637 else
636 toHTMLOptionElement(element)->setSelectedState(m_cachedStateForActiv eSelection[i]); 638 toHTMLOptionElement(element)->setSelectedState(m_cachedStateForActiv eSelection[i]);
637 } 639 }
638 640
(...skipping 978 matching lines...) Expand 10 before | Expand all | Expand 10 after
1617 bool HTMLSelectElement::isInteractiveContent() const 1619 bool HTMLSelectElement::isInteractiveContent() const
1618 { 1620 {
1619 return true; 1621 return true;
1620 } 1622 }
1621 1623
1622 bool HTMLSelectElement::supportsAutofocus() const 1624 bool HTMLSelectElement::supportsAutofocus() const
1623 { 1625 {
1624 return true; 1626 return true;
1625 } 1627 }
1626 1628
1629 void HTMLSelectElement::updateListOnRenderer()
1630 {
1631 if (m_optionChildChangedTimer.isActive())
1632 return;
1633 ASSERT(!m_optionChildChangedTimer.isActive());
1634 m_optionChildChangedTimer.startOneShot(0, FROM_HERE);
esprehn 2014/03/20 17:09:25 This is not correct, you can't use a timer.
spartha 2014/03/21 21:37:36 Just curious, when is it recommended to use a time
1635 }
1636
1637 void HTMLSelectElement::timerFired(Timer<HTMLSelectElement>* )
1638 {
1639 setOptionsChangedOnRenderer();
1640 // Update the renderer with the new list.
1641 if (RenderObject* renderer = this->renderer())
1642 renderer->updateFromElement();
1643 }
1644
1627 } // namespace 1645 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698