| 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. | 3 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. |
| 4 * All rights reserved. | 4 * All rights reserved. |
| 5 * Copyright (C) 2012 Google Inc. All rights reserved. | 5 * Copyright (C) 2012 Google Inc. All rights reserved. |
| 6 * | 6 * |
| 7 * Redistribution and use in source and binary forms, with or without | 7 * Redistribution and use in source and binary forms, with or without |
| 8 * modification, are permitted provided that the following conditions | 8 * modification, are permitted provided that the following conditions |
| 9 * are met: | 9 * are met: |
| 10 * 1. Redistributions of source code must retain the above copyright | 10 * 1. Redistributions of source code must retain the above copyright |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 ruleSet.fontFaceRules(); | 76 ruleSet.fontFaceRules(); |
| 77 for (auto& fontFaceRule : fontFaceRules) { | 77 for (auto& fontFaceRule : fontFaceRules) { |
| 78 if (FontFace* fontFace = FontFace::create(&document, fontFaceRule)) | 78 if (FontFace* fontFace = FontFace::create(&document, fontFaceRule)) |
| 79 cssFontSelector->fontFaceCache()->add(cssFontSelector, fontFaceRule, | 79 cssFontSelector->fontFaceCache()->add(cssFontSelector, fontFaceRule, |
| 80 fontFace); | 80 fontFace); |
| 81 } | 81 } |
| 82 if (fontFaceRules.size()) | 82 if (fontFaceRules.size()) |
| 83 document.styleResolver()->invalidateMatchedPropertiesCache(); | 83 document.styleResolver()->invalidateMatchedPropertiesCache(); |
| 84 } | 84 } |
| 85 | 85 |
| 86 void ScopedStyleResolver::appendCSSStyleSheet( | 86 void ScopedStyleResolver::appendCSSStyleSheet(CSSStyleSheet& cssSheet) { |
| 87 CSSStyleSheet& cssSheet, | 87 RuleSet* ruleSet = |
| 88 const MediaQueryEvaluator& medium) { | 88 treeScope().document().styleEngine().ruleSetForSheet(cssSheet); |
| 89 |
| 90 m_viewportDependentMediaQueryResults.appendVector( |
| 91 cssSheet.viewportDependentMediaQueryResults()); |
| 92 m_deviceDependentMediaQueryResults.appendVector( |
| 93 cssSheet.deviceDependentMediaQueryResults()); |
| 94 if (!ruleSet) |
| 95 return; |
| 96 |
| 89 unsigned index = m_authorStyleSheets.size(); | 97 unsigned index = m_authorStyleSheets.size(); |
| 90 m_authorStyleSheets.append(&cssSheet); | 98 m_authorStyleSheets.append(&cssSheet); |
| 91 StyleSheetContents* sheet = cssSheet.contents(); | 99 addKeyframeRules(*ruleSet); |
| 92 AddRuleFlags addRuleFlags = | 100 addFontFaceRules(*ruleSet); |
| 93 treeScope().document().getSecurityOrigin()->canRequest(sheet->baseURL()) | 101 addTreeBoundaryCrossingRules(*ruleSet, &cssSheet, index); |
| 94 ? RuleHasDocumentSecurityOrigin | |
| 95 : RuleHasNoSpecialState; | |
| 96 const RuleSet& ruleSet = sheet->ensureRuleSet(medium, addRuleFlags); | |
| 97 | |
| 98 addKeyframeRules(ruleSet); | |
| 99 addFontFaceRules(ruleSet); | |
| 100 addTreeBoundaryCrossingRules(ruleSet, &cssSheet, index); | |
| 101 treeScope().document().styleResolver()->addViewportDependentMediaQueries( | |
| 102 ruleSet.viewportDependentMediaQueryResults()); | |
| 103 treeScope().document().styleResolver()->addDeviceDependentMediaQueries( | |
| 104 ruleSet.deviceDependentMediaQueryResults()); | |
| 105 } | 102 } |
| 106 | 103 |
| 107 void ScopedStyleResolver::appendActiveStyleSheets( | 104 void ScopedStyleResolver::appendActiveStyleSheets( |
| 108 unsigned index, | 105 unsigned index, |
| 109 const ActiveStyleSheetVector& activeSheets) { | 106 const ActiveStyleSheetVector& activeSheets) { |
| 110 for (auto activeIterator = activeSheets.begin() + index; | 107 for (auto activeIterator = activeSheets.begin() + index; |
| 111 activeIterator != activeSheets.end(); activeIterator++) { | 108 activeIterator != activeSheets.end(); activeIterator++) { |
| 112 CSSStyleSheet* sheet = activeIterator->first; | 109 CSSStyleSheet* sheet = activeIterator->first; |
| 110 m_viewportDependentMediaQueryResults.appendVector( |
| 111 sheet->viewportDependentMediaQueryResults()); |
| 112 m_deviceDependentMediaQueryResults.appendVector( |
| 113 sheet->deviceDependentMediaQueryResults()); |
| 113 if (!activeIterator->second) | 114 if (!activeIterator->second) |
| 114 continue; | 115 continue; |
| 115 const RuleSet& ruleSet = *activeIterator->second; | 116 const RuleSet& ruleSet = *activeIterator->second; |
| 116 m_authorStyleSheets.append(sheet); | 117 m_authorStyleSheets.append(sheet); |
| 117 addKeyframeRules(ruleSet); | 118 addKeyframeRules(ruleSet); |
| 118 addFontFaceRules(ruleSet); | 119 addFontFaceRules(ruleSet); |
| 119 addTreeBoundaryCrossingRules(ruleSet, sheet, index++); | 120 addTreeBoundaryCrossingRules(ruleSet, sheet, index++); |
| 120 } | 121 } |
| 121 } | 122 } |
| 122 | 123 |
| 123 void ScopedStyleResolver::collectFeaturesTo( | 124 void ScopedStyleResolver::collectFeaturesTo( |
| 124 RuleFeatureSet& features, | 125 RuleFeatureSet& features, |
| 125 HeapHashSet<Member<const StyleSheetContents>>& | 126 HeapHashSet<Member<const StyleSheetContents>>& |
| 126 visitedSharedStyleSheetContents) const { | 127 visitedSharedStyleSheetContents) const { |
| 128 features.viewportDependentMediaQueryResults().appendVector( |
| 129 m_viewportDependentMediaQueryResults); |
| 130 features.deviceDependentMediaQueryResults().appendVector( |
| 131 m_deviceDependentMediaQueryResults); |
| 132 |
| 127 for (size_t i = 0; i < m_authorStyleSheets.size(); ++i) { | 133 for (size_t i = 0; i < m_authorStyleSheets.size(); ++i) { |
| 128 ASSERT(m_authorStyleSheets[i]->ownerNode()); | 134 ASSERT(m_authorStyleSheets[i]->ownerNode()); |
| 129 StyleSheetContents* contents = m_authorStyleSheets[i]->contents(); | 135 StyleSheetContents* contents = m_authorStyleSheets[i]->contents(); |
| 130 if (contents->hasOneClient() || | 136 if (contents->hasOneClient() || |
| 131 visitedSharedStyleSheetContents.add(contents).isNewEntry) | 137 visitedSharedStyleSheetContents.add(contents).isNewEntry) |
| 132 features.add(contents->ruleSet().features()); | 138 features.add(contents->ruleSet().features()); |
| 133 } | 139 } |
| 134 | 140 |
| 135 if (!m_treeBoundaryCrossingRuleSet) | 141 if (!m_treeBoundaryCrossingRuleSet) |
| 136 return; | 142 return; |
| 137 | 143 |
| 138 for (const auto& rules : *m_treeBoundaryCrossingRuleSet) | 144 for (const auto& rules : *m_treeBoundaryCrossingRuleSet) |
| 139 features.add(rules->m_ruleSet->features()); | 145 features.add(rules->m_ruleSet->features()); |
| 140 } | 146 } |
| 141 | 147 |
| 142 void ScopedStyleResolver::resetAuthorStyle() { | 148 void ScopedStyleResolver::resetAuthorStyle() { |
| 143 m_authorStyleSheets.clear(); | 149 m_authorStyleSheets.clear(); |
| 150 m_viewportDependentMediaQueryResults.clear(); |
| 151 m_deviceDependentMediaQueryResults.clear(); |
| 144 m_keyframesRuleMap.clear(); | 152 m_keyframesRuleMap.clear(); |
| 145 m_treeBoundaryCrossingRuleSet = nullptr; | 153 m_treeBoundaryCrossingRuleSet = nullptr; |
| 146 m_hasDeepOrShadowSelector = false; | 154 m_hasDeepOrShadowSelector = false; |
| 147 } | 155 } |
| 148 | 156 |
| 149 StyleRuleKeyframes* ScopedStyleResolver::keyframeStylesForAnimation( | 157 StyleRuleKeyframes* ScopedStyleResolver::keyframeStylesForAnimation( |
| 150 const StringImpl* animationName) { | 158 const StringImpl* animationName) { |
| 151 if (m_keyframesRuleMap.isEmpty()) | 159 if (m_keyframesRuleMap.isEmpty()) |
| 152 return nullptr; | 160 return nullptr; |
| 153 | 161 |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 255 // Only consider the global author RuleSet for @page rules, as per the HTML5 | 263 // Only consider the global author RuleSet for @page rules, as per the HTML5 |
| 256 // spec. | 264 // spec. |
| 257 ASSERT(m_scope->rootNode().isDocumentNode()); | 265 ASSERT(m_scope->rootNode().isDocumentNode()); |
| 258 for (size_t i = 0; i < m_authorStyleSheets.size(); ++i) | 266 for (size_t i = 0; i < m_authorStyleSheets.size(); ++i) |
| 259 collector.matchPageRules(&m_authorStyleSheets[i]->contents()->ruleSet()); | 267 collector.matchPageRules(&m_authorStyleSheets[i]->contents()->ruleSet()); |
| 260 } | 268 } |
| 261 | 269 |
| 262 DEFINE_TRACE(ScopedStyleResolver) { | 270 DEFINE_TRACE(ScopedStyleResolver) { |
| 263 visitor->trace(m_scope); | 271 visitor->trace(m_scope); |
| 264 visitor->trace(m_authorStyleSheets); | 272 visitor->trace(m_authorStyleSheets); |
| 273 visitor->trace(m_viewportDependentMediaQueryResults); |
| 274 visitor->trace(m_deviceDependentMediaQueryResults); |
| 265 visitor->trace(m_keyframesRuleMap); | 275 visitor->trace(m_keyframesRuleMap); |
| 266 visitor->trace(m_treeBoundaryCrossingRuleSet); | 276 visitor->trace(m_treeBoundaryCrossingRuleSet); |
| 267 } | 277 } |
| 268 | 278 |
| 269 static void addRules(RuleSet* ruleSet, | 279 static void addRules(RuleSet* ruleSet, |
| 270 const HeapVector<MinimalRuleData>& rules) { | 280 const HeapVector<MinimalRuleData>& rules) { |
| 271 for (unsigned i = 0; i < rules.size(); ++i) { | 281 for (unsigned i = 0; i < rules.size(); ++i) { |
| 272 const MinimalRuleData& info = rules[i]; | 282 const MinimalRuleData& info = rules[i]; |
| 273 ruleSet->addRule(info.m_rule, info.m_selectorIndex, info.m_flags); | 283 ruleSet->addRule(info.m_rule, info.m_selectorIndex, info.m_flags); |
| 274 } | 284 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 304 m_treeBoundaryCrossingRuleSet->append( | 314 m_treeBoundaryCrossingRuleSet->append( |
| 305 RuleSubSet::create(parentStyleSheet, sheetIndex, ruleSetForScope)); | 315 RuleSubSet::create(parentStyleSheet, sheetIndex, ruleSetForScope)); |
| 306 } | 316 } |
| 307 | 317 |
| 308 DEFINE_TRACE(ScopedStyleResolver::RuleSubSet) { | 318 DEFINE_TRACE(ScopedStyleResolver::RuleSubSet) { |
| 309 visitor->trace(m_parentStyleSheet); | 319 visitor->trace(m_parentStyleSheet); |
| 310 visitor->trace(m_ruleSet); | 320 visitor->trace(m_ruleSet); |
| 311 } | 321 } |
| 312 | 322 |
| 313 } // namespace blink | 323 } // namespace blink |
| OLD | NEW |