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

Unified Diff: Source/web/PopupMenuImpl.cpp

Issue 1267113002: PopupMenuImpl should get menu items via PopupMenuClient. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 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/ExternalPopupMenuTest.cpp ('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 05ea02149ce9fd5dbe89ee2d1c3420a26ca28290..2cef174070d796c676f2de52e2b16624fc5fe682 100644
--- a/Source/web/PopupMenuImpl.cpp
+++ b/Source/web/PopupMenuImpl.cpp
@@ -165,6 +165,7 @@ public:
, m_textTransform(style.textTransform())
, m_fontDescription(style.fontDescription())
, m_listIndex(0)
+ , m_isInGroup(false)
, m_buffer(buffer)
{
ASSERT(m_buffer);
@@ -198,6 +199,20 @@ public:
PagePopupClient::addString("},\n", m_buffer);
}
+ void startGroupChildren()
+ {
+ ASSERT(!m_isInGroup);
+ PagePopupClient::addString("children: [", m_buffer);
+ m_isInGroup = true;
+ }
+ void finishGroupIfNecessary()
+ {
+ if (!m_isInGroup)
+ return;
+ PagePopupClient::addString("],},\n", m_buffer);
+ m_isInGroup = false;
+ }
+
int fontSize() const { return m_fontDescription.computedPixelSize(); }
FontStyle fontStyle() const { return m_fontDescription.style(); }
FontVariant fontVariant() const { return m_fontDescription.variant(); }
@@ -210,6 +225,7 @@ public:
const FontDescription& m_fontDescription;
int m_listIndex;
+ bool m_isInGroup;
SharedBuffer* m_buffer;
};
@@ -252,14 +268,18 @@ void PopupMenuImpl::writeDocument(SharedBuffer* data)
ItemIterationContext context(*ownerStyle, data);
context.serializeBaseStyle();
PagePopupClient::addString("children: [\n", data);
- for (HTMLElement& child : Traversal<HTMLElement>::childrenOf(ownerElement())) {
+ for (; context.m_listIndex < m_client->listSize(); ++context.m_listIndex) {
+ Element& child = m_client->itemElement(context.m_listIndex);
+ if (!isHTMLOptGroupElement(child.parentNode()))
+ context.finishGroupIfNecessary();
if (isHTMLOptionElement(child))
addOption(context, toHTMLOptionElement(child));
- if (isHTMLOptGroupElement(child))
+ else if (isHTMLOptGroupElement(child))
addOptGroup(context, toHTMLOptGroupElement(child));
- if (isHTMLHRElement(child))
+ else if (isHTMLHRElement(child))
addSeparator(context, toHTMLHRElement(child));
}
+ context.finishGroupIfNecessary();
PagePopupClient::addString("],\n", data);
addProperty("anchorRectInScreen", anchorRectInScreen, data);
@@ -274,7 +294,7 @@ void PopupMenuImpl::writeDocument(SharedBuffer* data)
void PopupMenuImpl::addElementStyle(ItemIterationContext& context, HTMLElement& element)
{
- const ComputedStyle* style = m_client->computedStyleForItem(element);
+ const ComputedStyle* style = m_client->computedStyleForItem(context.m_listIndex);
ASSERT(style);
SharedBuffer* data = context.m_buffer;
// TODO(tkent): We generate unnecessary "style: {\n},\n" even if no
@@ -324,8 +344,7 @@ void PopupMenuImpl::addOption(ItemIterationContext& context, HTMLOptionElement&
SharedBuffer* data = context.m_buffer;
PagePopupClient::addString("{", data);
addProperty("label", element.text(), data);
- ASSERT(context.m_listIndex == element.listIndex());
- addProperty("value", context.m_listIndex++, data);
+ addProperty("value", context.m_listIndex, data);
if (!element.title().isEmpty())
addProperty("title", element.title(), data);
const AtomicString& ariaLabel = element.fastGetAttribute(HTMLNames::aria_labelAttr);
@@ -340,7 +359,6 @@ void PopupMenuImpl::addOption(ItemIterationContext& context, HTMLOptionElement&
void PopupMenuImpl::addOptGroup(ItemIterationContext& context, HTMLOptGroupElement& element)
{
SharedBuffer* data = context.m_buffer;
- ++context.m_listIndex;
PagePopupClient::addString("{\n", data);
PagePopupClient::addString("type: \"optgroup\",\n", data);
addProperty("label", element.groupLabelText(), data);
@@ -348,21 +366,13 @@ void PopupMenuImpl::addOptGroup(ItemIterationContext& context, HTMLOptGroupEleme
addProperty("ariaLabel", element.fastGetAttribute(HTMLNames::aria_labelAttr), data);
addProperty("disabled", element.isDisabledFormControl(), data);
addElementStyle(context, element);
- PagePopupClient::addString("children: [", data);
- for (HTMLElement& child : Traversal<HTMLElement>::childrenOf(element)) {
- if (isHTMLOptionElement(child))
- addOption(context, toHTMLOptionElement(child));
- if (isHTMLHRElement(child))
- addSeparator(context, toHTMLHRElement(child));
- }
- PagePopupClient::addString("],\n", data);
- PagePopupClient::addString("},\n", data);
+ context.startGroupChildren();
+ // We should call ItemIterationContext::finishGroupIfNecessary() later.
}
void PopupMenuImpl::addSeparator(ItemIterationContext& context, HTMLHRElement& element)
{
SharedBuffer* data = context.m_buffer;
- ++context.m_listIndex;
PagePopupClient::addString("{\n", data);
PagePopupClient::addString("type: \"separator\",\n", data);
addProperty("title", element.title(), data);
@@ -476,14 +486,18 @@ void PopupMenuImpl::update()
ItemIterationContext context(*ownerElement().computedStyle(), data.get());
context.serializeBaseStyle();
PagePopupClient::addString("children: [", data.get());
- for (HTMLElement& child : Traversal<HTMLElement>::childrenOf(ownerElement())) {
+ for (; context.m_listIndex < m_client->listSize(); ++context.m_listIndex) {
+ Element& child = m_client->itemElement(context.m_listIndex);
+ if (!isHTMLOptGroupElement(child.parentNode()))
+ context.finishGroupIfNecessary();
if (isHTMLOptionElement(child))
addOption(context, toHTMLOptionElement(child));
- if (isHTMLOptGroupElement(child))
+ else if (isHTMLOptGroupElement(child))
addOptGroup(context, toHTMLOptGroupElement(child));
- if (isHTMLHRElement(child))
+ else if (isHTMLHRElement(child))
addSeparator(context, toHTMLHRElement(child));
}
+ context.finishGroupIfNecessary();
PagePopupClient::addString("],\n", data.get());
PagePopupClient::addString("}\n", data.get());
m_popup->postMessage(String::fromUTF8(data->data(), data->size()));
« no previous file with comments | « Source/web/ExternalPopupMenuTest.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698