| 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 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 } | 193 } |
| 194 } else if (!foundSiblingSelector && selector->isSiblingSelector()) | 194 } else if (!foundSiblingSelector && selector->isSiblingSelector()) |
| 195 foundSiblingSelector = true; | 195 foundSiblingSelector = true; |
| 196 } | 196 } |
| 197 if (foundSiblingSelector) | 197 if (foundSiblingSelector) |
| 198 features.siblingRules.append(RuleFeature(ruleData.rule(), ruleData.selec
torIndex(), ruleData.hasDocumentSecurityOrigin())); | 198 features.siblingRules.append(RuleFeature(ruleData.rule(), ruleData.selec
torIndex(), ruleData.hasDocumentSecurityOrigin())); |
| 199 if (ruleData.containsUncommonAttributeSelector()) | 199 if (ruleData.containsUncommonAttributeSelector()) |
| 200 features.uncommonAttributeRules.append(RuleFeature(ruleData.rule(), rule
Data.selectorIndex(), ruleData.hasDocumentSecurityOrigin())); | 200 features.uncommonAttributeRules.append(RuleFeature(ruleData.rule(), rule
Data.selectorIndex(), ruleData.hasDocumentSecurityOrigin())); |
| 201 } | 201 } |
| 202 | 202 |
| 203 void RuleSet::addToRuleSet(AtomicStringImpl* key, AtomRuleMap& map, const RuleDa
ta& ruleData) | 203 void RuleSet::addToRuleSet(AtomicStringImpl* key, PendingRuleMap& map, const Rul
eData& ruleData) |
| 204 { | 204 { |
| 205 if (!key) | 205 if (!key) |
| 206 return; | 206 return; |
| 207 OwnPtr<Vector<RuleData> >& rules = map.add(key, nullptr).iterator->value; | 207 OwnPtr<LinkedStack<RuleData> >& rules = map.add(key, nullptr).iterator->valu
e; |
| 208 if (!rules) | 208 if (!rules) |
| 209 rules = adoptPtr(new Vector<RuleData>); | 209 rules = adoptPtr(new LinkedStack<RuleData>); |
| 210 rules->append(ruleData); | 210 rules->push(ruleData); |
| 211 } | 211 } |
| 212 | 212 |
| 213 bool RuleSet::findBestRuleSetAndAdd(const CSSSelector* component, RuleData& rule
Data) | 213 bool RuleSet::findBestRuleSetAndAdd(const CSSSelector* component, RuleData& rule
Data) |
| 214 { | 214 { |
| 215 if (component->m_match == CSSSelector::Id) { | 215 if (component->m_match == CSSSelector::Id) { |
| 216 addToRuleSet(component->value().impl(), m_idRules, ruleData); | 216 addToRuleSet(component->value().impl(), ensurePendingRules()->idRules, r
uleData); |
| 217 return true; | 217 return true; |
| 218 } | 218 } |
| 219 if (component->m_match == CSSSelector::Class) { | 219 if (component->m_match == CSSSelector::Class) { |
| 220 addToRuleSet(component->value().impl(), m_classRules, ruleData); | 220 addToRuleSet(component->value().impl(), ensurePendingRules()->classRules
, ruleData); |
| 221 return true; | 221 return true; |
| 222 } | 222 } |
| 223 if (component->isCustomPseudoElement()) { | 223 if (component->isCustomPseudoElement()) { |
| 224 addToRuleSet(component->value().impl(), m_shadowPseudoElementRules, rule
Data); | 224 addToRuleSet(component->value().impl(), ensurePendingRules()->shadowPseu
doElementRules, ruleData); |
| 225 return true; | 225 return true; |
| 226 } | 226 } |
| 227 if (component->pseudoType() == CSSSelector::PseudoCue) { | 227 if (component->pseudoType() == CSSSelector::PseudoCue) { |
| 228 m_cuePseudoRules.append(ruleData); | 228 m_cuePseudoRules.append(ruleData); |
| 229 return true; | 229 return true; |
| 230 } | 230 } |
| 231 if (SelectorChecker::isCommonPseudoClassSelector(component)) { | 231 if (SelectorChecker::isCommonPseudoClassSelector(component)) { |
| 232 switch (component->pseudoType()) { | 232 switch (component->pseudoType()) { |
| 233 case CSSSelector::PseudoLink: | 233 case CSSSelector::PseudoLink: |
| 234 case CSSSelector::PseudoVisited: | 234 case CSSSelector::PseudoVisited: |
| (...skipping 10 matching lines...) Expand all Loading... |
| 245 } | 245 } |
| 246 | 246 |
| 247 if (component->m_match == CSSSelector::Tag) { | 247 if (component->m_match == CSSSelector::Tag) { |
| 248 if (component->tagQName().localName() != starAtom) { | 248 if (component->tagQName().localName() != starAtom) { |
| 249 // If this is part of a subselector chain, recurse ahead to find a n
arrower set (ID/class.) | 249 // If this is part of a subselector chain, recurse ahead to find a n
arrower set (ID/class.) |
| 250 if (component->relation() == CSSSelector::SubSelector | 250 if (component->relation() == CSSSelector::SubSelector |
| 251 && (component->tagHistory()->m_match == CSSSelector::Class || co
mponent->tagHistory()->m_match == CSSSelector::Id || SelectorChecker::isCommonPs
eudoClassSelector(component->tagHistory())) | 251 && (component->tagHistory()->m_match == CSSSelector::Class || co
mponent->tagHistory()->m_match == CSSSelector::Id || SelectorChecker::isCommonPs
eudoClassSelector(component->tagHistory())) |
| 252 && findBestRuleSetAndAdd(component->tagHistory(), ruleData)) | 252 && findBestRuleSetAndAdd(component->tagHistory(), ruleData)) |
| 253 return true; | 253 return true; |
| 254 | 254 |
| 255 addToRuleSet(component->tagQName().localName().impl(), m_tagRules, r
uleData); | 255 addToRuleSet(component->tagQName().localName().impl(), ensurePending
Rules()->tagRules, ruleData); |
| 256 return true; | 256 return true; |
| 257 } | 257 } |
| 258 } | 258 } |
| 259 return false; | 259 return false; |
| 260 } | 260 } |
| 261 | 261 |
| 262 void RuleSet::addRule(StyleRule* rule, unsigned selectorIndex, AddRuleFlags addR
uleFlags) | 262 void RuleSet::addRule(StyleRule* rule, unsigned selectorIndex, AddRuleFlags addR
uleFlags) |
| 263 { | 263 { |
| 264 m_hasDirtyRules = true; | |
| 265 RuleData ruleData(rule, selectorIndex, m_ruleCount++, addRuleFlags); | 264 RuleData ruleData(rule, selectorIndex, m_ruleCount++, addRuleFlags); |
| 266 collectFeaturesFromRuleData(m_features, ruleData); | 265 collectFeaturesFromRuleData(m_features, ruleData); |
| 267 | 266 |
| 268 if (!findBestRuleSetAndAdd(ruleData.selector(), ruleData)) { | 267 if (!findBestRuleSetAndAdd(ruleData.selector(), ruleData)) { |
| 269 // If we didn't find a specialized map to stick it in, file under univer
sal rules. | 268 // If we didn't find a specialized map to stick it in, file under univer
sal rules. |
| 270 m_universalRules.append(ruleData); | 269 m_universalRules.append(ruleData); |
| 271 } | 270 } |
| 272 } | 271 } |
| 273 | 272 |
| 274 void RuleSet::addPageRule(StyleRulePage* rule) | 273 void RuleSet::addPageRule(StyleRulePage* rule) |
| 275 { | 274 { |
| 276 m_hasDirtyRules = true; | 275 ensurePendingRules(); // So that m_pageRules.shrinkToFit() gets called. |
| 277 m_pageRules.append(rule); | 276 m_pageRules.append(rule); |
| 278 } | 277 } |
| 279 | 278 |
| 280 void RuleSet::addRegionRule(StyleRuleRegion* regionRule, bool hasDocumentSecurit
yOrigin) | 279 void RuleSet::addRegionRule(StyleRuleRegion* regionRule, bool hasDocumentSecurit
yOrigin) |
| 281 { | 280 { |
| 282 m_hasDirtyRules = true; | 281 ensurePendingRules(); // So that m_regionSelectorsAndRuleSets.shrinkToFit()
gets called. |
| 283 OwnPtr<RuleSet> regionRuleSet = RuleSet::create(); | 282 OwnPtr<RuleSet> regionRuleSet = RuleSet::create(); |
| 284 // The region rule set should take into account the position inside the pare
nt rule set. | 283 // The region rule set should take into account the position inside the pare
nt rule set. |
| 285 // Otherwise, the rules inside region block might be incorrectly positioned
before other similar rules from | 284 // Otherwise, the rules inside region block might be incorrectly positioned
before other similar rules from |
| 286 // the stylesheet that contains the region block. | 285 // the stylesheet that contains the region block. |
| 287 regionRuleSet->m_ruleCount = m_ruleCount; | 286 regionRuleSet->m_ruleCount = m_ruleCount; |
| 288 | 287 |
| 289 // Collect the region rules into a rule set | 288 // Collect the region rules into a rule set |
| 290 // FIXME: Should this add other types of rules? (i.e. use addChildRules() di
rectly?) | 289 // FIXME: Should this add other types of rules? (i.e. use addChildRules() di
rectly?) |
| 291 const Vector<RefPtr<StyleRuleBase> >& childRules = regionRule->childRules(); | 290 const Vector<RefPtr<StyleRuleBase> >& childRules = regionRule->childRules(); |
| 292 AddRuleFlags addRuleFlags = hasDocumentSecurityOrigin ? RuleHasDocumentSecur
ityOrigin : RuleHasNoSpecialState; | 291 AddRuleFlags addRuleFlags = hasDocumentSecurityOrigin ? RuleHasDocumentSecur
ityOrigin : RuleHasNoSpecialState; |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 372 | 371 |
| 373 addChildRules(sheet->childRules(), medium, resolver, scope, hasDocumentSecur
ityOrigin, addRuleFlags); | 372 addChildRules(sheet->childRules(), medium, resolver, scope, hasDocumentSecur
ityOrigin, addRuleFlags); |
| 374 } | 373 } |
| 375 | 374 |
| 376 void RuleSet::addStyleRule(StyleRule* rule, AddRuleFlags addRuleFlags) | 375 void RuleSet::addStyleRule(StyleRule* rule, AddRuleFlags addRuleFlags) |
| 377 { | 376 { |
| 378 for (size_t selectorIndex = 0; selectorIndex != notFound; selectorIndex = ru
le->selectorList().indexOfNextSelectorAfter(selectorIndex)) | 377 for (size_t selectorIndex = 0; selectorIndex != notFound; selectorIndex = ru
le->selectorList().indexOfNextSelectorAfter(selectorIndex)) |
| 379 addRule(rule, selectorIndex, addRuleFlags); | 378 addRule(rule, selectorIndex, addRuleFlags); |
| 380 } | 379 } |
| 381 | 380 |
| 382 void RuleSet::shrinkMapVectorsToFit(AtomRuleMap& map) | 381 void RuleSet::compactPendingRules(PendingRuleMap& pendingMap, CompactRuleMap& co
mpactMap) |
| 383 { | 382 { |
| 384 RuleSet::AtomRuleMap::iterator end = map.end(); | 383 PendingRuleMap::iterator end = pendingMap.end(); |
| 385 for (RuleSet::AtomRuleMap::iterator it = map.begin(); it != end; ++it) | 384 for (PendingRuleMap::iterator it = pendingMap.begin(); it != end; ++it) { |
| 386 it->value->shrinkToFit(); | 385 OwnPtr<LinkedStack<RuleData> > pendingRules = it->value.release(); |
| 386 size_t pendingSize = pendingRules->size(); |
| 387 ASSERT(pendingSize); |
| 388 |
| 389 OwnPtr<Vector<RuleData> >& compactRules = compactMap.add(it->key, nullpt
r).iterator->value; |
| 390 if (!compactRules) { |
| 391 compactRules = adoptPtr(new Vector<RuleData>); |
| 392 compactRules->reserveInitialCapacity(pendingSize); |
| 393 } else { |
| 394 compactRules->reserveCapacity(compactRules->size() + pendingSize); |
| 395 } |
| 396 |
| 397 while (!pendingRules->isEmpty()) { |
| 398 compactRules->append(pendingRules->peek()); |
| 399 pendingRules->pop(); |
| 400 } |
| 401 |
| 402 ASSERT(compactRules->size() == compactRules->capacity()); |
| 403 } |
| 387 } | 404 } |
| 388 | 405 |
| 389 void RuleSet::shrinkToFit() | 406 void RuleSet::compactRules() |
| 390 { | 407 { |
| 391 m_hasDirtyRules = false; | 408 ASSERT(m_pendingRules); |
| 392 shrinkMapVectorsToFit(m_idRules); | 409 OwnPtr<PendingRuleMaps> pendingRules = m_pendingRules.release(); |
| 393 shrinkMapVectorsToFit(m_classRules); | 410 compactPendingRules(pendingRules->idRules, m_idRules); |
| 394 shrinkMapVectorsToFit(m_tagRules); | 411 compactPendingRules(pendingRules->classRules, m_classRules); |
| 395 shrinkMapVectorsToFit(m_shadowPseudoElementRules); | 412 compactPendingRules(pendingRules->tagRules, m_tagRules); |
| 413 compactPendingRules(pendingRules->shadowPseudoElementRules, m_shadowPseudoEl
ementRules); |
| 396 m_linkPseudoClassRules.shrinkToFit(); | 414 m_linkPseudoClassRules.shrinkToFit(); |
| 397 m_cuePseudoRules.shrinkToFit(); | 415 m_cuePseudoRules.shrinkToFit(); |
| 398 m_focusPseudoClassRules.shrinkToFit(); | 416 m_focusPseudoClassRules.shrinkToFit(); |
| 399 m_universalRules.shrinkToFit(); | 417 m_universalRules.shrinkToFit(); |
| 400 m_pageRules.shrinkToFit(); | 418 m_pageRules.shrinkToFit(); |
| 401 } | 419 } |
| 402 | 420 |
| 403 } // namespace WebCore | 421 } // namespace WebCore |
| OLD | NEW |