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

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: Created 6 years, 8 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 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 { 77 {
78 ScriptWrappable::init(this); 78 ScriptWrappable::init(this);
79 setHasCustomStyleCallbacks();
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)
87 { 88 {
88 return adoptRef(new HTMLSelectElement(document, form)); 89 return adoptRef(new HTMLSelectElement(document, form));
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after
514 // Otherwise, it returns |listIndex|. 515 // Otherwise, it returns |listIndex|.
515 // Valid means that it is enabled and an option element. 516 // Valid means that it is enabled and an option element.
516 int HTMLSelectElement::nextValidIndex(int listIndex, SkipDirection direction, in t skip) const 517 int HTMLSelectElement::nextValidIndex(int listIndex, SkipDirection direction, in t skip) const
517 { 518 {
518 ASSERT(direction == -1 || direction == 1); 519 ASSERT(direction == -1 || direction == 1);
519 const Vector<HTMLElement*>& listItems = this->listItems(); 520 const Vector<HTMLElement*>& listItems = this->listItems();
520 int lastGoodIndex = listIndex; 521 int lastGoodIndex = listIndex;
521 int size = listItems.size(); 522 int size = listItems.size();
522 for (listIndex += direction; listIndex >= 0 && listIndex < size; listIndex + = direction) { 523 for (listIndex += direction; listIndex >= 0 && listIndex < size; listIndex + = direction) {
523 --skip; 524 --skip;
524 if (!listItems[listIndex]->isDisabledFormControl() && isHTMLOptionElemen t(*listItems[listIndex])) { 525 HTMLElement* element = listItems[listIndex];
525 lastGoodIndex = listIndex; 526 if (!isHTMLOptionElement(*element) || toHTMLOptionElement(element)->isDi sabledFormControl() || toHTMLOptionElement(element)->isDisplayNone())
526 if (skip <= 0) 527 continue;
527 break; 528 lastGoodIndex = listIndex;
528 } 529 if (skip <= 0)
530 break;
529 } 531 }
530 return lastGoodIndex; 532 return lastGoodIndex;
531 } 533 }
532 534
533 int HTMLSelectElement::nextSelectableListIndex(int startIndex) const 535 int HTMLSelectElement::nextSelectableListIndex(int startIndex) const
534 { 536 {
535 return nextValidIndex(startIndex, SkipForwards, 1); 537 return nextValidIndex(startIndex, SkipForwards, 1);
536 } 538 }
537 539
538 int HTMLSelectElement::previousSelectableListIndex(int startIndex) const 540 int HTMLSelectElement::previousSelectableListIndex(int startIndex) const
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
631 { 633 {
632 ASSERT(renderer() && (renderer()->isListBox() || m_multiple)); 634 ASSERT(renderer() && (renderer()->isListBox() || m_multiple));
633 ASSERT(!listItems().size() || m_activeSelectionAnchorIndex >= 0); 635 ASSERT(!listItems().size() || m_activeSelectionAnchorIndex >= 0);
634 636
635 unsigned start = min(m_activeSelectionAnchorIndex, m_activeSelectionEndIndex ); 637 unsigned start = min(m_activeSelectionAnchorIndex, m_activeSelectionEndIndex );
636 unsigned end = max(m_activeSelectionAnchorIndex, m_activeSelectionEndIndex); 638 unsigned end = max(m_activeSelectionAnchorIndex, m_activeSelectionEndIndex);
637 639
638 const Vector<HTMLElement*>& items = listItems(); 640 const Vector<HTMLElement*>& items = listItems();
639 for (unsigned i = 0; i < items.size(); ++i) { 641 for (unsigned i = 0; i < items.size(); ++i) {
640 HTMLElement* element = items[i]; 642 HTMLElement* element = items[i];
641 if (!isHTMLOptionElement(*element) || toHTMLOptionElement(element)->isDi sabledFormControl()) 643 if (!isHTMLOptionElement(*element) || toHTMLOptionElement(element)->isDi sabledFormControl() || toHTMLOptionElement(element)->isDisplayNone())
642 continue; 644 continue;
643 645
644 if (i >= start && i <= end) 646 if (i >= start && i <= end)
645 toHTMLOptionElement(element)->setSelectedState(m_activeSelectionStat e); 647 toHTMLOptionElement(element)->setSelectedState(m_activeSelectionStat e);
646 else if (deselectOtherOptions || i >= m_cachedStateForActiveSelection.si ze()) 648 else if (deselectOtherOptions || i >= m_cachedStateForActiveSelection.si ze())
647 toHTMLOptionElement(element)->setSelectedState(false); 649 toHTMLOptionElement(element)->setSelectedState(false);
648 else 650 else
649 toHTMLOptionElement(element)->setSelectedState(m_cachedStateForActiv eSelection[i]); 651 toHTMLOptionElement(element)->setSelectedState(m_cachedStateForActiv eSelection[i]);
650 } 652 }
651 653
(...skipping 993 matching lines...) Expand 10 before | Expand all | Expand 10 after
1645 bool HTMLSelectElement::isInteractiveContent() const 1647 bool HTMLSelectElement::isInteractiveContent() const
1646 { 1648 {
1647 return true; 1649 return true;
1648 } 1650 }
1649 1651
1650 bool HTMLSelectElement::supportsAutofocus() const 1652 bool HTMLSelectElement::supportsAutofocus() const
1651 { 1653 {
1652 return true; 1654 return true;
1653 } 1655 }
1654 1656
1657 void HTMLSelectElement::updateListOnRenderer()
1658 {
1659 setOptionsChangedOnRenderer();
1660 }
1661
1662 void HTMLSelectElement::didRecalcStyle(StyleRecalcChange)
1663 {
1664 if (RenderObject* renderer = this->renderer())
1665 renderer->updateFromElement();
1666 }
1667
1655 } // namespace 1668 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698