| OLD | NEW |
| 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 * | 4 * |
| 5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
| 6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
| 7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
| 8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
| 9 * | 9 * |
| 10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 #include "core/css/TreeBoundaryCrossingRules.h" | 33 #include "core/css/TreeBoundaryCrossingRules.h" |
| 34 #include "core/css/resolver/MatchedPropertiesCache.h" | 34 #include "core/css/resolver/MatchedPropertiesCache.h" |
| 35 #include "core/css/resolver/ScopedStyleResolver.h" | 35 #include "core/css/resolver/ScopedStyleResolver.h" |
| 36 #include "core/css/resolver/StyleBuilder.h" | 36 #include "core/css/resolver/StyleBuilder.h" |
| 37 #include "core/css/resolver/StyleResolverIncludes.h" | 37 #include "core/css/resolver/StyleResolverIncludes.h" |
| 38 #include "core/css/resolver/StyleResolverState.h" | 38 #include "core/css/resolver/StyleResolverState.h" |
| 39 #include "core/css/resolver/StyleResourceLoader.h" | 39 #include "core/css/resolver/StyleResourceLoader.h" |
| 40 #include "wtf/Deque.h" | 40 #include "wtf/Deque.h" |
| 41 #include "wtf/HashMap.h" | 41 #include "wtf/HashMap.h" |
| 42 #include "wtf/HashSet.h" | 42 #include "wtf/HashSet.h" |
| 43 #include "wtf/ListHashSet.h" |
| 43 #include "wtf/RefPtr.h" | 44 #include "wtf/RefPtr.h" |
| 44 #include "wtf/Vector.h" | 45 #include "wtf/Vector.h" |
| 45 | 46 |
| 46 namespace WebCore { | 47 namespace WebCore { |
| 47 | 48 |
| 48 class CSSAnimationUpdate; | 49 class CSSAnimationUpdate; |
| 49 class CSSFontSelector; | 50 class CSSFontSelector; |
| 50 class CSSRuleList; | 51 class CSSRuleList; |
| 51 class CSSSelector; | 52 class CSSSelector; |
| 52 class CSSStyleSheet; | 53 class CSSStyleSheet; |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 // FIXME: It could be better to call appendAuthorStyleSheets() directly afte
r we factor StyleResolver further. | 139 // FIXME: It could be better to call appendAuthorStyleSheets() directly afte
r we factor StyleResolver further. |
| 139 // https://bugs.webkit.org/show_bug.cgi?id=108890 | 140 // https://bugs.webkit.org/show_bug.cgi?id=108890 |
| 140 void appendAuthorStyleSheets(unsigned firstNew, const Vector<RefPtr<CSSStyle
Sheet> >&); | 141 void appendAuthorStyleSheets(unsigned firstNew, const Vector<RefPtr<CSSStyle
Sheet> >&); |
| 141 void resetAuthorStyle(const ContainerNode*); | 142 void resetAuthorStyle(const ContainerNode*); |
| 142 void resetAtHostRules(const ShadowRoot*); | 143 void resetAtHostRules(const ShadowRoot*); |
| 143 void finishAppendAuthorStyleSheets(); | 144 void finishAppendAuthorStyleSheets(); |
| 144 | 145 |
| 145 TreeBoundaryCrossingRules& treeBoundaryCrossingRules() { return m_treeBounda
ryCrossingRules; } | 146 TreeBoundaryCrossingRules& treeBoundaryCrossingRules() { return m_treeBounda
ryCrossingRules; } |
| 146 void processScopedRules(const RuleSet& authorRules, const KURL&, const Conta
inerNode* scope = 0); | 147 void processScopedRules(const RuleSet& authorRules, const KURL&, const Conta
inerNode* scope = 0); |
| 147 | 148 |
| 149 void lazyAppendAuthorStyleSheets(unsigned firstNew, const Vector<RefPtr<CSSS
tyleSheet> >&); |
| 150 void removePendingAuthorStyleSheets(const Vector<RefPtr<CSSStyleSheet> >&); |
| 151 void appendPendingAuthorStyleSheets(); |
| 152 bool hasPendingAuthorStyleSheets() const { return m_pendingStyleSheets.size(
) > 0 || m_needCollectFeatures; } |
| 153 |
| 148 SelectorFilter& selectorFilter() { return m_selectorFilter; } | 154 SelectorFilter& selectorFilter() { return m_selectorFilter; } |
| 149 | 155 |
| 150 void setBuildScopedStyleTreeInDocumentOrder(bool enabled) { m_styleTree.setB
uildInDocumentOrder(enabled); } | 156 void setBuildScopedStyleTreeInDocumentOrder(bool enabled) { m_styleTree.setB
uildInDocumentOrder(enabled); } |
| 151 bool buildScopedStyleTreeInDocumentOrder() const { return m_styleTree.buildI
nDocumentOrder(); } | 157 bool buildScopedStyleTreeInDocumentOrder() const { return m_styleTree.buildI
nDocumentOrder(); } |
| 152 bool styleTreeHasOnlyScopedResolverForDocument() const { return m_styleTree.
hasOnlyScopedResolverForDocument(); } | 158 bool styleTreeHasOnlyScopedResolverForDocument() const { return m_styleTree.
hasOnlyScopedResolverForDocument(); } |
| 153 ScopedStyleResolver* styleTreeScopedStyleResolverForDocument() const { retur
n m_styleTree.scopedStyleResolverForDocument(); } | 159 ScopedStyleResolver* styleTreeScopedStyleResolverForDocument() const { retur
n m_styleTree.scopedStyleResolverForDocument(); } |
| 154 | 160 |
| 155 ScopedStyleResolver* ensureScopedStyleResolver(const ContainerNode* scope) | 161 ScopedStyleResolver* ensureScopedStyleResolver(const ContainerNode* scope) |
| 156 { | 162 { |
| 157 return m_styleTree.ensureScopedStyleResolver(scope ? *scope : document()
); | 163 return m_styleTree.ensureScopedStyleResolver(scope ? *scope : document()
); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 | 197 |
| 192 // FIXME: Rename to reflect the purpose, like didChangeFontSize or something
. | 198 // FIXME: Rename to reflect the purpose, like didChangeFontSize or something
. |
| 193 void invalidateMatchedPropertiesCache(); | 199 void invalidateMatchedPropertiesCache(); |
| 194 | 200 |
| 195 // Exposed for RenderStyle::isStyleAvilable(). | 201 // Exposed for RenderStyle::isStyleAvilable(). |
| 196 static RenderStyle* styleNotYetAvailable() { return s_styleNotYetAvailable;
} | 202 static RenderStyle* styleNotYetAvailable() { return s_styleNotYetAvailable;
} |
| 197 | 203 |
| 198 // FIXME: StyleResolver should not have this member or method. | 204 // FIXME: StyleResolver should not have this member or method. |
| 199 InspectorCSSOMWrappers& inspectorCSSOMWrappers() { return m_inspectorCSSOMWr
appers; } | 205 InspectorCSSOMWrappers& inspectorCSSOMWrappers() { return m_inspectorCSSOMWr
appers; } |
| 200 | 206 |
| 201 const RuleFeatureSet& ruleFeatureSet() const { return m_features; } | 207 const RuleFeatureSet& ensureRuleFeatureSet() |
| 208 { |
| 209 if (hasPendingAuthorStyleSheets()) |
| 210 appendPendingAuthorStyleSheets(); |
| 211 return m_features; |
| 212 } |
| 202 | 213 |
| 203 StyleSharingList& styleSharingList() { return m_styleSharingList; } | 214 StyleSharingList& styleSharingList() { return m_styleSharingList; } |
| 204 | 215 |
| 205 bool hasRulesForId(const AtomicString&) const; | 216 bool hasRulesForId(const AtomicString&) const; |
| 206 | 217 |
| 207 void addToStyleSharingList(Element&); | 218 void addToStyleSharingList(Element&); |
| 208 void clearStyleSharingList(); | 219 void clearStyleSharingList(); |
| 209 | 220 |
| 210 StyleResolverStats* stats() { return m_styleResolverStats.get(); } | 221 StyleResolverStats* stats() { return m_styleResolverStats.get(); } |
| 211 StyleResolverStats* statsTotals() { return m_styleResolverStatsTotals.get();
} | 222 StyleResolverStats* statsTotals() { return m_styleResolverStatsTotals.get();
} |
| 212 enum StatsReportType { ReportDefaultStats, ReportSlowStats }; | 223 enum StatsReportType { ReportDefaultStats, ReportSlowStats }; |
| 213 void enableStats(StatsReportType = ReportDefaultStats); | 224 void enableStats(StatsReportType = ReportDefaultStats); |
| 214 void disableStats(); | 225 void disableStats(); |
| 215 void printStats(); | 226 void printStats(); |
| 216 | 227 |
| 217 private: | 228 private: |
| 218 // FontSelectorClient implementation. | 229 // FontSelectorClient implementation. |
| 219 virtual void fontsNeedUpdate(FontSelector*); | 230 virtual void fontsNeedUpdate(FontSelector*); |
| 220 | 231 |
| 221 private: | 232 private: |
| 222 void initWatchedSelectorRules(const Vector<RefPtr<StyleRule> >& watchedSelec
tors); | 233 void initWatchedSelectorRules(const Vector<RefPtr<StyleRule> >& watchedSelec
tors); |
| 223 | 234 |
| 224 // FIXME: This should probably go away, folded into FontBuilder. | 235 // FIXME: This should probably go away, folded into FontBuilder. |
| 225 void updateFont(StyleResolverState&); | 236 void updateFont(StyleResolverState&); |
| 226 | 237 |
| 238 void filterViewportRules(const Vector<RefPtr<StyleRuleBase> >& rules, bool&
needsResolveViewport); |
| 239 void filterViewportRulesFromSheet(StyleSheetContents*, bool& needsResolveVie
wport); |
| 240 bool filterViewportRulesFromAuthorStyleSheets(unsigned firstNew, const Vecto
r<RefPtr<CSSStyleSheet> >& styleSheets); |
| 241 |
| 227 void collectPseudoRulesForElement(Element*, ElementRuleCollector&, PseudoId,
unsigned rulesToInclude); | 242 void collectPseudoRulesForElement(Element*, ElementRuleCollector&, PseudoId,
unsigned rulesToInclude); |
| 228 void matchUARules(ElementRuleCollector&, RuleSet*); | 243 void matchUARules(ElementRuleCollector&, RuleSet*); |
| 229 void matchAuthorRules(Element*, ElementRuleCollector&, bool includeEmptyRule
s); | 244 void matchAuthorRules(Element*, ElementRuleCollector&, bool includeEmptyRule
s); |
| 230 void matchAuthorRulesForShadowHost(Element*, ElementRuleCollector&, bool inc
ludeEmptyRules, Vector<ScopedStyleResolver*, 8>& resolvers, Vector<ScopedStyleRe
solver*, 8>& resolversInShadowTree); | 245 void matchAuthorRulesForShadowHost(Element*, ElementRuleCollector&, bool inc
ludeEmptyRules, Vector<ScopedStyleResolver*, 8>& resolvers, Vector<ScopedStyleRe
solver*, 8>& resolversInShadowTree); |
| 231 void matchHostRules(Element*, ScopedStyleResolver*, ElementRuleCollector&, b
ool includeEmptyRules); | 246 void matchHostRules(Element*, ScopedStyleResolver*, ElementRuleCollector&, b
ool includeEmptyRules); |
| 232 void matchAllRules(StyleResolverState&, ElementRuleCollector&, bool includeS
MILProperties); | 247 void matchAllRules(StyleResolverState&, ElementRuleCollector&, bool includeS
MILProperties); |
| 233 void matchUARules(ElementRuleCollector&); | 248 void matchUARules(ElementRuleCollector&); |
| 234 // FIXME: watched selectors should be implemented using injected author styl
esheets: http://crbug.com/316960 | 249 // FIXME: watched selectors should be implemented using injected author styl
esheets: http://crbug.com/316960 |
| 235 void matchWatchSelectorRules(ElementRuleCollector&); | 250 void matchWatchSelectorRules(ElementRuleCollector&); |
| 236 void collectFeatures(); | 251 void collectFeatures(); |
| 237 void collectTreeBoundaryCrossingRules(Element*, ElementRuleCollector&, bool
includeEmptyRules); | 252 void collectTreeBoundaryCrossingRules(Element*, ElementRuleCollector&, bool
includeEmptyRules); |
| 253 void resetRuleFeatures(); |
| 238 | 254 |
| 239 bool fastRejectSelector(const RuleData&) const; | 255 bool fastRejectSelector(const RuleData&) const; |
| 240 | 256 |
| 241 void applyMatchedProperties(StyleResolverState&, const MatchResult&, Element
* animatingElement); | 257 void applyMatchedProperties(StyleResolverState&, const MatchResult&, Element
* animatingElement); |
| 242 | 258 |
| 243 enum StyleApplicationPass { | 259 enum StyleApplicationPass { |
| 244 VariableDefinitions, | 260 VariableDefinitions, |
| 245 AnimationProperties, | 261 AnimationProperties, |
| 246 HighPriorityProperties, | 262 HighPriorityProperties, |
| 247 LowPriorityProperties | 263 LowPriorityProperties |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 | 295 |
| 280 RefPtr<RenderStyle> m_rootDefaultStyle; | 296 RefPtr<RenderStyle> m_rootDefaultStyle; |
| 281 | 297 |
| 282 Document& m_document; | 298 Document& m_document; |
| 283 SelectorFilter m_selectorFilter; | 299 SelectorFilter m_selectorFilter; |
| 284 | 300 |
| 285 RefPtr<CSSFontSelector> m_fontSelector; | 301 RefPtr<CSSFontSelector> m_fontSelector; |
| 286 | 302 |
| 287 RefPtr<ViewportStyleResolver> m_viewportStyleResolver; | 303 RefPtr<ViewportStyleResolver> m_viewportStyleResolver; |
| 288 | 304 |
| 305 ListHashSet<CSSStyleSheet*, 16> m_pendingStyleSheets; |
| 306 |
| 289 ScopedStyleTree m_styleTree; | 307 ScopedStyleTree m_styleTree; |
| 290 | 308 |
| 291 // FIXME: The entire logic of collecting features on StyleResolver, as well
astransferring them | 309 // FIXME: The entire logic of collecting features on StyleResolver, as well
astransferring them |
| 292 // between various parts of machinery smells wrong. This needs to be better
somehow. | 310 // between various parts of machinery smells wrong. This needs to be better
somehow. |
| 293 RuleFeatureSet m_features; | 311 RuleFeatureSet m_features; |
| 294 OwnPtr<RuleSet> m_siblingRuleSet; | 312 OwnPtr<RuleSet> m_siblingRuleSet; |
| 295 OwnPtr<RuleSet> m_uncommonAttributeRuleSet; | 313 OwnPtr<RuleSet> m_uncommonAttributeRuleSet; |
| 314 |
| 296 // FIXME: watched selectors should be implemented using injected author styl
esheets: http://crbug.com/316960 | 315 // FIXME: watched selectors should be implemented using injected author styl
esheets: http://crbug.com/316960 |
| 297 OwnPtr<RuleSet> m_watchedSelectorsRules; | 316 OwnPtr<RuleSet> m_watchedSelectorsRules; |
| 298 TreeBoundaryCrossingRules m_treeBoundaryCrossingRules; | 317 TreeBoundaryCrossingRules m_treeBoundaryCrossingRules; |
| 299 | 318 |
| 319 bool m_needCollectFeatures; |
| 320 |
| 300 InspectorCSSOMWrappers m_inspectorCSSOMWrappers; | 321 InspectorCSSOMWrappers m_inspectorCSSOMWrappers; |
| 301 | 322 |
| 302 StyleResourceLoader m_styleResourceLoader; | 323 StyleResourceLoader m_styleResourceLoader; |
| 303 | 324 |
| 304 StyleSharingList m_styleSharingList; | 325 StyleSharingList m_styleSharingList; |
| 305 | 326 |
| 306 OwnPtr<StyleResolverStats> m_styleResolverStats; | 327 OwnPtr<StyleResolverStats> m_styleResolverStats; |
| 307 OwnPtr<StyleResolverStats> m_styleResolverStatsTotals; | 328 OwnPtr<StyleResolverStats> m_styleResolverStatsTotals; |
| 308 unsigned m_styleResolverStatsSequence; | 329 unsigned m_styleResolverStatsSequence; |
| 309 }; | 330 }; |
| 310 | 331 |
| 311 inline bool checkRegionSelector(const CSSSelector* regionSelector, Element* regi
onElement) | 332 inline bool checkRegionSelector(const CSSSelector* regionSelector, Element* regi
onElement) |
| 312 { | 333 { |
| 313 if (!regionSelector || !regionElement) | 334 if (!regionSelector || !regionElement) |
| 314 return false; | 335 return false; |
| 315 | 336 |
| 316 SelectorChecker selectorChecker(regionElement->document(), SelectorChecker::
QueryingRules); | 337 SelectorChecker selectorChecker(regionElement->document(), SelectorChecker::
QueryingRules); |
| 317 for (const CSSSelector* s = regionSelector; s; s = CSSSelectorList::next(s))
{ | 338 for (const CSSSelector* s = regionSelector; s; s = CSSSelectorList::next(s))
{ |
| 318 SelectorChecker::SelectorCheckingContext selectorCheckingContext(s, regi
onElement, SelectorChecker::VisitedMatchDisabled); | 339 SelectorChecker::SelectorCheckingContext selectorCheckingContext(s, regi
onElement, SelectorChecker::VisitedMatchDisabled); |
| 319 PseudoId ignoreDynamicPseudo = NOPSEUDO; | 340 PseudoId ignoreDynamicPseudo = NOPSEUDO; |
| 320 if (selectorChecker.match(selectorCheckingContext, ignoreDynamicPseudo,
DOMSiblingTraversalStrategy()) == SelectorChecker::SelectorMatches) | 341 if (selectorChecker.match(selectorCheckingContext, ignoreDynamicPseudo,
DOMSiblingTraversalStrategy()) == SelectorChecker::SelectorMatches) |
| 321 return true; | 342 return true; |
| 322 } | 343 } |
| 323 return false; | 344 return false; |
| 324 } | 345 } |
| 325 | 346 |
| 347 inline bool isDocumentScope(const ContainerNode* scope) |
| 348 { |
| 349 return !scope || scope->isDocumentNode(); |
| 350 } |
| 351 |
| 352 inline void appendPendingStyleSheetsIfNeeded(StyleResolver* styleResolver) |
| 353 { |
| 354 if (!styleResolver || !styleResolver->hasPendingAuthorStyleSheets()) |
| 355 return; |
| 356 styleResolver->appendPendingAuthorStyleSheets(); |
| 357 } |
| 358 |
| 326 } // namespace WebCore | 359 } // namespace WebCore |
| 327 | 360 |
| 328 #endif // StyleResolver_h | 361 #endif // StyleResolver_h |
| OLD | NEW |