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

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: Fixed assert failure in linux dbg build 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
« no previous file with comments | « Source/web/ExternalPopupMenu.h ('k') | Source/web/PopupListBox.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/web/ExternalPopupMenu.cpp
diff --git a/Source/web/ExternalPopupMenu.cpp b/Source/web/ExternalPopupMenu.cpp
index 4505e5dd6d0fee13a0fa50cd0bb0621c81619299..f2252ba3bd196b8381782cf01892fa21aef8d734 100644
--- a/Source/web/ExternalPopupMenu.cpp
+++ b/Source/web/ExternalPopupMenu.cpp
@@ -126,7 +126,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 +134,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 +160,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 +184,14 @@ void ExternalPopupMenu::didCancel()
void ExternalPopupMenu::getPopupMenuInfo(WebPopupMenuInfo* info)
{
int itemCount = m_popupMenuClient->listSize();
- WebVector<WebMenuItemInfo> items(static_cast<size_t>(itemCount));
+ int count = 0;
+ Vector<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[count++];
popupItem.label = m_popupMenuClient->itemText(i);
popupItem.toolTip = m_popupMenuClient->itemToolTip(i);
if (m_popupMenuClient->itemIsSeparator(i))
@@ -196,7 +202,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 +211,45 @@ 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();
- info->items.swap(items);
+ info->items = items;
+}
+
+int ExternalPopupMenu::toPopupMenuItemIndex(int externalPopupMenuItemIndex)
+{
+ ASSERT(m_popupMenuClient);
+ if (externalPopupMenuItemIndex < 0)
+ return externalPopupMenuItemIndex;
+
+ int itemCount = m_popupMenuClient->listSize();
+ 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);
+ if (popupMenuItemIndex < 0)
+ return popupMenuItemIndex;
+
+ int itemCount = m_popupMenuClient->listSize();
+ 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;
}
}
« no previous file with comments | « Source/web/ExternalPopupMenu.h ('k') | Source/web/PopupListBox.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698