Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(465)

Side by Side Diff: Source/core/css/RuleFeature.cpp

Issue 772103002: Collect content:attr(...)-features in RuleFeatureSet. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Added TCs. Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 14 matching lines...) Expand all
25 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 25 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
26 * Boston, MA 02110-1301, USA. 26 * Boston, MA 02110-1301, USA.
27 */ 27 */
28 28
29 #include "config.h" 29 #include "config.h"
30 #include "core/css/RuleFeature.h" 30 #include "core/css/RuleFeature.h"
31 31
32 #include "core/HTMLNames.h" 32 #include "core/HTMLNames.h"
33 #include "core/css/CSSSelector.h" 33 #include "core/css/CSSSelector.h"
34 #include "core/css/CSSSelectorList.h" 34 #include "core/css/CSSSelectorList.h"
35 #include "core/css/CSSValueList.h"
35 #include "core/css/RuleSet.h" 36 #include "core/css/RuleSet.h"
37 #include "core/css/StylePropertySet.h"
36 #include "core/css/StyleRule.h" 38 #include "core/css/StyleRule.h"
37 #include "core/css/invalidation/DescendantInvalidationSet.h" 39 #include "core/css/invalidation/DescendantInvalidationSet.h"
38 #include "core/dom/Element.h" 40 #include "core/dom/Element.h"
39 #include "core/dom/Node.h" 41 #include "core/dom/Node.h"
40 #include "core/inspector/InspectorTraceEvents.h" 42 #include "core/inspector/InspectorTraceEvents.h"
41 #include "wtf/BitVector.h" 43 #include "wtf/BitVector.h"
42 44
43 namespace blink { 45 namespace blink {
44 46
45 #if ENABLE(ASSERT) 47 #if ENABLE(ASSERT)
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 void RuleFeatureSet::updateInvalidationSets(const CSSSelector& selector) 281 void RuleFeatureSet::updateInvalidationSets(const CSSSelector& selector)
280 { 282 {
281 InvalidationSetFeatures features; 283 InvalidationSetFeatures features;
282 auto result = extractInvalidationSetFeatures(selector, features, false); 284 auto result = extractInvalidationSetFeatures(selector, features, false);
283 if (result.first) { 285 if (result.first) {
284 features.forceSubtree = result.second == ForceSubtree; 286 features.forceSubtree = result.second == ForceSubtree;
285 addFeaturesToInvalidationSets(*result.first, features); 287 addFeaturesToInvalidationSets(*result.first, features);
286 } 288 }
287 } 289 }
288 290
291 void RuleFeatureSet::updateInvalidationSetsForContentAttribute(StyleRule* styleR ule)
292 {
293 const StylePropertySet& propertySet = styleRule->properties();
294
295 int propertyIndex = propertySet.findPropertyIndex(CSSPropertyContent);
296
297 if (propertyIndex == -1)
298 return;
299
300 StylePropertySet::PropertyReference contentProperty = propertySet.propertyAt (propertyIndex);
301 CSSValue* contentValue = contentProperty.value();
302
303 if (!contentValue->isValueList())
304 return;
305
306 for (CSSValueListIterator i = contentValue; i.hasMore(); i.advance()) {
307 CSSValue* item = i.value();
308 if (!item->isPrimitiveValue())
309 continue;
310 CSSPrimitiveValue* primitiveItem = toCSSPrimitiveValue(item);
311 if (!primitiveItem->isAttr())
312 continue;
313 ensureAttributeInvalidationSet(AtomicString(primitiveItem->getStringValu e()));
314 }
315 }
316
289 std::pair<const CSSSelector*, RuleFeatureSet::UseFeaturesType> 317 std::pair<const CSSSelector*, RuleFeatureSet::UseFeaturesType>
290 RuleFeatureSet::extractInvalidationSetFeatures(const CSSSelector& selector, Inva lidationSetFeatures& features, bool negated) 318 RuleFeatureSet::extractInvalidationSetFeatures(const CSSSelector& selector, Inva lidationSetFeatures& features, bool negated)
291 { 319 {
292 bool foundFeatures = false; 320 bool foundFeatures = false;
293 for (const CSSSelector* current = &selector; current; current = current->tag History()) { 321 for (const CSSSelector* current = &selector; current; current = current->tag History()) {
294 if (!negated) 322 if (!negated)
295 foundFeatures |= extractInvalidationSetFeature(*current, features); 323 foundFeatures |= extractInvalidationSetFeature(*current, features);
296 // Initialize the entry in the invalidation set map, if supported. 324 // Initialize the entry in the invalidation set map, if supported.
297 if (!invalidationSetForSelector(*current)) { 325 if (!invalidationSetForSelector(*current)) {
298 if (requiresSubtreeInvalidation(*current)) { 326 if (requiresSubtreeInvalidation(*current)) {
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 if (current->relation() == CSSSelector::SubSelector) 413 if (current->relation() == CSSSelector::SubSelector)
386 continue; 414 continue;
387 415
388 if (current->isShadowSelector()) 416 if (current->isShadowSelector())
389 features.treeBoundaryCrossing = true; 417 features.treeBoundaryCrossing = true;
390 418
391 features.adjacent = current->isAdjacentSelector(); 419 features.adjacent = current->isAdjacentSelector();
392 } 420 }
393 } 421 }
394 422
395 void RuleFeatureSet::addContentAttr(const AtomicString& attributeName)
396 {
397 ensureAttributeInvalidationSet(attributeName);
398 }
399
400 void RuleFeatureSet::collectFeaturesFromRuleData(const RuleData& ruleData) 423 void RuleFeatureSet::collectFeaturesFromRuleData(const RuleData& ruleData)
401 { 424 {
402 updateInvalidationSets(ruleData.selector()); 425 updateInvalidationSets(ruleData.selector());
426 updateInvalidationSetsForContentAttribute(ruleData.rule());
rune 2014/12/10 13:03:55 There's one RuleData per selector in the selector
403 427
404 FeatureMetadata metadata; 428 FeatureMetadata metadata;
405 collectFeaturesFromSelector(ruleData.selector(), metadata); 429 collectFeaturesFromSelector(ruleData.selector(), metadata);
406 m_metadata.add(metadata); 430 m_metadata.add(metadata);
407 431
408 if (metadata.foundSiblingSelector) 432 if (metadata.foundSiblingSelector)
409 siblingRules.append(RuleFeature(ruleData.rule(), ruleData.selectorIndex( ), ruleData.hasDocumentSecurityOrigin())); 433 siblingRules.append(RuleFeature(ruleData.rule(), ruleData.selectorIndex( ), ruleData.hasDocumentSecurityOrigin()));
410 if (ruleData.containsUncommonAttributeSelector()) 434 if (ruleData.containsUncommonAttributeSelector())
411 uncommonAttributeRules.append(RuleFeature(ruleData.rule(), ruleData.sele ctorIndex(), ruleData.hasDocumentSecurityOrigin())); 435 uncommonAttributeRules.append(RuleFeature(ruleData.rule(), ruleData.sele ctorIndex(), ruleData.hasDocumentSecurityOrigin()));
412 } 436 }
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
610 visitor->trace(uncommonAttributeRules); 634 visitor->trace(uncommonAttributeRules);
611 visitor->trace(m_classInvalidationSets); 635 visitor->trace(m_classInvalidationSets);
612 visitor->trace(m_attributeInvalidationSets); 636 visitor->trace(m_attributeInvalidationSets);
613 visitor->trace(m_idInvalidationSets); 637 visitor->trace(m_idInvalidationSets);
614 visitor->trace(m_pseudoInvalidationSets); 638 visitor->trace(m_pseudoInvalidationSets);
615 visitor->trace(m_styleInvalidator); 639 visitor->trace(m_styleInvalidator);
616 #endif 640 #endif
617 } 641 }
618 642
619 } // namespace blink 643 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698