| Index: Source/web/ExternalPopupMenu.cpp
|
| diff --git a/Source/web/ExternalPopupMenu.cpp b/Source/web/ExternalPopupMenu.cpp
|
| index 4505e5dd6d0fee13a0fa50cd0bb0621c81619299..e0f5a266303348251569db0a05bfb410fce7c13e 100644
|
| --- a/Source/web/ExternalPopupMenu.cpp
|
| +++ b/Source/web/ExternalPopupMenu.cpp
|
| @@ -54,6 +54,7 @@ ExternalPopupMenu::ExternalPopupMenu(LocalFrame& frame, PopupMenuClient* popupMe
|
| , m_webView(webView)
|
| , m_dispatchEventTimer(this, &ExternalPopupMenu::dispatchEvent)
|
| , m_webExternalPopupMenu(0)
|
| + , m_itemCount(0)
|
| {
|
| }
|
|
|
| @@ -126,7 +127,7 @@ void ExternalPopupMenu::disconnectClient()
|
| void ExternalPopupMenu::didChangeSelection(int index)
|
| {
|
| if (m_popupMenuClient)
|
| - m_popupMenuClient->selectionChanged(index);
|
| + m_popupMenuClient->selectionChanged(toPopupMenuItemIndex(index));
|
| }
|
|
|
| void ExternalPopupMenu::didAcceptIndex(int index)
|
| @@ -134,6 +135,7 @@ void ExternalPopupMenu::didAcceptIndex(int index)
|
| // Calling methods on the PopupMenuClient might lead to this object being
|
| // derefed. This ensures it does not get deleted while we are running this
|
| // method.
|
| + index = toPopupMenuItemIndex(index);
|
| RefPtr<ExternalPopupMenu> guard(this);
|
|
|
| if (m_popupMenuClient) {
|
| @@ -159,7 +161,7 @@ void ExternalPopupMenu::didAcceptIndices(const WebVector<int>& indices)
|
| m_popupMenuClient->valueChanged(static_cast<unsigned>(-1), true);
|
| else {
|
| for (size_t i = 0; i < indices.size(); ++i)
|
| - m_popupMenuClient->listBoxSelectItem(indices[i], (i > 0), false, (i == indices.size() - 1));
|
| + m_popupMenuClient->listBoxSelectItem(toPopupMenuItemIndex(indices[i]), (i > 0), false, (i == indices.size() - 1));
|
| }
|
|
|
| // The call to valueChanged above might have lead to a call to
|
| @@ -183,6 +185,7 @@ void ExternalPopupMenu::didCancel()
|
| void ExternalPopupMenu::getPopupMenuInfo(WebPopupMenuInfo* info)
|
| {
|
| int itemCount = m_popupMenuClient->listSize();
|
| + m_itemCount = 0;
|
| WebVector<WebMenuItemInfo> items(static_cast<size_t>(itemCount));
|
| for (int i = 0; i < itemCount; ++i) {
|
| WebMenuItemInfo& popupItem = items[i];
|
| @@ -202,14 +205,51 @@ void ExternalPopupMenu::getPopupMenuInfo(WebPopupMenuInfo* info)
|
| else
|
| popupItem.textDirection = WebTextDirectionLeftToRight;
|
| popupItem.hasTextDirectionOverride = style.hasTextDirectionOverride();
|
| + popupItem.displayNone = style.isDisplayNone();
|
| +
|
| + if (!popupItem.displayNone)
|
| + ++m_itemCount;
|
| }
|
|
|
| info->itemHeight = m_popupMenuClient->menuStyle().font().fontMetrics().height();
|
| info->itemFontSize = static_cast<int>(m_popupMenuClient->menuStyle().font().fontDescription().computedSize());
|
| - info->selectedIndex = m_popupMenuClient->selectedIndex();
|
| + info->selectedIndex = toExternalPopupMenuItemIndex(m_popupMenuClient->selectedIndex());
|
| info->rightAligned = m_popupMenuClient->menuStyle().textDirection() == blink::RTL;
|
| info->allowMultipleSelection = m_popupMenuClient->multiple();
|
| info->items.swap(items);
|
| }
|
|
|
| +int ExternalPopupMenu::toPopupMenuItemIndex(int index)
|
| +{
|
| + int itemCount = m_popupMenuClient->listSize();
|
| + if (itemCount == m_itemCount || index < 0)
|
| + return index;
|
| +
|
| + int indexTracker = 0;
|
| + for (int i = 0; i < itemCount ; ++i) {
|
| + if (m_popupMenuClient->itemStyle(i).isDisplayNone())
|
| + continue;
|
| + if (indexTracker++ == index)
|
| + return i;
|
| + }
|
| + return -1;
|
| +}
|
| +
|
| +int ExternalPopupMenu::toExternalPopupMenuItemIndex(int index)
|
| +{
|
| + int itemCount = m_popupMenuClient->listSize();
|
| + if (itemCount == m_itemCount || index < 0)
|
| + return index;
|
| +
|
| + int indexTracker = 0;
|
| + for (int i = 0; i < itemCount ; ++i) {
|
| + if (m_popupMenuClient->itemStyle(i).isDisplayNone())
|
| + continue;
|
| + if (index == i)
|
| + return indexTracker;
|
| + ++indexTracker;
|
| + }
|
| + return -1;
|
| +}
|
| +
|
| }
|
|
|