OLD | NEW |
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 610 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
621 documentStyle->setDisplay(EDisplay::Block); | 621 documentStyle->setDisplay(EDisplay::Block); |
622 documentStyle->setPosition(AbsolutePosition); | 622 documentStyle->setPosition(AbsolutePosition); |
623 | 623 |
624 document.setupFontBuilder(*documentStyle); | 624 document.setupFontBuilder(*documentStyle); |
625 | 625 |
626 return documentStyle.release(); | 626 return documentStyle.release(); |
627 } | 627 } |
628 | 628 |
629 void StyleResolver::adjustComputedStyle(StyleResolverState& state, | 629 void StyleResolver::adjustComputedStyle(StyleResolverState& state, |
630 Element* element) { | 630 Element* element) { |
| 631 DCHECK(state.layoutParentStyle()); |
| 632 DCHECK(state.parentStyle()); |
631 StyleAdjuster::adjustComputedStyle(state.mutableStyleRef(), | 633 StyleAdjuster::adjustComputedStyle(state.mutableStyleRef(), |
632 *state.parentStyle(), element); | 634 *state.parentStyle(), |
| 635 *state.layoutParentStyle(), element); |
633 } | 636 } |
634 | 637 |
635 // Start loading resources referenced by this style. | 638 // Start loading resources referenced by this style. |
636 void StyleResolver::loadPendingResources(StyleResolverState& state) { | 639 void StyleResolver::loadPendingResources(StyleResolverState& state) { |
637 state.elementStyleResources().loadPendingResources(state.style()); | 640 state.elementStyleResources().loadPendingResources(state.style()); |
638 } | 641 } |
639 | 642 |
640 PassRefPtr<ComputedStyle> StyleResolver::styleForElement( | 643 PassRefPtr<ComputedStyle> StyleResolver::styleForElement( |
641 Element* element, | 644 Element* element, |
642 const ComputedStyle* defaultParent, | 645 const ComputedStyle* defaultParent, |
| 646 const ComputedStyle* defaultLayoutParent, |
643 StyleSharingBehavior sharingBehavior, | 647 StyleSharingBehavior sharingBehavior, |
644 RuleMatchingBehavior matchingBehavior) { | 648 RuleMatchingBehavior matchingBehavior) { |
645 DCHECK(document().frame()); | 649 DCHECK(document().frame()); |
646 DCHECK(document().settings()); | 650 DCHECK(document().settings()); |
647 DCHECK(!hasPendingAuthorStyleSheets()); | 651 DCHECK(!hasPendingAuthorStyleSheets()); |
648 | 652 |
649 // Once an element has a layoutObject, we don't try to destroy it, since | 653 // Once an element has a layoutObject, we don't try to destroy it, since |
650 // otherwise the layoutObject will vanish if a style recalc happens during | 654 // otherwise the layoutObject will vanish if a style recalc happens during |
651 // loading. | 655 // loading. |
652 if (sharingBehavior == AllowStyleSharing && !document().isRenderingReady() && | 656 if (sharingBehavior == AllowStyleSharing && !document().isRenderingReady() && |
(...skipping 17 matching lines...) Expand all Loading... |
670 ElementResolveContext elementContext(*element); | 674 ElementResolveContext elementContext(*element); |
671 | 675 |
672 if (RuntimeEnabledFeatures::styleSharingEnabled() && | 676 if (RuntimeEnabledFeatures::styleSharingEnabled() && |
673 sharingBehavior == AllowStyleSharing && | 677 sharingBehavior == AllowStyleSharing && |
674 (defaultParent || elementContext.parentStyle())) { | 678 (defaultParent || elementContext.parentStyle())) { |
675 if (RefPtr<ComputedStyle> sharedStyle = | 679 if (RefPtr<ComputedStyle> sharedStyle = |
676 document().styleEngine().findSharedStyle(elementContext)) | 680 document().styleEngine().findSharedStyle(elementContext)) |
677 return sharedStyle.release(); | 681 return sharedStyle.release(); |
678 } | 682 } |
679 | 683 |
680 StyleResolverState state(document(), elementContext, defaultParent); | 684 StyleResolverState state(document(), elementContext, defaultParent, |
| 685 defaultLayoutParent); |
681 | 686 |
682 ElementAnimations* elementAnimations = element->elementAnimations(); | 687 ElementAnimations* elementAnimations = element->elementAnimations(); |
683 const ComputedStyle* baseComputedStyle = | 688 const ComputedStyle* baseComputedStyle = |
684 elementAnimations ? elementAnimations->baseComputedStyle() : nullptr; | 689 elementAnimations ? elementAnimations->baseComputedStyle() : nullptr; |
685 | 690 |
686 if (baseComputedStyle) { | 691 if (baseComputedStyle) { |
687 state.setStyle(ComputedStyle::clone(*baseComputedStyle)); | 692 state.setStyle(ComputedStyle::clone(*baseComputedStyle)); |
688 if (!state.parentStyle()) | 693 if (!state.parentStyle()) { |
689 state.setParentStyle(initialStyleForElement()); | 694 state.setParentStyle(initialStyleForElement()); |
| 695 state.setLayoutParentStyle(state.parentStyle()); |
| 696 } |
690 } else { | 697 } else { |
691 if (state.parentStyle()) { | 698 if (state.parentStyle()) { |
692 RefPtr<ComputedStyle> style = ComputedStyle::create(); | 699 RefPtr<ComputedStyle> style = ComputedStyle::create(); |
693 style->inheritFrom(*state.parentStyle(), | 700 style->inheritFrom(*state.parentStyle(), |
694 isAtShadowBoundary(element) | 701 isAtShadowBoundary(element) |
695 ? ComputedStyleBase::AtShadowBoundary | 702 ? ComputedStyleBase::AtShadowBoundary |
696 : ComputedStyleBase::NotAtShadowBoundary); | 703 : ComputedStyleBase::NotAtShadowBoundary); |
697 state.setStyle(style.release()); | 704 state.setStyle(style.release()); |
698 } else { | 705 } else { |
699 state.setStyle(initialStyleForElement()); | 706 state.setStyle(initialStyleForElement()); |
700 state.setParentStyle(ComputedStyle::clone(*state.style())); | 707 state.setParentStyle(ComputedStyle::clone(*state.style())); |
| 708 state.setLayoutParentStyle(state.parentStyle()); |
701 } | 709 } |
702 } | 710 } |
703 | 711 |
704 // contenteditable attribute (implemented by -webkit-user-modify) should | 712 // contenteditable attribute (implemented by -webkit-user-modify) should |
705 // be propagated from shadow host to distributed node. | 713 // be propagated from shadow host to distributed node. |
706 if (state.distributedToInsertionPoint()) { | 714 if (state.distributedToInsertionPoint()) { |
707 if (Element* parent = element->parentElement()) { | 715 if (Element* parent = element->parentElement()) { |
708 if (ComputedStyle* styleOfShadowHost = parent->mutableComputedStyle()) | 716 if (ComputedStyle* styleOfShadowHost = parent->mutableComputedStyle()) |
709 state.style()->setUserModify(styleOfShadowHost->userModify()); | 717 state.style()->setUserModify(styleOfShadowHost->userModify()); |
710 } | 718 } |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
805 // TODO(alancutter): Create compositor keyframe values directly instead of | 813 // TODO(alancutter): Create compositor keyframe values directly instead of |
806 // intermediate AnimatableValues. | 814 // intermediate AnimatableValues. |
807 PassRefPtr<AnimatableValue> StyleResolver::createAnimatableValueSnapshot( | 815 PassRefPtr<AnimatableValue> StyleResolver::createAnimatableValueSnapshot( |
808 Element& element, | 816 Element& element, |
809 const ComputedStyle& baseStyle, | 817 const ComputedStyle& baseStyle, |
810 const ComputedStyle* parentStyle, | 818 const ComputedStyle* parentStyle, |
811 CSSPropertyID property, | 819 CSSPropertyID property, |
812 const CSSValue* value) { | 820 const CSSValue* value) { |
813 // TODO(alancutter): Avoid creating a StyleResolverState just to apply a | 821 // TODO(alancutter): Avoid creating a StyleResolverState just to apply a |
814 // single value on a ComputedStyle. | 822 // single value on a ComputedStyle. |
815 StyleResolverState state(element.document(), &element, parentStyle); | 823 StyleResolverState state(element.document(), &element, parentStyle, |
| 824 parentStyle); |
816 state.setStyle(ComputedStyle::clone(baseStyle)); | 825 state.setStyle(ComputedStyle::clone(baseStyle)); |
817 if (value) { | 826 if (value) { |
818 StyleBuilder::applyProperty(property, state, *value); | 827 StyleBuilder::applyProperty(property, state, *value); |
819 state.fontBuilder().createFont( | 828 state.fontBuilder().createFont( |
820 state.document().styleEngine().fontSelector(), state.mutableStyleRef()); | 829 state.document().styleEngine().fontSelector(), state.mutableStyleRef()); |
821 } | 830 } |
822 return CSSAnimatableValueFactory::create(property, *state.style()); | 831 return CSSAnimatableValueFactory::create(property, *state.style()); |
823 } | 832 } |
824 | 833 |
825 PseudoElement* StyleResolver::createPseudoElement(Element* parent, | 834 PseudoElement* StyleResolver::createPseudoElement(Element* parent, |
(...skipping 27 matching lines...) Expand all Loading... |
853 return nullptr; | 862 return nullptr; |
854 | 863 |
855 ComputedStyle* parentStyle = parentLayoutObject->mutableStyle(); | 864 ComputedStyle* parentStyle = parentLayoutObject->mutableStyle(); |
856 if (ComputedStyle* cachedStyle = | 865 if (ComputedStyle* cachedStyle = |
857 parentStyle->getCachedPseudoStyle(pseudoId)) { | 866 parentStyle->getCachedPseudoStyle(pseudoId)) { |
858 if (!pseudoElementLayoutObjectIsNeeded(cachedStyle)) | 867 if (!pseudoElementLayoutObjectIsNeeded(cachedStyle)) |
859 return nullptr; | 868 return nullptr; |
860 return createPseudoElement(&parent, pseudoId); | 869 return createPseudoElement(&parent, pseudoId); |
861 } | 870 } |
862 | 871 |
863 StyleResolverState state(document(), &parent, parentStyle); | 872 StyleResolverState state(document(), &parent, parentStyle, parentStyle); |
864 if (!pseudoStyleForElementInternal(parent, pseudoId, parentStyle, state)) | 873 if (!pseudoStyleForElementInternal(parent, pseudoId, parentStyle, state)) |
865 return nullptr; | 874 return nullptr; |
866 RefPtr<ComputedStyle> style = state.takeStyle(); | 875 RefPtr<ComputedStyle> style = state.takeStyle(); |
867 DCHECK(style); | 876 DCHECK(style); |
868 parentStyle->addCachedPseudoStyle(style); | 877 parentStyle->addCachedPseudoStyle(style); |
869 | 878 |
870 if (!pseudoElementLayoutObjectIsNeeded(style.get())) | 879 if (!pseudoElementLayoutObjectIsNeeded(style.get())) |
871 return nullptr; | 880 return nullptr; |
872 | 881 |
873 PseudoElement* pseudo = createPseudoElement(&parent, pseudoId); | 882 PseudoElement* pseudo = createPseudoElement(&parent, pseudoId); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
956 | 965 |
957 if (state.style()->hasViewportUnits()) | 966 if (state.style()->hasViewportUnits()) |
958 document().setHasViewportUnits(); | 967 document().setHasViewportUnits(); |
959 | 968 |
960 return true; | 969 return true; |
961 } | 970 } |
962 | 971 |
963 PassRefPtr<ComputedStyle> StyleResolver::pseudoStyleForElement( | 972 PassRefPtr<ComputedStyle> StyleResolver::pseudoStyleForElement( |
964 Element* element, | 973 Element* element, |
965 const PseudoStyleRequest& pseudoStyleRequest, | 974 const PseudoStyleRequest& pseudoStyleRequest, |
966 const ComputedStyle* parentStyle) { | 975 const ComputedStyle* parentStyle, |
| 976 const ComputedStyle* parentLayoutObjectStyle) { |
967 DCHECK(parentStyle); | 977 DCHECK(parentStyle); |
968 if (!element) | 978 if (!element) |
969 return nullptr; | 979 return nullptr; |
970 | 980 |
971 StyleResolverState state(document(), element, parentStyle); | 981 StyleResolverState state(document(), element, parentStyle, |
| 982 parentLayoutObjectStyle); |
972 if (!pseudoStyleForElementInternal(*element, pseudoStyleRequest, parentStyle, | 983 if (!pseudoStyleForElementInternal(*element, pseudoStyleRequest, parentStyle, |
973 state)) { | 984 state)) { |
974 if (pseudoStyleRequest.type == PseudoStyleRequest::ForRenderer) | 985 if (pseudoStyleRequest.type == PseudoStyleRequest::ForRenderer) |
975 return nullptr; | 986 return nullptr; |
976 return state.takeStyle(); | 987 return state.takeStyle(); |
977 } | 988 } |
978 | 989 |
979 if (PseudoElement* pseudoElement = | 990 if (PseudoElement* pseudoElement = |
980 element->pseudoElement(pseudoStyleRequest.pseudoId)) | 991 element->pseudoElement(pseudoStyleRequest.pseudoId)) |
981 setAnimationUpdateIfNeeded(state, *pseudoElement); | 992 setAnimationUpdateIfNeeded(state, *pseudoElement); |
(...skipping 835 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1817 | 1828 |
1818 void StyleResolver::computeFont(ComputedStyle* style, | 1829 void StyleResolver::computeFont(ComputedStyle* style, |
1819 const StylePropertySet& propertySet) { | 1830 const StylePropertySet& propertySet) { |
1820 CSSPropertyID properties[] = { | 1831 CSSPropertyID properties[] = { |
1821 CSSPropertyFontSize, CSSPropertyFontFamily, CSSPropertyFontStretch, | 1832 CSSPropertyFontSize, CSSPropertyFontFamily, CSSPropertyFontStretch, |
1822 CSSPropertyFontStyle, CSSPropertyFontVariantCaps, CSSPropertyFontWeight, | 1833 CSSPropertyFontStyle, CSSPropertyFontVariantCaps, CSSPropertyFontWeight, |
1823 CSSPropertyLineHeight, | 1834 CSSPropertyLineHeight, |
1824 }; | 1835 }; |
1825 | 1836 |
1826 // TODO(timloh): This is weird, the style is being used as its own parent | 1837 // TODO(timloh): This is weird, the style is being used as its own parent |
1827 StyleResolverState state(document(), nullptr, style); | 1838 StyleResolverState state(document(), nullptr, style, style); |
1828 state.setStyle(style); | 1839 state.setStyle(style); |
1829 | 1840 |
1830 for (CSSPropertyID property : properties) { | 1841 for (CSSPropertyID property : properties) { |
1831 if (property == CSSPropertyLineHeight) | 1842 if (property == CSSPropertyLineHeight) |
1832 updateFont(state); | 1843 updateFont(state); |
1833 StyleBuilder::applyProperty(property, state, | 1844 StyleBuilder::applyProperty(property, state, |
1834 *propertySet.getPropertyCSSValue(property)); | 1845 *propertySet.getPropertyCSSValue(property)); |
1835 } | 1846 } |
1836 } | 1847 } |
1837 | 1848 |
1838 void StyleResolver::updateMediaType() { | 1849 void StyleResolver::updateMediaType() { |
1839 if (FrameView* view = document().view()) { | 1850 if (FrameView* view = document().view()) { |
1840 m_printMediaType = | 1851 m_printMediaType = |
1841 equalIgnoringCase(view->mediaType(), MediaTypeNames::print); | 1852 equalIgnoringCase(view->mediaType(), MediaTypeNames::print); |
1842 } | 1853 } |
1843 } | 1854 } |
1844 | 1855 |
1845 DEFINE_TRACE(StyleResolver) { | 1856 DEFINE_TRACE(StyleResolver) { |
1846 visitor->trace(m_matchedPropertiesCache); | 1857 visitor->trace(m_matchedPropertiesCache); |
1847 visitor->trace(m_selectorFilter); | 1858 visitor->trace(m_selectorFilter); |
1848 visitor->trace(m_styleSharingLists); | 1859 visitor->trace(m_styleSharingLists); |
1849 visitor->trace(m_pendingStyleSheets); | 1860 visitor->trace(m_pendingStyleSheets); |
1850 visitor->trace(m_document); | 1861 visitor->trace(m_document); |
1851 visitor->trace(m_tracker); | 1862 visitor->trace(m_tracker); |
1852 } | 1863 } |
1853 | 1864 |
1854 } // namespace blink | 1865 } // namespace blink |
OLD | NEW |