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

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

Issue 2143863003: Simplify protocol between SELECT elements and popups. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@select-remove-fixed-args
Patch Set: Created 4 years, 5 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 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 return firstSelectionIndex < 0 || (!firstSelectionIndex && hasPlaceholderLab elOption()); 201 return firstSelectionIndex < 0 || (!firstSelectionIndex && hasPlaceholderLab elOption());
202 } 202 }
203 203
204 String HTMLSelectElement::defaultToolTip() const 204 String HTMLSelectElement::defaultToolTip() const
205 { 205 {
206 if (form() && form()->noValidate()) 206 if (form() && form()->noValidate())
207 return String(); 207 return String();
208 return validationMessage(); 208 return validationMessage();
209 } 209 }
210 210
211 void HTMLSelectElement::listBoxSelectItem(int listIndex, bool allowMultiplySelec tions, bool fireOnChangeNow) 211 void HTMLSelectElement::selectMultipleOptionsByPopup(const Vector<int>& listIndi ces)
212 { 212 {
213 if (!multiple()) { 213 DCHECK(usesMenuList());
214 optionSelectedByUser(listToOptionIndex(listIndex), fireOnChangeNow); 214 DCHECK(!multiple());
wychen 2016/09/29 02:42:57 Should this line be DCHECK(multiple())? I'm a bit
tkent 2016/09/29 03:14:55 I think so :)
215 } else { 215 for (size_t i = 0; i < listIndices.size(); ++i) {
216 HTMLElement* element = listItems()[listIndex]; 216 bool addSelectionIfNotFirst = i > 0;
217 HTMLElement* element = listItems()[listIndices[i]];
217 if (isHTMLOptionElement(element)) 218 if (isHTMLOptionElement(element))
218 updateSelectedState(toHTMLOptionElement(element), allowMultiplySelec tions, false); 219 updateSelectedState(toHTMLOptionElement(element), addSelectionIfNotF irst, false);
219 setNeedsValidityCheck();
220 if (fireOnChangeNow)
221 listBoxOnChange();
222 } 220 }
221 setNeedsValidityCheck();
222 // TODO(tkent): Using listBoxOnChange() is very confusing.
223 listBoxOnChange();
223 } 224 }
224 225
225 bool HTMLSelectElement::usesMenuList() const 226 bool HTMLSelectElement::usesMenuList() const
226 { 227 {
227 if (LayoutTheme::theme().delegatesMenuListRendering()) 228 if (LayoutTheme::theme().delegatesMenuListRendering())
228 return true; 229 return true;
229 230
230 return !m_multiple && m_size <= 1; 231 return !m_multiple && m_size <= 1;
231 } 232 }
232 233
(...skipping 1027 matching lines...) Expand 10 before | Expand all | Expand 10 after
1260 void HTMLSelectElement::handlePopupOpenKeyboardEvent(Event* event) 1261 void HTMLSelectElement::handlePopupOpenKeyboardEvent(Event* event)
1261 { 1262 {
1262 focus(); 1263 focus();
1263 // Calling focus() may cause us to lose our layoutObject. Return true so 1264 // Calling focus() may cause us to lose our layoutObject. Return true so
1264 // that our caller doesn't process the event further, but don't set 1265 // that our caller doesn't process the event further, but don't set
1265 // the event as handled. 1266 // the event as handled.
1266 if (!layoutObject() || !layoutObject()->isMenuList() || isDisabledFormContro l()) 1267 if (!layoutObject() || !layoutObject()->isMenuList() || isDisabledFormContro l())
1267 return; 1268 return;
1268 // Save the selection so it can be compared to the new selection when 1269 // Save the selection so it can be compared to the new selection when
1269 // dispatching change events during selectOption, which gets called from 1270 // dispatching change events during selectOption, which gets called from
1270 // valueChanged, which gets called after the user makes a selection from the 1271 // selectOptionByPopup, which gets called after the user makes a selection
1271 // menu. 1272 // from the menu.
1272 saveLastSelection(); 1273 saveLastSelection();
1273 showPopup(); 1274 showPopup();
1274 event->setDefaultHandled(); 1275 event->setDefaultHandled();
1275 return; 1276 return;
1276 } 1277 }
1277 1278
1278 bool HTMLSelectElement::shouldOpenPopupForKeyDownEvent(KeyboardEvent* keyEvent) 1279 bool HTMLSelectElement::shouldOpenPopupForKeyDownEvent(KeyboardEvent* keyEvent)
1279 { 1280 {
1280 const String& key = keyEvent->key(); 1281 const String& key = keyEvent->key();
1281 LayoutTheme& layoutTheme = LayoutTheme::theme(); 1282 LayoutTheme& layoutTheme = LayoutTheme::theme();
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
1379 1380
1380 if (event->type() == EventTypeNames::mousedown && event->isMouseEvent() && t oMouseEvent(event)->button() == LeftButton) { 1381 if (event->type() == EventTypeNames::mousedown && event->isMouseEvent() && t oMouseEvent(event)->button() == LeftButton) {
1381 InputDeviceCapabilities* sourceCapabilities = toMouseEvent(event)->fromT ouch() ? InputDeviceCapabilities::firesTouchEventsSourceCapabilities() : InputDe viceCapabilities::doesntFireTouchEventsSourceCapabilities(); 1382 InputDeviceCapabilities* sourceCapabilities = toMouseEvent(event)->fromT ouch() ? InputDeviceCapabilities::firesTouchEventsSourceCapabilities() : InputDe viceCapabilities::doesntFireTouchEventsSourceCapabilities();
1382 focus(FocusParams(SelectionBehaviorOnFocus::Restore, WebFocusTypeNone, s ourceCapabilities)); 1383 focus(FocusParams(SelectionBehaviorOnFocus::Restore, WebFocusTypeNone, s ourceCapabilities));
1383 if (layoutObject() && layoutObject()->isMenuList() && !isDisabledFormCon trol()) { 1384 if (layoutObject() && layoutObject()->isMenuList() && !isDisabledFormCon trol()) {
1384 if (popupIsVisible()) { 1385 if (popupIsVisible()) {
1385 hidePopup(); 1386 hidePopup();
1386 } else { 1387 } else {
1387 // Save the selection so it can be compared to the new selection 1388 // Save the selection so it can be compared to the new selection
1388 // when we call onChange during selectOption, which gets called 1389 // when we call onChange during selectOption, which gets called
1389 // from valueChanged, which gets called after the user makes a 1390 // from selectOptionByPopup, which gets called after the user
1390 // selection from the menu. 1391 // makes a selection from the menu.
1391 saveLastSelection(); 1392 saveLastSelection();
1392 // TODO(lanwei): Will check if we need to add 1393 // TODO(lanwei): Will check if we need to add
1393 // InputDeviceCapabilities here when select menu list gets 1394 // InputDeviceCapabilities here when select menu list gets
1394 // focus, see https://crbug.com/476530. 1395 // focus, see https://crbug.com/476530.
1395 showPopup(); 1396 showPopup();
1396 } 1397 }
1397 } 1398 }
1398 event->setDefaultHandled(); 1399 event->setDefaultHandled();
1399 } 1400 }
1400 1401
(...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after
1916 return toHTMLOptionElement(listItems()[m_indexToSelectOnCancel]); 1917 return toHTMLOptionElement(listItems()[m_indexToSelectOnCancel]);
1917 if (m_suggestedOption) 1918 if (m_suggestedOption)
1918 return m_suggestedOption; 1919 return m_suggestedOption;
1919 // TODO(tkent): We should not call optionToBeShown() in multiple() case. 1920 // TODO(tkent): We should not call optionToBeShown() in multiple() case.
1920 if (multiple()) 1921 if (multiple())
1921 return selectedOption(); 1922 return selectedOption();
1922 DCHECK_EQ(selectedOption(), m_lastOnChangeOption); 1923 DCHECK_EQ(selectedOption(), m_lastOnChangeOption);
1923 return m_lastOnChangeOption; 1924 return m_lastOnChangeOption;
1924 } 1925 }
1925 1926
1926 void HTMLSelectElement::valueChanged(unsigned listIndex) 1927 void HTMLSelectElement::selectOptionByPopup(int listIndex)
1927 { 1928 {
1929 DCHECK(usesMenuList());
1928 // Check to ensure a page navigation has not occurred while the popup was 1930 // Check to ensure a page navigation has not occurred while the popup was
1929 // up. 1931 // up.
1930 Document& doc = document(); 1932 Document& doc = document();
1931 if (&doc != doc.frame()->document()) 1933 if (&doc != doc.frame()->document())
1932 return; 1934 return;
1933 1935
1934 setIndexToSelectOnCancel(-1); 1936 setIndexToSelectOnCancel(-1);
1935 optionSelectedByUser(listToOptionIndex(listIndex), true); 1937 optionSelectedByUser(listToOptionIndex(listIndex), true);
1936 } 1938 }
1937 1939
1938 void HTMLSelectElement::popupDidCancel() 1940 void HTMLSelectElement::popupDidCancel()
1939 { 1941 {
1940 if (m_indexToSelectOnCancel >= 0) 1942 if (m_indexToSelectOnCancel >= 0)
1941 valueChanged(m_indexToSelectOnCancel); 1943 selectOptionByPopup(m_indexToSelectOnCancel);
1942 } 1944 }
1943 1945
1944 void HTMLSelectElement::provisionalSelectionChanged(unsigned listIndex) 1946 void HTMLSelectElement::provisionalSelectionChanged(unsigned listIndex)
1945 { 1947 {
1946 setIndexToSelectOnCancel(listIndex); 1948 setIndexToSelectOnCancel(listIndex);
1947 } 1949 }
1948 1950
1949 void HTMLSelectElement::showPopup() 1951 void HTMLSelectElement::showPopup()
1950 { 1952 {
1951 if (popupIsVisible()) 1953 if (popupIsVisible())
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
2069 } 2071 }
2070 2072
2071 void HTMLSelectElement::didMutateSubtree() 2073 void HTMLSelectElement::didMutateSubtree()
2072 { 2074 {
2073 DCHECK(popupIsVisible()); 2075 DCHECK(popupIsVisible());
2074 DCHECK(m_popup); 2076 DCHECK(m_popup);
2075 m_popup->updateFromElement(PopupMenu::ByDOMChange); 2077 m_popup->updateFromElement(PopupMenu::ByDOMChange);
2076 } 2078 }
2077 2079
2078 } // namespace blink 2080 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/html/HTMLSelectElement.h ('k') | third_party/WebKit/Source/web/ExternalPopupMenu.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698