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

Unified Diff: third_party/WebKit/Source/core/dom/StyleEngine.cpp

Issue 2451893003: Move Document global rule data to CSSGlobalRuleSet. (Closed)
Patch Set: Rebased. Created 4 years, 2 months 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 | « third_party/WebKit/Source/core/dom/StyleEngine.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/core/dom/StyleEngine.cpp
diff --git a/third_party/WebKit/Source/core/dom/StyleEngine.cpp b/third_party/WebKit/Source/core/dom/StyleEngine.cpp
index e2a40b65f992f50c65b6df9c73213e400e138628..bb14a5f37ab3626189116e63b58ff3d72fb978f9 100644
--- a/third_party/WebKit/Source/core/dom/StyleEngine.cpp
+++ b/third_party/WebKit/Source/core/dom/StyleEngine.cpp
@@ -37,6 +37,7 @@
#include "core/css/StyleSheetContents.h"
#include "core/css/invalidation/InvalidationSet.h"
#include "core/css/resolver/ScopedStyleResolver.h"
+#include "core/css/resolver/SharedStyleFinder.h"
#include "core/css/resolver/ViewportStyleResolver.h"
#include "core/dom/DocumentStyleSheetCollector.h"
#include "core/dom/Element.h"
@@ -51,6 +52,7 @@
#include "core/html/HTMLSlotElement.h"
#include "core/html/imports/HTMLImportsController.h"
#include "core/inspector/InspectorInstrumentation.h"
+#include "core/layout/api/LayoutViewItem.h"
#include "core/page/Page.h"
#include "core/svg/SVGStyleElement.h"
#include "platform/fonts/FontCache.h"
@@ -126,13 +128,6 @@ StyleEngine::styleSheetsForStyleSheetList(TreeScope& treeScope) {
->styleSheetsForStyleSheetList();
}
-void StyleEngine::resetCSSFeatureFlags(const RuleFeatureSet& features) {
- m_usesSiblingRules = features.usesSiblingRules();
- m_usesFirstLineRules = features.usesFirstLineRules();
- m_usesWindowInactiveSelector = features.usesWindowInactiveSelector();
- m_maxDirectAdjacentSelectors = features.maxDirectAdjacentSelectors();
-}
-
void StyleEngine::injectAuthorSheet(StyleSheetContents* authorSheet) {
m_injectedAuthorStyleSheets.append(
CSSStyleSheet::create(authorSheet, *m_document));
@@ -255,10 +250,8 @@ void StyleEngine::modifiedStyleSheetCandidateNode(Node& node) {
}
void StyleEngine::watchedSelectorsChanged() {
- if (m_resolver) {
- m_resolver->initWatchedSelectorRules();
- m_resolver->resetRuleFeatures();
- }
+ m_globalRuleSet.initWatchedSelectorsRuleSet(document());
+ // TODO(rune@opera.com): Should be able to use RuleSetInvalidation here.
document().setNeedsStyleRecalc(SubtreeStyleChange,
StyleChangeReasonForTracing::create(
StyleChangeReason::DeclarativeContent));
@@ -397,8 +390,7 @@ void StyleEngine::resetAuthorStyle(TreeScope& treeScope) {
if (!scopedResolver)
return;
- DCHECK(m_resolver);
- m_resolver->resetRuleFeatures();
+ m_globalRuleSet.markDirty();
if (treeScope.rootNode().isDocumentNode()) {
scopedResolver->resetAuthorStyle();
return;
@@ -407,6 +399,15 @@ void StyleEngine::resetAuthorStyle(TreeScope& treeScope) {
treeScope.clearScopedStyleResolver();
}
+void StyleEngine::finishAppendAuthorStyleSheets() {
+ m_globalRuleSet.markDirty();
+ m_globalRuleSet.update(document());
+
+ if (!document().layoutViewItem().isNull() &&
+ document().layoutViewItem().style())
+ document().layoutViewItem().style()->font().update(fontSelector());
+}
+
void StyleEngine::appendActiveAuthorStyleSheets() {
DCHECK(isMaster());
@@ -420,7 +421,6 @@ void StyleEngine::appendActiveAuthorStyleSheets() {
m_resolver->appendAuthorStyleSheets(
collection->activeAuthorStyleSheets());
}
- m_resolver->finishAppendAuthorStyleSheets();
}
void StyleEngine::createResolver() {
@@ -429,6 +429,7 @@ void StyleEngine::createResolver() {
// A scoped style resolver for document will be created during
// appendActiveAuthorStyleSheets if needed.
appendActiveAuthorStyleSheets();
+ finishAppendAuthorStyleSheets();
}
void StyleEngine::clearResolver() {
@@ -650,11 +651,14 @@ void StyleEngine::classChangedForElement(const SpaceSplitString& changedClasses,
return;
InvalidationLists invalidationLists;
unsigned changedSize = changedClasses.size();
- RuleFeatureSet& ruleFeatureSet =
- ensureResolver().ensureUpdatedRuleFeatureSet();
- for (unsigned i = 0; i < changedSize; ++i)
- ruleFeatureSet.collectInvalidationSetsForClass(invalidationLists, element,
- changedClasses[i]);
+ // TODO(rune@opera.com): ensureResolver() can be removed once stylesheet
+ // updates are async. https://crbug.com/567021
+ ensureResolver();
+ const RuleFeatureSet& features = ruleFeatureSet();
+ for (unsigned i = 0; i < changedSize; ++i) {
+ features.collectInvalidationSetsForClass(invalidationLists, element,
+ changedClasses[i]);
+ }
m_styleInvalidator.scheduleInvalidationSetsForNode(invalidationLists,
element);
}
@@ -676,8 +680,10 @@ void StyleEngine::classChangedForElement(const SpaceSplitString& oldClasses,
remainingClassBits.ensureSize(oldClasses.size());
InvalidationLists invalidationLists;
- RuleFeatureSet& ruleFeatureSet =
- ensureResolver().ensureUpdatedRuleFeatureSet();
+ // TODO(rune@opera.com): ensureResolver() can be removed once stylesheet
+ // updates are async. https://crbug.com/567021
+ ensureResolver();
+ const RuleFeatureSet& features = ruleFeatureSet();
for (unsigned i = 0; i < newClasses.size(); ++i) {
bool found = false;
@@ -691,17 +697,18 @@ void StyleEngine::classChangedForElement(const SpaceSplitString& oldClasses,
}
}
// Class was added.
- if (!found)
- ruleFeatureSet.collectInvalidationSetsForClass(invalidationLists, element,
- newClasses[i]);
+ if (!found) {
+ features.collectInvalidationSetsForClass(invalidationLists, element,
+ newClasses[i]);
+ }
}
for (unsigned i = 0; i < oldClasses.size(); ++i) {
if (remainingClassBits.quickGet(i))
continue;
// Class was removed.
- ruleFeatureSet.collectInvalidationSetsForClass(invalidationLists, element,
- oldClasses[i]);
+ features.collectInvalidationSetsForClass(invalidationLists, element,
+ oldClasses[i]);
}
m_styleInvalidator.scheduleInvalidationSetsForNode(invalidationLists,
@@ -714,10 +721,11 @@ void StyleEngine::attributeChangedForElement(const QualifiedName& attributeName,
return;
InvalidationLists invalidationLists;
- ensureResolver()
- .ensureUpdatedRuleFeatureSet()
- .collectInvalidationSetsForAttribute(invalidationLists, element,
- attributeName);
+ // TODO(rune@opera.com): ensureResolver() can be removed once stylesheet
+ // updates are async. https://crbug.com/567021
+ ensureResolver();
+ ruleFeatureSet().collectInvalidationSetsForAttribute(invalidationLists,
+ element, attributeName);
m_styleInvalidator.scheduleInvalidationSetsForNode(invalidationLists,
element);
}
@@ -729,14 +737,14 @@ void StyleEngine::idChangedForElement(const AtomicString& oldId,
return;
InvalidationLists invalidationLists;
- RuleFeatureSet& ruleFeatureSet =
- ensureResolver().ensureUpdatedRuleFeatureSet();
+ // TODO(rune@opera.com): ensureResolver() can be removed once stylesheet
+ // updates are async. https://crbug.com/567021
+ ensureResolver();
+ const RuleFeatureSet& features = ruleFeatureSet();
if (!oldId.isEmpty())
- ruleFeatureSet.collectInvalidationSetsForId(invalidationLists, element,
- oldId);
+ features.collectInvalidationSetsForId(invalidationLists, element, oldId);
if (!newId.isEmpty())
- ruleFeatureSet.collectInvalidationSetsForId(invalidationLists, element,
- newId);
+ features.collectInvalidationSetsForId(invalidationLists, element, newId);
m_styleInvalidator.scheduleInvalidationSetsForNode(invalidationLists,
element);
}
@@ -748,10 +756,11 @@ void StyleEngine::pseudoStateChangedForElement(
return;
InvalidationLists invalidationLists;
- ensureResolver()
- .ensureUpdatedRuleFeatureSet()
- .collectInvalidationSetsForPseudoClass(invalidationLists, element,
- pseudoType);
+ // TODO(rune@opera.com): ensureResolver() can be removed once stylesheet
+ // updates are async. https://crbug.com/567021
+ ensureResolver();
+ ruleFeatureSet().collectInvalidationSetsForPseudoClass(invalidationLists,
+ element, pseudoType);
m_styleInvalidator.scheduleInvalidationSetsForNode(invalidationLists,
element);
}
@@ -764,27 +773,30 @@ void StyleEngine::scheduleSiblingInvalidationsForElement(
InvalidationLists invalidationLists;
- RuleFeatureSet& ruleFeatureSet =
- ensureResolver().ensureUpdatedRuleFeatureSet();
+ // TODO(rune@opera.com): ensureResolver() can be removed once stylesheet
+ // updates are async. https://crbug.com/567021
+ ensureResolver();
+ const RuleFeatureSet& features = ruleFeatureSet();
- if (element.hasID())
- ruleFeatureSet.collectSiblingInvalidationSetForId(
- invalidationLists, element, element.idForStyleResolution(),
- minDirectAdjacent);
+ if (element.hasID()) {
+ features.collectSiblingInvalidationSetForId(invalidationLists, element,
+ element.idForStyleResolution(),
+ minDirectAdjacent);
+ }
if (element.hasClass()) {
const SpaceSplitString& classNames = element.classNames();
for (size_t i = 0; i < classNames.size(); i++)
- ruleFeatureSet.collectSiblingInvalidationSetForClass(
+ features.collectSiblingInvalidationSetForClass(
invalidationLists, element, classNames[i], minDirectAdjacent);
}
for (const Attribute& attribute : element.attributes())
- ruleFeatureSet.collectSiblingInvalidationSetForAttribute(
+ features.collectSiblingInvalidationSetForAttribute(
invalidationLists, element, attribute.name(), minDirectAdjacent);
- ruleFeatureSet.collectUniversalSiblingInvalidationSet(invalidationLists,
- minDirectAdjacent);
+ features.collectUniversalSiblingInvalidationSet(invalidationLists,
+ minDirectAdjacent);
m_styleInvalidator.scheduleSiblingInvalidationsAsDescendants(
invalidationLists, schedulingParent);
@@ -796,7 +808,7 @@ void StyleEngine::scheduleInvalidationsForInsertedSibling(
unsigned affectedSiblings =
insertedElement.parentNode()->childrenAffectedByIndirectAdjacentRules()
? UINT_MAX
- : m_maxDirectAdjacentSelectors;
+ : maxDirectAdjacentSelectors();
ContainerNode* schedulingParent = insertedElement.parentElementOrShadowRoot();
if (!schedulingParent)
@@ -817,7 +829,7 @@ void StyleEngine::scheduleInvalidationsForRemovedSibling(
unsigned affectedSiblings =
afterElement.parentNode()->childrenAffectedByIndirectAdjacentRules()
? UINT_MAX
- : m_maxDirectAdjacentSelectors;
+ : maxDirectAdjacentSelectors();
ContainerNode* schedulingParent = afterElement.parentElementOrShadowRoot();
if (!schedulingParent)
@@ -833,8 +845,10 @@ void StyleEngine::scheduleInvalidationsForRemovedSibling(
void StyleEngine::scheduleNthPseudoInvalidations(ContainerNode& nthParent) {
InvalidationLists invalidationLists;
- ensureResolver().ensureUpdatedRuleFeatureSet().collectNthInvalidationSet(
- invalidationLists);
+ // TODO(rune@opera.com): ensureResolver() can be removed once stylesheet
+ // updates are async. https://crbug.com/567021
+ ensureResolver();
+ ruleFeatureSet().collectNthInvalidationSet(invalidationLists);
m_styleInvalidator.scheduleInvalidationSetsForNode(invalidationLists,
nthParent);
}
@@ -966,12 +980,24 @@ void StyleEngine::setHttpDefaultStyle(const String& content) {
setPreferredStylesheetSetNameIfNotSet(content, UpdateActiveSheets);
}
-void StyleEngine::ensureFullscreenUAStyle() {
- CSSDefaultStyleSheets::instance().ensureDefaultStyleSheetForFullscreen();
- if (!m_resolver)
+void StyleEngine::ensureUAStyleForFullscreen() {
+ if (m_globalRuleSet.hasFullscreenUAStyle())
return;
- if (!m_resolver->hasFullscreenUAStyle())
- m_resolver->resetRuleFeatures();
+ CSSDefaultStyleSheets::instance().ensureDefaultStyleSheetForFullscreen();
+ m_globalRuleSet.markDirty();
+ m_globalRuleSet.update(document());
+}
+
+void StyleEngine::ensureUAStyleForElement(const Element& element) {
+ if (CSSDefaultStyleSheets::instance().ensureDefaultStyleSheetsForElement(
+ element)) {
+ m_globalRuleSet.markDirty();
+ m_globalRuleSet.update(document());
+ }
+}
+
+bool StyleEngine::hasRulesForId(const AtomicString& id) const {
+ return m_globalRuleSet.ruleFeatureSet().hasSelectorForId(id);
}
void StyleEngine::initialViewportChanged() {
@@ -997,18 +1023,29 @@ void StyleEngine::viewportRulesChanged() {
m_viewportResolver->updateViewport(documentStyleSheetCollection());
}
+PassRefPtr<ComputedStyle> StyleEngine::findSharedStyle(
+ const ElementResolveContext& elementResolveContext) {
+ DCHECK(m_resolver);
+ return SharedStyleFinder(
+ elementResolveContext, m_globalRuleSet.ruleFeatureSet(),
+ m_globalRuleSet.siblingRuleSet(),
+ m_globalRuleSet.uncommonAttributeRuleSet(), *m_resolver)
+ .findSharedStyle();
+}
+
DEFINE_TRACE(StyleEngine) {
visitor->trace(m_document);
visitor->trace(m_injectedAuthorStyleSheets);
visitor->trace(m_inspectorStyleSheet);
visitor->trace(m_documentStyleSheetCollection);
visitor->trace(m_styleSheetCollectionMap);
- visitor->trace(m_resolver);
- visitor->trace(m_viewportResolver);
- visitor->trace(m_styleInvalidator);
visitor->trace(m_dirtyTreeScopes);
visitor->trace(m_activeTreeScopes);
visitor->trace(m_treeBoundaryCrossingScopes);
+ visitor->trace(m_globalRuleSet);
+ visitor->trace(m_resolver);
+ visitor->trace(m_viewportResolver);
+ visitor->trace(m_styleInvalidator);
visitor->trace(m_fontSelector);
visitor->trace(m_textToSheetCache);
visitor->trace(m_sheetToTextCache);
« no previous file with comments | « third_party/WebKit/Source/core/dom/StyleEngine.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698