Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(84)

Unified Diff: sky/engine/core/dom/StyleSheetCollection.cpp

Issue 799393005: Merge all StyleSheetCollections. (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sky/engine/core/dom/StyleSheetCollection.h ('k') | sky/engine/core/dom/TreeScopeStyleSheetCollection.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
}
« no previous file with comments | « sky/engine/core/dom/StyleSheetCollection.h ('k') | sky/engine/core/dom/TreeScopeStyleSheetCollection.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698