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 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 { | 123 { |
124 if (addRuleFlags & RuleIsInRegionRule) | 124 if (addRuleFlags & RuleIsInRegionRule) |
125 return PropertyWhitelistRegion; | 125 return PropertyWhitelistRegion; |
126 for (const CSSSelector* component = selector; component; component = compone
nt->tagHistory()) { | 126 for (const CSSSelector* component = selector; component; component = compone
nt->tagHistory()) { |
127 if (component->pseudoType() == CSSSelector::PseudoCue || (component->m_m
atch == CSSSelector::PseudoElement && component->value() == TextTrackCue::cueSha
dowPseudoId())) | 127 if (component->pseudoType() == CSSSelector::PseudoCue || (component->m_m
atch == CSSSelector::PseudoElement && component->value() == TextTrackCue::cueSha
dowPseudoId())) |
128 return PropertyWhitelistCue; | 128 return PropertyWhitelistCue; |
129 } | 129 } |
130 return PropertyWhitelistNone; | 130 return PropertyWhitelistNone; |
131 } | 131 } |
132 | 132 |
| 133 namespace { |
| 134 |
| 135 // FIXME: Should we move this class to WTF? |
| 136 template<typename T> |
| 137 class TerminatedArrayBuilder { |
| 138 public: |
| 139 explicit TerminatedArrayBuilder(PassOwnPtr<T> array) |
| 140 : m_array(array) |
| 141 , m_count(0) |
| 142 , m_capacity(0) |
| 143 { |
| 144 if (!m_array) |
| 145 return; |
| 146 for (T* item = m_array.get(); !item->isLastInArray(); ++item) |
| 147 ++m_count; |
| 148 ++m_count; // To count the last item itself. |
| 149 m_capacity = m_count; |
| 150 } |
| 151 |
| 152 void grow(size_t count) |
| 153 { |
| 154 ASSERT(count); |
| 155 if (!m_array) { |
| 156 ASSERT(!m_count); |
| 157 ASSERT(!m_capacity); |
| 158 m_capacity = count; |
| 159 m_array = adoptPtr(static_cast<T*>(fastMalloc(m_capacity * sizeof(T)
))); |
| 160 return; |
| 161 } |
| 162 m_capacity += count; |
| 163 m_array = adoptPtr(static_cast<T*>(fastRealloc(m_array.leakPtr(), m_capa
city * sizeof(T)))); |
| 164 m_array.get()[m_count - 1].setLastInArray(false); |
| 165 } |
| 166 |
| 167 void append(const T& item) |
| 168 { |
| 169 RELEASE_ASSERT(m_count < m_capacity); |
| 170 ASSERT(!item.isLastInArray()); |
| 171 m_array.get()[m_count++] = item; |
| 172 } |
| 173 |
| 174 PassOwnPtr<T> release() |
| 175 { |
| 176 RELEASE_ASSERT(m_count == m_capacity); |
| 177 if (m_array) |
| 178 m_array.get()[m_count - 1].setLastInArray(true); |
| 179 assertValid(); |
| 180 return m_array.release(); |
| 181 } |
| 182 |
| 183 private: |
| 184 #ifndef NDEBUG |
| 185 void assertValid() |
| 186 { |
| 187 for (size_t i = 0; i < m_count; ++i) { |
| 188 bool isLastInArray = (i + 1 == m_count); |
| 189 ASSERT(m_array.get()[i].isLastInArray() == isLastInArray); |
| 190 } |
| 191 } |
| 192 #else |
| 193 void assertValid() { } |
| 194 #endif |
| 195 |
| 196 OwnPtr<T> m_array; |
| 197 size_t m_count; |
| 198 size_t m_capacity; |
| 199 }; |
| 200 |
| 201 } |
| 202 |
133 RuleData::RuleData(StyleRule* rule, unsigned selectorIndex, unsigned position, A
ddRuleFlags addRuleFlags) | 203 RuleData::RuleData(StyleRule* rule, unsigned selectorIndex, unsigned position, A
ddRuleFlags addRuleFlags) |
134 : m_rule(rule) | 204 : m_rule(rule) |
135 , m_selectorIndex(selectorIndex) | 205 , m_selectorIndex(selectorIndex) |
| 206 , m_isLastInArray(false) |
136 , m_position(position) | 207 , m_position(position) |
137 , m_hasFastCheckableSelector((addRuleFlags & RuleCanUseFastCheckSelector) &&
SelectorCheckerFastPath::canUse(selector())) | 208 , m_hasFastCheckableSelector((addRuleFlags & RuleCanUseFastCheckSelector) &&
SelectorCheckerFastPath::canUse(selector())) |
138 , m_specificity(selector()->specificity()) | 209 , m_specificity(selector()->specificity()) |
139 , m_hasMultipartSelector(!!selector()->tagHistory()) | 210 , m_hasMultipartSelector(!!selector()->tagHistory()) |
140 , m_hasRightmostSelectorMatchingHTMLBasedOnRuleHash(isSelectorMatchingHTMLBa
sedOnRuleHash(selector())) | 211 , m_hasRightmostSelectorMatchingHTMLBasedOnRuleHash(isSelectorMatchingHTMLBa
sedOnRuleHash(selector())) |
141 , m_containsUncommonAttributeSelector(WebCore::containsUncommonAttributeSele
ctor(selector())) | 212 , m_containsUncommonAttributeSelector(WebCore::containsUncommonAttributeSele
ctor(selector())) |
142 , m_linkMatchType(SelectorChecker::determineLinkMatchType(selector())) | 213 , m_linkMatchType(SelectorChecker::determineLinkMatchType(selector())) |
143 , m_hasDocumentSecurityOrigin(addRuleFlags & RuleHasDocumentSecurityOrigin) | 214 , m_hasDocumentSecurityOrigin(addRuleFlags & RuleHasDocumentSecurityOrigin) |
144 , m_propertyWhitelistType(determinePropertyWhitelistType(addRuleFlags, selec
tor())) | 215 , m_propertyWhitelistType(determinePropertyWhitelistType(addRuleFlags, selec
tor())) |
145 { | 216 { |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 { | 445 { |
375 for (size_t selectorIndex = 0; selectorIndex != notFound; selectorIndex = ru
le->selectorList().indexOfNextSelectorAfter(selectorIndex)) | 446 for (size_t selectorIndex = 0; selectorIndex != notFound; selectorIndex = ru
le->selectorList().indexOfNextSelectorAfter(selectorIndex)) |
376 addRule(rule, selectorIndex, addRuleFlags); | 447 addRule(rule, selectorIndex, addRuleFlags); |
377 } | 448 } |
378 | 449 |
379 void RuleSet::compactPendingRules(PendingRuleMap& pendingMap, CompactRuleMap& co
mpactMap) | 450 void RuleSet::compactPendingRules(PendingRuleMap& pendingMap, CompactRuleMap& co
mpactMap) |
380 { | 451 { |
381 PendingRuleMap::iterator end = pendingMap.end(); | 452 PendingRuleMap::iterator end = pendingMap.end(); |
382 for (PendingRuleMap::iterator it = pendingMap.begin(); it != end; ++it) { | 453 for (PendingRuleMap::iterator it = pendingMap.begin(); it != end; ++it) { |
383 OwnPtr<LinkedStack<RuleData> > pendingRules = it->value.release(); | 454 OwnPtr<LinkedStack<RuleData> > pendingRules = it->value.release(); |
384 size_t pendingSize = pendingRules->size(); | 455 CompactRuleMap::iterator compactRules = compactMap.add(it->key, nullptr)
.iterator; |
385 ASSERT(pendingSize); | |
386 | 456 |
387 OwnPtr<Vector<RuleData> >& compactRules = compactMap.add(it->key, nullpt
r).iterator->value; | 457 TerminatedArrayBuilder<RuleData> builder(compactRules->value.release()); |
388 if (!compactRules) { | 458 builder.grow(pendingRules->size()); |
389 compactRules = adoptPtr(new Vector<RuleData>); | 459 while (!pendingRules->isEmpty()) { |
390 compactRules->reserveInitialCapacity(pendingSize); | 460 builder.append(pendingRules->peek()); |
391 } else { | 461 pendingRules->pop(); |
392 compactRules->reserveCapacity(compactRules->size() + pendingSize); | |
393 } | 462 } |
394 | 463 |
395 while (!pendingRules->isEmpty()) { | 464 compactRules->value = builder.release(); |
396 compactRules->append(pendingRules->peek()); | |
397 pendingRules->pop(); | |
398 } | |
399 } | 465 } |
400 } | 466 } |
401 | 467 |
402 void RuleSet::compactRules() | 468 void RuleSet::compactRules() |
403 { | 469 { |
404 ASSERT(m_pendingRules); | 470 ASSERT(m_pendingRules); |
405 OwnPtr<PendingRuleMaps> pendingRules = m_pendingRules.release(); | 471 OwnPtr<PendingRuleMaps> pendingRules = m_pendingRules.release(); |
406 compactPendingRules(pendingRules->idRules, m_idRules); | 472 compactPendingRules(pendingRules->idRules, m_idRules); |
407 compactPendingRules(pendingRules->classRules, m_classRules); | 473 compactPendingRules(pendingRules->classRules, m_classRules); |
408 compactPendingRules(pendingRules->tagRules, m_tagRules); | 474 compactPendingRules(pendingRules->tagRules, m_tagRules); |
409 compactPendingRules(pendingRules->shadowPseudoElementRules, m_shadowPseudoEl
ementRules); | 475 compactPendingRules(pendingRules->shadowPseudoElementRules, m_shadowPseudoEl
ementRules); |
410 m_linkPseudoClassRules.shrinkToFit(); | 476 m_linkPseudoClassRules.shrinkToFit(); |
411 m_cuePseudoRules.shrinkToFit(); | 477 m_cuePseudoRules.shrinkToFit(); |
412 m_focusPseudoClassRules.shrinkToFit(); | 478 m_focusPseudoClassRules.shrinkToFit(); |
413 m_universalRules.shrinkToFit(); | 479 m_universalRules.shrinkToFit(); |
414 m_pageRules.shrinkToFit(); | 480 m_pageRules.shrinkToFit(); |
415 } | 481 } |
416 | 482 |
417 } // namespace WebCore | 483 } // namespace WebCore |
OLD | NEW |