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()); |