| OLD | NEW |
| 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 | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010, 2011 Apple Inc. All rights |
| 7 * reserved. | 7 * reserved. |
| 8 * (C) 2006 Alexey Proskuryakov (ap@nypop.com) | 8 * (C) 2006 Alexey Proskuryakov (ap@nypop.com) |
| 9 * Copyright (C) 2010 Google Inc. All rights reserved. | 9 * Copyright (C) 2010 Google Inc. All rights reserved. |
| 10 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. | 10 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. |
| (...skipping 806 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 817 if (reason == ResetReasonSelectedOptionRemoved) { | 817 if (reason == ResetReasonSelectedOptionRemoved) { |
| 818 // There must be no selected OPTIONs. | 818 // There must be no selected OPTIONs. |
| 819 break; | 819 break; |
| 820 } | 820 } |
| 821 } | 821 } |
| 822 ++optionIndex; | 822 ++optionIndex; |
| 823 } | 823 } |
| 824 if (!lastSelectedOption && m_size <= 1 && | 824 if (!lastSelectedOption && m_size <= 1 && |
| 825 (!firstEnabledOption || | 825 (!firstEnabledOption || |
| 826 (firstEnabledOption && !firstEnabledOption->selected()))) { | 826 (firstEnabledOption && !firstEnabledOption->selected()))) { |
| 827 selectOption(firstEnabledOption, reason == ResetReasonSelectedOptionRemoved | 827 selectOption( |
| 828 ? 0 | 828 firstEnabledOption, |
| 829 : DeselectOtherOptions); | 829 reason == ResetReasonSelectedOptionRemoved ? 0 : DeselectOtherOptions); |
| 830 lastSelectedOption = firstEnabledOption; | 830 lastSelectedOption = firstEnabledOption; |
| 831 didChange = true; | 831 didChange = true; |
| 832 } | 832 } |
| 833 if (didChange) | 833 if (didChange) |
| 834 setNeedsValidityCheck(); | 834 setNeedsValidityCheck(); |
| 835 m_lastOnChangeOption = lastSelectedOption; | 835 m_lastOnChangeOption = lastSelectedOption; |
| 836 } | 836 } |
| 837 | 837 |
| 838 HTMLOptionElement* HTMLSelectElement::selectedOption() const { | 838 HTMLOptionElement* HTMLSelectElement::selectedOption() const { |
| 839 for (const auto option : optionList()) { | 839 for (const auto option : optionList()) { |
| (...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1306 else if (key == "PageUp") | 1306 else if (key == "PageUp") |
| 1307 option = nextValidOption(listIndex, SkipBackwards, 3); | 1307 option = nextValidOption(listIndex, SkipBackwards, 3); |
| 1308 else if (key == "Home") | 1308 else if (key == "Home") |
| 1309 option = nextValidOption(-1, SkipForwards, 1); | 1309 option = nextValidOption(-1, SkipForwards, 1); |
| 1310 else if (key == "End") | 1310 else if (key == "End") |
| 1311 option = nextValidOption(listItems.size(), SkipBackwards, 1); | 1311 option = nextValidOption(listItems.size(), SkipBackwards, 1); |
| 1312 else | 1312 else |
| 1313 handled = false; | 1313 handled = false; |
| 1314 | 1314 |
| 1315 if (handled && option) | 1315 if (handled && option) |
| 1316 selectOption(option, DeselectOtherOptions | MakeOptionDirty | | 1316 selectOption( |
| 1317 DispatchInputAndChangeEvent); | 1317 option, |
| 1318 DeselectOtherOptions | MakeOptionDirty | DispatchInputAndChangeEvent); |
| 1318 | 1319 |
| 1319 if (handled) | 1320 if (handled) |
| 1320 event->setDefaultHandled(); | 1321 event->setDefaultHandled(); |
| 1321 } | 1322 } |
| 1322 | 1323 |
| 1323 if (event->type() == EventTypeNames::keypress) { | 1324 if (event->type() == EventTypeNames::keypress) { |
| 1324 if (!layoutObject() || !event->isKeyboardEvent()) | 1325 if (!layoutObject() || !event->isKeyboardEvent()) |
| 1325 return; | 1326 return; |
| 1326 | 1327 |
| 1327 int keyCode = toKeyboardEvent(event)->keyCode(); | 1328 int keyCode = toKeyboardEvent(event)->keyCode(); |
| (...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1712 return option->displayLabel(); | 1713 return option->displayLabel(); |
| 1713 } | 1714 } |
| 1714 return String(); | 1715 return String(); |
| 1715 } | 1716 } |
| 1716 | 1717 |
| 1717 void HTMLSelectElement::typeAheadFind(KeyboardEvent* event) { | 1718 void HTMLSelectElement::typeAheadFind(KeyboardEvent* event) { |
| 1718 int index = m_typeAhead.handleEvent( | 1719 int index = m_typeAhead.handleEvent( |
| 1719 event, TypeAhead::MatchPrefix | TypeAhead::CycleFirstChar); | 1720 event, TypeAhead::MatchPrefix | TypeAhead::CycleFirstChar); |
| 1720 if (index < 0) | 1721 if (index < 0) |
| 1721 return; | 1722 return; |
| 1722 selectOption(optionAtListIndex(index), DeselectOtherOptions | | 1723 selectOption( |
| 1723 MakeOptionDirty | | 1724 optionAtListIndex(index), |
| 1724 DispatchInputAndChangeEvent); | 1725 DeselectOtherOptions | MakeOptionDirty | DispatchInputAndChangeEvent); |
| 1725 if (!usesMenuList()) | 1726 if (!usesMenuList()) |
| 1726 listBoxOnChange(); | 1727 listBoxOnChange(); |
| 1727 } | 1728 } |
| 1728 | 1729 |
| 1729 void HTMLSelectElement::selectOptionByAccessKey(HTMLOptionElement* option) { | 1730 void HTMLSelectElement::selectOptionByAccessKey(HTMLOptionElement* option) { |
| 1730 // First bring into focus the list box. | 1731 // First bring into focus the list box. |
| 1731 if (!isFocused()) | 1732 if (!isFocused()) |
| 1732 accessKeyAction(false); | 1733 accessKeyAction(false); |
| 1733 | 1734 |
| 1734 if (!option || option->ownerSelectElement() != this) | 1735 if (!option || option->ownerSelectElement() != this) |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1898 | 1899 |
| 1899 HTMLOptionElement* option = optionAtListIndex(listIndex); | 1900 HTMLOptionElement* option = optionAtListIndex(listIndex); |
| 1900 // Bail out if this index is already the selected one, to avoid running | 1901 // Bail out if this index is already the selected one, to avoid running |
| 1901 // unnecessary JavaScript that can mess up autofill when there is no actual | 1902 // unnecessary JavaScript that can mess up autofill when there is no actual |
| 1902 // change (see https://bugs.webkit.org/show_bug.cgi?id=35256 and | 1903 // change (see https://bugs.webkit.org/show_bug.cgi?id=35256 and |
| 1903 // <rdar://7467917>). The selectOption function does not behave this way, | 1904 // <rdar://7467917>). The selectOption function does not behave this way, |
| 1904 // possibly because other callers need a change event even in cases where | 1905 // possibly because other callers need a change event even in cases where |
| 1905 // the selected option is not change. | 1906 // the selected option is not change. |
| 1906 if (option == selectedOption()) | 1907 if (option == selectedOption()) |
| 1907 return; | 1908 return; |
| 1908 selectOption(option, DeselectOtherOptions | MakeOptionDirty | | 1909 selectOption( |
| 1909 DispatchInputAndChangeEvent); | 1910 option, |
| 1911 DeselectOtherOptions | MakeOptionDirty | DispatchInputAndChangeEvent); |
| 1910 } | 1912 } |
| 1911 | 1913 |
| 1912 void HTMLSelectElement::popupDidCancel() { | 1914 void HTMLSelectElement::popupDidCancel() { |
| 1913 if (m_indexToSelectOnCancel >= 0) | 1915 if (m_indexToSelectOnCancel >= 0) |
| 1914 selectOptionByPopup(m_indexToSelectOnCancel); | 1916 selectOptionByPopup(m_indexToSelectOnCancel); |
| 1915 } | 1917 } |
| 1916 | 1918 |
| 1917 void HTMLSelectElement::provisionalSelectionChanged(unsigned listIndex) { | 1919 void HTMLSelectElement::provisionalSelectionChanged(unsigned listIndex) { |
| 1918 setIndexToSelectOnCancel(listIndex); | 1920 setIndexToSelectOnCancel(listIndex); |
| 1919 } | 1921 } |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2041 m_popupUpdater = nullptr; | 2043 m_popupUpdater = nullptr; |
| 2042 } | 2044 } |
| 2043 | 2045 |
| 2044 void HTMLSelectElement::didMutateSubtree() { | 2046 void HTMLSelectElement::didMutateSubtree() { |
| 2045 DCHECK(popupIsVisible()); | 2047 DCHECK(popupIsVisible()); |
| 2046 DCHECK(m_popup); | 2048 DCHECK(m_popup); |
| 2047 m_popup->updateFromElement(PopupMenu::ByDOMChange); | 2049 m_popup->updateFromElement(PopupMenu::ByDOMChange); |
| 2048 } | 2050 } |
| 2049 | 2051 |
| 2050 } // namespace blink | 2052 } // namespace blink |
| OLD | NEW |