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

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

Issue 308123010: Trigger computation of font size when crossing foreignObject boundary (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebased to trunk Created 6 years, 6 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
« no previous file with comments | « Source/core/css/resolver/StyleAdjuster.cpp ('k') | Source/core/dom/Document.cpp » ('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 627 matching lines...) Expand 10 before | Expand all | Expand 10 after
638 } 638 }
639 // contenteditable attribute (implemented by -webkit-user-modify) should 639 // contenteditable attribute (implemented by -webkit-user-modify) should
640 // be propagated from shadow host to distributed node. 640 // be propagated from shadow host to distributed node.
641 if (state.distributedToInsertionPoint()) { 641 if (state.distributedToInsertionPoint()) {
642 if (Element* parent = element->parentElement()) { 642 if (Element* parent = element->parentElement()) {
643 if (RenderStyle* styleOfShadowHost = parent->renderStyle()) 643 if (RenderStyle* styleOfShadowHost = parent->renderStyle())
644 state.style()->setUserModify(styleOfShadowHost->userModify()); 644 state.style()->setUserModify(styleOfShadowHost->userModify());
645 } 645 }
646 } 646 }
647 647
648 state.fontBuilder().initForStyleResolve(state.document(), state.style(), sta te.useSVGZoomRules()); 648 state.fontBuilder().initForStyleResolve(state.document(), state.style());
649 649
650 if (element->isLink()) { 650 if (element->isLink()) {
651 state.style()->setIsLink(true); 651 state.style()->setIsLink(true);
652 EInsideLink linkState = state.elementLinkState(); 652 EInsideLink linkState = state.elementLinkState();
653 if (linkState != NotInsideLink) { 653 if (linkState != NotInsideLink) {
654 bool forceVisited = InspectorInstrumentation::forcePseudoState(eleme nt, CSSSelector::PseudoVisited); 654 bool forceVisited = InspectorInstrumentation::forcePseudoState(eleme nt, CSSSelector::PseudoVisited);
655 if (forceVisited) 655 if (forceVisited)
656 linkState = InsideVisitedLink; 656 linkState = InsideVisitedLink;
657 } 657 }
658 state.style()->setInsideLink(linkState); 658 state.style()->setInsideLink(linkState);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
706 706
707 MatchResult result; 707 MatchResult result;
708 result.addMatchedProperties(&keyframe->properties()); 708 result.addMatchedProperties(&keyframe->properties());
709 709
710 ASSERT(!state.style()); 710 ASSERT(!state.style());
711 711
712 // Create the style 712 // Create the style
713 state.setStyle(RenderStyle::clone(&elementStyle)); 713 state.setStyle(RenderStyle::clone(&elementStyle));
714 state.setLineHeightValue(0); 714 state.setLineHeightValue(0);
715 715
716 state.fontBuilder().initForStyleResolve(state.document(), state.style(), sta te.useSVGZoomRules()); 716 state.fontBuilder().initForStyleResolve(state.document(), state.style());
717 717
718 // We don't need to bother with !important. Since there is only ever one 718 // We don't need to bother with !important. Since there is only ever one
719 // decl, there's nothing to override. So just add the first properties. 719 // decl, there's nothing to override. So just add the first properties.
720 // We also don't need to bother with animation properties since the only 720 // We also don't need to bother with animation properties since the only
721 // relevant one is animation-timing-function and we special-case that in 721 // relevant one is animation-timing-function and we special-case that in
722 // CSSAnimations.cpp 722 // CSSAnimations.cpp
723 bool inheritedOnly = false; 723 bool inheritedOnly = false;
724 applyMatchedProperties<HighPriorityProperties>(state, result, false, 0, resu lt.matchedProperties.size() - 1, inheritedOnly); 724 applyMatchedProperties<HighPriorityProperties>(state, result, false, 0, resu lt.matchedProperties.size() - 1, inheritedOnly);
725 725
726 // If our font got dirtied, go ahead and update it now. 726 // If our font got dirtied, go ahead and update it now.
(...skipping 26 matching lines...) Expand all
753 style = RenderStyle::clone(element.renderStyle()); 753 style = RenderStyle::clone(element.renderStyle());
754 else 754 else
755 style = RenderStyle::create(); 755 style = RenderStyle::create();
756 return createAnimatableValueSnapshot(element, property, value, *style); 756 return createAnimatableValueSnapshot(element, property, value, *style);
757 } 757 }
758 758
759 PassRefPtrWillBeRawPtr<AnimatableValue> StyleResolver::createAnimatableValueSnap shot(Element& element, CSSPropertyID property, CSSValue& value, RenderStyle& sty le) 759 PassRefPtrWillBeRawPtr<AnimatableValue> StyleResolver::createAnimatableValueSnap shot(Element& element, CSSPropertyID property, CSSValue& value, RenderStyle& sty le)
760 { 760 {
761 StyleResolverState state(element.document(), &element); 761 StyleResolverState state(element.document(), &element);
762 state.setStyle(&style); 762 state.setStyle(&style);
763 state.fontBuilder().initForStyleResolve(state.document(), state.style(), sta te.useSVGZoomRules()); 763 state.fontBuilder().initForStyleResolve(state.document(), state.style());
764 StyleBuilder::applyProperty(property, state, &value); 764 StyleBuilder::applyProperty(property, state, &value);
765 return CSSAnimatableValueFactory::create(property, style); 765 return CSSAnimatableValueFactory::create(property, style);
766 } 766 }
767 767
768 PassRefPtrWillBeRawPtr<PseudoElement> StyleResolver::createPseudoElementIfNeeded (Element& parent, PseudoId pseudoId) 768 PassRefPtrWillBeRawPtr<PseudoElement> StyleResolver::createPseudoElementIfNeeded (Element& parent, PseudoId pseudoId)
769 { 769 {
770 RenderObject* parentRenderer = parent.renderer(); 770 RenderObject* parentRenderer = parent.renderer();
771 if (!parentRenderer) 771 if (!parentRenderer)
772 return nullptr; 772 return nullptr;
773 773
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
814 StyleResolverParentScope::ensureParentStackIsPushed(); 814 StyleResolverParentScope::ensureParentStackIsPushed();
815 815
816 if (pseudoStyleRequest.allowsInheritance(state.parentStyle())) { 816 if (pseudoStyleRequest.allowsInheritance(state.parentStyle())) {
817 state.setStyle(RenderStyle::create()); 817 state.setStyle(RenderStyle::create());
818 state.style()->inheritFrom(state.parentStyle()); 818 state.style()->inheritFrom(state.parentStyle());
819 } else { 819 } else {
820 state.setStyle(defaultStyleForElement()); 820 state.setStyle(defaultStyleForElement());
821 state.setParentStyle(RenderStyle::clone(state.style())); 821 state.setParentStyle(RenderStyle::clone(state.style()));
822 } 822 }
823 823
824 state.fontBuilder().initForStyleResolve(state.document(), state.style(), sta te.useSVGZoomRules()); 824 state.fontBuilder().initForStyleResolve(state.document(), state.style());
825 825
826 // Since we don't use pseudo-elements in any of our quirk/print 826 // Since we don't use pseudo-elements in any of our quirk/print
827 // user agent rules, don't waste time walking those rules. 827 // user agent rules, don't waste time walking those rules.
828 828
829 { 829 {
830 // Check UA, user and author rules. 830 // Check UA, user and author rules.
831 ElementRuleCollector collector(state.elementContext(), m_selectorFilter, state.style()); 831 ElementRuleCollector collector(state.elementContext(), m_selectorFilter, state.style());
832 collector.setPseudoStyleRequest(pseudoStyleRequest); 832 collector.setPseudoStyleRequest(pseudoStyleRequest);
833 833
834 matchUARules(collector); 834 matchUARules(collector);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
883 { 883 {
884 ASSERT(!hasPendingAuthorStyleSheets()); 884 ASSERT(!hasPendingAuthorStyleSheets());
885 resetDirectionAndWritingModeOnDocument(document()); 885 resetDirectionAndWritingModeOnDocument(document());
886 StyleResolverState state(document(), document().documentElement()); // m_roo tElementStyle will be set to the document style. 886 StyleResolverState state(document(), document().documentElement()); // m_roo tElementStyle will be set to the document style.
887 887
888 state.setStyle(RenderStyle::create()); 888 state.setStyle(RenderStyle::create());
889 const RenderStyle* rootElementStyle = state.rootElementStyle() ? state.rootE lementStyle() : document().renderStyle(); 889 const RenderStyle* rootElementStyle = state.rootElementStyle() ? state.rootE lementStyle() : document().renderStyle();
890 ASSERT(rootElementStyle); 890 ASSERT(rootElementStyle);
891 state.style()->inheritFrom(rootElementStyle); 891 state.style()->inheritFrom(rootElementStyle);
892 892
893 state.fontBuilder().initForStyleResolve(state.document(), state.style(), sta te.useSVGZoomRules()); 893 state.fontBuilder().initForStyleResolve(state.document(), state.style());
894 894
895 PageRuleCollector collector(rootElementStyle, pageIndex); 895 PageRuleCollector collector(rootElementStyle, pageIndex);
896 896
897 collector.matchPageRules(CSSDefaultStyleSheets::instance().defaultPrintStyle ()); 897 collector.matchPageRules(CSSDefaultStyleSheets::instance().defaultPrintStyle ());
898 898
899 if (ScopedStyleResolver* scopedResolver = m_styleTree.scopedStyleResolverFor Document()) 899 if (ScopedStyleResolver* scopedResolver = m_styleTree.scopedStyleResolverFor Document())
900 scopedResolver->matchPageRules(collector); 900 scopedResolver->matchPageRules(collector);
901 901
902 state.setLineHeightValue(0); 902 state.setLineHeightValue(0);
903 bool inheritedOnly = false; 903 bool inheritedOnly = false;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
938 if (ScopedStyleResolver* scopedResolver = m_styleTree.scopedStyleResolverFor Document()) 938 if (ScopedStyleResolver* scopedResolver = m_styleTree.scopedStyleResolverFor Document())
939 scopedResolver->collectViewportRulesTo(this); 939 scopedResolver->collectViewportRulesTo(this);
940 940
941 viewportStyleResolver()->resolve(); 941 viewportStyleResolver()->resolve();
942 } 942 }
943 943
944 PassRefPtr<RenderStyle> StyleResolver::defaultStyleForElement() 944 PassRefPtr<RenderStyle> StyleResolver::defaultStyleForElement()
945 { 945 {
946 StyleResolverState state(document(), 0); 946 StyleResolverState state(document(), 0);
947 state.setStyle(RenderStyle::create()); 947 state.setStyle(RenderStyle::create());
948 state.fontBuilder().initForStyleResolve(document(), state.style(), state.use SVGZoomRules()); 948 state.fontBuilder().initForStyleResolve(document(), state.style());
949 state.style()->setLineHeight(RenderStyle::initialLineHeight()); 949 state.style()->setLineHeight(RenderStyle::initialLineHeight());
950 state.setLineHeightValue(0); 950 state.setLineHeightValue(0);
951 state.fontBuilder().setInitial(state.style()->effectiveZoom()); 951 state.fontBuilder().setInitial(state.style()->effectiveZoom());
952 state.style()->font().update(document().styleEngine()->fontSelector()); 952 state.style()->font().update(document().styleEngine()->fontSelector());
953 return state.takeStyle(); 953 return state.takeStyle();
954 } 954 }
955 955
956 PassRefPtr<RenderStyle> StyleResolver::styleForText(Text* textNode) 956 PassRefPtr<RenderStyle> StyleResolver::styleForText(Text* textNode)
957 { 957 {
958 ASSERT(textNode); 958 ASSERT(textNode);
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after
1371 // Now we have all of the matched rules in the appropriate order. Walk the r ules and apply 1371 // Now we have all of the matched rules in the appropriate order. Walk the r ules and apply
1372 // high-priority properties first, i.e., those properties that other propert ies depend on. 1372 // high-priority properties first, i.e., those properties that other propert ies depend on.
1373 // The order is (1) high-priority not important, (2) high-priority important , (3) normal not important 1373 // The order is (1) high-priority not important, (2) high-priority important , (3) normal not important
1374 // and (4) normal important. 1374 // and (4) normal important.
1375 state.setLineHeightValue(0); 1375 state.setLineHeightValue(0);
1376 applyMatchedProperties<HighPriorityProperties>(state, matchResult, false, 0, matchResult.matchedProperties.size() - 1, applyInheritedOnly); 1376 applyMatchedProperties<HighPriorityProperties>(state, matchResult, false, 0, matchResult.matchedProperties.size() - 1, applyInheritedOnly);
1377 applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, mat chResult.ranges.firstAuthorRule, matchResult.ranges.lastAuthorRule, applyInherit edOnly); 1377 applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, mat chResult.ranges.firstAuthorRule, matchResult.ranges.lastAuthorRule, applyInherit edOnly);
1378 applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, mat chResult.ranges.firstUserRule, matchResult.ranges.lastUserRule, applyInheritedOn ly); 1378 applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, mat chResult.ranges.firstUserRule, matchResult.ranges.lastUserRule, applyInheritedOn ly);
1379 applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, mat chResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly); 1379 applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, mat chResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly);
1380 1380
1381 if (UNLIKELY(isSVGForeignObjectElement(element))) {
1382 // RenderSVGRoot handles zooming for the whole SVG subtree, so foreignOb ject content should not be scaled again.
1383 //
1384 // FIXME: The following hijacks the zoom property for foreignObject so t hat children of foreignObject get the
1385 // correct font-size in case of zooming. 'zoom' is part of HighPriorityP roperties, along with other font-related
1386 // properties used as input to the FontBuilder, so resetting it here may cause the FontBuilder to recompute the
1387 // font used as inheritable font for foreignObject content. If we want t o support zoom on foreignObject we'll
1388 // need to find another way of handling the SVG zoom model.
1389 state.setEffectiveZoom(RenderStyle::initialZoom());
1390 }
1391
1381 if (cachedMatchedProperties && cachedMatchedProperties->renderStyle->effecti veZoom() != state.style()->effectiveZoom()) { 1392 if (cachedMatchedProperties && cachedMatchedProperties->renderStyle->effecti veZoom() != state.style()->effectiveZoom()) {
1382 state.fontBuilder().setFontDirty(true); 1393 state.fontBuilder().setFontDirty(true);
1383 applyInheritedOnly = false; 1394 applyInheritedOnly = false;
1384 } 1395 }
1385 1396
1386 // If our font got dirtied, go ahead and update it now. 1397 // If our font got dirtied, go ahead and update it now.
1387 updateFont(state); 1398 updateFont(state);
1388 1399
1389 // Line-height is set when we are sure we decided on the font-size. 1400 // Line-height is set when we are sure we decided on the font-size.
1390 if (state.lineHeightValue()) 1401 if (state.lineHeightValue())
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1447 fprintf(stderr, "%s\n", m_styleResolverStats->report().utf8().data()); 1458 fprintf(stderr, "%s\n", m_styleResolverStats->report().utf8().data());
1448 fprintf(stderr, "== Totals ==\n"); 1459 fprintf(stderr, "== Totals ==\n");
1449 fprintf(stderr, "%s\n", m_styleResolverStatsTotals->report().utf8().data()); 1460 fprintf(stderr, "%s\n", m_styleResolverStatsTotals->report().utf8().data());
1450 } 1461 }
1451 1462
1452 void StyleResolver::applyPropertiesToStyle(const CSSPropertyValue* properties, s ize_t count, RenderStyle* style) 1463 void StyleResolver::applyPropertiesToStyle(const CSSPropertyValue* properties, s ize_t count, RenderStyle* style)
1453 { 1464 {
1454 StyleResolverState state(document(), document().documentElement(), style); 1465 StyleResolverState state(document(), document().documentElement(), style);
1455 state.setStyle(style); 1466 state.setStyle(style);
1456 1467
1457 state.fontBuilder().initForStyleResolve(document(), style, state.useSVGZoomR ules()); 1468 state.fontBuilder().initForStyleResolve(document(), style);
1458 1469
1459 for (size_t i = 0; i < count; ++i) { 1470 for (size_t i = 0; i < count; ++i) {
1460 if (properties[i].value) { 1471 if (properties[i].value) {
1461 // As described in BUG66291, setting font-size and line-height on a font may entail a CSSPrimitiveValue::computeLengthDouble call, 1472 // As described in BUG66291, setting font-size and line-height on a font may entail a CSSPrimitiveValue::computeLengthDouble call,
1462 // which assumes the fontMetrics are available for the affected font , otherwise a crash occurs (see http://trac.webkit.org/changeset/96122). 1473 // which assumes the fontMetrics are available for the affected font , otherwise a crash occurs (see http://trac.webkit.org/changeset/96122).
1463 // The updateFont() call below updates the fontMetrics and ensure th e proper setting of font-size and line-height. 1474 // The updateFont() call below updates the fontMetrics and ensure th e proper setting of font-size and line-height.
1464 switch (properties[i].property) { 1475 switch (properties[i].property) {
1465 case CSSPropertyFontSize: 1476 case CSSPropertyFontSize:
1466 case CSSPropertyLineHeight: 1477 case CSSPropertyLineHeight:
1467 updateFont(state); 1478 updateFont(state);
(...skipping 28 matching lines...) Expand all
1496 visitor->trace(m_viewportStyleResolver); 1507 visitor->trace(m_viewportStyleResolver);
1497 visitor->trace(m_features); 1508 visitor->trace(m_features);
1498 visitor->trace(m_siblingRuleSet); 1509 visitor->trace(m_siblingRuleSet);
1499 visitor->trace(m_uncommonAttributeRuleSet); 1510 visitor->trace(m_uncommonAttributeRuleSet);
1500 visitor->trace(m_watchedSelectorsRules); 1511 visitor->trace(m_watchedSelectorsRules);
1501 visitor->trace(m_treeBoundaryCrossingRules); 1512 visitor->trace(m_treeBoundaryCrossingRules);
1502 visitor->trace(m_pendingStyleSheets); 1513 visitor->trace(m_pendingStyleSheets);
1503 } 1514 }
1504 1515
1505 } // namespace WebCore 1516 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/css/resolver/StyleAdjuster.cpp ('k') | Source/core/dom/Document.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698