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

Unified Diff: Source/web/PopupMenuImpl.cpp

Issue 1149153003: New SELECT Popup: Very slow to open a popup with many items. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: More optimization Created 5 years, 7 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/PopupMenuImpl.cpp
diff --git a/Source/web/PopupMenuImpl.cpp b/Source/web/PopupMenuImpl.cpp
index 621fa5861f7ba0bfafd4e98ebfe7de003ec4a800..49fc55f0cd46bb413ecc41d3d2c2a98eafb8e5e2 100644
--- a/Source/web/PopupMenuImpl.cpp
+++ b/Source/web/PopupMenuImpl.cpp
@@ -27,6 +27,11 @@
namespace blink {
+// We don't make child style information if the popup will have a lot of items
+// because of a performance problem.
+// TODO(tkent): This is a workaround. We should do a performance optimization.
+static const unsigned styledChildrenLimit = 100;
+
class PopupMenuCSSFontSelector : public CSSFontSelector {
public:
static PassRefPtrWillBeRawPtr<PopupMenuCSSFontSelector> create(Document* document, CSSFontSelector* ownerFontSelector)
@@ -94,13 +99,14 @@ void PopupMenuImpl::writeDocument(SharedBuffer* data)
"window.dialogArguments = {\n", data);
addProperty("selectedIndex", m_client->selectedIndex(), data);
PagePopupClient::addString("children: [\n", data);
+ bool enableExtraStyling = ownerElement().countChildren() < styledChildrenLimit;
for (HTMLElement& child : Traversal<HTMLElement>::childrenOf(ownerElement())) {
if (isHTMLOptionElement(child))
- addOption(toHTMLOptionElement(child), data);
+ addOption(toHTMLOptionElement(child), enableExtraStyling, data);
if (isHTMLOptGroupElement(child))
- addOptGroup(toHTMLOptGroupElement(child), data);
+ addOptGroup(toHTMLOptGroupElement(child), enableExtraStyling, data);
if (isHTMLHRElement(child))
- addSeparator(toHTMLHRElement(child), data);
+ addSeparator(toHTMLHRElement(child), enableExtraStyling, data);
}
PagePopupClient::addString("],\n", data);
addProperty("anchorRectInScreen", anchorRectInScreen, data);
@@ -180,33 +186,35 @@ const char* fontStyleToString(FontStyle style)
return 0;
}
-void PopupMenuImpl::addElementStyle(HTMLElement& element, SharedBuffer* data)
+void PopupMenuImpl::addElementStyle(HTMLElement& element, bool enableExtraStyling, SharedBuffer* data)
{
const ComputedStyle* style = m_client->computedStyleForItem(element);
ASSERT(style);
PagePopupClient::addString("style: {\n", data);
- addProperty("color", style->visitedDependentColor(CSSPropertyColor).serialized(), data);
- addProperty("backgroundColor", style->visitedDependentColor(CSSPropertyBackgroundColor).serialized(), data);
- const FontDescription& fontDescription = style->font().fontDescription();
- addProperty("fontSize", fontDescription.computedPixelSize(), data);
- addProperty("fontWeight", String(fontWeightToString(fontDescription.weight())), data);
- PagePopupClient::addString("fontFamily: [\n", data);
- for (const FontFamily* f = &fontDescription.family(); f; f = f->next()) {
- addJavaScriptString(f->family().string(), data);
- if (f->next())
- PagePopupClient::addString(",\n", data);
- }
- PagePopupClient::addString("],\n", data);
- addProperty("fontStyle", String(fontStyleToString(fontDescription.style())), data);
- addProperty("fontVariant", String(fontVariantToString(fontDescription.variant())), data);
- addProperty("visibility", String(style->visibility() == HIDDEN ? "hidden" : "visible"), data);
- addProperty("display", String(style->display() == NONE ? "none" : "block"), data);
+ addProperty("visibility", String(style->visibility() == HIDDEN ? "hidden" : ""), data);
+ addProperty("display", String(style->display() == NONE ? "none" : ""), data);
addProperty("direction", String(style->direction() == RTL ? "rtl" : "ltr"), data);
addProperty("unicodeBidi", String(isOverride(style->unicodeBidi()) ? "bidi-override" : "normal"), data);
+ if (enableExtraStyling) {
+ addProperty("color", style->visitedDependentColor(CSSPropertyColor).serialized(), data);
+ addProperty("backgroundColor", style->visitedDependentColor(CSSPropertyBackgroundColor).serialized(), data);
+ const FontDescription& fontDescription = style->font().fontDescription();
+ addProperty("fontSize", fontDescription.computedPixelSize(), data);
+ addProperty("fontWeight", String(fontWeightToString(fontDescription.weight())), data);
+ PagePopupClient::addString("fontFamily: [\n", data);
+ for (const FontFamily* f = &fontDescription.family(); f; f = f->next()) {
+ addJavaScriptString(f->family().string(), data);
+ if (f->next())
+ PagePopupClient::addString(",\n", data);
+ }
+ PagePopupClient::addString("],\n", data);
+ addProperty("fontStyle", String(fontStyleToString(fontDescription.style())), data);
+ addProperty("fontVariant", String(fontVariantToString(fontDescription.variant())), data);
+ }
PagePopupClient::addString("},\n", data);
}
-void PopupMenuImpl::addOption(HTMLOptionElement& element, SharedBuffer* data)
+void PopupMenuImpl::addOption(HTMLOptionElement& element, bool enableExtraStyling, SharedBuffer* data)
{
PagePopupClient::addString("{\n", data);
PagePopupClient::addString("type: \"option\",\n", data);
@@ -215,11 +223,11 @@ void PopupMenuImpl::addOption(HTMLOptionElement& element, SharedBuffer* data)
addProperty("value", element.listIndex(), data);
addProperty("ariaLabel", element.fastGetAttribute(HTMLNames::aria_labelAttr), data);
addProperty("disabled", element.isDisabledFormControl(), data);
- addElementStyle(element, data);
+ addElementStyle(element, enableExtraStyling, data);
PagePopupClient::addString("},\n", data);
}
-void PopupMenuImpl::addOptGroup(HTMLOptGroupElement& element, SharedBuffer* data)
+void PopupMenuImpl::addOptGroup(HTMLOptGroupElement& element, bool enableExtraStyling, SharedBuffer* data)
{
PagePopupClient::addString("{\n", data);
PagePopupClient::addString("type: \"optgroup\",\n", data);
@@ -227,28 +235,28 @@ void PopupMenuImpl::addOptGroup(HTMLOptGroupElement& element, SharedBuffer* data
addProperty("title", element.title(), data);
addProperty("ariaLabel", element.fastGetAttribute(HTMLNames::aria_labelAttr), data);
addProperty("disabled", element.isDisabledFormControl(), data);
- addElementStyle(element, data);
+ addElementStyle(element, enableExtraStyling, data);
PagePopupClient::addString("children: [", data);
for (HTMLElement& child : Traversal<HTMLElement>::childrenOf(element)) {
if (isHTMLOptionElement(child))
- addOption(toHTMLOptionElement(child), data);
+ addOption(toHTMLOptionElement(child), enableExtraStyling, data);
if (isHTMLOptGroupElement(child))
- addOptGroup(toHTMLOptGroupElement(child), data);
+ addOptGroup(toHTMLOptGroupElement(child), enableExtraStyling, data);
if (isHTMLHRElement(child))
- addSeparator(toHTMLHRElement(child), data);
+ addSeparator(toHTMLHRElement(child), enableExtraStyling, data);
}
PagePopupClient::addString("],\n", data);
PagePopupClient::addString("},\n", data);
}
-void PopupMenuImpl::addSeparator(HTMLHRElement& element, SharedBuffer* data)
+void PopupMenuImpl::addSeparator(HTMLHRElement& element, bool enableExtraStyling, SharedBuffer* data)
{
PagePopupClient::addString("{\n", data);
PagePopupClient::addString("type: \"separator\",\n", data);
addProperty("title", element.title(), data);
addProperty("ariaLabel", element.fastGetAttribute(HTMLNames::aria_labelAttr), data);
addProperty("disabled", element.isDisabledFormControl(), data);
- addElementStyle(element, data);
+ addElementStyle(element, enableExtraStyling, data);
PagePopupClient::addString("},\n", data);
}
@@ -354,13 +362,14 @@ void PopupMenuImpl::update()
PagePopupClient::addString("window.updateData = {\n", data.get());
PagePopupClient::addString("type: \"update\",\n", data.get());
PagePopupClient::addString("children: [", data.get());
+ bool enableExtraStyling = ownerElement().countChildren() < styledChildrenLimit;
for (HTMLElement& child : Traversal<HTMLElement>::childrenOf(ownerElement())) {
if (isHTMLOptionElement(child))
- addOption(toHTMLOptionElement(child), data.get());
+ addOption(toHTMLOptionElement(child), enableExtraStyling, data.get());
if (isHTMLOptGroupElement(child))
- addOptGroup(toHTMLOptGroupElement(child), data.get());
+ addOptGroup(toHTMLOptGroupElement(child), enableExtraStyling, data.get());
if (isHTMLHRElement(child))
- addSeparator(toHTMLHRElement(child), data.get());
+ addSeparator(toHTMLHRElement(child), enableExtraStyling, data.get());
}
PagePopupClient::addString("],\n", data.get());
PagePopupClient::addString("}\n", data.get());

Powered by Google App Engine
This is Rietveld 408576698