| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) | 3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) |
| 4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) | 4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) |
| 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All r
ights reserved. | 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All r
ights reserved. |
| 6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> | 6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> |
| 7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> | 7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> |
| 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
| 9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved. | 9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved. |
| 10 * Copyright (C) Research In Motion Limited 2011. All rights reserved. | 10 * Copyright (C) Research In Motion Limited 2011. All rights reserved. |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 #include "HTMLNames.h" | 32 #include "HTMLNames.h" |
| 33 #include "RuntimeEnabledFeatures.h" | 33 #include "RuntimeEnabledFeatures.h" |
| 34 #include "core/css/CSSFontSelector.h" | 34 #include "core/css/CSSFontSelector.h" |
| 35 #include "core/css/CSSSelector.h" | 35 #include "core/css/CSSSelector.h" |
| 36 #include "core/css/CSSSelectorList.h" | 36 #include "core/css/CSSSelectorList.h" |
| 37 #include "core/css/SelectorChecker.h" | 37 #include "core/css/SelectorChecker.h" |
| 38 #include "core/css/SelectorCheckerFastPath.h" | 38 #include "core/css/SelectorCheckerFastPath.h" |
| 39 #include "core/css/SelectorFilter.h" | 39 #include "core/css/SelectorFilter.h" |
| 40 #include "core/css/StyleRuleImport.h" | 40 #include "core/css/StyleRuleImport.h" |
| 41 #include "core/css/StyleSheetContents.h" | 41 #include "core/css/StyleSheetContents.h" |
| 42 #include "core/css/analyzer/RuleSetAnalyzer.h" |
| 42 #include "core/html/track/TextTrackCue.h" | 43 #include "core/html/track/TextTrackCue.h" |
| 43 #include "platform/weborigin/SecurityOrigin.h" | 44 #include "platform/weborigin/SecurityOrigin.h" |
| 44 | 45 |
| 45 namespace WebCore { | 46 namespace WebCore { |
| 46 | 47 |
| 47 using namespace HTMLNames; | 48 using namespace HTMLNames; |
| 48 | 49 |
| 49 // ----------------------------------------------------------------- | 50 // ----------------------------------------------------------------- |
| 50 | 51 |
| 51 static inline bool isSelectorMatchingHTMLBasedOnRuleHash(const CSSSelector* sele
ctor) | 52 static inline bool isSelectorMatchingHTMLBasedOnRuleHash(const CSSSelector* sele
ctor) |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 , m_containsUncommonAttributeSelector(WebCore::containsUncommonAttributeSele
ctor(selector())) | 201 , m_containsUncommonAttributeSelector(WebCore::containsUncommonAttributeSele
ctor(selector())) |
| 201 , m_linkMatchType(SelectorChecker::determineLinkMatchType(selector())) | 202 , m_linkMatchType(SelectorChecker::determineLinkMatchType(selector())) |
| 202 , m_hasDocumentSecurityOrigin(addRuleFlags & RuleHasDocumentSecurityOrigin) | 203 , m_hasDocumentSecurityOrigin(addRuleFlags & RuleHasDocumentSecurityOrigin) |
| 203 , m_propertyWhitelistType(determinePropertyWhitelistType(addRuleFlags, selec
tor())) | 204 , m_propertyWhitelistType(determinePropertyWhitelistType(addRuleFlags, selec
tor())) |
| 204 { | 205 { |
| 205 ASSERT(m_position == position); | 206 ASSERT(m_position == position); |
| 206 ASSERT(m_selectorIndex == selectorIndex); | 207 ASSERT(m_selectorIndex == selectorIndex); |
| 207 SelectorFilter::collectIdentifierHashes(selector(), m_descendantSelectorIden
tifierHashes, maximumIdentifierCount); | 208 SelectorFilter::collectIdentifierHashes(selector(), m_descendantSelectorIden
tifierHashes, maximumIdentifierCount); |
| 208 } | 209 } |
| 209 | 210 |
| 210 static void collectFeaturesFromRuleData(RuleFeatureSet& features, const RuleData
& ruleData) | |
| 211 { | |
| 212 bool foundSiblingSelector = false; | |
| 213 unsigned maxDirectAdjacentSelectors = 0; | |
| 214 for (const CSSSelector* selector = ruleData.selector(); selector; selector =
selector->tagHistory()) { | |
| 215 features.collectFeaturesFromSelector(selector); | |
| 216 | |
| 217 if (const CSSSelectorList* selectorList = selector->selectorList()) { | |
| 218 for (const CSSSelector* subSelector = selectorList->first(); subSele
ctor; subSelector = CSSSelectorList::next(subSelector)) { | |
| 219 // FIXME: Shouldn't this be checking subSelector->isSiblingSelec
tor()? | |
| 220 if (!foundSiblingSelector && selector->isSiblingSelector()) | |
| 221 foundSiblingSelector = true; | |
| 222 if (subSelector->isDirectAdjacentSelector()) | |
| 223 maxDirectAdjacentSelectors++; | |
| 224 features.collectFeaturesFromSelector(subSelector); | |
| 225 } | |
| 226 } else { | |
| 227 if (!foundSiblingSelector && selector->isSiblingSelector()) | |
| 228 foundSiblingSelector = true; | |
| 229 if (selector->isDirectAdjacentSelector()) | |
| 230 maxDirectAdjacentSelectors++; | |
| 231 } | |
| 232 } | |
| 233 features.setMaxDirectAdjacentSelectors(maxDirectAdjacentSelectors); | |
| 234 if (foundSiblingSelector) | |
| 235 features.siblingRules.append(RuleFeature(ruleData.rule(), ruleData.selec
torIndex(), ruleData.hasDocumentSecurityOrigin())); | |
| 236 if (ruleData.containsUncommonAttributeSelector()) | |
| 237 features.uncommonAttributeRules.append(RuleFeature(ruleData.rule(), rule
Data.selectorIndex(), ruleData.hasDocumentSecurityOrigin())); | |
| 238 } | |
| 239 | |
| 240 void RuleSet::addToRuleSet(StringImpl* key, PendingRuleMap& map, const RuleData&
ruleData) | 211 void RuleSet::addToRuleSet(StringImpl* key, PendingRuleMap& map, const RuleData&
ruleData) |
| 241 { | 212 { |
| 242 if (!key) | 213 if (!key) |
| 243 return; | 214 return; |
| 244 OwnPtr<LinkedStack<RuleData> >& rules = map.add(key, nullptr).iterator->valu
e; | 215 OwnPtr<LinkedStack<RuleData> >& rules = map.add(key, nullptr).iterator->valu
e; |
| 245 if (!rules) | 216 if (!rules) |
| 246 rules = adoptPtr(new LinkedStack<RuleData>); | 217 rules = adoptPtr(new LinkedStack<RuleData>); |
| 247 rules->push(ruleData); | 218 rules->push(ruleData); |
| 248 } | 219 } |
| 249 | 220 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 addToRuleSet(component->tagQName().localName().impl(), ensurePending
Rules()->tagRules, ruleData); | 263 addToRuleSet(component->tagQName().localName().impl(), ensurePending
Rules()->tagRules, ruleData); |
| 293 return true; | 264 return true; |
| 294 } | 265 } |
| 295 } | 266 } |
| 296 return false; | 267 return false; |
| 297 } | 268 } |
| 298 | 269 |
| 299 void RuleSet::addRule(StyleRule* rule, unsigned selectorIndex, AddRuleFlags addR
uleFlags) | 270 void RuleSet::addRule(StyleRule* rule, unsigned selectorIndex, AddRuleFlags addR
uleFlags) |
| 300 { | 271 { |
| 301 RuleData ruleData(rule, selectorIndex, m_ruleCount++, addRuleFlags); | 272 RuleData ruleData(rule, selectorIndex, m_ruleCount++, addRuleFlags); |
| 302 collectFeaturesFromRuleData(m_features, ruleData); | 273 m_features.ensureRuleSetAnalyzer()->collectFeaturesFromRuleData(m_features,
ruleData); |
| 303 | 274 |
| 304 if (!findBestRuleSetAndAdd(ruleData.selector(), ruleData)) { | 275 if (!findBestRuleSetAndAdd(ruleData.selector(), ruleData)) { |
| 305 // If we didn't find a specialized map to stick it in, file under univer
sal rules. | 276 // If we didn't find a specialized map to stick it in, file under univer
sal rules. |
| 306 m_universalRules.append(ruleData); | 277 m_universalRules.append(ruleData); |
| 307 } | 278 } |
| 308 } | 279 } |
| 309 | 280 |
| 310 void RuleSet::addPageRule(StyleRulePage* rule) | 281 void RuleSet::addPageRule(StyleRulePage* rule) |
| 311 { | 282 { |
| 312 ensurePendingRules(); // So that m_pageRules.shrinkToFit() gets called. | 283 ensurePendingRules(); // So that m_pageRules.shrinkToFit() gets called. |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 447 m_universalRules.shrinkToFit(); | 418 m_universalRules.shrinkToFit(); |
| 448 m_pageRules.shrinkToFit(); | 419 m_pageRules.shrinkToFit(); |
| 449 m_viewportRules.shrinkToFit(); | 420 m_viewportRules.shrinkToFit(); |
| 450 m_fontFaceRules.shrinkToFit(); | 421 m_fontFaceRules.shrinkToFit(); |
| 451 m_keyframesRules.shrinkToFit(); | 422 m_keyframesRules.shrinkToFit(); |
| 452 m_treeBoundaryCrossingRules.shrinkToFit(); | 423 m_treeBoundaryCrossingRules.shrinkToFit(); |
| 453 m_shadowDistributedRules.shrinkToFit(); | 424 m_shadowDistributedRules.shrinkToFit(); |
| 454 } | 425 } |
| 455 | 426 |
| 456 } // namespace WebCore | 427 } // namespace WebCore |
| OLD | NEW |