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

Side by Side Diff: sky/engine/core/css/resolver/ScopedStyleResolver.cpp

Issue 858423002: Don't store a RuleFeatureSet on ScopedStyleResolver. (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: better test names. Created 5 years, 11 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 unified diff | Download patch
« no previous file with comments | « sky/engine/core/css/resolver/ScopedStyleResolver.h ('k') | sky/engine/core/dom/Element.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 3 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
4 * Copyright (C) 2012 Google Inc. All rights reserved. 4 * Copyright (C) 2012 Google Inc. All rights reserved.
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions 7 * modification, are permitted provided that the following conditions
8 * are met: 8 * are met:
9 * 1. Redistributions of source code must retain the above copyright 9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 26 matching lines...) Expand all
37 #include "sky/engine/core/dom/shadow/ShadowRoot.h" 37 #include "sky/engine/core/dom/shadow/ShadowRoot.h"
38 #include "sky/engine/core/html/HTMLStyleElement.h" 38 #include "sky/engine/core/html/HTMLStyleElement.h"
39 39
40 namespace blink { 40 namespace blink {
41 41
42 ScopedStyleResolver::ScopedStyleResolver(TreeScope& scope) 42 ScopedStyleResolver::ScopedStyleResolver(TreeScope& scope)
43 : m_scope(scope) 43 : m_scope(scope)
44 { 44 {
45 } 45 }
46 46
47 void ScopedStyleResolver::appendStyleSheet(CSSStyleSheet& sheet)
48 {
49 MediaQueryEvaluator medium(m_scope.document().view());
50
51 if (sheet.mediaQueries() && !medium.eval(sheet.mediaQueries()))
52 return;
53
54 const RuleSet& ruleSet = sheet.contents()->ensureRuleSet();
55 m_features.add(ruleSet.features());
56 }
57
58 void ScopedStyleResolver::updateActiveStyleSheets() 47 void ScopedStyleResolver::updateActiveStyleSheets()
59 { 48 {
60 Vector<RefPtr<CSSStyleSheet>> candidateSheets; 49 Vector<RefPtr<CSSStyleSheet>> candidateSheets;
61 collectStyleSheets(candidateSheets); 50 collectStyleSheets(candidateSheets);
62 m_authorStyleSheets.swap(candidateSheets); 51 m_authorStyleSheets.swap(candidateSheets);
63 52
64 Node& root = m_scope.rootNode(); 53 Node& root = m_scope.rootNode();
65 54
66 // TODO(esprehn): We should avoid subtree recalcs in sky when rules change 55 // TODO(esprehn): We should avoid subtree recalcs in sky when rules change
67 // and only recalc specific tree scopes. 56 // and only recalc specific tree scopes.
68 root.setNeedsStyleRecalc(SubtreeStyleChange); 57 root.setNeedsStyleRecalc(SubtreeStyleChange);
69 58
70 // TODO(esprehn): We should use LocalStyleChange, :host rule changes 59 // TODO(esprehn): We should use LocalStyleChange, :host rule changes
71 // can only impact the host directly as Sky has no descendant selectors. 60 // can only impact the host directly as Sky has no descendant selectors.
72 if (root.isShadowRoot()) 61 if (root.isShadowRoot())
73 toShadowRoot(root).host()->setNeedsStyleRecalc(SubtreeStyleChange); 62 toShadowRoot(root).host()->setNeedsStyleRecalc(SubtreeStyleChange);
63 }
74 64
75 m_features.clear(); 65 bool ScopedStyleResolver::hasSelectorForId(const AtomicString& id) const
66 {
67 for (auto& sheet : m_authorStyleSheets) {
68 RuleSet& ruleSet = sheet->contents()->ensureRuleSet();
69 if (ruleSet.features().hasSelectorForId(id))
70 return true;
71 }
72 return false;
73 }
76 74
77 for (RefPtr<CSSStyleSheet>& sheet : m_authorStyleSheets) 75 bool ScopedStyleResolver::hasSelectorForClass(const AtomicString& className) con st
78 appendStyleSheet(*sheet); 76 {
77 for (auto& sheet : m_authorStyleSheets) {
78 RuleSet& ruleSet = sheet->contents()->ensureRuleSet();
79 if (ruleSet.features().hasSelectorForClass(className))
80 return true;
81 }
82 return false;
83 }
84
85 bool ScopedStyleResolver::hasSelectorForAttribute(const AtomicString& attributeN ame) const
86 {
87 for (auto& sheet : m_authorStyleSheets) {
88 RuleSet& ruleSet = sheet->contents()->ensureRuleSet();
89 if (ruleSet.features().hasSelectorForAttribute(attributeName))
90 return true;
91 }
92 return false;
79 } 93 }
80 94
81 void ScopedStyleResolver::addStyleSheetCandidateNode(HTMLStyleElement& element) 95 void ScopedStyleResolver::addStyleSheetCandidateNode(HTMLStyleElement& element)
82 { 96 {
83 ASSERT(element.inActiveDocument()); 97 ASSERT(element.inActiveDocument());
84 m_styleSheetCandidateNodes.add(&element); 98 m_styleSheetCandidateNodes.add(&element);
85 } 99 }
86 100
87 void ScopedStyleResolver::removeStyleSheetCandidateNode(HTMLStyleElement& elemen t) 101 void ScopedStyleResolver::removeStyleSheetCandidateNode(HTMLStyleElement& elemen t)
88 { 102 {
89 m_styleSheetCandidateNodes.remove(&element); 103 m_styleSheetCandidateNodes.remove(&element);
90 } 104 }
91 105
92 void ScopedStyleResolver::collectStyleSheets(Vector<RefPtr<CSSStyleSheet>>& shee ts) 106 void ScopedStyleResolver::collectStyleSheets(Vector<RefPtr<CSSStyleSheet>>& shee ts)
93 { 107 {
108 MediaQueryEvaluator medium(m_scope.document().view());
109
94 for (Node* node : m_styleSheetCandidateNodes) { 110 for (Node* node : m_styleSheetCandidateNodes) {
95 ASSERT(isHTMLStyleElement(*node)); 111 ASSERT(isHTMLStyleElement(*node));
96 if (CSSStyleSheet* sheet = toHTMLStyleElement(node)->sheet()) 112 CSSStyleSheet* sheet = toHTMLStyleElement(node)->sheet();
113 if (sheet && (!sheet->mediaQueries() || medium.eval(sheet->mediaQueries( )))) {
97 sheets.append(sheet); 114 sheets.append(sheet);
115 }
98 } 116 }
99 } 117 }
100 118
101 const StyleRuleKeyframes* ScopedStyleResolver::keyframeStylesForAnimation(String animationName) 119 const StyleRuleKeyframes* ScopedStyleResolver::keyframeStylesForAnimation(String animationName)
102 { 120 {
103 for (auto& sheet : m_authorStyleSheets) { 121 for (auto& sheet : m_authorStyleSheets) {
104 // TODO(esprehn): Maybe just store the keyframes in a map? 122 // TODO(esprehn): Maybe just store the keyframes in a map?
105 for (auto& rule : sheet->contents()->ruleSet().keyframesRules()) { 123 for (auto& rule : sheet->contents()->ensureRuleSet().keyframesRules()) {
106 if (rule->name() == animationName) 124 if (rule->name() == animationName)
107 return rule.get(); 125 return rule.get();
108 } 126 }
109 } 127 }
110 return nullptr; 128 return nullptr;
111 } 129 }
112 130
113 void ScopedStyleResolver::collectMatchingAuthorRules(ElementRuleCollector& colle ctor, CascadeOrder cascadeOrder) 131 void ScopedStyleResolver::collectMatchingAuthorRules(ElementRuleCollector& colle ctor, CascadeOrder cascadeOrder)
114 { 132 {
115 for (size_t i = 0; i < m_authorStyleSheets.size(); ++i) { 133 for (size_t i = 0; i < m_authorStyleSheets.size(); ++i) {
116 MatchRequest matchRequest(&m_authorStyleSheets[i]->contents()->ruleSet() , m_authorStyleSheets[i].get(), i); 134 MatchRequest matchRequest(&m_authorStyleSheets[i]->contents()->ensureRul eSet(), m_authorStyleSheets[i].get(), i);
117 collector.collectMatchingRules(matchRequest, cascadeOrder); 135 collector.collectMatchingRules(matchRequest, cascadeOrder);
118 } 136 }
119 } 137 }
120 138
121 void ScopedStyleResolver::collectMatchingHostRules(ElementRuleCollector& collect or, CascadeOrder cascadeOrder) 139 void ScopedStyleResolver::collectMatchingHostRules(ElementRuleCollector& collect or, CascadeOrder cascadeOrder)
122 { 140 {
123 for (size_t i = 0; i < m_authorStyleSheets.size(); ++i) { 141 for (size_t i = 0; i < m_authorStyleSheets.size(); ++i) {
124 MatchRequest matchRequest(&m_authorStyleSheets[i]->contents()->ruleSet() , m_authorStyleSheets[i].get(), i); 142 MatchRequest matchRequest(&m_authorStyleSheets[i]->contents()->ensureRul eSet(), m_authorStyleSheets[i].get(), i);
125 collector.collectMatchingHostRules(matchRequest, cascadeOrder); 143 collector.collectMatchingHostRules(matchRequest, cascadeOrder);
126 } 144 }
127 } 145 }
128 146
129 } // namespace blink 147 } // namespace blink
OLDNEW
« no previous file with comments | « sky/engine/core/css/resolver/ScopedStyleResolver.h ('k') | sky/engine/core/dom/Element.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698