Advertisement
Guest User

Untitled

a guest
Jun 25th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. diff --git a/WebCore/dom/SelectElement.cpp b/WebCore/dom/SelectElement.cpp
  2. index 3023668..ec78aff 100644
  3. --- a/WebCore/dom/SelectElement.cpp
  4. +++ b/WebCore/dom/SelectElement.cpp
  5. @@ -777,18 +777,27 @@ void SelectElement::listBoxDefaultEventHandler(SelectElementData& data, Element*
  6.  
  7.              ASSERT_UNUSED(listItems, !listItems.size() || (endIndex >= 0 && (unsigned) endIndex < listItems.size()));
  8.              setActiveSelectionEndIndex(data, endIndex);
  9. -            
  10. +
  11. +#if PLATFORM(MAC) || (PLATFORM(CHROMIUM) && OS(DARWIN))
  12. +            bool isCtrlKey = static_cast<KeyboardEvent*>(event)->metaKey();
  13. +#else
  14. +            bool isCtrlKey = static_cast<KeyboardEvent*>(event)->ctrlKey();
  15. +#endif
  16.              // If the anchor is unitialized, or if we're going to deselect all other options, then set the anchor index equal to the end index.
  17. -            bool deselectOthers = !data.multiple() || !static_cast<KeyboardEvent*>(event)->shiftKey();
  18. +            bool deselectOthers = !data.multiple() || (!static_cast<KeyboardEvent*>(event)->shiftKey() && !isCtrlKey);
  19.              if (data.activeSelectionAnchorIndex() < 0 || deselectOthers) {
  20. -                data.setActiveSelectionState(true);
  21. +                if (!isCtrlKey)
  22. +                    data.setActiveSelectionState(true);
  23.                  if (deselectOthers)
  24.                      deselectItems(data, element);
  25.                  setActiveSelectionAnchorIndex(data, element, data.activeSelectionEndIndex());
  26.              }
  27.  
  28.              toRenderListBox(element->renderer())->scrollToRevealElementAtListIndex(endIndex);
  29. -            updateListBoxSelection(data, element, deselectOthers);
  30. +            if (isCtrlKey)
  31. +                scrollToSelection(data, element);
  32. +            else
  33. +                updateListBoxSelection(data, element, deselectOthers);
  34.              listBoxOnChange(data, element);
  35.              event->setDefaultHandled();
  36.          }
  37. @@ -801,7 +810,9 @@ void SelectElement::listBoxDefaultEventHandler(SelectElementData& data, Element*
  38.              if (htmlForm)
  39.                  htmlForm->submitImplicitly(event, false);
  40.              event->setDefaultHandled();
  41. -            return;
  42. +        } else if (data.multiple() && keyCode == ' ') {
  43. +            updateSelectedState(data, element, listToOptionIndex(data, element, data.activeSelectionEndIndex()), true, false);
  44. +            event->setDefaultHandled();
  45.          }
  46.      }
  47.  }
  48. diff --git a/WebCore/rendering/RenderListBox.cpp b/WebCore/rendering/RenderListBox.cpp
  49. index 532c551..9339785 100644
  50. --- a/WebCore/rendering/RenderListBox.cpp
  51. +++ b/WebCore/rendering/RenderListBox.cpp
  52. @@ -279,6 +279,28 @@ void RenderListBox::paintObject(PaintInfo& paintInfo, int tx, int ty)
  53.      }
  54.  }
  55.  
  56. +void RenderListBox::addFocusRingRects(Vector<IntRect>& rects, int tx, int ty)
  57. +{
  58. +    SelectElement* select = toSelectElement(static_cast<Element*>(node()));
  59. +    // Focus the last selected item.
  60. +    int selectedItem = select->activeSelectionEndListIndex();
  61. +    if (selectedItem >= 0) {
  62. +        rects.append(itemBoundingBoxRect(tx, ty, selectedItem));
  63. +        return;
  64. +    }
  65. +
  66. +    // No selected items, find the first non-disabled item
  67. +    int size = numItems();
  68. +    const Vector<Element*>& listItems = select->listItems();
  69. +    for (int i = 0; i < size; ++i) {
  70. +        OptionElement* optionElement = toOptionElement(listItems[i]);
  71. +        if (optionElement && !optionElement->disabled()) {
  72. +            rects.append(itemBoundingBoxRect(tx, ty, i));
  73. +            return;
  74. +        }
  75. +    }
  76. +}
  77. +
  78.  void RenderListBox::paintScrollbar(PaintInfo& paintInfo, int tx, int ty)
  79.  {
  80.      if (m_vBar) {
  81. diff --git a/WebCore/rendering/RenderListBox.h b/WebCore/rendering/RenderListBox.h
  82. index 072fc91..434ac45 100644
  83. --- a/WebCore/rendering/RenderListBox.h
  84. +++ b/WebCore/rendering/RenderListBox.h
  85. @@ -76,6 +76,8 @@ private:
  86.  
  87.      virtual void layout();
  88.  
  89. +    virtual void addFocusRingRects(Vector<IntRect>&, int tx, int ty);
  90. +
  91.      virtual bool canBeProgramaticallyScrolled(bool) const { return true; }
  92.      virtual void autoscroll();
  93.      virtual void stopAutoscroll();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement