Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/WebCore/dom/SelectElement.cpp b/WebCore/dom/SelectElement.cpp
- index 3023668..ec78aff 100644
- --- a/WebCore/dom/SelectElement.cpp
- +++ b/WebCore/dom/SelectElement.cpp
- @@ -777,18 +777,27 @@ void SelectElement::listBoxDefaultEventHandler(SelectElementData& data, Element*
- ASSERT_UNUSED(listItems, !listItems.size() || (endIndex >= 0 && (unsigned) endIndex < listItems.size()));
- setActiveSelectionEndIndex(data, endIndex);
- -
- +
- +#if PLATFORM(MAC) || (PLATFORM(CHROMIUM) && OS(DARWIN))
- + bool isCtrlKey = static_cast<KeyboardEvent*>(event)->metaKey();
- +#else
- + bool isCtrlKey = static_cast<KeyboardEvent*>(event)->ctrlKey();
- +#endif
- // 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.
- - bool deselectOthers = !data.multiple() || !static_cast<KeyboardEvent*>(event)->shiftKey();
- + bool deselectOthers = !data.multiple() || (!static_cast<KeyboardEvent*>(event)->shiftKey() && !isCtrlKey);
- if (data.activeSelectionAnchorIndex() < 0 || deselectOthers) {
- - data.setActiveSelectionState(true);
- + if (!isCtrlKey)
- + data.setActiveSelectionState(true);
- if (deselectOthers)
- deselectItems(data, element);
- setActiveSelectionAnchorIndex(data, element, data.activeSelectionEndIndex());
- }
- toRenderListBox(element->renderer())->scrollToRevealElementAtListIndex(endIndex);
- - updateListBoxSelection(data, element, deselectOthers);
- + if (isCtrlKey)
- + scrollToSelection(data, element);
- + else
- + updateListBoxSelection(data, element, deselectOthers);
- listBoxOnChange(data, element);
- event->setDefaultHandled();
- }
- @@ -801,7 +810,9 @@ void SelectElement::listBoxDefaultEventHandler(SelectElementData& data, Element*
- if (htmlForm)
- htmlForm->submitImplicitly(event, false);
- event->setDefaultHandled();
- - return;
- + } else if (data.multiple() && keyCode == ' ') {
- + updateSelectedState(data, element, listToOptionIndex(data, element, data.activeSelectionEndIndex()), true, false);
- + event->setDefaultHandled();
- }
- }
- }
- diff --git a/WebCore/rendering/RenderListBox.cpp b/WebCore/rendering/RenderListBox.cpp
- index 532c551..9339785 100644
- --- a/WebCore/rendering/RenderListBox.cpp
- +++ b/WebCore/rendering/RenderListBox.cpp
- @@ -279,6 +279,28 @@ void RenderListBox::paintObject(PaintInfo& paintInfo, int tx, int ty)
- }
- }
- +void RenderListBox::addFocusRingRects(Vector<IntRect>& rects, int tx, int ty)
- +{
- + SelectElement* select = toSelectElement(static_cast<Element*>(node()));
- + // Focus the last selected item.
- + int selectedItem = select->activeSelectionEndListIndex();
- + if (selectedItem >= 0) {
- + rects.append(itemBoundingBoxRect(tx, ty, selectedItem));
- + return;
- + }
- +
- + // No selected items, find the first non-disabled item
- + int size = numItems();
- + const Vector<Element*>& listItems = select->listItems();
- + for (int i = 0; i < size; ++i) {
- + OptionElement* optionElement = toOptionElement(listItems[i]);
- + if (optionElement && !optionElement->disabled()) {
- + rects.append(itemBoundingBoxRect(tx, ty, i));
- + return;
- + }
- + }
- +}
- +
- void RenderListBox::paintScrollbar(PaintInfo& paintInfo, int tx, int ty)
- {
- if (m_vBar) {
- diff --git a/WebCore/rendering/RenderListBox.h b/WebCore/rendering/RenderListBox.h
- index 072fc91..434ac45 100644
- --- a/WebCore/rendering/RenderListBox.h
- +++ b/WebCore/rendering/RenderListBox.h
- @@ -76,6 +76,8 @@ private:
- virtual void layout();
- + virtual void addFocusRingRects(Vector<IntRect>&, int tx, int ty);
- +
- virtual bool canBeProgramaticallyScrolled(bool) const { return true; }
- virtual void autoscroll();
- virtual void stopAutoscroll();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement