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

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

Issue 670373002: Demote 'line-height' to a low priority property. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase. Created 6 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/CSSProperties.in ('k') | Source/core/css/resolver/StyleResolverState.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 654 matching lines...) Expand 10 before | Expand all | Expand 10 after
665 resetDirectionAndWritingModeOnDocument(document()); 665 resetDirectionAndWritingModeOnDocument(document());
666 StyleResolverState state(document(), &element, parentStyle); 666 StyleResolverState state(document(), &element, parentStyle);
667 667
668 MatchResult result; 668 MatchResult result;
669 result.addMatchedProperties(&keyframe->properties()); 669 result.addMatchedProperties(&keyframe->properties());
670 670
671 ASSERT(!state.style()); 671 ASSERT(!state.style());
672 672
673 // Create the style 673 // Create the style
674 state.setStyle(RenderStyle::clone(&elementStyle)); 674 state.setStyle(RenderStyle::clone(&elementStyle));
675 state.setLineHeightValue(0);
676 675
677 // We don't need to bother with !important. Since there is only ever one 676 // We don't need to bother with !important. Since there is only ever one
678 // decl, there's nothing to override. So just add the first properties. 677 // decl, there's nothing to override. So just add the first properties.
679 // We also don't need to bother with animation properties since the only 678 // We also don't need to bother with animation properties since the only
680 // relevant one is animation-timing-function and we special-case that in 679 // relevant one is animation-timing-function and we special-case that in
681 // CSSAnimations.cpp 680 // CSSAnimations.cpp
682 bool inheritedOnly = false; 681 bool inheritedOnly = false;
683 applyMatchedProperties<HighPriorityProperties>(state, result, false, 0, resu lt.matchedProperties.size() - 1, inheritedOnly); 682 applyMatchedProperties<HighPriorityProperties>(state, result, false, 0, resu lt.matchedProperties.size() - 1, inheritedOnly);
684 683
685 // If our font got dirtied, go ahead and update it now. 684 // If our font got dirtied, go ahead and update it now.
686 updateFont(state); 685 updateFont(state);
687 686
688 // Line-height is set when we are sure we decided on the font-size
689 if (state.lineHeightValue())
690 StyleBuilder::applyProperty(CSSPropertyLineHeight, state, state.lineHeig htValue());
691
692 // Now do rest of the properties. 687 // Now do rest of the properties.
693 applyMatchedProperties<LowPriorityProperties>(state, result, false, 0, resul t.matchedProperties.size() - 1, inheritedOnly); 688 applyMatchedProperties<LowPriorityProperties>(state, result, false, 0, resul t.matchedProperties.size() - 1, inheritedOnly);
694 689
695 loadPendingResources(state); 690 loadPendingResources(state);
696 691
697 didAccess(); 692 didAccess();
698 693
699 return state.takeStyle(); 694 return state.takeStyle();
700 } 695 }
701 696
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
859 ASSERT(rootElementStyle); 854 ASSERT(rootElementStyle);
860 state.style()->inheritFrom(rootElementStyle); 855 state.style()->inheritFrom(rootElementStyle);
861 856
862 PageRuleCollector collector(rootElementStyle, pageIndex); 857 PageRuleCollector collector(rootElementStyle, pageIndex);
863 858
864 collector.matchPageRules(CSSDefaultStyleSheets::instance().defaultPrintStyle ()); 859 collector.matchPageRules(CSSDefaultStyleSheets::instance().defaultPrintStyle ());
865 860
866 if (ScopedStyleResolver* scopedResolver = document().scopedStyleResolver()) 861 if (ScopedStyleResolver* scopedResolver = document().scopedStyleResolver())
867 scopedResolver->matchPageRules(collector); 862 scopedResolver->matchPageRules(collector);
868 863
869 state.setLineHeightValue(0);
870 bool inheritedOnly = false; 864 bool inheritedOnly = false;
871 865
872 MatchResult& result = collector.matchedResult(); 866 MatchResult& result = collector.matchedResult();
873 applyMatchedProperties<HighPriorityProperties>(state, result, false, 0, resu lt.matchedProperties.size() - 1, inheritedOnly); 867 applyMatchedProperties<HighPriorityProperties>(state, result, false, 0, resu lt.matchedProperties.size() - 1, inheritedOnly);
874 868
875 // If our font got dirtied, go ahead and update it now. 869 // If our font got dirtied, go ahead and update it now.
876 updateFont(state); 870 updateFont(state);
877 871
878 // Line-height is set when we are sure we decided on the font-size.
879 if (state.lineHeightValue())
880 StyleBuilder::applyProperty(CSSPropertyLineHeight, state, state.lineHeig htValue());
881
882 applyMatchedProperties<LowPriorityProperties>(state, result, false, 0, resul t.matchedProperties.size() - 1, inheritedOnly); 872 applyMatchedProperties<LowPriorityProperties>(state, result, false, 0, resul t.matchedProperties.size() - 1, inheritedOnly);
883 873
884 addContentAttrValuesToFeatures(state.contentAttrValues(), m_features); 874 addContentAttrValuesToFeatures(state.contentAttrValues(), m_features);
885 875
886 loadPendingResources(state); 876 loadPendingResources(state);
887 877
888 didAccess(); 878 didAccess();
889 879
890 // Now return the style. 880 // Now return the style.
891 return state.takeStyle(); 881 return state.takeStyle();
(...skipping 13 matching lines...) Expand all
905 if (ScopedStyleResolver* scopedResolver = document().scopedStyleResolver()) 895 if (ScopedStyleResolver* scopedResolver = document().scopedStyleResolver())
906 scopedResolver->collectViewportRulesTo(this); 896 scopedResolver->collectViewportRulesTo(this);
907 897
908 viewportStyleResolver()->resolve(); 898 viewportStyleResolver()->resolve();
909 } 899 }
910 900
911 PassRefPtr<RenderStyle> StyleResolver::defaultStyleForElement() 901 PassRefPtr<RenderStyle> StyleResolver::defaultStyleForElement()
912 { 902 {
913 StyleResolverState state(document(), 0); 903 StyleResolverState state(document(), 0);
914 state.setStyle(RenderStyle::create()); 904 state.setStyle(RenderStyle::create());
915 state.style()->setLineHeight(RenderStyle::initialLineHeight());
916 state.setLineHeightValue(0);
917 state.fontBuilder().setInitial(state.style()->effectiveZoom()); 905 state.fontBuilder().setInitial(state.style()->effectiveZoom());
918 state.style()->font().update(document().styleEngine()->fontSelector()); 906 state.style()->font().update(document().styleEngine()->fontSelector());
919 return state.takeStyle(); 907 return state.takeStyle();
920 } 908 }
921 909
922 PassRefPtr<RenderStyle> StyleResolver::styleForText(Text* textNode) 910 PassRefPtr<RenderStyle> StyleResolver::styleForText(Text* textNode)
923 { 911 {
924 ASSERT(textNode); 912 ASSERT(textNode);
925 913
926 Node* parentNode = NodeRenderingTraversal::parent(textNode); 914 Node* parentNode = NodeRenderingTraversal::parent(textNode);
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after
1246 // lastCSSPropertyId<HighPriorityProperties>. 1234 // lastCSSPropertyId<HighPriorityProperties>.
1247 template<> CSSPropertyID StyleResolver::firstCSSPropertyId<StyleResolver::HighPr iorityProperties>() 1235 template<> CSSPropertyID StyleResolver::firstCSSPropertyId<StyleResolver::HighPr iorityProperties>()
1248 { 1236 {
1249 COMPILE_ASSERT(CSSPropertyColor == firstCSSProperty, CSS_color_is_first_high _priority_property); 1237 COMPILE_ASSERT(CSSPropertyColor == firstCSSProperty, CSS_color_is_first_high _priority_property);
1250 return CSSPropertyColor; 1238 return CSSPropertyColor;
1251 } 1239 }
1252 1240
1253 // This method returns the last CSSPropertyId of high priority properties. 1241 // This method returns the last CSSPropertyId of high priority properties.
1254 template<> CSSPropertyID StyleResolver::lastCSSPropertyId<StyleResolver::HighPri orityProperties>() 1242 template<> CSSPropertyID StyleResolver::lastCSSPropertyId<StyleResolver::HighPri orityProperties>()
1255 { 1243 {
1256 COMPILE_ASSERT(CSSPropertyLineHeight == CSSPropertyColor + 17, CSS_line_heig ht_is_end_of_high_prioity_property_range); 1244 COMPILE_ASSERT(CSSPropertyZoom == CSSPropertyColor + 16, CSS_zoom_is_end_of_ high_priority_property_range);
1257 COMPILE_ASSERT(CSSPropertyZoom == CSSPropertyLineHeight - 1, CSS_zoom_is_bef ore_line_height); 1245 COMPILE_ASSERT(CSSPropertyTextRendering == CSSPropertyZoom - 1, CSS_text_ren dering_is_before_zoom);
1258 return CSSPropertyLineHeight; 1246 return CSSPropertyZoom;
1259 } 1247 }
1260 1248
1261 // This method returns the first CSSPropertyId of remaining properties, 1249 // This method returns the first CSSPropertyId of remaining properties,
1262 // i.e. low priority properties. No properties depend on low priority 1250 // i.e. low priority properties. No properties depend on low priority
1263 // properties. So we don't need to resolve such properties quickly. 1251 // properties. So we don't need to resolve such properties quickly.
1264 // All low priority properties are obtained by using 1252 // All low priority properties are obtained by using
1265 // firstCSSPropertyId<LowPriorityProperties> and 1253 // firstCSSPropertyId<LowPriorityProperties> and
1266 // lastCSSPropertyId<LowPriorityProperties>. 1254 // lastCSSPropertyId<LowPriorityProperties>.
1267 template<> CSSPropertyID StyleResolver::firstCSSPropertyId<StyleResolver::LowPri orityProperties>() 1255 template<> CSSPropertyID StyleResolver::firstCSSPropertyId<StyleResolver::LowPri orityProperties>()
1268 { 1256 {
1269 COMPILE_ASSERT(CSSPropertyAlignContent == CSSPropertyLineHeight + 1, CSS_bac kground_is_first_low_priority_property); 1257 COMPILE_ASSERT(CSSPropertyAlignContent == CSSPropertyZoom + 1, CSS_align_con tent_is_first_low_priority_property);
1270 return CSSPropertyAlignContent; 1258 return CSSPropertyAlignContent;
1271 } 1259 }
1272 1260
1273 // This method returns the last CSSPropertyId of low priority properties. 1261 // This method returns the last CSSPropertyId of low priority properties.
1274 template<> CSSPropertyID StyleResolver::lastCSSPropertyId<StyleResolver::LowPrio rityProperties>() 1262 template<> CSSPropertyID StyleResolver::lastCSSPropertyId<StyleResolver::LowPrio rityProperties>()
1275 { 1263 {
1276 return static_cast<CSSPropertyID>(lastCSSProperty); 1264 return static_cast<CSSPropertyID>(lastCSSProperty);
1277 } 1265 }
1278 1266
1279 template <StyleResolver::StyleApplicationPass pass> 1267 template <StyleResolver::StyleApplicationPass pass>
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1342 ASSERT(!current.value()->isInheritedValue()); 1330 ASSERT(!current.value()->isInheritedValue());
1343 continue; 1331 continue;
1344 } 1332 }
1345 1333
1346 if (propertyWhitelistType == PropertyWhitelistCue && !isValidCueStylePro perty(property)) 1334 if (propertyWhitelistType == PropertyWhitelistCue && !isValidCueStylePro perty(property))
1347 continue; 1335 continue;
1348 if (propertyWhitelistType == PropertyWhitelistFirstLetter && !isValidFir stLetterStyleProperty(property)) 1336 if (propertyWhitelistType == PropertyWhitelistFirstLetter && !isValidFir stLetterStyleProperty(property))
1349 continue; 1337 continue;
1350 if (!isPropertyForPass<pass>(property)) 1338 if (!isPropertyForPass<pass>(property))
1351 continue; 1339 continue;
1352 if (pass == HighPriorityProperties && property == CSSPropertyLineHeight) 1340
1353 state.setLineHeightValue(current.value()); 1341 StyleBuilder::applyProperty(current.id(), state, current.value());
1354 else
1355 StyleBuilder::applyProperty(current.id(), state, current.value());
1356 } 1342 }
1357 } 1343 }
1358 1344
1359 template <StyleResolver::StyleApplicationPass pass> 1345 template <StyleResolver::StyleApplicationPass pass>
1360 void StyleResolver::applyMatchedProperties(StyleResolverState& state, const Matc hResult& matchResult, bool isImportant, int startIndex, int endIndex, bool inher itedOnly) 1346 void StyleResolver::applyMatchedProperties(StyleResolverState& state, const Matc hResult& matchResult, bool isImportant, int startIndex, int endIndex, bool inher itedOnly)
1361 { 1347 {
1362 if (startIndex == -1) 1348 if (startIndex == -1)
1363 return; 1349 return;
1364 1350
1365 if (state.style()->insideLink() != NotInsideLink) { 1351 if (state.style()->insideLink() != NotInsideLink) {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1428 state.style()->setInsideLink(linkStatus); 1414 state.style()->setInsideLink(linkStatus);
1429 return; 1415 return;
1430 } 1416 }
1431 applyInheritedOnly = true; 1417 applyInheritedOnly = true;
1432 } 1418 }
1433 1419
1434 // Now we have all of the matched rules in the appropriate order. Walk the r ules and apply 1420 // Now we have all of the matched rules in the appropriate order. Walk the r ules and apply
1435 // high-priority properties first, i.e., those properties that other propert ies depend on. 1421 // high-priority properties first, i.e., those properties that other propert ies depend on.
1436 // The order is (1) high-priority not important, (2) high-priority important , (3) normal not important 1422 // The order is (1) high-priority not important, (2) high-priority important , (3) normal not important
1437 // and (4) normal important. 1423 // and (4) normal important.
1438 state.setLineHeightValue(0);
1439 applyMatchedProperties<HighPriorityProperties>(state, matchResult, false, 0, matchResult.matchedProperties.size() - 1, applyInheritedOnly); 1424 applyMatchedProperties<HighPriorityProperties>(state, matchResult, false, 0, matchResult.matchedProperties.size() - 1, applyInheritedOnly);
1440 applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, mat chResult.ranges.firstAuthorRule, matchResult.ranges.lastAuthorRule, applyInherit edOnly); 1425 applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, mat chResult.ranges.firstAuthorRule, matchResult.ranges.lastAuthorRule, applyInherit edOnly);
1441 applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, mat chResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly); 1426 applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, mat chResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly);
1442 1427
1443 if (UNLIKELY(isSVGForeignObjectElement(element))) { 1428 if (UNLIKELY(isSVGForeignObjectElement(element))) {
1444 // RenderSVGRoot handles zooming for the whole SVG subtree, so foreignOb ject content should not be scaled again. 1429 // RenderSVGRoot handles zooming for the whole SVG subtree, so foreignOb ject content should not be scaled again.
1445 // 1430 //
1446 // FIXME: The following hijacks the zoom property for foreignObject so t hat children of foreignObject get the 1431 // FIXME: The following hijacks the zoom property for foreignObject so t hat children of foreignObject get the
1447 // correct font-size in case of zooming. 'zoom' is part of HighPriorityP roperties, along with other font-related 1432 // correct font-size in case of zooming. 'zoom' is part of HighPriorityP roperties, along with other font-related
1448 // properties used as input to the FontBuilder, so resetting it here may cause the FontBuilder to recompute the 1433 // properties used as input to the FontBuilder, so resetting it here may cause the FontBuilder to recompute the
1449 // font used as inheritable font for foreignObject content. If we want t o support zoom on foreignObject we'll 1434 // font used as inheritable font for foreignObject content. If we want t o support zoom on foreignObject we'll
1450 // need to find another way of handling the SVG zoom model. 1435 // need to find another way of handling the SVG zoom model.
1451 state.setEffectiveZoom(RenderStyle::initialZoom()); 1436 state.setEffectiveZoom(RenderStyle::initialZoom());
1452 } 1437 }
1453 1438
1454 if (cachedMatchedProperties && cachedMatchedProperties->renderStyle->effecti veZoom() != state.style()->effectiveZoom()) { 1439 if (cachedMatchedProperties && cachedMatchedProperties->renderStyle->effecti veZoom() != state.style()->effectiveZoom()) {
1455 state.fontBuilder().setFontDirty(true); 1440 state.fontBuilder().setFontDirty(true);
1456 applyInheritedOnly = false; 1441 applyInheritedOnly = false;
1457 } 1442 }
1458 1443
1459 // If our font got dirtied, go ahead and update it now. 1444 // If our font got dirtied, go ahead and update it now.
1460 updateFont(state); 1445 updateFont(state);
1461 1446
1462 // Line-height is set when we are sure we decided on the font-size.
1463 if (state.lineHeightValue())
1464 StyleBuilder::applyProperty(CSSPropertyLineHeight, state, state.lineHeig htValue());
1465
1466 // Many properties depend on the font. If it changes we just apply all prope rties. 1447 // Many properties depend on the font. If it changes we just apply all prope rties.
1467 if (cachedMatchedProperties && cachedMatchedProperties->renderStyle->fontDes cription() != state.style()->fontDescription()) 1448 if (cachedMatchedProperties && cachedMatchedProperties->renderStyle->fontDes cription() != state.style()->fontDescription())
1468 applyInheritedOnly = false; 1449 applyInheritedOnly = false;
1469 1450
1470 // Now do the normal priority UA properties. 1451 // Now do the normal priority UA properties.
1471 applyMatchedProperties<LowPriorityProperties>(state, matchResult, false, mat chResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly); 1452 applyMatchedProperties<LowPriorityProperties>(state, matchResult, false, mat chResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly);
1472 1453
1473 // Cache the UA properties to pass them to RenderTheme in adjustRenderStyle. 1454 // Cache the UA properties to pass them to RenderTheme in adjustRenderStyle.
1474 state.cacheUserAgentBorderAndBackground(); 1455 state.cacheUserAgentBorderAndBackground();
1475 1456
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
1592 visitor->trace(m_uncommonAttributeRuleSet); 1573 visitor->trace(m_uncommonAttributeRuleSet);
1593 visitor->trace(m_watchedSelectorsRules); 1574 visitor->trace(m_watchedSelectorsRules);
1594 visitor->trace(m_treeBoundaryCrossingRules); 1575 visitor->trace(m_treeBoundaryCrossingRules);
1595 visitor->trace(m_styleSharingLists); 1576 visitor->trace(m_styleSharingLists);
1596 visitor->trace(m_pendingStyleSheets); 1577 visitor->trace(m_pendingStyleSheets);
1597 visitor->trace(m_document); 1578 visitor->trace(m_document);
1598 #endif 1579 #endif
1599 } 1580 }
1600 1581
1601 } // namespace blink 1582 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/css/CSSProperties.in ('k') | Source/core/css/resolver/StyleResolverState.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698