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