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

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: Created 6 years, 4 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..343b1292a55e980f388f391be0f61abac97f4439 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,11 +135,12 @@ 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.
+ int popupMenuItemIndex = toPopupMenuItemIndex(index);
RefPtr<ExternalPopupMenu> guard(this);
if (m_popupMenuClient) {
m_popupMenuClient->popupDidHide();
- m_popupMenuClient->valueChanged(index);
+ m_popupMenuClient->valueChanged(popupMenuItemIndex);
}
m_webExternalPopupMenu = 0;
}
@@ -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,9 +185,14 @@ 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];
+ PopupMenuStyle style = m_popupMenuClient->itemStyle(i);
+ if (style.isDisplayNone())
+ continue;
+
+ WebMenuItemInfo& popupItem = items[m_itemCount++];
popupItem.label = m_popupMenuClient->itemText(i);
popupItem.toolTip = m_popupMenuClient->itemToolTip(i);
if (m_popupMenuClient->itemIsSeparator(i))
@@ -196,7 +203,6 @@ void ExternalPopupMenu::getPopupMenuInfo(WebPopupMenuInfo* info)
popupItem.type = WebMenuItemInfo::Option;
popupItem.enabled = m_popupMenuClient->itemIsEnabled(i);
popupItem.checked = m_popupMenuClient->itemIsSelected(i);
- PopupMenuStyle style = m_popupMenuClient->itemStyle(i);
if (style.textDirection() == blink::RTL)
popupItem.textDirection = WebTextDirectionRightToLeft;
else
@@ -206,10 +212,47 @@ void ExternalPopupMenu::getPopupMenuInfo(WebPopupMenuInfo* info)
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();
+ if (m_itemCount < itemCount)
+ items.shrink(m_itemCount);
info->items.swap(items);
}
+int ExternalPopupMenu::toPopupMenuItemIndex(int externalPopupMenuItemIndex)
+{
+ ASSERT(m_popupMenuClient);
+ int itemCount = m_popupMenuClient->listSize();
+ if (itemCount == m_itemCount || externalPopupMenuItemIndex < 0)
keishi 2014/08/06 03:00:20 I get what you're trying to do with itemCount == m
spartha 2014/08/06 08:13:31 Done.
+ return externalPopupMenuItemIndex;
+
+ int indexTracker = 0;
+ for (int i = 0; i < itemCount ; ++i) {
+ if (m_popupMenuClient->itemStyle(i).isDisplayNone())
+ continue;
+ if (indexTracker++ == externalPopupMenuItemIndex)
+ return i;
+ }
+ return -1;
+}
+
+int ExternalPopupMenu::toExternalPopupMenuItemIndex(int popupMenuItemIndex)
+{
+ ASSERT(m_popupMenuClient);
+ int itemCount = m_popupMenuClient->listSize();
+ if (itemCount == m_itemCount || popupMenuItemIndex < 0)
+ return popupMenuItemIndex;
+
+ int indexTracker = 0;
+ for (int i = 0; i < itemCount; ++i) {
+ if (m_popupMenuClient->itemStyle(i).isDisplayNone())
+ continue;
+ if (popupMenuItemIndex == i)
+ return indexTracker;
+ ++indexTracker;
+ }
+ return -1;
+}
+
}

Powered by Google App Engine
This is Rietveld 408576698