ShadowRoot& ElementShadow::addShadowRoot(Element& shadowHost, ShadowRootType type) { EventDispatchForbiddenScope assertNoEventDispatch; ScriptForbiddenScope forbidScript; if (type == ShadowRootType::V0 && m_shadowRoot) { DCHECK_EQ(m_shadowRoot->type(), ShadowRootType::V0); Deprecation::countDeprecation(shadowHost.document(), UseCounter::ElementCreateShadowRootMultiple); } if (m_shadowRoot) { // TODO(hayato): Is the order, from the youngest to the oldest, important? for (ShadowRoot* root = &youngestShadowRoot(); root; root = root->olderShadowRoot()) root->lazyReattachIfAttached(); } ShadowRoot* shadowRoot = ShadowRoot::create(shadowHost.document(), type); shadowRoot->setParentOrShadowHostNode(&shadowHost); shadowRoot->setParentTreeScope(shadowHost.treeScope()); appendShadowRoot(*shadowRoot); setNeedsDistributionRecalc(); shadowRoot->insertedInto(&shadowHost); shadowHost.setChildNeedsStyleRecalc(); shadowHost.setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::Shadow)); InspectorInstrumentation::didPushShadowRoot(&shadowHost, shadowRoot); return *shadowRoot; }
ShadowRoot& ElementShadow::addShadowRoot(Element& shadowHost, ShadowRootType type) { EventDispatchForbiddenScope assertNoEventDispatch; ScriptForbiddenScope forbidScript; if (type == ShadowRootType::V0) { if (m_shadowRoots.isEmpty()) { shadowHost.willAddFirstAuthorShadowRoot(); } else if (m_shadowRoots.head()->type() == ShadowRootType::UserAgent) { shadowHost.willAddFirstAuthorShadowRoot(); UseCounter::countDeprecation(shadowHost.document(), UseCounter::ElementCreateShadowRootMultipleWithUserAgentShadowRoot); } else { UseCounter::countDeprecation(shadowHost.document(), UseCounter::ElementCreateShadowRootMultiple); } } else if (type == ShadowRootType::Open || type == ShadowRootType::Closed) { shadowHost.willAddFirstAuthorShadowRoot(); } for (ShadowRoot* root = m_shadowRoots.head(); root; root = root->olderShadowRoot()) root->lazyReattachIfAttached(); RefPtrWillBeRawPtr<ShadowRoot> shadowRoot = ShadowRoot::create(shadowHost.document(), type); shadowRoot->setParentOrShadowHostNode(&shadowHost); shadowRoot->setParentTreeScope(shadowHost.treeScope()); m_shadowRoots.push(shadowRoot.get()); setNeedsDistributionRecalc(); shadowRoot->insertedInto(&shadowHost); shadowHost.setChildNeedsStyleRecalc(); shadowHost.setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::Shadow)); InspectorInstrumentation::didPushShadowRoot(&shadowHost, shadowRoot.get()); return *shadowRoot; }
ShadowRoot& ElementShadow::addShadowRoot(Element& shadowHost, ShadowRoot::ShadowRootType type) { RefPtr<ShadowRoot> shadowRoot = ShadowRoot::create(shadowHost.document(), type); for (ShadowRoot* root = youngestShadowRoot(); root; root = root->olderShadowRoot()) root->lazyReattachIfAttached(); shadowRoot->setParentOrShadowHostNode(&shadowHost); shadowRoot->setParentTreeScope(shadowHost.treeScope()); m_shadowRoots.push(shadowRoot.get()); ChildNodeInsertionNotifier(shadowHost).notify(*shadowRoot); setNeedsDistributionRecalc(); // addShadowRoot() affects apply-author-styles. However, we know that the youngest shadow root has not had any children yet. // The youngest shadow root's apply-author-styles is default (false). So we can just set m_applyAuthorStyles false. m_applyAuthorStyles = false; shadowHost.didAddShadowRoot(*shadowRoot); InspectorInstrumentation::didPushShadowRoot(&shadowHost, shadowRoot.get()); ASSERT(m_shadowRoots.head()); ASSERT(shadowRoot.get() == m_shadowRoots.head()); return *m_shadowRoots.head(); }