Chromium Code Reviews| Index: third_party/WebKit/Source/core/dom/custom/CustomElementsRegistry.cpp |
| diff --git a/third_party/WebKit/Source/core/dom/custom/CustomElementsRegistry.cpp b/third_party/WebKit/Source/core/dom/custom/CustomElementsRegistry.cpp |
| index 1bd3aad2ffc571283db758477872f8e23179e72b..983d9860332b76b90a0912d85d4c987ea5c9a4ae 100644 |
| --- a/third_party/WebKit/Source/core/dom/custom/CustomElementsRegistry.cpp |
| +++ b/third_party/WebKit/Source/core/dom/custom/CustomElementsRegistry.cpp |
| @@ -75,6 +75,9 @@ CustomElementsRegistry::CustomElementsRegistry(Document* document) |
| : m_document(document) |
| , m_upgradeCandidates(new UpgradeCandidateMap()) |
| { |
| + // !contextDocument() just for unit testing. |
| + DCHECK(document == document->contextDocument() |
| + || !document->contextDocument()); |
| } |
| DEFINE_TRACE(CustomElementsRegistry) |
| @@ -214,6 +217,10 @@ CustomElementDefinition* CustomElementsRegistry::definitionForName( |
| void CustomElementsRegistry::addCandidate(Element* candidate) |
| { |
| + // !contextDocument() just for unit testing. |
| + DCHECK(candidate->document().contextDocument() == m_document |
| + || !candidate->document().contextDocument()); |
| + |
| const AtomicString& name = candidate->localName(); |
| if (nameIsDefined(name) || v0NameIsDefined(name)) |
| return; |
| @@ -249,6 +256,33 @@ ScriptPromise CustomElementsRegistry::whenDefined( |
| return newResolver->promise(); |
| } |
| +using ElementsInDocument = HeapVector<Member<Element>>; |
| +using ElementsDocumentMap = HeapHashMap<Document*, ElementsInDocument>; |
| + |
| +static void addToImports(ElementsDocumentMap& imports, Element* element) |
| +{ |
| + Document* document = &element->document(); |
| + const auto& it = imports.find(document); |
| + ElementsInDocument* list; |
| + if (it != imports.end()) { |
| + list = &it->value; |
| + } else { |
| + list = &imports.add(document, ElementsInDocument()) |
| + .storedValue->value; |
| + } |
| + list->append(element); |
| +} |
| + |
| +static void collectFromImports(ElementsDocumentMap& imports, HeapVector<Member<Element>>* elements) |
| +{ |
| + for (const auto& it : imports) { |
| + CustomElementUpgradeSorter sorter; |
| + for (Element* element : it.value) |
| + sorter.add(element); |
| + sorter.sorted(elements, it.key); |
| + } |
| +} |
| + |
| void CustomElementsRegistry::collectCandidates( |
| const CustomElementDescriptor& desc, |
| HeapVector<Member<Element>>* elements) |
| @@ -256,14 +290,31 @@ void CustomElementsRegistry::collectCandidates( |
| UpgradeCandidateMap::iterator it = m_upgradeCandidates->find(desc.name()); |
| if (it == m_upgradeCandidates->end()) |
| return; |
| + |
| + ElementsDocumentMap imports; |
| CustomElementUpgradeSorter sorter; |
| for (Element* element : *it.get()->value) { |
| if (!element || !desc.matches(*element)) |
| continue; |
| - sorter.add(element); |
| + |
| + Document& document = element->document(); |
| + if (document == m_document) { |
| + sorter.add(element); |
| + continue; |
| + } |
|
dominicc (has gone to gerrit)
2016/07/13 06:12:30
else-if might be clearer than continues.
kojii
2016/07/13 06:47:16
Done.
kojii
2016/07/13 06:47:16
Done.
|
| + |
| + // Group elements by document if they are in import documents. |
| + if (document.contextDocument() == m_document) { |
| + addToImports(imports, element); |
| + continue; |
| + } |
| + |
| + // The element has moved to other documents, ignore. |
| } |
| m_upgradeCandidates->remove(it); |
| + if (!imports.isEmpty()) |
|
dominicc (has gone to gerrit)
2016/07/13 06:12:30
I'm not really grokking this change at this point.
kojii
2016/07/13 06:47:16
I'm sorry, I can't understand what "grabble" means
|
| + collectFromImports(imports, elements); |
| sorter.sorted(elements, m_document.get()); |
| } |