void ContentDistributor::distribute(Element* host) { ASSERT(needsDistribution()); ASSERT(m_nodeToInsertionPoint.isEmpty()); m_validity = Valid; ContentDistribution pool; for (Node* node = host->firstChild(); node; node = node->nextSibling()) populate(node, pool); Vector<bool> distributed(pool.size()); distributed.fill(false); Vector<HTMLShadowElement*, 8> activeShadowInsertionPoints; for (ShadowRoot* root = host->youngestShadowRoot(); root; root = root->olderShadowRoot()) { HTMLShadowElement* firstActiveShadowInsertionPoint = 0; const Vector<InsertionPoint*>& insertionPoints = root->insertionPointList(); for (size_t i = 0; i < insertionPoints.size(); ++i) { InsertionPoint* point = insertionPoints[i]; if (!point->isActive()) continue; if (isHTMLShadowElement(point)) { if (!firstActiveShadowInsertionPoint) firstActiveShadowInsertionPoint = toHTMLShadowElement(point); } else { distributeSelectionsTo(point, pool, distributed); if (ElementShadow* shadow = point->parentNode()->isElementNode() ? toElement(point->parentNode())->shadow() : 0) shadow->invalidateDistribution(); } } if (firstActiveShadowInsertionPoint) activeShadowInsertionPoints.append(firstActiveShadowInsertionPoint); } for (size_t i = activeShadowInsertionPoints.size(); i > 0; --i) { HTMLShadowElement* shadowElement = activeShadowInsertionPoints[i - 1]; ShadowRoot* root = shadowElement->shadowRoot(); ASSERT(root); if (root->olderShadowRoot()) { distributeNodeChildrenTo(shadowElement, root->olderShadowRoot()); root->olderShadowRoot()->setAssignedTo(shadowElement); } else { distributeSelectionsTo(shadowElement, pool, distributed); if (ElementShadow* shadow = shadowElement->parentNode()->isElementNode() ? toElement(shadowElement->parentNode())->shadow() : 0) shadow->invalidateDistribution(); } } }
bool ContentDistributor::invalidate(Element* host) { ASSERT(needsInvalidation()); bool needsReattach = (m_validity == Undetermined) || !m_nodeToInsertionPoint.isEmpty(); for (ShadowRoot* root = host->youngestShadowRoot(); root; root = root->olderShadowRoot()) { root->setAssignedTo(0); const Vector<InsertionPoint*>& insertionPoints = root->insertionPointList(); for (size_t i = 0; i < insertionPoints.size(); ++i) { needsReattach = needsReattach || true; insertionPoints[i]->clearDistribution(); } } m_validity = Invalidating; m_nodeToInsertionPoint.clear(); return needsReattach; }