Chromium Code Reviews| Index: third_party/WebKit/Source/core/dom/custom/CustomElementUpgradeSorter.cpp |
| diff --git a/third_party/WebKit/Source/core/dom/custom/CustomElementUpgradeSorter.cpp b/third_party/WebKit/Source/core/dom/custom/CustomElementUpgradeSorter.cpp |
| index 34f9e28e5ea741d3eb6a526ae982debb3d29d0fa..2401593c44455eb57dfcac980d5971b8c2abd685 100644 |
| --- a/third_party/WebKit/Source/core/dom/custom/CustomElementUpgradeSorter.cpp |
| +++ b/third_party/WebKit/Source/core/dom/custom/CustomElementUpgradeSorter.cpp |
| @@ -8,6 +8,10 @@ |
| #include "core/dom/ElementTraversal.h" |
| #include "core/dom/Node.h" |
| #include "core/dom/shadow/ShadowRoot.h" |
| +#include "core/html/HTMLLinkElement.h" |
| +#include "core/html/imports/HTMLImportChild.h" |
| +#include "core/html/imports/HTMLImportTreeRoot.h" |
| +#include "core/html/imports/HTMLImportsController.h" |
| namespace blink { |
| @@ -17,23 +21,59 @@ CustomElementUpgradeSorter::CustomElementUpgradeSorter() |
| { |
| } |
| +static HTMLLinkElement* GetParentLinkElement(Document* d) |
|
dominicc (has gone to gerrit)
2016/08/22 08:07:36
Get -> get
Does HTML imports use this nomenclatur
kochi
2016/08/22 12:02:00
Renamed the function to getLinkElement().
|
| +{ |
| + DCHECK(d); |
| + HTMLImportsController* c = d->importsController(); |
| + if (!c) |
| + return nullptr; |
| + |
| + HTMLImportTreeRoot* r = c->root(); |
| + DCHECK(r); |
| + |
| + HTMLImportChild* ch = r->find(*d); |
| + if (!ch) |
| + return nullptr; |
| + |
| + // Get HTMLLinkElement <link rel="import"> |
| + return ch->link(); |
| +} |
| + |
| +CustomElementUpgradeSorter::AddResult CustomElementUpgradeSorter::addToParentChildMap( |
| + Node* parent, |
| + Node* child) |
| +{ |
| + ParentChildMap::iterator it = m_parentChildMap->find(parent); |
| + if (it != m_parentChildMap->end()) { |
| + it->value.add(child); |
| + // The entry for the parent exists; so must its parents. |
| + return kParentAlreadyExistsInMap; |
| + } |
| + ParentChildMap::AddResult result = |
| + m_parentChildMap->add(parent, HeapHashSet<Member<Node>>()); |
| + result.storedValue->value.add(child); |
| + return kParentAddedToMap; |
| +} |
| + |
| void CustomElementUpgradeSorter::add(Element* element) |
| { |
| m_elements->add(element); |
| - for (Node* n = element, *parent = n->parentOrShadowHostNode(); |
| - parent; |
| - n = parent, parent = parent->parentOrShadowHostNode()) { |
| - |
| - ParentChildMap::iterator it = m_parentChildMap->find(parent); |
| - if (it == m_parentChildMap->end()) { |
| - ParentChildMap::AddResult result = |
| - m_parentChildMap->add(parent, HeapHashSet<Member<Node>>()); |
| - result.storedValue->value.add(n); |
| - } else { |
| - it->value.add(n); |
| - // The entry for the parent exists; so must its parents. |
| + for (Node* n = element, *parent = n->parentOrShadowHostNode(); parent;) { |
|
dominicc (has gone to gerrit)
2016/08/22 08:07:36
Think about what you've done here when the documen
dominicc (has gone to gerrit)
2016/08/22 08:10:55
Hmm, actually, maybe this is fine, because this wi
kochi
2016/08/22 12:02:00
Added some comments.
|
| + if (addToParentChildMap(parent, n) == kParentAlreadyExistsInMap) |
| break; |
| + |
| + n = parent; |
| + parent = parent->parentOrShadowHostNode(); |
| + |
| + if (!parent && n->isDocumentNode()) { |
| + Document* d = toDocument(n); |
| + Element* link = GetParentLinkElement(d); |
| + if (!link || addToParentChildMap(link, n) == kParentAlreadyExistsInMap) |
| + break; |
| + |
| + n = link; |
| + parent = link->parentOrShadowHostNode(); |
| } |
| } |
| } |