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

Side by Side Diff: Source/core/css/resolver/StyleResolver.cpp

Issue 214333003: Refactoring MatchRanges and RuleRange. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 9 months 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 | Annotate | Revision Log
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, 2013 Apple Inc. All rights reserved. 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights 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 386 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 397
398 StyleResolver::~StyleResolver() 398 StyleResolver::~StyleResolver()
399 { 399 {
400 } 400 }
401 401
402 inline void StyleResolver::collectTreeBoundaryCrossingRules(Element* element, El ementRuleCollector& collector, bool includeEmptyRules) 402 inline void StyleResolver::collectTreeBoundaryCrossingRules(Element* element, El ementRuleCollector& collector, bool includeEmptyRules)
403 { 403 {
404 if (m_treeBoundaryCrossingRules.isEmpty()) 404 if (m_treeBoundaryCrossingRules.isEmpty())
405 return; 405 return;
406 406
407 RuleRange ruleRange = collector.matchedResult().ranges.authorRuleRange();
408
409 // When comparing rules declared in outer treescopes, outer's rules win. 407 // When comparing rules declared in outer treescopes, outer's rules win.
410 CascadeOrder outerCascadeOrder = m_treeBoundaryCrossingRules.size() + m_tree BoundaryCrossingRules.size(); 408 CascadeOrder outerCascadeOrder = m_treeBoundaryCrossingRules.size() + m_tree BoundaryCrossingRules.size();
411 // When comparing rules declared in inner treescopes, inner's rules win. 409 // When comparing rules declared in inner treescopes, inner's rules win.
412 CascadeOrder innerCascadeOrder = m_treeBoundaryCrossingRules.size(); 410 CascadeOrder innerCascadeOrder = m_treeBoundaryCrossingRules.size();
413 411
414 for (DocumentOrderedList::iterator it = m_treeBoundaryCrossingRules.begin(); it != m_treeBoundaryCrossingRules.end(); ++it) { 412 for (DocumentOrderedList::iterator it = m_treeBoundaryCrossingRules.begin(); it != m_treeBoundaryCrossingRules.end(); ++it) {
415 const ContainerNode* scopingNode = toContainerNode(*it); 413 const ContainerNode* scopingNode = toContainerNode(*it);
416 RuleSet* ruleSet = m_treeBoundaryCrossingRules.ruleSetScopedBy(scopingNo de); 414 RuleSet* ruleSet = m_treeBoundaryCrossingRules.ruleSetScopedBy(scopingNo de);
417 unsigned boundaryBehavior = SelectorChecker::ScopeContainsLastMatchedEle ment; 415 unsigned boundaryBehavior = SelectorChecker::ScopeContainsLastMatchedEle ment;
418 bool isInnerTreeScope = element->treeScope().isInclusiveAncestorOf(scopi ngNode->treeScope()); 416 bool isInnerTreeScope = element->treeScope().isInclusiveAncestorOf(scopi ngNode->treeScope());
419 417
420 // If a given scoping node is a shadow root and a given element is in a descendant tree of tree hosted by 418 // If a given scoping node is a shadow root and a given element is in a descendant tree of tree hosted by
421 // the scoping node's shadow host, we should use ScopeIsShadowHost. 419 // the scoping node's shadow host, we should use ScopeIsShadowHost.
422 if (scopingNode && scopingNode->isShadowRoot()) { 420 if (scopingNode && scopingNode->isShadowRoot()) {
423 if (element->isInDescendantTreeOf(toShadowRoot(scopingNode)->host()) ) 421 if (element->isInDescendantTreeOf(toShadowRoot(scopingNode)->host()) )
424 boundaryBehavior |= SelectorChecker::ScopeIsShadowHost; 422 boundaryBehavior |= SelectorChecker::ScopeIsShadowHost;
425 scopingNode = toShadowRoot(scopingNode)->host(); 423 scopingNode = toShadowRoot(scopingNode)->host();
426 } 424 }
427 425
428 CascadeOrder cascadeOrder = isInnerTreeScope ? innerCascadeOrder : outer CascadeOrder; 426 CascadeOrder cascadeOrder = isInnerTreeScope ? innerCascadeOrder : outer CascadeOrder;
429 427 collector.collectMatchingRules(MatchRequest(ruleSet, includeEmptyRules, scopingNode), collector.matchedResult().ranges.authorRuleRange(), static_cast<Se lectorChecker::BehaviorAtBoundary>(boundaryBehavior), ignoreCascadeScope, cascad eOrder);
430 collector.collectMatchingRules(MatchRequest(ruleSet, includeEmptyRules, scopingNode), ruleRange, static_cast<SelectorChecker::BehaviorAtBoundary>(bounda ryBehavior), ignoreCascadeScope, cascadeOrder);
431 ++innerCascadeOrder; 428 ++innerCascadeOrder;
432 --outerCascadeOrder; 429 --outerCascadeOrder;
433 } 430 }
434 } 431 }
435 432
436 static inline bool applyAuthorStylesOf(const Element* element) 433 static inline bool applyAuthorStylesOf(const Element* element)
437 { 434 {
438 return element->treeScope().applyAuthorStyles() || (element->shadow() && ele ment->shadow()->applyAuthorStyles()); 435 return element->treeScope().applyAuthorStyles() || (element->shadow() && ele ment->shadow()->applyAuthorStyles());
439 } 436 }
440 437
441 void StyleResolver::matchAuthorRulesForShadowHost(Element* element, ElementRuleC ollector& collector, bool includeEmptyRules, Vector<ScopedStyleResolver*, 8>& re solvers, Vector<ScopedStyleResolver*, 8>& resolversInShadowTree) 438 void StyleResolver::matchAuthorRulesForShadowHost(Element* element, ElementRuleC ollector& collector, bool includeEmptyRules, Vector<ScopedStyleResolver*, 8>& re solvers, Vector<ScopedStyleResolver*, 8>& resolversInShadowTree)
442 { 439 {
443 collector.clearMatchedRules(); 440 collector.clearMatchedRules();
444 collector.matchedResult().ranges.lastAuthorRule = collector.matchedResult(). matchedProperties.size() - 1; 441 collector.matchedResult().ranges.authorRuleRange().setLast(collector.matched Result().matchedProperties.size() - 1);
445 442
446 CascadeScope cascadeScope = 0; 443 CascadeScope cascadeScope = 0;
447 CascadeOrder cascadeOrder = 0; 444 CascadeOrder cascadeOrder = 0;
448 bool applyAuthorStyles = applyAuthorStylesOf(element); 445 bool applyAuthorStyles = applyAuthorStylesOf(element);
449 446
450 for (int j = resolversInShadowTree.size() - 1; j >= 0; --j) 447 for (int j = resolversInShadowTree.size() - 1; j >= 0; --j)
451 resolversInShadowTree.at(j)->collectMatchingAuthorRules(collector, inclu deEmptyRules, applyAuthorStyles, cascadeScope, cascadeOrder++); 448 resolversInShadowTree.at(j)->collectMatchingAuthorRules(collector, inclu deEmptyRules, applyAuthorStyles, cascadeScope, cascadeOrder++);
452 449
453 if (resolvers.isEmpty() || resolvers.first()->treeScope() != element->treeSc ope()) 450 if (resolvers.isEmpty() || resolvers.first()->treeScope() != element->treeSc ope())
454 ++cascadeScope; 451 ++cascadeScope;
455 cascadeOrder += resolvers.size(); 452 cascadeOrder += resolvers.size();
456 for (unsigned i = 0; i < resolvers.size(); ++i) 453 for (unsigned i = 0; i < resolvers.size(); ++i)
457 resolvers.at(i)->collectMatchingAuthorRules(collector, includeEmptyRules , applyAuthorStyles, cascadeScope++, --cascadeOrder); 454 resolvers.at(i)->collectMatchingAuthorRules(collector, includeEmptyRules , applyAuthorStyles, cascadeScope++, --cascadeOrder);
458 455
459 collectTreeBoundaryCrossingRules(element, collector, includeEmptyRules); 456 collectTreeBoundaryCrossingRules(element, collector, includeEmptyRules);
460 collector.sortAndTransferMatchedRules(); 457 collector.sortAndTransferMatchedRules();
461 } 458 }
462 459
463 void StyleResolver::matchAuthorRules(Element* element, ElementRuleCollector& col lector, bool includeEmptyRules) 460 void StyleResolver::matchAuthorRules(Element* element, ElementRuleCollector& col lector, bool includeEmptyRules)
464 { 461 {
465 collector.clearMatchedRules(); 462 collector.clearMatchedRules();
466 collector.matchedResult().ranges.lastAuthorRule = collector.matchedResult(). matchedProperties.size() - 1; 463 collector.matchedResult().ranges.authorRuleRange().setLast(collector.matched Result().matchedProperties.size() - 1);
467 464
468 bool applyAuthorStyles = applyAuthorStylesOf(element); 465 bool applyAuthorStyles = applyAuthorStylesOf(element);
469 if (m_styleTree.hasOnlyScopedResolverForDocument()) { 466 if (m_styleTree.hasOnlyScopedResolverForDocument()) {
470 m_styleTree.scopedStyleResolverForDocument()->collectMatchingAuthorRules (collector, includeEmptyRules, applyAuthorStyles, ignoreCascadeScope); 467 m_styleTree.scopedStyleResolverForDocument()->collectMatchingAuthorRules (collector, includeEmptyRules, applyAuthorStyles, ignoreCascadeScope);
471 collectTreeBoundaryCrossingRules(element, collector, includeEmptyRules); 468 collectTreeBoundaryCrossingRules(element, collector, includeEmptyRules);
472 collector.sortAndTransferMatchedRules(); 469 collector.sortAndTransferMatchedRules();
473 return; 470 return;
474 } 471 }
475 472
476 Vector<ScopedStyleResolver*, 8> resolvers; 473 Vector<ScopedStyleResolver*, 8> resolvers;
(...skipping 20 matching lines...) Expand all
497 collectTreeBoundaryCrossingRules(element, collector, includeEmptyRules); 494 collectTreeBoundaryCrossingRules(element, collector, includeEmptyRules);
498 collector.sortAndTransferMatchedRules(); 495 collector.sortAndTransferMatchedRules();
499 } 496 }
500 497
501 void StyleResolver::matchWatchSelectorRules(ElementRuleCollector& collector) 498 void StyleResolver::matchWatchSelectorRules(ElementRuleCollector& collector)
502 { 499 {
503 if (!m_watchedSelectorsRules) 500 if (!m_watchedSelectorsRules)
504 return; 501 return;
505 502
506 collector.clearMatchedRules(); 503 collector.clearMatchedRules();
507 collector.matchedResult().ranges.lastUserRule = collector.matchedResult().ma tchedProperties.size() - 1; 504 collector.matchedResult().ranges.userRuleRange().setLast(collector.matchedRe sult().matchedProperties.size() - 1);
508 505
509 MatchRequest matchRequest(m_watchedSelectorsRules.get()); 506 MatchRequest matchRequest(m_watchedSelectorsRules.get());
510 RuleRange ruleRange = collector.matchedResult().ranges.userRuleRange(); 507 collector.collectMatchingRules(matchRequest, collector.matchedResult().range s.userRuleRange());
511 collector.collectMatchingRules(matchRequest, ruleRange);
512
513 collector.sortAndTransferMatchedRules(); 508 collector.sortAndTransferMatchedRules();
514 } 509 }
515 510
516 void StyleResolver::matchUARules(ElementRuleCollector& collector) 511 void StyleResolver::matchUARules(ElementRuleCollector& collector)
517 { 512 {
518 collector.setMatchingUARules(true); 513 collector.setMatchingUARules(true);
519 514
520 CSSDefaultStyleSheets& defaultStyleSheets = CSSDefaultStyleSheets::instance( ); 515 CSSDefaultStyleSheets& defaultStyleSheets = CSSDefaultStyleSheets::instance( );
521 RuleSet* userAgentStyleSheet = m_medium->mediaTypeMatchSpecific("print") 516 RuleSet* userAgentStyleSheet = m_medium->mediaTypeMatchSpecific("print")
522 ? defaultStyleSheets.defaultPrintStyle() : defaultStyleSheets.defaultSty le(); 517 ? defaultStyleSheets.defaultPrintStyle() : defaultStyleSheets.defaultSty le();
523 matchUARules(collector, userAgentStyleSheet); 518 matchUARules(collector, userAgentStyleSheet);
524 519
525 // In quirks mode, we match rules from the quirks user agent sheet. 520 // In quirks mode, we match rules from the quirks user agent sheet.
526 if (document().inQuirksMode()) 521 if (document().inQuirksMode())
527 matchUARules(collector, defaultStyleSheets.defaultQuirksStyle()); 522 matchUARules(collector, defaultStyleSheets.defaultQuirksStyle());
528 523
529 // If document uses view source styles (in view source mode or in xml viewer mode), then we match rules from the view source style sheet. 524 // If document uses view source styles (in view source mode or in xml viewer mode), then we match rules from the view source style sheet.
530 if (document().isViewSource()) 525 if (document().isViewSource())
531 matchUARules(collector, defaultStyleSheets.defaultViewSourceStyle()); 526 matchUARules(collector, defaultStyleSheets.defaultViewSourceStyle());
532 527
533 collector.setMatchingUARules(false); 528 collector.setMatchingUARules(false);
534 529
535 matchWatchSelectorRules(collector); 530 matchWatchSelectorRules(collector);
536 } 531 }
537 532
538 void StyleResolver::matchUARules(ElementRuleCollector& collector, RuleSet* rules ) 533 void StyleResolver::matchUARules(ElementRuleCollector& collector, RuleSet* rules )
539 { 534 {
540 collector.clearMatchedRules(); 535 collector.clearMatchedRules();
541 collector.matchedResult().ranges.lastUARule = collector.matchedResult().matc hedProperties.size() - 1; 536 collector.matchedResult().ranges.UARuleRange().setLast(collector.matchedResu lt().matchedProperties.size() - 1);
542 537 collector.collectMatchingRules(MatchRequest(rules), collector.matchedResult( ).ranges.UARuleRange());
543 RuleRange ruleRange = collector.matchedResult().ranges.UARuleRange();
544 collector.collectMatchingRules(MatchRequest(rules), ruleRange);
545
546 collector.sortAndTransferMatchedRules(); 538 collector.sortAndTransferMatchedRules();
547 } 539 }
548 540
549 void StyleResolver::matchAllRules(StyleResolverState& state, ElementRuleCollecto r& collector, bool includeSMILProperties) 541 void StyleResolver::matchAllRules(StyleResolverState& state, ElementRuleCollecto r& collector, bool includeSMILProperties)
550 { 542 {
551 matchUARules(collector); 543 matchUARules(collector);
552 544
553 // Now check author rules, beginning first with presentational attributes ma pped from HTML. 545 // Now check author rules, beginning first with presentational attributes ma pped from HTML.
554 if (state.element()->isStyledElement()) { 546 if (state.element()->isStyledElement()) {
555 collector.addElementStyleProperties(state.element()->presentationAttribu teStyle()); 547 collector.addElementStyleProperties(state.element()->presentationAttribu teStyle());
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
759 ASSERT(animations && !animations->isEmpty()); 751 ASSERT(animations && !animations->isEmpty());
760 while (animations->animation(0)->name() != animationName) 752 while (animations->animation(0)->name() != animationName)
761 animations->remove(0); 753 animations->remove(0);
762 ASSERT(!animations->isEmpty() && animations->animation(0)->name() == animati onName); 754 ASSERT(!animations->isEmpty() && animations->animation(0)->name() == animati onName);
763 755
764 state.fontBuilder().initForStyleResolve(state.document(), state.style(), sta te.useSVGZoomRules()); 756 state.fontBuilder().initForStyleResolve(state.document(), state.style(), sta te.useSVGZoomRules());
765 757
766 // We don't need to bother with !important. Since there is only ever one 758 // We don't need to bother with !important. Since there is only ever one
767 // decl, there's nothing to override. So just add the first properties. 759 // decl, there's nothing to override. So just add the first properties.
768 bool inheritedOnly = false; 760 bool inheritedOnly = false;
769 applyMatchedProperties<AnimationProperties>(state, result, false, 0, result. matchedProperties.size() - 1, inheritedOnly); 761 applyMatchedProperties<AnimationProperties>(state, result, false, RuleRange( 0, result.matchedProperties.size() - 1), inheritedOnly);
770 applyMatchedProperties<HighPriorityProperties>(state, result, false, 0, resu lt.matchedProperties.size() - 1, inheritedOnly); 762 applyMatchedProperties<HighPriorityProperties>(state, result, false, RuleRan ge(0, result.matchedProperties.size() - 1), inheritedOnly);
771 763
772 // If our font got dirtied, go ahead and update it now. 764 // If our font got dirtied, go ahead and update it now.
773 updateFont(state); 765 updateFont(state);
774 766
775 // Line-height is set when we are sure we decided on the font-size 767 // Line-height is set when we are sure we decided on the font-size
776 if (state.lineHeightValue()) 768 if (state.lineHeightValue())
777 StyleBuilder::applyProperty(CSSPropertyLineHeight, state, state.lineHeig htValue()); 769 StyleBuilder::applyProperty(CSSPropertyLineHeight, state, state.lineHeig htValue());
778 770
779 // Now do rest of the properties. 771 // Now do rest of the properties.
780 applyMatchedProperties<LowPriorityProperties>(state, result, false, 0, resul t.matchedProperties.size() - 1, inheritedOnly); 772 applyMatchedProperties<LowPriorityProperties>(state, result, false, RuleRang e(0, result.matchedProperties.size() - 1), inheritedOnly);
781 773
782 // If our font got dirtied by one of the non-essential font props, 774 // If our font got dirtied by one of the non-essential font props,
783 // go ahead and update it a second time. 775 // go ahead and update it a second time.
784 updateFont(state); 776 updateFont(state);
785 777
786 loadPendingResources(state); 778 loadPendingResources(state);
787 779
788 didAccess(); 780 didAccess();
789 781
790 return state.takeStyle(); 782 return state.takeStyle();
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
941 933
942 collector.matchPageRules(CSSDefaultStyleSheets::instance().defaultPrintStyle ()); 934 collector.matchPageRules(CSSDefaultStyleSheets::instance().defaultPrintStyle ());
943 935
944 if (ScopedStyleResolver* scopedResolver = m_styleTree.scopedStyleResolverFor Document()) 936 if (ScopedStyleResolver* scopedResolver = m_styleTree.scopedStyleResolverFor Document())
945 scopedResolver->matchPageRules(collector); 937 scopedResolver->matchPageRules(collector);
946 938
947 state.setLineHeightValue(0); 939 state.setLineHeightValue(0);
948 bool inheritedOnly = false; 940 bool inheritedOnly = false;
949 941
950 MatchResult& result = collector.matchedResult(); 942 MatchResult& result = collector.matchedResult();
951 applyMatchedProperties<HighPriorityProperties>(state, result, false, 0, resu lt.matchedProperties.size() - 1, inheritedOnly); 943 applyMatchedProperties<HighPriorityProperties>(state, result, false, RuleRan ge(0, result.matchedProperties.size() - 1), inheritedOnly);
952 944
953 // If our font got dirtied, go ahead and update it now. 945 // If our font got dirtied, go ahead and update it now.
954 updateFont(state); 946 updateFont(state);
955 947
956 // Line-height is set when we are sure we decided on the font-size. 948 // Line-height is set when we are sure we decided on the font-size.
957 if (state.lineHeightValue()) 949 if (state.lineHeightValue())
958 StyleBuilder::applyProperty(CSSPropertyLineHeight, state, state.lineHeig htValue()); 950 StyleBuilder::applyProperty(CSSPropertyLineHeight, state, state.lineHeig htValue());
959 951
960 applyMatchedProperties<LowPriorityProperties>(state, result, false, 0, resul t.matchedProperties.size() - 1, inheritedOnly); 952 applyMatchedProperties<LowPriorityProperties>(state, result, false, RuleRang e(0, result.matchedProperties.size() - 1), inheritedOnly);
961 953
962 addContentAttrValuesToFeatures(state.contentAttrValues(), m_features); 954 addContentAttrValuesToFeatures(state.contentAttrValues(), m_features);
963 955
964 loadPendingResources(state); 956 loadPendingResources(state);
965 957
966 didAccess(); 958 didAccess();
967 959
968 // Now return the style. 960 // Now return the style.
969 return state.takeStyle(); 961 return state.takeStyle();
970 } 962 }
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
1203 if (!isPropertyForPass<pass>(property)) 1195 if (!isPropertyForPass<pass>(property))
1204 continue; 1196 continue;
1205 if (pass == HighPriorityProperties && property == CSSPropertyLineHeight) 1197 if (pass == HighPriorityProperties && property == CSSPropertyLineHeight)
1206 state.setLineHeightValue(current.value()); 1198 state.setLineHeightValue(current.value());
1207 else 1199 else
1208 StyleBuilder::applyProperty(current.id(), state, current.value()); 1200 StyleBuilder::applyProperty(current.id(), state, current.value());
1209 } 1201 }
1210 } 1202 }
1211 1203
1212 template <StyleResolver::StyleApplicationPass pass> 1204 template <StyleResolver::StyleApplicationPass pass>
1213 void StyleResolver::applyMatchedProperties(StyleResolverState& state, const Matc hResult& matchResult, bool isImportant, int startIndex, int endIndex, bool inher itedOnly) 1205 void StyleResolver::applyMatchedProperties(StyleResolverState& state, const Matc hResult& matchResult, bool isImportant, const RuleRange& range, bool inheritedOn ly)
1214 { 1206 {
1215 if (startIndex == -1) 1207 if (range.collapsed())
1216 return; 1208 return;
1217 1209
1218 if (state.style()->insideLink() != NotInsideLink) { 1210 if (state.style()->insideLink() != NotInsideLink) {
1219 for (int i = startIndex; i <= endIndex; ++i) { 1211 for (int i = range.first(); i <= range.last(); ++i) {
1220 const MatchedProperties& matchedProperties = matchResult.matchedProp erties[i]; 1212 const MatchedProperties& matchedProperties = matchResult.matchedProp erties[i];
1221 unsigned linkMatchType = matchedProperties.linkMatchType; 1213 unsigned linkMatchType = matchedProperties.linkMatchType;
1222 // FIXME: It would be nicer to pass these as arguments but that requ ires changes in many places. 1214 // FIXME: It would be nicer to pass these as arguments but that requ ires changes in many places.
1223 state.setApplyPropertyToRegularStyle(linkMatchType & SelectorChecker ::MatchLink); 1215 state.setApplyPropertyToRegularStyle(linkMatchType & SelectorChecker ::MatchLink);
1224 state.setApplyPropertyToVisitedLinkStyle(linkMatchType & SelectorChe cker::MatchVisited); 1216 state.setApplyPropertyToVisitedLinkStyle(linkMatchType & SelectorChe cker::MatchVisited);
1225 1217
1226 applyProperties<pass>(state, matchedProperties.properties.get(), mat chResult.matchedRules[i], isImportant, inheritedOnly, static_cast<PropertyWhitel istType>(matchedProperties.whitelistType)); 1218 applyProperties<pass>(state, matchedProperties.properties.get(), mat chResult.matchedRules[i], isImportant, inheritedOnly, static_cast<PropertyWhitel istType>(matchedProperties.whitelistType));
1227 } 1219 }
1228 state.setApplyPropertyToRegularStyle(true); 1220 state.setApplyPropertyToRegularStyle(true);
1229 state.setApplyPropertyToVisitedLinkStyle(false); 1221 state.setApplyPropertyToVisitedLinkStyle(false);
1230 return; 1222 return;
1231 } 1223 }
1232 for (int i = startIndex; i <= endIndex; ++i) { 1224 for (int i = range.first(); i <= range.last(); ++i) {
1233 const MatchedProperties& matchedProperties = matchResult.matchedProperti es[i]; 1225 const MatchedProperties& matchedProperties = matchResult.matchedProperti es[i];
1234 applyProperties<pass>(state, matchedProperties.properties.get(), matchRe sult.matchedRules[i], isImportant, inheritedOnly, static_cast<PropertyWhitelistT ype>(matchedProperties.whitelistType)); 1226 applyProperties<pass>(state, matchedProperties.properties.get(), matchRe sult.matchedRules[i], isImportant, inheritedOnly, static_cast<PropertyWhitelistT ype>(matchedProperties.whitelistType));
1235 } 1227 }
1236 } 1228 }
1237 1229
1238 static unsigned computeMatchedPropertiesHash(const MatchedProperties* properties , unsigned size) 1230 static unsigned computeMatchedPropertiesHash(const MatchedProperties* properties , unsigned size)
1239 { 1231 {
1240 return StringHasher::hashMemory(properties, sizeof(MatchedProperties) * size ); 1232 return StringHasher::hashMemory(properties, sizeof(MatchedProperties) * size );
1241 } 1233 }
1242 1234
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1279 state.style()->inheritFrom(cachedMatchedProperties->renderStyle.get( )); 1271 state.style()->inheritFrom(cachedMatchedProperties->renderStyle.get( ));
1280 1272
1281 // Unfortunately the link status is treated like an inherited proper ty. We need to explicitly restore it. 1273 // Unfortunately the link status is treated like an inherited proper ty. We need to explicitly restore it.
1282 state.style()->setInsideLink(linkStatus); 1274 state.style()->setInsideLink(linkStatus);
1283 return; 1275 return;
1284 } 1276 }
1285 applyInheritedOnly = true; 1277 applyInheritedOnly = true;
1286 } 1278 }
1287 1279
1288 // Apply animation properties in order to apply animation results and trigge r transitions below. 1280 // Apply animation properties in order to apply animation results and trigge r transitions below.
1289 applyMatchedProperties<AnimationProperties>(state, matchResult, false, 0, ma tchResult.matchedProperties.size() - 1, applyInheritedOnly); 1281 applyMatchedProperties<AnimationProperties>(state, matchResult, false, RuleR ange(0, matchResult.matchedProperties.size() - 1), applyInheritedOnly);
1290 applyMatchedProperties<AnimationProperties>(state, matchResult, true, matchR esult.ranges.firstAuthorRule, matchResult.ranges.lastAuthorRule, applyInheritedO nly); 1282 applyMatchedProperties<AnimationProperties>(state, matchResult, true, matchR esult.ranges.authorRuleRange(), applyInheritedOnly);
1291 applyMatchedProperties<AnimationProperties>(state, matchResult, true, matchR esult.ranges.firstUserRule, matchResult.ranges.lastUserRule, applyInheritedOnly) ; 1283 applyMatchedProperties<AnimationProperties>(state, matchResult, true, matchR esult.ranges.userRuleRange(), applyInheritedOnly);
1292 applyMatchedProperties<AnimationProperties>(state, matchResult, true, matchR esult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly); 1284 applyMatchedProperties<AnimationProperties>(state, matchResult, true, matchR esult.ranges.UARuleRange(), applyInheritedOnly);
1293 1285
1294 // Match transition-property / animation-name length by trimming and 1286 // Match transition-property / animation-name length by trimming and
1295 // lengthening other transition / animation property lists 1287 // lengthening other transition / animation property lists
1296 // FIXME: This is wrong because we shouldn't affect the computed values 1288 // FIXME: This is wrong because we shouldn't affect the computed values
1297 state.style()->adjustAnimations(); 1289 state.style()->adjustAnimations();
1298 state.style()->adjustTransitions(); 1290 state.style()->adjustTransitions();
1299 1291
1300 // Now we have all of the matched rules in the appropriate order. Walk the r ules and apply 1292 // Now we have all of the matched rules in the appropriate order. Walk the r ules and apply
1301 // high-priority properties first, i.e., those properties that other propert ies depend on. 1293 // high-priority properties first, i.e., those properties that other propert ies depend on.
1302 // The order is (1) high-priority not important, (2) high-priority important , (3) normal not important 1294 // The order is (1) high-priority not important, (2) high-priority important , (3) normal not important
1303 // and (4) normal important. 1295 // and (4) normal important.
1304 state.setLineHeightValue(0); 1296 state.setLineHeightValue(0);
1305 applyMatchedProperties<HighPriorityProperties>(state, matchResult, false, 0, matchResult.matchedProperties.size() - 1, applyInheritedOnly); 1297 applyMatchedProperties<HighPriorityProperties>(state, matchResult, false, Ru leRange(0, matchResult.matchedProperties.size() - 1), applyInheritedOnly);
1306 applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, mat chResult.ranges.firstAuthorRule, matchResult.ranges.lastAuthorRule, applyInherit edOnly); 1298 applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, mat chResult.ranges.authorRuleRange(), applyInheritedOnly);
1307 applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, mat chResult.ranges.firstUserRule, matchResult.ranges.lastUserRule, applyInheritedOn ly); 1299 applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, mat chResult.ranges.userRuleRange(), applyInheritedOnly);
1308 applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, mat chResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly); 1300 applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, mat chResult.ranges.UARuleRange(), applyInheritedOnly);
1309 1301
1310 if (cachedMatchedProperties && cachedMatchedProperties->renderStyle->effecti veZoom() != state.style()->effectiveZoom()) { 1302 if (cachedMatchedProperties && cachedMatchedProperties->renderStyle->effecti veZoom() != state.style()->effectiveZoom()) {
1311 state.fontBuilder().setFontDirty(true); 1303 state.fontBuilder().setFontDirty(true);
1312 applyInheritedOnly = false; 1304 applyInheritedOnly = false;
1313 } 1305 }
1314 1306
1315 // If our font got dirtied, go ahead and update it now. 1307 // If our font got dirtied, go ahead and update it now.
1316 updateFont(state); 1308 updateFont(state);
1317 1309
1318 // Line-height is set when we are sure we decided on the font-size. 1310 // Line-height is set when we are sure we decided on the font-size.
1319 if (state.lineHeightValue()) 1311 if (state.lineHeightValue())
1320 StyleBuilder::applyProperty(CSSPropertyLineHeight, state, state.lineHeig htValue()); 1312 StyleBuilder::applyProperty(CSSPropertyLineHeight, state, state.lineHeig htValue());
1321 1313
1322 // Many properties depend on the font. If it changes we just apply all prope rties. 1314 // Many properties depend on the font. If it changes we just apply all prope rties.
1323 if (cachedMatchedProperties && cachedMatchedProperties->renderStyle->fontDes cription() != state.style()->fontDescription()) 1315 if (cachedMatchedProperties && cachedMatchedProperties->renderStyle->fontDes cription() != state.style()->fontDescription())
1324 applyInheritedOnly = false; 1316 applyInheritedOnly = false;
1325 1317
1326 // Now do the normal priority UA properties. 1318 // Now do the normal priority UA properties.
1327 applyMatchedProperties<LowPriorityProperties>(state, matchResult, false, mat chResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly); 1319 applyMatchedProperties<LowPriorityProperties>(state, matchResult, false, mat chResult.ranges.UARuleRange(), applyInheritedOnly);
1328 1320
1329 // Cache the UA properties to pass them to RenderTheme in adjustRenderStyle. 1321 // Cache the UA properties to pass them to RenderTheme in adjustRenderStyle.
1330 state.cacheUserAgentBorderAndBackground(); 1322 state.cacheUserAgentBorderAndBackground();
1331 1323
1332 // Now do the author and user normal priority properties and all the !import ant properties. 1324 // Now do the author and user normal priority properties and all the !import ant properties.
1333 applyMatchedProperties<LowPriorityProperties>(state, matchResult, false, mat chResult.ranges.lastUARule + 1, matchResult.matchedProperties.size() - 1, applyI nheritedOnly); 1325 applyMatchedProperties<LowPriorityProperties>(state, matchResult, false, Rul eRange(matchResult.ranges.UARuleRange().last() + 1, matchResult.matchedPropertie s.size() - 1), applyInheritedOnly);
1334 applyMatchedProperties<LowPriorityProperties>(state, matchResult, true, matc hResult.ranges.firstAuthorRule, matchResult.ranges.lastAuthorRule, applyInherite dOnly); 1326 applyMatchedProperties<LowPriorityProperties>(state, matchResult, true, matc hResult.ranges.authorRuleRange(), applyInheritedOnly);
1335 applyMatchedProperties<LowPriorityProperties>(state, matchResult, true, matc hResult.ranges.firstUserRule, matchResult.ranges.lastUserRule, applyInheritedOnl y); 1327 applyMatchedProperties<LowPriorityProperties>(state, matchResult, true, matc hResult.ranges.userRuleRange(), applyInheritedOnly);
1336 applyMatchedProperties<LowPriorityProperties>(state, matchResult, true, matc hResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly); 1328 applyMatchedProperties<LowPriorityProperties>(state, matchResult, true, matc hResult.ranges.UARuleRange(), applyInheritedOnly);
1337 1329
1338 loadPendingResources(state); 1330 loadPendingResources(state);
1339 1331
1340 if (!cachedMatchedProperties && cacheHash && MatchedPropertiesCache::isCache able(element, state.style(), state.parentStyle())) { 1332 if (!cachedMatchedProperties && cacheHash && MatchedPropertiesCache::isCache able(element, state.style(), state.parentStyle())) {
1341 INCREMENT_STYLE_STATS_COUNTER(*this, matchedPropertyCacheAdded); 1333 INCREMENT_STYLE_STATS_COUNTER(*this, matchedPropertyCacheAdded);
1342 m_matchedPropertiesCache.add(state.style(), state.parentStyle(), cacheHa sh, matchResult); 1334 m_matchedPropertiesCache.add(state.style(), state.parentStyle(), cacheHa sh, matchResult);
1343 } 1335 }
1344 1336
1345 ASSERT(!state.fontBuilder().fontDirty()); 1337 ASSERT(!state.fontBuilder().fontDirty());
1346 } 1338 }
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
1423 visitor->trace(m_keyframesRuleMap); 1415 visitor->trace(m_keyframesRuleMap);
1424 visitor->trace(m_viewportDependentMediaQueryResults); 1416 visitor->trace(m_viewportDependentMediaQueryResults);
1425 visitor->trace(m_viewportStyleResolver); 1417 visitor->trace(m_viewportStyleResolver);
1426 visitor->trace(m_siblingRuleSet); 1418 visitor->trace(m_siblingRuleSet);
1427 visitor->trace(m_uncommonAttributeRuleSet); 1419 visitor->trace(m_uncommonAttributeRuleSet);
1428 visitor->trace(m_watchedSelectorsRules); 1420 visitor->trace(m_watchedSelectorsRules);
1429 visitor->trace(m_treeBoundaryCrossingRules); 1421 visitor->trace(m_treeBoundaryCrossingRules);
1430 } 1422 }
1431 1423
1432 } // namespace WebCore 1424 } // namespace WebCore
OLDNEW
« Source/core/css/resolver/MatchResult.h ('K') | « Source/core/css/resolver/StyleResolver.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698