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

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

Issue 57643004: Pass RenderStyle / RenderObject by reference in more places (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase on master Created 7 years, 1 month 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
« no previous file with comments | « Source/core/css/resolver/StyleResolver.h ('k') | Source/core/dom/Document.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 706 matching lines...) Expand 10 before | Expand all | Expand 10 after
717 // FIXME: Shouldn't this be on RenderBody::styleDidChange? 717 // FIXME: Shouldn't this be on RenderBody::styleDidChange?
718 if (element->hasTagName(bodyTag)) 718 if (element->hasTagName(bodyTag))
719 document().textLinkColors().setTextColor(state.style()->visitedDependent Color(CSSPropertyColor)); 719 document().textLinkColors().setTextColor(state.style()->visitedDependent Color(CSSPropertyColor));
720 720
721 setAnimationUpdateIfNeeded(state, *element); 721 setAnimationUpdateIfNeeded(state, *element);
722 722
723 // Now return the style. 723 // Now return the style.
724 return state.takeStyle(); 724 return state.takeStyle();
725 } 725 }
726 726
727 PassRefPtr<RenderStyle> StyleResolver::styleForKeyframe(Element* e, const Render Style* elementStyle, const StyleKeyframe* keyframe) 727 PassRefPtr<RenderStyle> StyleResolver::styleForKeyframe(Element* e, const Render Style& elementStyle, const StyleKeyframe* keyframe)
728 { 728 {
729 ASSERT(document().frame()); 729 ASSERT(document().frame());
730 ASSERT(documentSettings()); 730 ASSERT(documentSettings());
731 731
732 if (e == document().documentElement()) 732 if (e == document().documentElement())
733 resetDirectionAndWritingModeOnDocument(document()); 733 resetDirectionAndWritingModeOnDocument(document());
734 StyleResolverState state(document(), e); 734 StyleResolverState state(document(), e);
735 735
736 MatchResult result; 736 MatchResult result;
737 if (keyframe->properties()) 737 if (keyframe->properties())
738 result.addMatchedProperties(keyframe->properties()); 738 result.addMatchedProperties(keyframe->properties());
739 739
740 ASSERT(!state.style()); 740 ASSERT(!state.style());
741 741
742 // Create the style 742 // Create the style
743 state.setStyle(RenderStyle::clone(elementStyle)); 743 state.setStyle(RenderStyle::clone(&elementStyle));
744 state.setLineHeightValue(0); 744 state.setLineHeightValue(0);
745 745
746 state.fontBuilder().initForStyleResolve(state.document(), state.style(), sta te.useSVGZoomRules()); 746 state.fontBuilder().initForStyleResolve(state.document(), state.style(), sta te.useSVGZoomRules());
747 747
748 // We don't need to bother with !important. Since there is only ever one 748 // We don't need to bother with !important. Since there is only ever one
749 // decl, there's nothing to override. So just add the first properties. 749 // decl, there's nothing to override. So just add the first properties.
750 bool inheritedOnly = false; 750 bool inheritedOnly = false;
751 if (keyframe->properties()) { 751 if (keyframe->properties()) {
752 // FIXME: Can't keyframes contain variables? 752 // FIXME: Can't keyframes contain variables?
753 applyMatchedProperties<AnimationProperties>(state, result, false, 0, res ult.matchedProperties.size() - 1, inheritedOnly); 753 applyMatchedProperties<AnimationProperties>(state, result, false, 0, res ult.matchedProperties.size() - 1, inheritedOnly);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
787 if (stack.isEmpty()) 787 if (stack.isEmpty())
788 return 0; 788 return 0;
789 789
790 for (size_t i = 0; i < stack.size(); ++i) { 790 for (size_t i = 0; i < stack.size(); ++i) {
791 if (const StyleRuleKeyframes* keyframesRule = stack.at(i)->keyframeStyle sForAnimation(animationName)) 791 if (const StyleRuleKeyframes* keyframesRule = stack.at(i)->keyframeStyle sForAnimation(animationName))
792 return keyframesRule; 792 return keyframesRule;
793 } 793 }
794 return 0; 794 return 0;
795 } 795 }
796 796
797 void StyleResolver::keyframeStylesForAnimation(Element* e, const RenderStyle* el ementStyle, KeyframeList& list) 797 void StyleResolver::keyframeStylesForAnimation(Element* e, const RenderStyle& el ementStyle, KeyframeList& list)
798 { 798 {
799 ASSERT(!RuntimeEnabledFeatures::webAnimationsCSSEnabled()); 799 ASSERT(!RuntimeEnabledFeatures::webAnimationsCSSEnabled());
800 list.clear(); 800 list.clear();
801 801
802 // Get the keyframesRule for this name 802 // Get the keyframesRule for this name
803 if (!e || list.animationName().isEmpty()) 803 if (!e || list.animationName().isEmpty())
804 return; 804 return;
805 805
806 const StyleRuleKeyframes* keyframesRule = matchScopedKeyframesRule(e, list.a nimationName().impl()); 806 const StyleRuleKeyframes* keyframesRule = matchScopedKeyframesRule(e, list.a nimationName().impl());
807 if (!keyframesRule) 807 if (!keyframesRule)
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
846 hundredPercentKeyframe = StyleKeyframe::create().leakRef(); 846 hundredPercentKeyframe = StyleKeyframe::create().leakRef();
847 hundredPercentKeyframe->setKeyText("100%"); 847 hundredPercentKeyframe->setKeyText("100%");
848 } 848 }
849 KeyframeValue keyframeValue(1, 0); 849 KeyframeValue keyframeValue(1, 0);
850 keyframeValue.setStyle(styleForKeyframe(e, elementStyle, hundredPercentK eyframe)); 850 keyframeValue.setStyle(styleForKeyframe(e, elementStyle, hundredPercentK eyframe));
851 keyframeValue.addProperties(hundredPercentKeyframe->properties()); 851 keyframeValue.addProperties(hundredPercentKeyframe->properties());
852 list.insert(keyframeValue); 852 list.insert(keyframeValue);
853 } 853 }
854 } 854 }
855 855
856 void StyleResolver::resolveKeyframes(Element* element, const RenderStyle* style, const AtomicString& name, TimingFunction* defaultTimingFunction, Vector<std::pa ir<KeyframeAnimationEffect::KeyframeVector, RefPtr<TimingFunction> > >& keyframe sAndTimingFunctions) 856 void StyleResolver::resolveKeyframes(Element* element, const RenderStyle& style, const AtomicString& name, TimingFunction* defaultTimingFunction, Vector<std::pa ir<KeyframeAnimationEffect::KeyframeVector, RefPtr<TimingFunction> > >& keyframe sAndTimingFunctions)
857 { 857 {
858 ASSERT(RuntimeEnabledFeatures::webAnimationsCSSEnabled()); 858 ASSERT(RuntimeEnabledFeatures::webAnimationsCSSEnabled());
859 const StyleRuleKeyframes* keyframesRule = matchScopedKeyframesRule(element, name.impl()); 859 const StyleRuleKeyframes* keyframesRule = matchScopedKeyframesRule(element, name.impl());
860 if (!keyframesRule) 860 if (!keyframesRule)
861 return; 861 return;
862 862
863 const Vector<RefPtr<StyleKeyframe> >& styleKeyframes = keyframesRule->keyfra mes(); 863 const Vector<RefPtr<StyleKeyframe> >& styleKeyframes = keyframesRule->keyfra mes();
864 if (styleKeyframes.isEmpty()) 864 if (styleKeyframes.isEmpty())
865 return; 865 return;
866 866
867 // Construct and populate the style for each keyframe 867 // Construct and populate the style for each keyframe
868 KeyframeAnimationEffect::KeyframeVector keyframes; 868 KeyframeAnimationEffect::KeyframeVector keyframes;
869 HashMap<double, RefPtr<TimingFunction> > perKeyframeTimingFunctions; 869 HashMap<double, RefPtr<TimingFunction> > perKeyframeTimingFunctions;
870 for (size_t i = 0; i < styleKeyframes.size(); ++i) { 870 for (size_t i = 0; i < styleKeyframes.size(); ++i) {
871 const StyleKeyframe* styleKeyframe = styleKeyframes[i].get(); 871 const StyleKeyframe* styleKeyframe = styleKeyframes[i].get();
872 RefPtr<RenderStyle> keyframeStyle = styleForKeyframe(element, style, sty leKeyframe); 872 RefPtr<RenderStyle> keyframeStyle = styleForKeyframe(element, style, sty leKeyframe);
873 RefPtr<Keyframe> keyframe = Keyframe::create(); 873 RefPtr<Keyframe> keyframe = Keyframe::create();
874 const Vector<double>& offsets = styleKeyframe->keys(); 874 const Vector<double>& offsets = styleKeyframe->keys();
875 ASSERT(!offsets.isEmpty()); 875 ASSERT(!offsets.isEmpty());
876 keyframe->setOffset(offsets[0]); 876 keyframe->setOffset(offsets[0]);
877 TimingFunction* timingFunction = defaultTimingFunction; 877 TimingFunction* timingFunction = defaultTimingFunction;
878 const StylePropertySet* properties = styleKeyframe->properties(); 878 const StylePropertySet* properties = styleKeyframe->properties();
879 for (unsigned j = 0; j < properties->propertyCount(); j++) { 879 for (unsigned j = 0; j < properties->propertyCount(); j++) {
880 CSSPropertyID property = properties->propertyAt(j).id(); 880 CSSPropertyID property = properties->propertyAt(j).id();
881 if (property == CSSPropertyWebkitAnimationTimingFunction || property == CSSPropertyAnimationTimingFunction) { 881 if (property == CSSPropertyWebkitAnimationTimingFunction || property == CSSPropertyAnimationTimingFunction) {
882 // FIXME: This sometimes gets the wrong timing function. See crb ug.com/288540. 882 // FIXME: This sometimes gets the wrong timing function. See crb ug.com/288540.
883 timingFunction = KeyframeValue::timingFunction(keyframeStyle.get (), name); 883 timingFunction = KeyframeValue::timingFunction(keyframeStyle.get (), name);
884 } else if (CSSAnimations::isAnimatableProperty(property)) { 884 } else if (CSSAnimations::isAnimatableProperty(property)) {
885 keyframe->setPropertyValue(property, CSSAnimatableValueFactory:: create(property, keyframeStyle.get()).get()); 885 keyframe->setPropertyValue(property, CSSAnimatableValueFactory:: create(property, *keyframeStyle).get());
886 } 886 }
887 } 887 }
888 keyframes.append(keyframe); 888 keyframes.append(keyframe);
889 // The last keyframe specified at a given offset is used. 889 // The last keyframe specified at a given offset is used.
890 perKeyframeTimingFunctions.set(offsets[0], timingFunction); 890 perKeyframeTimingFunctions.set(offsets[0], timingFunction);
891 for (size_t j = 1; j < offsets.size(); ++j) { 891 for (size_t j = 1; j < offsets.size(); ++j) {
892 keyframes.append(keyframe->cloneWithOffset(offsets[j])); 892 keyframes.append(keyframe->cloneWithOffset(offsets[j]));
893 perKeyframeTimingFunctions.set(offsets[j], timingFunction); 893 perKeyframeTimingFunctions.set(offsets[j], timingFunction);
894 } 894 }
895 } 895 }
(...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after
1496 1496
1497 // Now do the author and user normal priority properties and all the !import ant properties. 1497 // Now do the author and user normal priority properties and all the !import ant properties.
1498 applyMatchedProperties<LowPriorityProperties>(state, matchResult, false, mat chResult.ranges.lastUARule + 1, matchResult.matchedProperties.size() - 1, applyI nheritedOnly); 1498 applyMatchedProperties<LowPriorityProperties>(state, matchResult, false, mat chResult.ranges.lastUARule + 1, matchResult.matchedProperties.size() - 1, applyI nheritedOnly);
1499 applyMatchedProperties<LowPriorityProperties>(state, matchResult, true, matc hResult.ranges.firstAuthorRule, matchResult.ranges.lastAuthorRule, applyInherite dOnly); 1499 applyMatchedProperties<LowPriorityProperties>(state, matchResult, true, matc hResult.ranges.firstAuthorRule, matchResult.ranges.lastAuthorRule, applyInherite dOnly);
1500 applyMatchedProperties<LowPriorityProperties>(state, matchResult, true, matc hResult.ranges.firstUserRule, matchResult.ranges.lastUserRule, applyInheritedOnl y); 1500 applyMatchedProperties<LowPriorityProperties>(state, matchResult, true, matc hResult.ranges.firstUserRule, matchResult.ranges.lastUserRule, applyInheritedOnl y);
1501 applyMatchedProperties<LowPriorityProperties>(state, matchResult, true, matc hResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly); 1501 applyMatchedProperties<LowPriorityProperties>(state, matchResult, true, matc hResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly);
1502 1502
1503 // animatingElement may be null, for example if we're calculating the 1503 // animatingElement may be null, for example if we're calculating the
1504 // style for a potential pseudo element that has yet to be created. 1504 // style for a potential pseudo element that has yet to be created.
1505 if (RuntimeEnabledFeatures::webAnimationsEnabled() && animatingElement) { 1505 if (RuntimeEnabledFeatures::webAnimationsEnabled() && animatingElement) {
1506 state.setAnimationUpdate(CSSAnimations::calculateUpdate(animatingElement , state.style(), this)); 1506 state.setAnimationUpdate(CSSAnimations::calculateUpdate(animatingElement , *state.style(), this));
1507 if (state.animationUpdate()) { 1507 if (state.animationUpdate()) {
1508 ASSERT(!applyInheritedOnly); 1508 ASSERT(!applyInheritedOnly);
1509 const AnimationEffect::CompositableValueMap& compositableValuesForAn imations = state.animationUpdate()->compositableValuesForAnimations(); 1509 const AnimationEffect::CompositableValueMap& compositableValuesForAn imations = state.animationUpdate()->compositableValuesForAnimations();
1510 const AnimationEffect::CompositableValueMap& compositableValuesForTr ansitions = state.animationUpdate()->compositableValuesForTransitions(); 1510 const AnimationEffect::CompositableValueMap& compositableValuesForTr ansitions = state.animationUpdate()->compositableValuesForTransitions();
1511 // Apply animated properties, then reapply any rules marked importan t. 1511 // Apply animated properties, then reapply any rules marked importan t.
1512 if (applyAnimatedProperties<HighPriorityProperties>(state, composita bleValuesForAnimations)) { 1512 if (applyAnimatedProperties<HighPriorityProperties>(state, composita bleValuesForAnimations)) {
1513 bool important = true; 1513 bool important = true;
1514 applyMatchedProperties<HighPriorityProperties>(state, matchResul t, important, matchResult.ranges.firstAuthorRule, matchResult.ranges.lastAuthorR ule, applyInheritedOnly); 1514 applyMatchedProperties<HighPriorityProperties>(state, matchResul t, important, matchResult.ranges.firstAuthorRule, matchResult.ranges.lastAuthorR ule, applyInheritedOnly);
1515 applyMatchedProperties<HighPriorityProperties>(state, matchResul t, important, matchResult.ranges.firstUserRule, matchResult.ranges.lastUserRule, applyInheritedOnly); 1515 applyMatchedProperties<HighPriorityProperties>(state, matchResul t, important, matchResult.ranges.firstUserRule, matchResult.ranges.lastUserRule, applyInheritedOnly);
1516 applyMatchedProperties<HighPriorityProperties>(state, matchResul t, important, matchResult.ranges.firstUARule, matchResult.ranges.lastUARule, app lyInheritedOnly); 1516 applyMatchedProperties<HighPriorityProperties>(state, matchResul t, important, matchResult.ranges.firstUARule, matchResult.ranges.lastUARule, app lyInheritedOnly);
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
1612 m_matchedPropertiesSearches, m_matchedPropertiesHit, m_matchedProperties SharedInheritedHit, m_matchedPropertiesToCache, m_matchedPropertiesEnteredIntoCa che); 1612 m_matchedPropertiesSearches, m_matchedPropertiesHit, m_matchedProperties SharedInheritedHit, m_matchedPropertiesToCache, m_matchedPropertiesEnteredIntoCa che);
1613 1613
1614 fprintf(stderr, "Total:\n"); 1614 fprintf(stderr, "Total:\n");
1615 printStyleStats(m_totalSearches, m_totalElementsEligibleForSharing, m_totalS tylesShared, m_totalSearchFoundSiblingForSharing, m_totalSearchesMissedSharing, 1615 printStyleStats(m_totalSearches, m_totalElementsEligibleForSharing, m_totalS tylesShared, m_totalSearchFoundSiblingForSharing, m_totalSearchesMissedSharing,
1616 m_totalMatchedPropertiesSearches, m_totalMatchedPropertiesHit, m_totalMa tchedPropertiesSharedInheritedHit, m_totalMatchedPropertiesToCache, m_totalMatch edPropertiesEnteredIntoCache); 1616 m_totalMatchedPropertiesSearches, m_totalMatchedPropertiesHit, m_totalMa tchedPropertiesSharedInheritedHit, m_totalMatchedPropertiesToCache, m_totalMatch edPropertiesEnteredIntoCache);
1617 fprintf(stderr, "----------------------------------------------------------- ---------------------\n"); 1617 fprintf(stderr, "----------------------------------------------------------- ---------------------\n");
1618 } 1618 }
1619 #endif 1619 #endif
1620 1620
1621 } // namespace WebCore 1621 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/css/resolver/StyleResolver.h ('k') | Source/core/dom/Document.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698