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

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

Issue 2045603002: Handle the "key" field as opposed to keyIdentifier field. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove initialization of the view Created 4 years, 6 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 1268 matching lines...) Expand 10 before | Expand all | Expand 10 after
1279 // valueChanged, which gets called after the user makes a selection from the 1279 // valueChanged, which gets called after the user makes a selection from the
1280 // menu. 1280 // menu.
1281 saveLastSelection(); 1281 saveLastSelection();
1282 showPopup(); 1282 showPopup();
1283 event->setDefaultHandled(); 1283 event->setDefaultHandled();
1284 return; 1284 return;
1285 } 1285 }
1286 1286
1287 bool HTMLSelectElement::shouldOpenPopupForKeyDownEvent(KeyboardEvent* keyEvent) 1287 bool HTMLSelectElement::shouldOpenPopupForKeyDownEvent(KeyboardEvent* keyEvent)
1288 { 1288 {
1289 const String& keyIdentifier = keyEvent->keyIdentifier(); 1289 const String& key = keyEvent->key();
1290 LayoutTheme& layoutTheme = LayoutTheme::theme(); 1290 LayoutTheme& layoutTheme = LayoutTheme::theme();
1291 1291
1292 if (isSpatialNavigationEnabled(document().frame())) 1292 if (isSpatialNavigationEnabled(document().frame()))
1293 return false; 1293 return false;
1294 1294
1295 return ((layoutTheme.popsMenuByArrowKeys() && (keyIdentifier == "Down" || k eyIdentifier == "Up")) 1295 return ((layoutTheme.popsMenuByArrowKeys() && (key == "ArrowDown" || key == "ArrowUp"))
1296 || (layoutTheme.popsMenuByAltDownUpOrF4Key() && (keyIdentifier == "Down" || keyIdentifier == "Up") && keyEvent->altKey()) 1296 || (layoutTheme.popsMenuByAltDownUpOrF4Key() && (key == "ArrowDown" || k ey == "ArrowUp") && keyEvent->altKey())
1297 || (layoutTheme.popsMenuByAltDownUpOrF4Key() && (!keyEvent->altKey() && !keyEvent->ctrlKey() && keyIdentifier == "F4"))); 1297 || (layoutTheme.popsMenuByAltDownUpOrF4Key() && (!keyEvent->altKey() && !keyEvent->ctrlKey() && key == "F4")));
1298 } 1298 }
1299 1299
1300 bool HTMLSelectElement::shouldOpenPopupForKeyPressEvent(KeyboardEvent *event) 1300 bool HTMLSelectElement::shouldOpenPopupForKeyPressEvent(KeyboardEvent *event)
1301 { 1301 {
1302 LayoutTheme& layoutTheme = LayoutTheme::theme(); 1302 LayoutTheme& layoutTheme = LayoutTheme::theme();
1303 int keyCode = event->keyCode(); 1303 int keyCode = event->keyCode();
1304 1304
1305 return ((layoutTheme.popsMenuBySpaceKey() && event->keyCode() == ' ' && !m_t ypeAhead.hasActiveSession(event)) 1305 return ((layoutTheme.popsMenuBySpaceKey() && event->keyCode() == ' ' && !m_t ypeAhead.hasActiveSession(event))
1306 || (layoutTheme.popsMenuByReturnKey() && keyCode == '\r')); 1306 || (layoutTheme.popsMenuByReturnKey() && keyCode == '\r'));
1307 } 1307 }
(...skipping 16 matching lines...) Expand all
1324 if (isSpatialNavigationEnabled(document().frame())) { 1324 if (isSpatialNavigationEnabled(document().frame())) {
1325 if (!m_activeSelectionState) 1325 if (!m_activeSelectionState)
1326 return; 1326 return;
1327 } 1327 }
1328 1328
1329 // The key handling below shouldn't be used for non spatial navigation 1329 // The key handling below shouldn't be used for non spatial navigation
1330 // mode Mac 1330 // mode Mac
1331 if (LayoutTheme::theme().popsMenuByArrowKeys() && !isSpatialNavigationEn abled(document().frame())) 1331 if (LayoutTheme::theme().popsMenuByArrowKeys() && !isSpatialNavigationEn abled(document().frame()))
1332 return; 1332 return;
1333 1333
1334 const String& keyIdentifier = keyEvent->keyIdentifier(); 1334 const String& key = keyEvent->key();
1335 bool handled = true; 1335 bool handled = true;
1336 const ListItems& listItems = this->listItems(); 1336 const ListItems& listItems = this->listItems();
1337 HTMLOptionElement* option = selectedOption(); 1337 HTMLOptionElement* option = selectedOption();
1338 int listIndex = option ? option->listIndex() : -1; 1338 int listIndex = option ? option->listIndex() : -1;
1339 1339
1340 if (keyIdentifier == "Down" || keyIdentifier == "Right") 1340 if (key == "ArrowDown" || key == "ArrowRight")
1341 option = nextValidOption(listIndex, SkipForwards, 1); 1341 option = nextValidOption(listIndex, SkipForwards, 1);
1342 else if (keyIdentifier == "Up" || keyIdentifier == "Left") 1342 else if (key == "ArrowUp" || key == "ArrowLeft")
1343 option = nextValidOption(listIndex, SkipBackwards, 1); 1343 option = nextValidOption(listIndex, SkipBackwards, 1);
1344 else if (keyIdentifier == "PageDown") 1344 else if (key == "PageDown")
1345 option = nextValidOption(listIndex, SkipForwards, 3); 1345 option = nextValidOption(listIndex, SkipForwards, 3);
1346 else if (keyIdentifier == "PageUp") 1346 else if (key == "PageUp")
1347 option = nextValidOption(listIndex, SkipBackwards, 3); 1347 option = nextValidOption(listIndex, SkipBackwards, 3);
1348 else if (keyIdentifier == "Home") 1348 else if (key == "Home")
1349 option = nextValidOption(-1, SkipForwards, 1); 1349 option = nextValidOption(-1, SkipForwards, 1);
1350 else if (keyIdentifier == "End") 1350 else if (key == "End")
1351 option = nextValidOption(listItems.size(), SkipBackwards, 1); 1351 option = nextValidOption(listItems.size(), SkipBackwards, 1);
1352 else 1352 else
1353 handled = false; 1353 handled = false;
1354 1354
1355 if (handled && option) 1355 if (handled && option)
1356 selectOption(option, DeselectOtherOptions | MakeOptionDirty | Dispat chInputAndChangeEvent); 1356 selectOption(option, DeselectOtherOptions | MakeOptionDirty | Dispat chInputAndChangeEvent);
1357 1357
1358 if (handled) 1358 if (handled)
1359 event->setDefaultHandled(); 1359 event->setDefaultHandled();
1360 } 1360 }
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
1567 1567
1568 } else if (event->type() == EventTypeNames::mouseup && event->isMouseEvent() && toMouseEvent(event)->button() == LeftButton && layoutObject()) { 1568 } else if (event->type() == EventTypeNames::mouseup && event->isMouseEvent() && toMouseEvent(event)->button() == LeftButton && layoutObject()) {
1569 if (document().page() && document().page()->autoscrollController().autos crollInProgress(toLayoutBox(layoutObject()))) 1569 if (document().page() && document().page()->autoscrollController().autos crollInProgress(toLayoutBox(layoutObject())))
1570 document().page()->autoscrollController().stopAutoscroll(); 1570 document().page()->autoscrollController().stopAutoscroll();
1571 else 1571 else
1572 handleMouseRelease(); 1572 handleMouseRelease();
1573 1573
1574 } else if (event->type() == EventTypeNames::keydown) { 1574 } else if (event->type() == EventTypeNames::keydown) {
1575 if (!event->isKeyboardEvent()) 1575 if (!event->isKeyboardEvent())
1576 return; 1576 return;
1577 const String& keyIdentifier = toKeyboardEvent(event)->keyIdentifier(); 1577 const String& key = toKeyboardEvent(event)->key();
1578 1578
1579 bool handled = false; 1579 bool handled = false;
1580 HTMLOptionElement* endOption = nullptr; 1580 HTMLOptionElement* endOption = nullptr;
1581 if (!m_activeSelectionEnd) { 1581 if (!m_activeSelectionEnd) {
1582 // Initialize the end index 1582 // Initialize the end index
1583 if (keyIdentifier == "Down" || keyIdentifier == "PageDown") { 1583 if (key == "ArrowDown" || key == "PageDown") {
1584 HTMLOptionElement* startOption = lastSelectedOption(); 1584 HTMLOptionElement* startOption = lastSelectedOption();
1585 handled = true; 1585 handled = true;
1586 if (keyIdentifier == "Down") 1586 if (key == "ArrowDown")
1587 endOption = nextSelectableOption(startOption); 1587 endOption = nextSelectableOption(startOption);
1588 else 1588 else
1589 endOption = nextSelectableOptionPageAway(startOption, SkipFo rwards); 1589 endOption = nextSelectableOptionPageAway(startOption, SkipFo rwards);
1590 } else if (keyIdentifier == "Up" || keyIdentifier == "PageUp") { 1590 } else if (key == "ArrowUp" || key == "PageUp") {
1591 HTMLOptionElement* startOption = selectedOption(); 1591 HTMLOptionElement* startOption = selectedOption();
1592 handled = true; 1592 handled = true;
1593 if (keyIdentifier == "Up") 1593 if (key == "ArrowUp")
1594 endOption = previousSelectableOption(startOption); 1594 endOption = previousSelectableOption(startOption);
1595 else 1595 else
1596 endOption = nextSelectableOptionPageAway(startOption, SkipBa ckwards); 1596 endOption = nextSelectableOptionPageAway(startOption, SkipBa ckwards);
1597 } 1597 }
1598 } else { 1598 } else {
1599 // Set the end index based on the current end index. 1599 // Set the end index based on the current end index.
1600 if (keyIdentifier == "Down") { 1600 if (key == "ArrowDown") {
1601 endOption = nextSelectableOption(m_activeSelectionEnd.get()); 1601 endOption = nextSelectableOption(m_activeSelectionEnd.get());
1602 handled = true; 1602 handled = true;
1603 } else if (keyIdentifier == "Up") { 1603 } else if (key == "ArrowUp") {
1604 endOption = previousSelectableOption(m_activeSelectionEnd.get()) ; 1604 endOption = previousSelectableOption(m_activeSelectionEnd.get()) ;
1605 handled = true; 1605 handled = true;
1606 } else if (keyIdentifier == "PageDown") { 1606 } else if (key == "PageDown") {
1607 endOption = nextSelectableOptionPageAway(m_activeSelectionEnd.ge t(), SkipForwards); 1607 endOption = nextSelectableOptionPageAway(m_activeSelectionEnd.ge t(), SkipForwards);
1608 handled = true; 1608 handled = true;
1609 } else if (keyIdentifier == "PageUp") { 1609 } else if (key == "PageUp") {
1610 endOption = nextSelectableOptionPageAway(m_activeSelectionEnd.ge t(), SkipBackwards); 1610 endOption = nextSelectableOptionPageAway(m_activeSelectionEnd.ge t(), SkipBackwards);
1611 handled = true; 1611 handled = true;
1612 } 1612 }
1613 } 1613 }
1614 if (keyIdentifier == "Home") { 1614 if (key == "Home") {
1615 endOption = firstSelectableOption(); 1615 endOption = firstSelectableOption();
1616 handled = true; 1616 handled = true;
1617 } else if (keyIdentifier == "End") { 1617 } else if (key == "End") {
1618 endOption = lastSelectableOption(); 1618 endOption = lastSelectableOption();
1619 handled = true; 1619 handled = true;
1620 } 1620 }
1621 1621
1622 if (isSpatialNavigationEnabled(document().frame())) { 1622 if (isSpatialNavigationEnabled(document().frame())) {
1623 // Check if the selection moves to the boundary. 1623 // Check if the selection moves to the boundary.
1624 if (keyIdentifier == "Left" || keyIdentifier == "Right" || ((keyIden tifier == "Down" || keyIdentifier == "Up") && endOption == m_activeSelectionEnd) ) 1624 if (key == "ArrowLeft" || key == "ArrowRight" || ((key == "ArrowDown " || key == "ArrowUp") && endOption == m_activeSelectionEnd))
1625 return; 1625 return;
1626 } 1626 }
1627 1627
1628 if (endOption && handled) { 1628 if (endOption && handled) {
1629 // Save the selection so it can be compared to the new selection 1629 // Save the selection so it can be compared to the new selection
1630 // when dispatching change events immediately after making the new 1630 // when dispatching change events immediately after making the new
1631 // selection. 1631 // selection.
1632 saveLastSelection(); 1632 saveLastSelection();
1633 1633
1634 setActiveSelectionEnd(endOption); 1634 setActiveSelectionEnd(endOption);
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after
2073 } 2073 }
2074 2074
2075 void HTMLSelectElement::didMutateSubtree() 2075 void HTMLSelectElement::didMutateSubtree()
2076 { 2076 {
2077 DCHECK(popupIsVisible()); 2077 DCHECK(popupIsVisible());
2078 DCHECK(m_popup); 2078 DCHECK(m_popup);
2079 m_popup->updateFromElement(PopupMenu::ByDOMChange); 2079 m_popup->updateFromElement(PopupMenu::ByDOMChange);
2080 } 2080 }
2081 2081
2082 } // namespace blink 2082 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/html/HTMLButtonElement.cpp ('k') | third_party/WebKit/Source/core/html/HTMLSummaryElement.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698