PassRefPtr<ShadowRoot> ShadowRoot::create(Element* element, ShadowRootType type, ExceptionCode& ec) { if (!element) { ec = HIERARCHY_REQUEST_ERR; return 0; } // Since some elements recreates shadow root dynamically, multiple shadow subtrees won't work well in that element. // Until they are fixed, we disable adding author shadow root for them. if (type == AuthorShadowRoot && !allowsAuthorShadowRoot(element)) { ec = HIERARCHY_REQUEST_ERR; return 0; } RefPtr<ShadowRoot> shadowRoot = adoptRef(new ShadowRoot(element->document())); shadowRoot->setType(type); ec = 0; element->ensureShadow()->addShadowRoot(element, shadowRoot, type, ec); if (ec) return 0; ASSERT(element == shadowRoot->host()); ASSERT(element->shadow()); return shadowRoot.release(); }
PassRefPtr<ShadowRoot> ShadowRoot::create(Element* element, ShadowRootCreationPurpose purpose, ExceptionCode& ec) { #if ENABLE(SHADOW_DOM) bool isMultipleShadowSubtreesEnabled = RuntimeEnabledFeatures::multipleShadowSubtreesEnabled(); #else bool isMultipleShadowSubtreesEnabled = false; #endif if (!element || (!isMultipleShadowSubtreesEnabled && element->hasShadowRoot())) { ec = HIERARCHY_REQUEST_ERR; return 0; } // Since some elements recreates shadow root dynamically, multiple shadow subtrees won't work well in that element. // Until they are fixed, we disable adding author shadow root for them. if (purpose == CreatingAuthorShadowRoot && !allowsAuthorShadowRoot(element)) { ec = HIERARCHY_REQUEST_ERR; return 0; } ASSERT(purpose != CreatingUserAgentShadowRoot || !element->hasShadowRoot()); RefPtr<ShadowRoot> shadowRoot = adoptRef(new ShadowRoot(element->document())); ec = 0; element->ensureShadowTree()->addShadowRoot(element, shadowRoot, ec); if (ec) return 0; ASSERT(element == shadowRoot->host()); ASSERT(element->hasShadowRoot()); return shadowRoot.release(); }