| Index: sky/engine/core/dom/StyleSheetCollection.cpp
|
| diff --git a/sky/engine/core/dom/StyleSheetCollection.cpp b/sky/engine/core/dom/StyleSheetCollection.cpp
|
| index 8a864d908e05469b02a7d8f5b7b09438c6686c9d..4e99b28868705c782d283afea800de0b363ebf89 100644
|
| --- a/sky/engine/core/dom/StyleSheetCollection.cpp
|
| +++ b/sky/engine/core/dom/StyleSheetCollection.cpp
|
| @@ -28,10 +28,17 @@
|
| #include "sky/engine/core/dom/StyleSheetCollection.h"
|
|
|
| #include "sky/engine/core/css/CSSStyleSheet.h"
|
| +#include "sky/engine/core/css/resolver/StyleResolver.h"
|
| +#include "sky/engine/core/dom/Document.h"
|
| +#include "sky/engine/core/dom/StyleEngine.h"
|
| +#include "sky/engine/core/dom/shadow/ShadowRoot.h"
|
| +#include "sky/engine/core/dom/TreeScope.h"
|
| +#include "sky/engine/core/html/HTMLStyleElement.h"
|
|
|
| namespace blink {
|
|
|
| -StyleSheetCollection::StyleSheetCollection()
|
| +StyleSheetCollection::StyleSheetCollection(TreeScope& treeScope)
|
| + : m_treeScope(treeScope)
|
| {
|
| }
|
|
|
| @@ -39,19 +46,67 @@ StyleSheetCollection::~StyleSheetCollection()
|
| {
|
| }
|
|
|
| -void StyleSheetCollection::swap(StyleSheetCollection& other)
|
| +void StyleSheetCollection::addStyleSheetCandidateNode(Node* node, bool)
|
| {
|
| - m_activeAuthorStyleSheets.swap(other.m_activeAuthorStyleSheets);
|
| + if (!node->inDocument())
|
| + return;
|
| +
|
| + // Until the <body> exists, we have no choice but to compare document positions,
|
| + // since styles outside of the body and head continue to be shunted into the head
|
| + // (and thus can shift to end up before dynamically added DOM content that is also
|
| + // outside the body).
|
| + m_styleSheetCandidateNodes.add(node);
|
| }
|
|
|
| -void StyleSheetCollection::appendActiveStyleSheets(const Vector<RefPtr<CSSStyleSheet> >& sheets)
|
| +void StyleSheetCollection::removeStyleSheetCandidateNode(Node* node, ContainerNode* scopingNode)
|
| {
|
| - m_activeAuthorStyleSheets.appendVector(sheets);
|
| + m_styleSheetCandidateNodes.remove(node);
|
| }
|
|
|
| -void StyleSheetCollection::appendActiveStyleSheet(CSSStyleSheet* sheet)
|
| +void StyleSheetCollection::collectStyleSheets(Vector<RefPtr<CSSStyleSheet>>& sheets)
|
| {
|
| - m_activeAuthorStyleSheets.append(sheet);
|
| + DocumentOrderedList::iterator begin = m_styleSheetCandidateNodes.begin();
|
| + DocumentOrderedList::iterator end = m_styleSheetCandidateNodes.end();
|
| + for (DocumentOrderedList::iterator it = begin; it != end; ++it) {
|
| + Node* node = *it;
|
| + if (!isHTMLStyleElement(*node))
|
| + continue;
|
| + if (CSSStyleSheet* sheet = toHTMLStyleElement(node)->sheet())
|
| + sheets.append(sheet);
|
| + }
|
| +}
|
| +
|
| +void StyleSheetCollection::updateActiveStyleSheets(StyleEngine* engine)
|
| +{
|
| + Vector<RefPtr<CSSStyleSheet>> candidateSheets;
|
| + collectStyleSheets(candidateSheets);
|
| +
|
| + Node& root = m_treeScope.rootNode();
|
| +
|
| + // TODO(esprehn): Remove special casing for Document.
|
| + if (root.isDocumentNode()) {
|
| + engine->clearMasterResolver();
|
| + // FIMXE: The following depends on whether StyleRuleFontFace was modified or not.
|
| + // No need to always-clear font cache.
|
| + engine->clearFontCache();
|
| + } else if (StyleResolver* styleResolver = engine->resolver()) {
|
| + // We should not destroy StyleResolver when we find any stylesheet update in a shadow tree.
|
| + // In this case, we will reset rulesets created from style elements in the shadow tree.
|
| + styleResolver->resetAuthorStyle(m_treeScope);
|
| + styleResolver->removePendingAuthorStyleSheets(m_activeAuthorStyleSheets);
|
| + styleResolver->lazyAppendAuthorStyleSheets(0, candidateSheets);
|
| + }
|
| +
|
| + // TODO(esprehn): We should avoid subtree recalcs in sky when rules change
|
| + // and only recalc specific tree scopes.
|
| + root.setNeedsStyleRecalc(SubtreeStyleChange);
|
| +
|
| + // TODO(esprehn): We should use LocalStyleChange, :host rule changes
|
| + // can only impact the host directly as Sky has no descendant selectors.
|
| + if (root.isShadowRoot())
|
| + toShadowRoot(root).host()->setNeedsStyleRecalc(SubtreeStyleChange);
|
| +
|
| + m_activeAuthorStyleSheets.swap(candidateSheets);
|
| }
|
|
|
| }
|
|
|