Chromium Code Reviews| Index: third_party/WebKit/Source/core/html/HTMLSelectElement.cpp |
| diff --git a/third_party/WebKit/Source/core/html/HTMLSelectElement.cpp b/third_party/WebKit/Source/core/html/HTMLSelectElement.cpp |
| index fb05114875a508c4c3fd98fa59cbac3554bfbe50..af2b74f47a8837583d2bc1572ebda4d74036c3c2 100644 |
| --- a/third_party/WebKit/Source/core/html/HTMLSelectElement.cpp |
| +++ b/third_party/WebKit/Source/core/html/HTMLSelectElement.cpp |
| @@ -644,8 +644,8 @@ void HTMLSelectElement::saveListboxActiveSelection() |
| // m_activeSelectionEndIndex = 3, options at 1-3 indices are selected. |
| // updateListBoxSelection needs to clear selection of the fifth OPTION. |
| m_cachedStateForActiveSelection.resize(0); |
| - for (auto& element : listItems()) { |
| - m_cachedStateForActiveSelection.append(isHTMLOptionElement(*element) && toHTMLOptionElement(element)->selected()); |
| + for (const auto& option : optionList()) { |
| + m_cachedStateForActiveSelection.append(option->selected()); |
| } |
| } |
| @@ -659,27 +659,27 @@ void HTMLSelectElement::updateListBoxSelection(bool deselectOtherOptions, bool s |
| ASSERT(layoutObject()); |
| ASSERT(layoutObject()->isListBox() || m_multiple); |
| - int activeSelectionAnchorIndex = m_activeSelectionAnchor ? m_activeSelectionAnchor->listIndex() : -1; |
| - int activeSelectionEndIndex = m_activeSelectionEnd ? m_activeSelectionEnd->listIndex() : -1; |
| + int activeSelectionAnchorIndex = m_activeSelectionAnchor ? m_activeSelectionAnchor->index() : -1; |
| + int activeSelectionEndIndex = m_activeSelectionEnd ? m_activeSelectionEnd->index() : -1; |
| int start = std::min(activeSelectionAnchorIndex, activeSelectionEndIndex); |
| int end = std::max(activeSelectionAnchorIndex, activeSelectionEndIndex); |
| - const ListItems& items = listItems(); |
| - for (int i = 0; i < static_cast<int>(items.size()); ++i) { |
| - if (!isHTMLOptionElement(*items[i])) |
| - continue; |
| - HTMLOptionElement& option = toHTMLOptionElement(*items[i]); |
| - if (option.isDisabledFormControl() || !option.layoutObject()) |
| + int i = 0; |
| + for (const auto& option : optionList()) { |
| + if (option->isDisabledFormControl() || !option->layoutObject()) { |
| + ++i; |
| continue; |
| + } |
| if (i >= start && i <= end) { |
| - option.setSelectedState(m_activeSelectionState); |
| - option.setDirty(true); |
| + option->setSelectedState(m_activeSelectionState); |
| + option->setDirty(true); |
| } else if (deselectOtherOptions || i >= static_cast<int>(m_cachedStateForActiveSelection.size())) { |
| - option.setSelectedState(false); |
| - option.setDirty(true); |
| + option->setSelectedState(false); |
| + option->setDirty(true); |
| } else { |
| - option.setSelectedState(m_cachedStateForActiveSelection[i]); |
| + option->setSelectedState(m_cachedStateForActiveSelection[i]); |
| } |
| + ++i; |
| } |
| setNeedsValidityCheck(); |
| @@ -770,54 +770,12 @@ void HTMLSelectElement::invalidateSelectedItems() |
| collection->invalidateCache(); |
| } |
| -void HTMLSelectElement::setRecalcListItems(HTMLElement& subject) |
| +void HTMLSelectElement::setRecalcListItems() |
| { |
| // FIXME: This function does a bunch of confusing things depending on if it |
| // is in the document or not. |
| - bool shouldRecalc = true; |
| - if (!m_shouldRecalcListItems && !isHTMLOptGroupElement(subject)) { |
| - if (firstChild() == &subject) { |
| - // The subject was prepended. This doesn't handle elements in an |
| - // OPTGROUP. |
| - DCHECK(m_listItems.size() == 0 || m_listItems[0] != &subject); |
| - m_listItems.prepend(&subject); |
| - shouldRecalc = false; |
| - } else if (lastChild() == &subject) { |
| - // The subject was appended. This doesn't handle elements in an |
| - // OPTGROUP. |
| - DCHECK(m_listItems.size() == 0 || m_listItems.last() != &subject); |
| - m_listItems.append(&subject); |
| - shouldRecalc = false; |
| - } else if (!subject.isDescendantOf(this)) { |
| - // |subject| was removed from this. This logic works well with |
| - // SELECT children and OPTGROUP children. |
| - |
| - // m_listItems might be empty, or might not have the OPTION. |
| - // 1. Remove an OPTGROUP with OPTION children from a SELECT. |
| - // 2. This function is called for the OPTGROUP removal. |
| - // 3. m_shouldRecalcListItems becomes true. |
| - // 4. recalcListItems() happens. m_listItems has no OPTGROUP and |
| - // no its children. m_shouldRecalcListItems becomes false. |
| - // 5. This function is called for the removal of an OPTION child |
| - // of the OPTGROUP. |
| - if (m_listItems.size() > 0) { |
| - size_t index; |
| - // Avoid Vector::find() in typical cases. |
| - if (m_listItems.first() == &subject) |
| - index = 0; |
| - else if (m_listItems.last() == &subject) |
| - index = m_listItems.size() - 1; |
| - else |
| - index = m_listItems.find(&subject); |
| - if (index != WTF::kNotFound) { |
| - m_listItems.remove(index); |
| - shouldRecalc = false; |
| - } |
| - } |
| - } |
| - } |
| - m_shouldRecalcListItems = shouldRecalc; |
| + m_shouldRecalcListItems = true; |
| setOptionsChangedOnLayoutObject(); |
| if (!inShadowIncludingDocument()) { |
| @@ -918,9 +876,9 @@ void HTMLSelectElement::resetToDefaultSelection(ResetReason reason) |
| HTMLOptionElement* HTMLSelectElement::selectedOption() const |
| { |
| - for (const auto& element : listItems()) { |
| - if (isHTMLOptionElement(*element) && toHTMLOptionElement(*element).selected()) |
| - return toHTMLOptionElement(element); |
| + for (const auto option : optionList()) { |
|
keishi
2016/07/11 02:00:39
&?
tkent
2016/07/11 02:12:32
& is not used intentionally. If we add & here, com
|
| + if (option->selected()) |
| + return option; |
| } |
| return nullptr; |
| } |
| @@ -1004,7 +962,7 @@ void HTMLSelectElement::optionSelectionStateChanged(HTMLOptionElement* option, b |
| void HTMLSelectElement::optionInserted(HTMLOptionElement& option, bool optionIsSelected) |
| { |
| ASSERT(option.ownerSelectElement() == this); |
| - setRecalcListItems(option); |
| + setRecalcListItems(); |
| if (optionIsSelected) { |
| selectOption(&option, multiple() ? 0 : DeselectOtherOptions); |
| } else { |
| @@ -1018,7 +976,7 @@ void HTMLSelectElement::optionInserted(HTMLOptionElement& option, bool optionIsS |
| void HTMLSelectElement::optionRemoved(HTMLOptionElement& option) |
| { |
| - setRecalcListItems(option); |
| + setRecalcListItems(); |
| if (option.selected()) |
| resetToDefaultSelection(ResetReasonSelectedOptionRemoved); |
| else if (!m_lastOnChangeOption) |
| @@ -1041,14 +999,14 @@ void HTMLSelectElement::optionRemoved(HTMLOptionElement& option) |
| void HTMLSelectElement::optGroupInsertedOrRemoved(HTMLOptGroupElement& optgroup) |
| { |
| - setRecalcListItems(optgroup); |
| + setRecalcListItems(); |
| setNeedsValidityCheck(); |
| m_lastOnChangeSelection.clear(); |
| } |
| void HTMLSelectElement::hrInsertedOrRemoved(HTMLHRElement& hr) |
| { |
| - setRecalcListItems(hr); |
| + setRecalcListItems(); |
| m_lastOnChangeSelection.clear(); |
| } |
| @@ -1174,15 +1132,15 @@ void HTMLSelectElement::dispatchBlurEvent(Element* newFocusedElement, WebFocusTy |
| HTMLFormControlElementWithState::dispatchBlurEvent(newFocusedElement, type, sourceCapabilities); |
| } |
| -void HTMLSelectElement::deselectItemsWithoutValidation(HTMLElement* excludeElement) |
| +void HTMLSelectElement::deselectItemsWithoutValidation(HTMLOptionElement* excludeElement) |
| { |
| if (!multiple() && usesMenuList() && m_lastOnChangeOption && m_lastOnChangeOption != excludeElement) { |
| m_lastOnChangeOption->setSelectedState(false); |
| return; |
| } |
| - for (auto& element : listItems()) { |
| - if (element != excludeElement && isHTMLOptionElement(*element)) |
| - toHTMLOptionElement(element)->setSelectedState(false); |
| + for (const auto& option : optionList()) { |
| + if (option != excludeElement) |
| + option->setSelectedState(false); |
| } |
| } |