| Index: Source/core/html/HTMLStyleElement.cpp
|
| diff --git a/Source/core/html/HTMLStyleElement.cpp b/Source/core/html/HTMLStyleElement.cpp
|
| index e4db64902d6d8a7a7a5b4c62477f2a602e2dfc6c..2b0171caa71ed407b3427112c3712b282b859574 100644
|
| --- a/Source/core/html/HTMLStyleElement.cpp
|
| +++ b/Source/core/html/HTMLStyleElement.cpp
|
| @@ -49,15 +49,12 @@ inline HTMLStyleElement::HTMLStyleElement(Document& document, bool createdByPars
|
| , StyleElement(&document, createdByParser)
|
| , m_firedLoad(false)
|
| , m_loadedSheet(false)
|
| - , m_scopedStyleRegistrationState(NotRegistered)
|
| {
|
| ScriptWrappable::init(this);
|
| }
|
|
|
| HTMLStyleElement::~HTMLStyleElement()
|
| {
|
| - // During tear-down, willRemove isn't called, so m_scopedStyleRegistrationState may still be RegisteredAsScoped or RegisteredInShadowRoot here.
|
| - // Therefore we can't ASSERT(m_scopedStyleRegistrationState == NotRegistered).
|
| #if !ENABLE(OILPAN)
|
| StyleElement::clearDocumentData(document(), this);
|
| #endif
|
| @@ -74,8 +71,6 @@ void HTMLStyleElement::parseAttribute(const QualifiedName& name, const AtomicStr
|
| {
|
| if (name == titleAttr && m_sheet) {
|
| m_sheet->setTitle(value);
|
| - } else if (name == scopedAttr && ContextFeatures::styleScopedEnabled(&document())) {
|
| - scopedAttributeChanged(!value.isNull());
|
| } else if (name == mediaAttr && inDocument() && document().isActive() && m_sheet) {
|
| m_sheet->setMediaQueries(MediaQuerySet::create(value));
|
| document().modifiedStyleSheet(m_sheet.get());
|
| @@ -84,101 +79,18 @@ void HTMLStyleElement::parseAttribute(const QualifiedName& name, const AtomicStr
|
| }
|
| }
|
|
|
| -void HTMLStyleElement::scopedAttributeChanged(bool scoped)
|
| -{
|
| - ASSERT(ContextFeatures::styleScopedEnabled(&document()));
|
| -
|
| - if (!inDocument())
|
| - return;
|
| -
|
| - if (scoped) {
|
| - if (m_scopedStyleRegistrationState == RegisteredAsScoped)
|
| - return;
|
| -
|
| - // As any <style> in a shadow tree is treated as "scoped",
|
| - // need to remove the <style> from its shadow root.
|
| - ContainerNode* scopingNode = 0;
|
| - if (m_scopedStyleRegistrationState == RegisteredInShadowRoot) {
|
| - scopingNode = containingShadowRoot();
|
| - unregisterWithScopingNode(scopingNode);
|
| - }
|
| - document().styleEngine()->removeStyleSheetCandidateNode(this, scopingNode, treeScope());
|
| - registerWithScopingNode(true);
|
| -
|
| - document().styleEngine()->addStyleSheetCandidateNode(this, false);
|
| - document().modifiedStyleSheet(sheet());
|
| - return;
|
| - }
|
| -
|
| - // If the <style> was scoped, need to remove the <style> from the scoping
|
| - // element, i.e. the parent node.
|
| - if (m_scopedStyleRegistrationState != RegisteredAsScoped)
|
| - return;
|
| -
|
| - unregisterWithScopingNode(parentNode());
|
| - document().styleEngine()->removeStyleSheetCandidateNode(this, parentNode(), treeScope());
|
| -
|
| - // As any <style> in a shadow tree is treated as "scoped",
|
| - // need to add the <style> to its shadow root.
|
| - if (isInShadowTree())
|
| - registerWithScopingNode(false);
|
| -
|
| - document().styleEngine()->addStyleSheetCandidateNode(this, false);
|
| - // FIXME: currently need to use FullStyleUpdate here.
|
| - // Because ShadowTreeStyleSheetCollection doesn't know old scoping node.
|
| - // So setNeedsStyleRecalc for old scoping node is not invoked.
|
| - document().modifiedStyleSheet(sheet());
|
| -}
|
| -
|
| void HTMLStyleElement::finishParsingChildren()
|
| {
|
| StyleElement::finishParsingChildren(this);
|
| HTMLElement::finishParsingChildren();
|
| }
|
|
|
| -void HTMLStyleElement::registerWithScopingNode(bool scoped)
|
| -{
|
| - // Note: We cannot rely on the 'scoped' element already being present when this method is invoked.
|
| - // Therefore we cannot rely on scoped()!
|
| - ASSERT(m_scopedStyleRegistrationState == NotRegistered);
|
| - ASSERT(inDocument());
|
| - if (m_scopedStyleRegistrationState != NotRegistered)
|
| - return;
|
| -
|
| - ContainerNode* scope = scoped ? parentNode() : containingShadowRoot();
|
| - if (!scope)
|
| - return;
|
| - if (!scope->isElementNode() && !scope->isShadowRoot()) {
|
| - // DocumentFragment nodes should never be inDocument,
|
| - // <style> should not be a child of Document, PI or some such.
|
| - ASSERT_NOT_REACHED();
|
| - return;
|
| - }
|
| - scope->registerScopedHTMLStyleChild();
|
| - m_scopedStyleRegistrationState = scoped ? RegisteredAsScoped : RegisteredInShadowRoot;
|
| -}
|
| -
|
| -void HTMLStyleElement::unregisterWithScopingNode(ContainerNode* scope)
|
| -{
|
| - ASSERT(m_scopedStyleRegistrationState != NotRegistered || !ContextFeatures::styleScopedEnabled(&document()));
|
| - if (!isRegisteredAsScoped())
|
| - return;
|
| -
|
| - ASSERT(scope);
|
| - if (scope) {
|
| - ASSERT(scope->hasScopedHTMLStyleChild());
|
| - scope->unregisterScopedHTMLStyleChild();
|
| - }
|
| -
|
| - m_scopedStyleRegistrationState = NotRegistered;
|
| -}
|
| -
|
| Node::InsertionNotificationRequest HTMLStyleElement::insertedInto(ContainerNode* insertionPoint)
|
| {
|
| HTMLElement::insertedInto(insertionPoint);
|
| - if (insertionPoint->inDocument()) {
|
| - if (m_scopedStyleRegistrationState == NotRegistered && (scoped() || isInShadowTree()))
|
| - registerWithScopingNode(scoped());
|
| + if (insertionPoint->inDocument() && isInShadowTree()) {
|
| + if (ShadowRoot* scope = containingShadowRoot())
|
| + scope->registerScopedHTMLStyleChild();
|
| }
|
| return InsertionShouldCallDidNotifySubtreeInsertions;
|
| }
|
| @@ -187,27 +99,18 @@ void HTMLStyleElement::removedFrom(ContainerNode* insertionPoint)
|
| {
|
| HTMLElement::removedFrom(insertionPoint);
|
|
|
| - // In the current implementation, <style scoped> is only registered if the node is in the document.
|
| - // That is, because willRemove() is also called if an ancestor is removed from the document.
|
| - // Now, if we want to register <style scoped> even if it's not inDocument,
|
| - // we'd need to find a way to discern whether that is the case, or whether <style scoped> itself is about to be removed.
|
| - ContainerNode* scopingNode = 0;
|
| - if (m_scopedStyleRegistrationState != NotRegistered) {
|
| - if (m_scopedStyleRegistrationState == RegisteredInShadowRoot) {
|
| - scopingNode = containingShadowRoot();
|
| - if (!scopingNode)
|
| - scopingNode = insertionPoint->containingShadowRoot();
|
| - } else {
|
| - scopingNode = parentNode() ? parentNode() : insertionPoint;
|
| - }
|
| -
|
| - unregisterWithScopingNode(scopingNode);
|
| - }
|
| + if (!insertionPoint->inDocument())
|
| + return;
|
|
|
| - if (insertionPoint->inDocument()) {
|
| - TreeScope* containingScope = containingShadowRoot();
|
| - StyleElement::removedFromDocument(document(), this, scopingNode, containingScope ? *containingScope : insertionPoint->treeScope());
|
| - }
|
| + ShadowRoot* scopingNode = containingShadowRoot();
|
| + if (!scopingNode)
|
| + scopingNode = insertionPoint->containingShadowRoot();
|
| +
|
| + if (scopingNode)
|
| + scopingNode->unregisterScopedHTMLStyleChild();
|
| +
|
| + TreeScope* containingScope = containingShadowRoot();
|
| + StyleElement::removedFromDocument(document(), this, scopingNode, containingScope ? *containingScope : insertionPoint->treeScope());
|
| }
|
|
|
| void HTMLStyleElement::didNotifySubtreeInsertionsToDocument()
|
| @@ -231,28 +134,15 @@ const AtomicString& HTMLStyleElement::type() const
|
| return getAttribute(typeAttr);
|
| }
|
|
|
| -bool HTMLStyleElement::scoped() const
|
| -{
|
| - return fastHasAttribute(scopedAttr) && ContextFeatures::styleScopedEnabled(&document());
|
| -}
|
| -
|
| -void HTMLStyleElement::setScoped(bool scopedValue)
|
| -{
|
| - setBooleanAttribute(scopedAttr, scopedValue);
|
| -}
|
| -
|
| ContainerNode* HTMLStyleElement::scopingNode()
|
| {
|
| if (!inDocument())
|
| return 0;
|
|
|
| - if (!isRegisteredAsScoped())
|
| - return &document();
|
| -
|
| - if (isRegisteredInShadowRoot())
|
| + if (isInShadowTree())
|
| return containingShadowRoot();
|
|
|
| - return parentNode();
|
| + return &document();
|
| }
|
|
|
| void HTMLStyleElement::dispatchPendingLoadEvents()
|
|
|