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

Unified Diff: Source/core/dom/CustomElement.cpp

Issue 23009004: Process Custom Elements in post-order. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 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
Index: Source/core/dom/CustomElement.cpp
diff --git a/Source/core/dom/CustomElement.cpp b/Source/core/dom/CustomElement.cpp
index 6ffcd2a97306dbab97685d39624030bb2185dab1..56a01317941e25930c7518b5a89dfd999f169a0d 100644
--- a/Source/core/dom/CustomElement.cpp
+++ b/Source/core/dom/CustomElement.cpp
@@ -93,7 +93,8 @@ void CustomElement::define(Element* element, PassRefPtr<CustomElementDefinition>
RefPtr<CustomElementDefinition> definition(passDefinition);
element->setCustomElementState(Element::Defined);
definitions().add(element, definition);
- CustomElementCallbackScheduler::scheduleCreatedCallback(definition->callbacks(), element);
+ if (!elementsBeingParsed().contains(element))
dglazkov 2013/08/13 16:22:06 I am trying to figure out why we need this check a
+ CustomElementCallbackScheduler::scheduleCreatedCallback(definition->callbacks(), element);
}
CustomElementDefinition* CustomElement::definitionFor(Element* element)
@@ -101,6 +102,26 @@ CustomElementDefinition* CustomElement::definitionFor(Element* element)
return definitions().get(element);
}
+void CustomElement::finishedParsingChildren(Element* element)
+{
+ switch (element->customElementState()) {
+ case Node::NotCustomElement:
+ case Node::Upgraded:
+ ASSERT_NOT_REACHED();
+ return;
+
+ case Node::UpgradeCandidate:
+ CustomElementUpgradeCandidateMap::elementFinishedParsingChildren(element);
+ setFinishedParsing(element);
+ return;
+
+ case Node::Defined:
+ setFinishedParsing(element);
+ CustomElementCallbackScheduler::scheduleCreatedCallback(definitionFor(element)->callbacks(), element);
+ return;
+ }
+}
+
void CustomElement::attributeDidChange(Element* element, const AtomicString& name, const AtomicString& oldValue, const AtomicString& newValue)
{
ASSERT(element->customElementState() == Element::Upgraded);
@@ -132,9 +153,14 @@ void CustomElement::wasDestroyed(Element* element)
case Element::UpgradeCandidate:
CustomElementUpgradeCandidateMap::elementWasDestroyed(element);
+ elementsBeingParsed().remove(element);
break;
case Element::Defined:
+ elementsBeingParsed().remove(element);
+ definitions().remove(element);
+ break;
+
case Element::Upgraded:
definitions().remove(element);
break;
@@ -166,4 +192,23 @@ CustomElement::DefinitionMap& CustomElement::definitions()
return map;
}
+CustomElement::ElementSet& CustomElement::elementsBeingParsed()
+{
+ DEFINE_STATIC_LOCAL(ElementSet, set, ());
+ return set;
+}
+
+void CustomElement::setBeingParsed(Element* element)
+{
+ ElementSet::AddResult result = elementsBeingParsed().add(element);
+ ASSERT(result.isNewEntry);
+}
+
+void CustomElement::setFinishedParsing(Element* element)
+{
+ ElementSet::iterator it = elementsBeingParsed().find(element);
+ ASSERT(it != elementsBeingParsed().end());
+ elementsBeingParsed().remove(it);
+}
+
} // namespace WebCore

Powered by Google App Engine
This is Rietveld 408576698