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

Unified Diff: Source/web/ExternalPopupMenu.cpp

Issue 415343003: Option Groups with display: none should not show the children option elements (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Adding changes to ExternalPopupMenu Created 6 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 side-by-side diff with in-line comments
Download patch
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;
+}
+
}

Powered by Google App Engine
This is Rietveld 408576698