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

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

Issue 2450093005: Support display: contents for elements, first-line and first-letter pseudos. (Closed)
Patch Set: Support display: contents for elements, first-line and first-letter pseudos. Created 3 years, 10 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
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. 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc.
6 * All rights reserved. 6 * All rights reserved.
7 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> 7 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org>
8 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> 8 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org>
9 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. 9 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved.
10 * (http://www.torchmobile.com/) 10 * (http://www.torchmobile.com/)
(...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after
570 documentStyle->setOverflowX(EOverflow::kAuto); 570 documentStyle->setOverflowX(EOverflow::kAuto);
571 documentStyle->setOverflowY(EOverflow::kAuto); 571 documentStyle->setOverflowY(EOverflow::kAuto);
572 572
573 document.setupFontBuilder(*documentStyle); 573 document.setupFontBuilder(*documentStyle);
574 574
575 return documentStyle.release(); 575 return documentStyle.release();
576 } 576 }
577 577
578 void StyleResolver::adjustComputedStyle(StyleResolverState& state, 578 void StyleResolver::adjustComputedStyle(StyleResolverState& state,
579 Element* element) { 579 Element* element) {
580 DCHECK(state.layoutParentStyle());
581 DCHECK(state.parentStyle());
580 StyleAdjuster::adjustComputedStyle(state.mutableStyleRef(), 582 StyleAdjuster::adjustComputedStyle(state.mutableStyleRef(),
581 *state.parentStyle(), element); 583 *state.parentStyle(),
584 *state.layoutParentStyle(), element);
582 } 585 }
583 586
584 // Start loading resources referenced by this style. 587 // Start loading resources referenced by this style.
585 void StyleResolver::loadPendingResources(StyleResolverState& state) { 588 void StyleResolver::loadPendingResources(StyleResolverState& state) {
586 state.elementStyleResources().loadPendingResources(state.style()); 589 state.elementStyleResources().loadPendingResources(state.style());
587 } 590 }
588 591
589 static const ComputedStyle* calculateBaseComputedStyle( 592 static const ComputedStyle* calculateBaseComputedStyle(
590 StyleResolverState& state, 593 StyleResolverState& state,
591 const Element* animatingElement) { 594 const Element* animatingElement) {
(...skipping 21 matching lines...) Expand all
613 return; 616 return;
614 617
615 ElementAnimations* elementAnimations = animatingElement->elementAnimations(); 618 ElementAnimations* elementAnimations = animatingElement->elementAnimations();
616 if (elementAnimations) 619 if (elementAnimations)
617 elementAnimations->updateBaseComputedStyle(state.style()); 620 elementAnimations->updateBaseComputedStyle(state.style());
618 } 621 }
619 622
620 PassRefPtr<ComputedStyle> StyleResolver::styleForElement( 623 PassRefPtr<ComputedStyle> StyleResolver::styleForElement(
621 Element* element, 624 Element* element,
622 const ComputedStyle* defaultParent, 625 const ComputedStyle* defaultParent,
626 const ComputedStyle* defaultLayoutParent,
623 StyleSharingBehavior sharingBehavior, 627 StyleSharingBehavior sharingBehavior,
624 RuleMatchingBehavior matchingBehavior) { 628 RuleMatchingBehavior matchingBehavior) {
625 DCHECK(document().frame()); 629 DCHECK(document().frame());
626 DCHECK(document().settings()); 630 DCHECK(document().settings());
627 631
628 // Once an element has a layoutObject, we don't try to destroy it, since 632 // Once an element has a layoutObject, we don't try to destroy it, since
629 // otherwise the layoutObject will vanish if a style recalc happens during 633 // otherwise the layoutObject will vanish if a style recalc happens during
630 // loading. 634 // loading.
631 if (sharingBehavior == AllowStyleSharing && !document().isRenderingReady() && 635 if (sharingBehavior == AllowStyleSharing && !document().isRenderingReady() &&
632 !element->layoutObject()) { 636 !element->layoutObject()) {
(...skipping 16 matching lines...) Expand all
649 ElementResolveContext elementContext(*element); 653 ElementResolveContext elementContext(*element);
650 654
651 if (RuntimeEnabledFeatures::styleSharingEnabled() && 655 if (RuntimeEnabledFeatures::styleSharingEnabled() &&
652 sharingBehavior == AllowStyleSharing && 656 sharingBehavior == AllowStyleSharing &&
653 (defaultParent || elementContext.parentStyle())) { 657 (defaultParent || elementContext.parentStyle())) {
654 if (RefPtr<ComputedStyle> sharedStyle = 658 if (RefPtr<ComputedStyle> sharedStyle =
655 document().styleEngine().findSharedStyle(elementContext)) 659 document().styleEngine().findSharedStyle(elementContext))
656 return sharedStyle.release(); 660 return sharedStyle.release();
657 } 661 }
658 662
659 StyleResolverState state(document(), elementContext, defaultParent); 663 StyleResolverState state(document(), elementContext, defaultParent,
664 defaultLayoutParent);
660 665
661 const ComputedStyle* baseComputedStyle = 666 const ComputedStyle* baseComputedStyle =
662 calculateBaseComputedStyle(state, element); 667 calculateBaseComputedStyle(state, element);
663 668
664 if (baseComputedStyle) { 669 if (baseComputedStyle) {
665 state.setStyle(ComputedStyle::clone(*baseComputedStyle)); 670 state.setStyle(ComputedStyle::clone(*baseComputedStyle));
666 if (!state.parentStyle()) 671 if (!state.parentStyle()) {
667 state.setParentStyle(initialStyleForElement()); 672 state.setParentStyle(initialStyleForElement());
673 state.setLayoutParentStyle(state.parentStyle());
674 }
668 } else { 675 } else {
669 if (state.parentStyle()) { 676 if (state.parentStyle()) {
670 RefPtr<ComputedStyle> style = ComputedStyle::create(); 677 RefPtr<ComputedStyle> style = ComputedStyle::create();
671 style->inheritFrom(*state.parentStyle(), 678 style->inheritFrom(*state.parentStyle(),
672 isAtShadowBoundary(element) 679 isAtShadowBoundary(element)
673 ? ComputedStyleBase::AtShadowBoundary 680 ? ComputedStyleBase::AtShadowBoundary
674 : ComputedStyleBase::NotAtShadowBoundary); 681 : ComputedStyleBase::NotAtShadowBoundary);
675 state.setStyle(std::move(style)); 682 state.setStyle(std::move(style));
676 } else { 683 } else {
677 state.setStyle(initialStyleForElement()); 684 state.setStyle(initialStyleForElement());
678 state.setParentStyle(ComputedStyle::clone(*state.style())); 685 state.setParentStyle(ComputedStyle::clone(*state.style()));
686 state.setLayoutParentStyle(state.parentStyle());
679 } 687 }
680 } 688 }
681 689
682 // contenteditable attribute (implemented by -webkit-user-modify) should 690 // contenteditable attribute (implemented by -webkit-user-modify) should
683 // be propagated from shadow host to distributed node. 691 // be propagated from shadow host to distributed node.
684 if (state.distributedToInsertionPoint()) { 692 if (state.distributedToInsertionPoint()) {
685 if (Element* parent = element->parentElement()) { 693 if (Element* parent = element->parentElement()) {
686 if (ComputedStyle* styleOfShadowHost = parent->mutableComputedStyle()) 694 if (ComputedStyle* styleOfShadowHost = parent->mutableComputedStyle())
687 state.style()->setUserModify(styleOfShadowHost->userModify()); 695 state.style()->setUserModify(styleOfShadowHost->userModify());
688 } 696 }
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
783 // TODO(alancutter): Create compositor keyframe values directly instead of 791 // TODO(alancutter): Create compositor keyframe values directly instead of
784 // intermediate AnimatableValues. 792 // intermediate AnimatableValues.
785 PassRefPtr<AnimatableValue> StyleResolver::createAnimatableValueSnapshot( 793 PassRefPtr<AnimatableValue> StyleResolver::createAnimatableValueSnapshot(
786 Element& element, 794 Element& element,
787 const ComputedStyle& baseStyle, 795 const ComputedStyle& baseStyle,
788 const ComputedStyle* parentStyle, 796 const ComputedStyle* parentStyle,
789 CSSPropertyID property, 797 CSSPropertyID property,
790 const CSSValue* value) { 798 const CSSValue* value) {
791 // TODO(alancutter): Avoid creating a StyleResolverState just to apply a 799 // TODO(alancutter): Avoid creating a StyleResolverState just to apply a
792 // single value on a ComputedStyle. 800 // single value on a ComputedStyle.
793 StyleResolverState state(element.document(), &element, parentStyle); 801 StyleResolverState state(element.document(), &element, parentStyle,
802 parentStyle);
794 state.setStyle(ComputedStyle::clone(baseStyle)); 803 state.setStyle(ComputedStyle::clone(baseStyle));
795 if (value) { 804 if (value) {
796 StyleBuilder::applyProperty(property, state, *value); 805 StyleBuilder::applyProperty(property, state, *value);
797 state.fontBuilder().createFont( 806 state.fontBuilder().createFont(
798 state.document().styleEngine().fontSelector(), state.mutableStyleRef()); 807 state.document().styleEngine().fontSelector(), state.mutableStyleRef());
799 } 808 }
800 return CSSAnimatableValueFactory::create(property, *state.style()); 809 return CSSAnimatableValueFactory::create(property, *state.style());
801 } 810 }
802 811
803 PseudoElement* StyleResolver::createPseudoElement(Element* parent, 812 PseudoElement* StyleResolver::createPseudoElement(Element* parent,
(...skipping 27 matching lines...) Expand all
831 return nullptr; 840 return nullptr;
832 841
833 ComputedStyle* parentStyle = parentLayoutObject->mutableStyle(); 842 ComputedStyle* parentStyle = parentLayoutObject->mutableStyle();
834 if (ComputedStyle* cachedStyle = 843 if (ComputedStyle* cachedStyle =
835 parentStyle->getCachedPseudoStyle(pseudoId)) { 844 parentStyle->getCachedPseudoStyle(pseudoId)) {
836 if (!pseudoElementLayoutObjectIsNeeded(cachedStyle)) 845 if (!pseudoElementLayoutObjectIsNeeded(cachedStyle))
837 return nullptr; 846 return nullptr;
838 return createPseudoElement(&parent, pseudoId); 847 return createPseudoElement(&parent, pseudoId);
839 } 848 }
840 849
841 StyleResolverState state(document(), &parent, parentStyle); 850 StyleResolverState state(document(), &parent, parentStyle, parentStyle);
842 if (!pseudoStyleForElementInternal(parent, pseudoId, parentStyle, state)) 851 if (!pseudoStyleForElementInternal(parent, pseudoId, parentStyle, state))
843 return nullptr; 852 return nullptr;
844 RefPtr<ComputedStyle> style = state.takeStyle(); 853 RefPtr<ComputedStyle> style = state.takeStyle();
845 DCHECK(style); 854 DCHECK(style);
846 parentStyle->addCachedPseudoStyle(style); 855 parentStyle->addCachedPseudoStyle(style);
847 856
848 if (!pseudoElementLayoutObjectIsNeeded(style.get())) 857 if (!pseudoElementLayoutObjectIsNeeded(style.get()))
849 return nullptr; 858 return nullptr;
850 859
851 PseudoElement* pseudo = createPseudoElement(&parent, pseudoId); 860 PseudoElement* pseudo = createPseudoElement(&parent, pseudoId);
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
932 941
933 if (state.style()->hasViewportUnits()) 942 if (state.style()->hasViewportUnits())
934 document().setHasViewportUnits(); 943 document().setHasViewportUnits();
935 944
936 return true; 945 return true;
937 } 946 }
938 947
939 PassRefPtr<ComputedStyle> StyleResolver::pseudoStyleForElement( 948 PassRefPtr<ComputedStyle> StyleResolver::pseudoStyleForElement(
940 Element* element, 949 Element* element,
941 const PseudoStyleRequest& pseudoStyleRequest, 950 const PseudoStyleRequest& pseudoStyleRequest,
942 const ComputedStyle* parentStyle) { 951 const ComputedStyle* parentStyle,
952 const ComputedStyle* parentLayoutObjectStyle) {
943 DCHECK(parentStyle); 953 DCHECK(parentStyle);
944 if (!element) 954 if (!element)
945 return nullptr; 955 return nullptr;
946 956
947 StyleResolverState state(document(), element, parentStyle); 957 StyleResolverState state(document(), element, parentStyle,
958 parentLayoutObjectStyle);
948 if (!pseudoStyleForElementInternal(*element, pseudoStyleRequest, parentStyle, 959 if (!pseudoStyleForElementInternal(*element, pseudoStyleRequest, parentStyle,
949 state)) { 960 state)) {
950 if (pseudoStyleRequest.type == PseudoStyleRequest::ForRenderer) 961 if (pseudoStyleRequest.type == PseudoStyleRequest::ForRenderer)
951 return nullptr; 962 return nullptr;
952 return state.takeStyle(); 963 return state.takeStyle();
953 } 964 }
954 965
955 if (PseudoElement* pseudoElement = 966 if (PseudoElement* pseudoElement =
956 element->pseudoElement(pseudoStyleRequest.pseudoId)) 967 element->pseudoElement(pseudoStyleRequest.pseudoId))
957 setAnimationUpdateIfNeeded(state, *pseudoElement); 968 setAnimationUpdateIfNeeded(state, *pseudoElement);
(...skipping 946 matching lines...) Expand 10 before | Expand all | Expand 10 after
1904 1915
1905 void StyleResolver::computeFont(ComputedStyle* style, 1916 void StyleResolver::computeFont(ComputedStyle* style,
1906 const StylePropertySet& propertySet) { 1917 const StylePropertySet& propertySet) {
1907 CSSPropertyID properties[] = { 1918 CSSPropertyID properties[] = {
1908 CSSPropertyFontSize, CSSPropertyFontFamily, CSSPropertyFontStretch, 1919 CSSPropertyFontSize, CSSPropertyFontFamily, CSSPropertyFontStretch,
1909 CSSPropertyFontStyle, CSSPropertyFontVariantCaps, CSSPropertyFontWeight, 1920 CSSPropertyFontStyle, CSSPropertyFontVariantCaps, CSSPropertyFontWeight,
1910 CSSPropertyLineHeight, 1921 CSSPropertyLineHeight,
1911 }; 1922 };
1912 1923
1913 // TODO(timloh): This is weird, the style is being used as its own parent 1924 // TODO(timloh): This is weird, the style is being used as its own parent
1914 StyleResolverState state(document(), nullptr, style); 1925 StyleResolverState state(document(), nullptr, style, style);
1915 state.setStyle(style); 1926 state.setStyle(style);
1916 1927
1917 for (CSSPropertyID property : properties) { 1928 for (CSSPropertyID property : properties) {
1918 if (property == CSSPropertyLineHeight) 1929 if (property == CSSPropertyLineHeight)
1919 updateFont(state); 1930 updateFont(state);
1920 StyleBuilder::applyProperty(property, state, 1931 StyleBuilder::applyProperty(property, state,
1921 *propertySet.getPropertyCSSValue(property)); 1932 *propertySet.getPropertyCSSValue(property));
1922 } 1933 }
1923 } 1934 }
1924 1935
1925 void StyleResolver::updateMediaType() { 1936 void StyleResolver::updateMediaType() {
1926 if (FrameView* view = document().view()) { 1937 if (FrameView* view = document().view()) {
1927 bool wasPrint = m_printMediaType; 1938 bool wasPrint = m_printMediaType;
1928 m_printMediaType = 1939 m_printMediaType =
1929 equalIgnoringCase(view->mediaType(), MediaTypeNames::print); 1940 equalIgnoringCase(view->mediaType(), MediaTypeNames::print);
1930 if (wasPrint != m_printMediaType) 1941 if (wasPrint != m_printMediaType)
1931 m_matchedPropertiesCache.clearViewportDependent(); 1942 m_matchedPropertiesCache.clearViewportDependent();
1932 } 1943 }
1933 } 1944 }
1934 1945
1935 DEFINE_TRACE(StyleResolver) { 1946 DEFINE_TRACE(StyleResolver) {
1936 visitor->trace(m_matchedPropertiesCache); 1947 visitor->trace(m_matchedPropertiesCache);
1937 visitor->trace(m_selectorFilter); 1948 visitor->trace(m_selectorFilter);
1938 visitor->trace(m_styleSharingLists); 1949 visitor->trace(m_styleSharingLists);
1939 visitor->trace(m_document); 1950 visitor->trace(m_document);
1940 visitor->trace(m_tracker); 1951 visitor->trace(m_tracker);
1941 } 1952 }
1942 1953
1943 } // namespace blink 1954 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698