Chromium Code Reviews| 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 |