| 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 6ecc7a8ea89b49ab40328c7981fe22f933eed729..5f6dcbb7e98035dbb37321553b9ba85deaa652b2 100644
|
| --- a/third_party/WebKit/Source/core/dom/custom/CustomElementsRegistry.cpp
|
| +++ b/third_party/WebKit/Source/core/dom/custom/CustomElementsRegistry.cpp
|
| @@ -79,6 +79,9 @@ CustomElementsRegistry::CustomElementsRegistry(const LocalDOMWindow* owner)
|
| , m_v0 (new V0RegistrySet())
|
| , m_upgradeCandidates(new UpgradeCandidateMap())
|
| {
|
| + // !contextDocument() just for unit testing.
|
| + DCHECK(m_owner->document() == m_owner->document()->contextDocument()
|
| + || !m_owner->document()->contextDocument());
|
| }
|
|
|
| DEFINE_TRACE(CustomElementsRegistry)
|
| @@ -234,6 +237,10 @@ CustomElementDefinition* CustomElementsRegistry::definitionForName(
|
|
|
| void CustomElementsRegistry::addCandidate(Element* candidate)
|
| {
|
| + // !contextDocument() just for unit testing.
|
| + DCHECK(candidate->document().contextDocument() == m_owner->document()
|
| + || !candidate->document().contextDocument());
|
| +
|
| const AtomicString& name = candidate->localName();
|
| if (nameIsDefined(name) || v0NameIsDefined(name))
|
| return;
|
| @@ -269,6 +276,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)
|
| @@ -276,11 +310,19 @@ 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);
|
| +
|
| + // Group elements by document if they are in import documents.
|
| + Document& document = element->document();
|
| + if (document == m_owner->document())
|
| + sorter.add(element);
|
| + else if (document.contextDocument() == m_owner->document())
|
| + addToImports(imports, element);
|
| }
|
|
|
| m_upgradeCandidates->remove(it);
|
| @@ -289,6 +331,10 @@ void CustomElementsRegistry::collectCandidates(
|
| if (!document)
|
| return;
|
|
|
| + // If there were elements from import documents, put them first.
|
| + if (!imports.isEmpty())
|
| + collectFromImports(imports, elements);
|
| +
|
| sorter.sorted(elements, document);
|
| }
|
|
|
|
|