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

Unified Diff: Source/web/PopupMenuImpl.cpp

Issue 1193793002: New SELECT Popup: Remove O(N^2) scan for OPTIONs. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 6 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/PopupMenuImpl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/web/PopupMenuImpl.cpp
diff --git a/Source/web/PopupMenuImpl.cpp b/Source/web/PopupMenuImpl.cpp
index ffe9cdeda8b00bb96f58dcc6a9ac0004324c0efb..67dcdedb57def2c76cb26b88d9187afec474b902 100644
--- a/Source/web/PopupMenuImpl.cpp
+++ b/Source/web/PopupMenuImpl.cpp
@@ -131,13 +131,14 @@ void PopupMenuImpl::writeDocument(SharedBuffer* data)
addProperty("selectedIndex", m_client->selectedIndex(), data);
PagePopupClient::addString("children: [\n", data);
bool enableExtraStyling = !hasTooManyItemsForStyling();
+ int listIndex = 0;
for (HTMLElement& child : Traversal<HTMLElement>::childrenOf(ownerElement())) {
if (isHTMLOptionElement(child))
- addOption(toHTMLOptionElement(child), enableExtraStyling, data);
+ addOption(toHTMLOptionElement(child), listIndex, enableExtraStyling, data);
if (isHTMLOptGroupElement(child))
- addOptGroup(toHTMLOptGroupElement(child), enableExtraStyling, data);
+ addOptGroup(toHTMLOptGroupElement(child), listIndex, enableExtraStyling, data);
if (isHTMLHRElement(child))
- addSeparator(toHTMLHRElement(child), enableExtraStyling, data);
+ addSeparator(toHTMLHRElement(child), listIndex, enableExtraStyling, data);
}
PagePopupClient::addString("],\n", data);
addProperty("anchorRectInScreen", anchorRectInScreen, data);
@@ -262,21 +263,23 @@ void PopupMenuImpl::addElementStyle(HTMLElement& element, bool enableExtraStylin
PagePopupClient::addString("},\n", data);
}
-void PopupMenuImpl::addOption(HTMLOptionElement& element, bool enableExtraStyling, SharedBuffer* data)
+void PopupMenuImpl::addOption(HTMLOptionElement& element, int& listIndex, bool enableExtraStyling, SharedBuffer* data)
{
PagePopupClient::addString("{\n", data);
PagePopupClient::addString("type: \"option\",\n", data);
addProperty("label", element.text(), data);
addProperty("title", element.title(), data);
- addProperty("value", element.listIndex(), data);
+ ASSERT(listIndex == element.listIndex());
+ addProperty("value", listIndex++, data);
addProperty("ariaLabel", element.fastGetAttribute(HTMLNames::aria_labelAttr), data);
addProperty("disabled", element.isDisabledFormControl(), data);
addElementStyle(element, enableExtraStyling, data);
PagePopupClient::addString("},\n", data);
}
-void PopupMenuImpl::addOptGroup(HTMLOptGroupElement& element, bool enableExtraStyling, SharedBuffer* data)
+void PopupMenuImpl::addOptGroup(HTMLOptGroupElement& element, int& listIndex, bool enableExtraStyling, SharedBuffer* data)
{
+ ++listIndex;
PagePopupClient::addString("{\n", data);
PagePopupClient::addString("type: \"optgroup\",\n", data);
addProperty("label", element.groupLabelText(), data);
@@ -287,18 +290,20 @@ void PopupMenuImpl::addOptGroup(HTMLOptGroupElement& element, bool enableExtraSt
PagePopupClient::addString("children: [", data);
for (HTMLElement& child : Traversal<HTMLElement>::childrenOf(element)) {
if (isHTMLOptionElement(child))
- addOption(toHTMLOptionElement(child), enableExtraStyling, data);
+ addOption(toHTMLOptionElement(child), listIndex, enableExtraStyling, data);
+ // TODO(tkent): Ignore nested OPTGROUP. crbug.com/502101.
if (isHTMLOptGroupElement(child))
- addOptGroup(toHTMLOptGroupElement(child), enableExtraStyling, data);
+ addOptGroup(toHTMLOptGroupElement(child), listIndex, enableExtraStyling, data);
if (isHTMLHRElement(child))
- addSeparator(toHTMLHRElement(child), enableExtraStyling, data);
+ addSeparator(toHTMLHRElement(child), listIndex, enableExtraStyling, data);
}
PagePopupClient::addString("],\n", data);
PagePopupClient::addString("},\n", data);
}
-void PopupMenuImpl::addSeparator(HTMLHRElement& element, bool enableExtraStyling, SharedBuffer* data)
+void PopupMenuImpl::addSeparator(HTMLHRElement& element, int& listIndex, bool enableExtraStyling, SharedBuffer* data)
{
+ ++listIndex;
PagePopupClient::addString("{\n", data);
PagePopupClient::addString("type: \"separator\",\n", data);
addProperty("title", element.title(), data);
@@ -411,13 +416,14 @@ void PopupMenuImpl::update()
PagePopupClient::addString("type: \"update\",\n", data.get());
PagePopupClient::addString("children: [", data.get());
bool enableExtraStyling = !hasTooManyItemsForStyling();
+ int listIndex = 0;
for (HTMLElement& child : Traversal<HTMLElement>::childrenOf(ownerElement())) {
if (isHTMLOptionElement(child))
- addOption(toHTMLOptionElement(child), enableExtraStyling, data.get());
+ addOption(toHTMLOptionElement(child), listIndex, enableExtraStyling, data.get());
if (isHTMLOptGroupElement(child))
- addOptGroup(toHTMLOptGroupElement(child), enableExtraStyling, data.get());
+ addOptGroup(toHTMLOptGroupElement(child), listIndex, enableExtraStyling, data.get());
if (isHTMLHRElement(child))
- addSeparator(toHTMLHRElement(child), enableExtraStyling, data.get());
+ addSeparator(toHTMLHRElement(child), listIndex, enableExtraStyling, data.get());
}
PagePopupClient::addString("],\n", data.get());
PagePopupClient::addString("}\n", data.get());
« no previous file with comments | « Source/web/PopupMenuImpl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698