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.
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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 #include "core/css/CSSValueList.h" | 52 #include "core/css/CSSValueList.h" |
53 #include "core/css/CSSValuePool.h" | 53 #include "core/css/CSSValuePool.h" |
54 #include "core/css/ElementRuleCollector.h" | 54 #include "core/css/ElementRuleCollector.h" |
55 #include "core/css/FontFace.h" | 55 #include "core/css/FontFace.h" |
56 #include "core/css/MediaQueryEvaluator.h" | 56 #include "core/css/MediaQueryEvaluator.h" |
57 #include "core/css/PageRuleCollector.h" | 57 #include "core/css/PageRuleCollector.h" |
58 #include "core/css/StylePropertySet.h" | 58 #include "core/css/StylePropertySet.h" |
59 #include "core/css/StyleRuleImport.h" | 59 #include "core/css/StyleRuleImport.h" |
60 #include "core/css/StyleSheetContents.h" | 60 #include "core/css/StyleSheetContents.h" |
61 #include "core/css/resolver/AnimatedStyleBuilder.h" | 61 #include "core/css/resolver/AnimatedStyleBuilder.h" |
| 62 #include "core/css/resolver/ElementResolveContext.h" |
62 #include "core/css/resolver/MatchResult.h" | 63 #include "core/css/resolver/MatchResult.h" |
63 #include "core/css/resolver/MediaQueryResult.h" | 64 #include "core/css/resolver/MediaQueryResult.h" |
64 #include "core/css/resolver/SharedStyleFinder.h" | 65 #include "core/css/resolver/SharedStyleFinder.h" |
65 #include "core/css/resolver/StyleAdjuster.h" | 66 #include "core/css/resolver/StyleAdjuster.h" |
66 #include "core/css/resolver/StyleResolverParentScope.h" | 67 #include "core/css/resolver/StyleResolverParentScope.h" |
67 #include "core/css/resolver/StyleResolverState.h" | 68 #include "core/css/resolver/StyleResolverState.h" |
68 #include "core/css/resolver/StyleResolverStats.h" | 69 #include "core/css/resolver/StyleResolverStats.h" |
69 #include "core/css/resolver/ViewportStyleResolver.h" | 70 #include "core/css/resolver/ViewportStyleResolver.h" |
70 #include "core/dom/CSSSelectorWatch.h" | 71 #include "core/dom/CSSSelectorWatch.h" |
71 #include "core/dom/NodeRenderStyle.h" | 72 #include "core/dom/NodeRenderStyle.h" |
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
565 document().setHasNodesWithPlaceholderStyle(); | 566 document().setHasNodesWithPlaceholderStyle(); |
566 return s_styleNotYetAvailable; | 567 return s_styleNotYetAvailable; |
567 } | 568 } |
568 | 569 |
569 didAccess(); | 570 didAccess(); |
570 | 571 |
571 StyleResolverParentScope::ensureParentStackIsPushed(); | 572 StyleResolverParentScope::ensureParentStackIsPushed(); |
572 | 573 |
573 if (element == document().documentElement()) | 574 if (element == document().documentElement()) |
574 resetDirectionAndWritingModeOnDocument(document()); | 575 resetDirectionAndWritingModeOnDocument(document()); |
575 StyleResolverState state(document(), element, defaultParent); | |
576 | 576 |
577 if (sharingBehavior == AllowStyleSharing && state.parentStyle()) { | 577 ElementResolveContext elementContext(document(), element, defaultParent); |
578 SharedStyleFinder styleFinder(state.elementContext(), m_features, m_sibl
ingRuleSet.get(), m_uncommonAttributeRuleSet.get(), *this); | 578 |
| 579 if (sharingBehavior == AllowStyleSharing && elementContext.parentStyle()) { |
| 580 SharedStyleFinder styleFinder(elementContext, m_features, m_siblingRuleS
et.get(), m_uncommonAttributeRuleSet.get(), *this); |
579 if (RefPtr<RenderStyle> sharedStyle = styleFinder.findSharedStyle()) | 581 if (RefPtr<RenderStyle> sharedStyle = styleFinder.findSharedStyle()) |
580 return sharedStyle.release(); | 582 return sharedStyle.release(); |
581 } | 583 } |
582 | 584 |
583 ActiveAnimations* activeAnimations = element->activeAnimations(); | 585 StyleResolverState state(elementContext); |
584 const RenderStyle* baseRenderStyle = activeAnimations ? activeAnimations->ba
seRenderStyle() : nullptr; | |
585 | 586 |
586 if (baseRenderStyle) { | 587 if (!elementContext.baseRenderStyle() && elementContext.parentStyle()) |
587 state.setStyle(RenderStyle::clone(baseRenderStyle)); | 588 state.style()->inheritFrom(elementContext.parentStyle(), isAtShadowBound
ary(element) ? RenderStyle::AtShadowBoundary : RenderStyle::NotAtShadowBoundary)
; |
588 } else if (state.parentStyle()) { | 589 |
589 state.setStyle(RenderStyle::create()); | |
590 state.style()->inheritFrom(state.parentStyle(), isAtShadowBoundary(eleme
nt) ? RenderStyle::AtShadowBoundary : RenderStyle::NotAtShadowBoundary); | |
591 } else { | |
592 state.setStyle(defaultStyleForElement()); | |
593 state.setParentStyle(RenderStyle::clone(state.style())); | |
594 } | |
595 // contenteditable attribute (implemented by -webkit-user-modify) should | 590 // contenteditable attribute (implemented by -webkit-user-modify) should |
596 // be propagated from shadow host to distributed node. | 591 // be propagated from shadow host to distributed node. |
597 if (state.distributedToInsertionPoint()) { | 592 if (state.distributedToInsertionPoint()) { |
598 if (Element* parent = element->parentElement()) { | 593 if (Element* parent = element->parentElement()) { |
599 if (RenderStyle* styleOfShadowHost = parent->renderStyle()) | 594 if (RenderStyle* styleOfShadowHost = parent->renderStyle()) |
600 state.style()->setUserModify(styleOfShadowHost->userModify()); | 595 state.style()->setUserModify(styleOfShadowHost->userModify()); |
601 } | 596 } |
602 } | 597 } |
603 | 598 |
604 if (element->isLink()) { | 599 if (element->isLink()) { |
605 state.style()->setIsLink(true); | 600 state.style()->setIsLink(true); |
606 EInsideLink linkState = state.elementLinkState(); | 601 EInsideLink linkState = state.elementLinkState(); |
607 if (linkState != NotInsideLink) { | 602 if (linkState != NotInsideLink) { |
608 bool forceVisited = InspectorInstrumentation::forcePseudoState(eleme
nt, CSSSelector::PseudoVisited); | 603 bool forceVisited = InspectorInstrumentation::forcePseudoState(eleme
nt, CSSSelector::PseudoVisited); |
609 if (forceVisited) | 604 if (forceVisited) |
610 linkState = InsideVisitedLink; | 605 linkState = InsideVisitedLink; |
611 } | 606 } |
612 state.style()->setInsideLink(linkState); | 607 state.style()->setInsideLink(linkState); |
613 } | 608 } |
614 | 609 |
615 if (!baseRenderStyle) { | 610 if (!elementContext.baseRenderStyle()) { |
616 | 611 |
617 bool needsCollection = false; | 612 bool needsCollection = false; |
618 CSSDefaultStyleSheets::instance().ensureDefaultStyleSheetsForElement(ele
ment, needsCollection); | 613 CSSDefaultStyleSheets::instance().ensureDefaultStyleSheetsForElement(ele
ment, needsCollection); |
619 if (needsCollection) | 614 if (needsCollection) |
620 collectFeatures(); | 615 collectFeatures(); |
621 | 616 |
622 ElementRuleCollector collector(state.elementContext(), m_selectorFilter,
state.style()); | 617 ElementRuleCollector collector(state.elementContext(), m_selectorFilter,
state.style()); |
623 | 618 |
624 matchAllRules(state, collector, matchingBehavior != MatchAllRulesExcludi
ngSMIL); | 619 matchAllRules(state, collector, matchingBehavior != MatchAllRulesExcludi
ngSMIL); |
625 | 620 |
626 applyMatchedProperties(state, collector.matchedResult()); | 621 applyMatchedProperties(state, collector.matchedResult()); |
627 applyCallbackSelectors(state); | 622 applyCallbackSelectors(state); |
628 | 623 |
629 addContentAttrValuesToFeatures(state.contentAttrValues(), m_features); | 624 addContentAttrValuesToFeatures(state.contentAttrValues(), m_features); |
630 | 625 |
631 // Cache our original display. | 626 // Cache our original display. |
632 state.style()->setOriginalDisplay(state.style()->display()); | 627 state.style()->setOriginalDisplay(state.style()->display()); |
633 | 628 |
634 adjustRenderStyle(state, element); | 629 adjustRenderStyle(state, element); |
635 | 630 |
636 if (activeAnimations) | 631 if (elementContext.activeAnimations()) |
637 activeAnimations->updateBaseRenderStyle(state.style()); | 632 elementContext.activeAnimations()->updateBaseRenderStyle(state.style
()); |
638 } | 633 } |
639 | 634 |
640 // FIXME: The CSSWG wants to specify that the effects of animations are appl
ied before | 635 // FIXME: The CSSWG wants to specify that the effects of animations are appl
ied before |
641 // important rules, but this currently happens here as we require adjustment
to have happened | 636 // important rules, but this currently happens here as we require adjustment
to have happened |
642 // before deciding which properties to transition. | 637 // before deciding which properties to transition. |
643 if (applyAnimatedProperties(state, element)) | 638 if (applyAnimatedProperties(state, element)) |
644 adjustRenderStyle(state, element); | 639 adjustRenderStyle(state, element); |
645 | 640 |
646 if (isHTMLBodyElement(*element)) | 641 if (isHTMLBodyElement(*element)) |
647 document().textLinkColors().setTextColor(state.style()->color()); | 642 document().textLinkColors().setTextColor(state.style()->color()); |
648 | 643 |
649 setAnimationUpdateIfNeeded(state, *element); | 644 setAnimationUpdateIfNeeded(state, *element); |
650 | 645 |
651 if (state.style()->hasViewportUnits()) | 646 if (state.style()->hasViewportUnits()) |
652 document().setHasViewportUnits(); | 647 document().setHasViewportUnits(); |
653 | 648 |
654 // Now return the style. | 649 // Now return the style. |
655 return state.takeStyle(); | 650 return state.takeStyle(); |
656 } | 651 } |
657 | 652 |
658 PassRefPtr<RenderStyle> StyleResolver::styleForKeyframe(Element& element, const
RenderStyle& elementStyle, RenderStyle* parentStyle, const StyleKeyframe* keyfra
me, const AtomicString& animationName) | 653 PassRefPtr<RenderStyle> StyleResolver::styleForKeyframe(Element& element, const
RenderStyle& elementStyle, RenderStyle* parentStyle, const StyleKeyframe* keyfra
me, const AtomicString& animationName) |
659 { | 654 { |
660 ASSERT(document().frame()); | 655 ASSERT(document().frame()); |
661 ASSERT(document().settings()); | 656 ASSERT(document().settings()); |
662 ASSERT(!hasPendingAuthorStyleSheets()); | 657 ASSERT(!hasPendingAuthorStyleSheets()); |
663 | 658 |
664 if (&element == document().documentElement()) | 659 if (&element == document().documentElement()) |
665 resetDirectionAndWritingModeOnDocument(document()); | 660 resetDirectionAndWritingModeOnDocument(document()); |
666 StyleResolverState state(document(), &element, parentStyle); | 661 StyleResolverState state(document(), &element, RenderStyle::clone(&elementSt
yle), parentStyle); |
667 | 662 |
668 MatchResult result; | 663 MatchResult result; |
669 result.addMatchedProperties(&keyframe->properties()); | 664 result.addMatchedProperties(&keyframe->properties()); |
670 | 665 |
671 ASSERT(!state.style()); | |
672 | |
673 // Create the style | |
674 state.setStyle(RenderStyle::clone(&elementStyle)); | |
675 state.setLineHeightValue(0); | |
676 | 666 |
677 // We don't need to bother with !important. Since there is only ever one | 667 // 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. | 668 // 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 | 669 // 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 | 670 // relevant one is animation-timing-function and we special-case that in |
681 // CSSAnimations.cpp | 671 // CSSAnimations.cpp |
682 bool inheritedOnly = false; | 672 bool inheritedOnly = false; |
683 applyMatchedProperties<HighPriorityProperties>(state, result, false, 0, resu
lt.matchedProperties.size() - 1, inheritedOnly); | 673 applyMatchedProperties<HighPriorityProperties>(state, result, false, 0, resu
lt.matchedProperties.size() - 1, inheritedOnly); |
684 | 674 |
685 // If our font got dirtied, go ahead and update it now. | 675 // If our font got dirtied, go ahead and update it now. |
686 updateFont(state); | 676 updateFont(state); |
687 | 677 |
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. | 678 // Now do rest of the properties. |
693 applyMatchedProperties<LowPriorityProperties>(state, result, false, 0, resul
t.matchedProperties.size() - 1, inheritedOnly); | 679 applyMatchedProperties<LowPriorityProperties>(state, result, false, 0, resul
t.matchedProperties.size() - 1, inheritedOnly); |
694 | 680 |
695 loadPendingResources(state); | 681 loadPendingResources(state); |
696 | 682 |
697 didAccess(); | 683 didAccess(); |
698 | 684 |
699 return state.takeStyle(); | 685 return state.takeStyle(); |
700 } | 686 } |
701 | 687 |
702 // This function is used by the WebAnimations JavaScript API method animate(). | 688 // This function is used by the WebAnimations JavaScript API method animate(). |
703 // FIXME: Remove this when animate() switches away from resolution-dependent par
sing. | 689 // FIXME: Remove this when animate() switches away from resolution-dependent par
sing. |
704 PassRefPtrWillBeRawPtr<AnimatableValue> StyleResolver::createAnimatableValueSnap
shot(Element& element, CSSPropertyID property, CSSValue& value) | 690 PassRefPtrWillBeRawPtr<AnimatableValue> StyleResolver::createAnimatableValueSnap
shot(Element& element, CSSPropertyID property, CSSValue& value) |
705 { | 691 { |
706 RefPtr<RenderStyle> style; | 692 RefPtr<RenderStyle> style; |
707 if (element.renderStyle()) | 693 if (element.renderStyle()) |
708 style = RenderStyle::clone(element.renderStyle()); | 694 style = RenderStyle::clone(element.renderStyle()); |
709 else | 695 else |
710 style = RenderStyle::create(); | 696 style = RenderStyle::create(); |
711 StyleResolverState state(element.document(), &element); | 697 StyleResolverState state(element.document(), &element, style); |
712 state.setStyle(style); | |
713 return createAnimatableValueSnapshot(state, property, value); | 698 return createAnimatableValueSnapshot(state, property, value); |
714 } | 699 } |
715 | 700 |
716 PassRefPtrWillBeRawPtr<AnimatableValue> StyleResolver::createAnimatableValueSnap
shot(StyleResolverState& state, CSSPropertyID property, CSSValue& value) | 701 PassRefPtrWillBeRawPtr<AnimatableValue> StyleResolver::createAnimatableValueSnap
shot(StyleResolverState& state, CSSPropertyID property, CSSValue& value) |
717 { | 702 { |
718 StyleBuilder::applyProperty(property, state, &value); | 703 StyleBuilder::applyProperty(property, state, &value); |
719 return CSSAnimatableValueFactory::create(property, *state.style()); | 704 return CSSAnimatableValueFactory::create(property, *state.style()); |
720 } | 705 } |
721 | 706 |
722 PassRefPtrWillBeRawPtr<PseudoElement> StyleResolver::createPseudoElementIfNeeded
(Element& parent, PseudoId pseudoId) | 707 PassRefPtrWillBeRawPtr<PseudoElement> StyleResolver::createPseudoElementIfNeeded
(Element& parent, PseudoId pseudoId) |
(...skipping 11 matching lines...) Expand all Loading... |
734 if (!parentRenderer->canHaveGeneratedChildren()) | 719 if (!parentRenderer->canHaveGeneratedChildren()) |
735 return nullptr; | 720 return nullptr; |
736 | 721 |
737 RenderStyle* parentStyle = parentRenderer->style(); | 722 RenderStyle* parentStyle = parentRenderer->style(); |
738 if (RenderStyle* cachedStyle = parentStyle->getCachedPseudoStyle(pseudoId))
{ | 723 if (RenderStyle* cachedStyle = parentStyle->getCachedPseudoStyle(pseudoId))
{ |
739 if (!pseudoElementRendererIsNeeded(cachedStyle)) | 724 if (!pseudoElementRendererIsNeeded(cachedStyle)) |
740 return nullptr; | 725 return nullptr; |
741 return PseudoElement::create(&parent, pseudoId); | 726 return PseudoElement::create(&parent, pseudoId); |
742 } | 727 } |
743 | 728 |
744 StyleResolverState state(document(), &parent, parentStyle); | 729 ElementResolveContext elementContext(document(), &parent, parentStyle); |
745 if (!pseudoStyleForElementInternal(parent, pseudoId, parentStyle, state)) | 730 StyleResolverState state(elementContext); |
| 731 if (!pseudoStyleForElementInternal(pseudoId, parentStyle, state)) |
746 return nullptr; | 732 return nullptr; |
747 RefPtr<RenderStyle> style = state.takeStyle(); | 733 RefPtr<RenderStyle> style = state.takeStyle(); |
748 ASSERT(style); | 734 ASSERT(style); |
749 parentStyle->addCachedPseudoStyle(style); | 735 parentStyle->addCachedPseudoStyle(style); |
750 | 736 |
751 if (!pseudoElementRendererIsNeeded(style.get())) | 737 if (!pseudoElementRendererIsNeeded(style.get())) |
752 return nullptr; | 738 return nullptr; |
753 | 739 |
754 RefPtrWillBeRawPtr<PseudoElement> pseudo = PseudoElement::create(&parent, ps
eudoId); | 740 RefPtrWillBeRawPtr<PseudoElement> pseudo = PseudoElement::create(&parent, ps
eudoId); |
755 | 741 |
756 setAnimationUpdateIfNeeded(state, *pseudo); | 742 setAnimationUpdateIfNeeded(state, *pseudo); |
757 if (ActiveAnimations* activeAnimations = pseudo->activeAnimations()) | 743 if (ActiveAnimations* activeAnimations = pseudo->activeAnimations()) |
758 activeAnimations->cssAnimations().maybeApplyPendingUpdate(pseudo.get()); | 744 activeAnimations->cssAnimations().maybeApplyPendingUpdate(pseudo.get()); |
759 return pseudo.release(); | 745 return pseudo.release(); |
760 } | 746 } |
761 | 747 |
762 bool StyleResolver::pseudoStyleForElementInternal(Element& element, const Pseudo
StyleRequest& pseudoStyleRequest, RenderStyle* parentStyle, StyleResolverState&
state) | 748 bool StyleResolver::pseudoStyleForElementInternal(const PseudoStyleRequest& pseu
doStyleRequest, RenderStyle* parentStyle, StyleResolverState& state) |
763 { | 749 { |
764 ASSERT(document().frame()); | 750 ASSERT(document().frame()); |
765 ASSERT(document().settings()); | 751 ASSERT(document().settings()); |
766 ASSERT(pseudoStyleRequest.pseudoId != FIRST_LINE_INHERITED); | 752 ASSERT(pseudoStyleRequest.pseudoId != FIRST_LINE_INHERITED); |
767 | 753 |
768 StyleResolverParentScope::ensureParentStackIsPushed(); | 754 StyleResolverParentScope::ensureParentStackIsPushed(); |
769 | 755 |
770 Element* pseudoElement = element.pseudoElement(pseudoStyleRequest.pseudoId); | 756 const ElementResolveContext& elementContext = state.elementContext(); |
771 | 757 Element* pseudoElement = elementContext.element()->pseudoElement(pseudoStyle
Request.pseudoId); |
772 ActiveAnimations* activeAnimations = pseudoElement ? pseudoElement->activeAn
imations() : nullptr; | |
773 const RenderStyle* baseRenderStyle = activeAnimations ? activeAnimations->ba
seRenderStyle() : nullptr; | |
774 | |
775 if (baseRenderStyle) { | |
776 state.setStyle(RenderStyle::clone(baseRenderStyle)); | |
777 } else if (pseudoStyleRequest.allowsInheritance(state.parentStyle())) { | |
778 state.setStyle(RenderStyle::create()); | |
779 state.style()->inheritFrom(state.parentStyle()); | |
780 } else { | |
781 state.setStyle(defaultStyleForElement()); | |
782 state.setParentStyle(RenderStyle::clone(state.style())); | |
783 } | |
784 | 758 |
785 state.style()->setStyleType(pseudoStyleRequest.pseudoId); | 759 state.style()->setStyleType(pseudoStyleRequest.pseudoId); |
786 | 760 |
787 // Since we don't use pseudo-elements in any of our quirk/print | 761 // Since we don't use pseudo-elements in any of our quirk/print |
788 // user agent rules, don't waste time walking those rules. | 762 // user agent rules, don't waste time walking those rules. |
789 | 763 |
790 if (!baseRenderStyle) { | 764 if (!elementContext.baseRenderStyle()) { |
| 765 |
| 766 if (pseudoStyleRequest.allowsInheritance(elementContext.parentStyle())) |
| 767 state.style()->inheritFrom(elementContext.parentStyle()); |
| 768 |
791 // Check UA, user and author rules. | 769 // Check UA, user and author rules. |
792 ElementRuleCollector collector(state.elementContext(), m_selectorFilter,
state.style()); | 770 ElementRuleCollector collector(elementContext, m_selectorFilter, state.s
tyle()); |
793 collector.setPseudoStyleRequest(pseudoStyleRequest); | 771 collector.setPseudoStyleRequest(pseudoStyleRequest); |
794 | 772 |
795 matchUARules(collector); | 773 matchUARules(collector); |
796 matchAuthorRules(state.element(), collector, false); | 774 matchAuthorRules(state.element(), collector, false); |
797 | 775 |
798 if (collector.matchedResult().matchedProperties.isEmpty()) | 776 if (collector.matchedResult().matchedProperties.isEmpty()) |
799 return false; | 777 return false; |
800 | 778 |
801 applyMatchedProperties(state, collector.matchedResult()); | 779 applyMatchedProperties(state, collector.matchedResult()); |
802 applyCallbackSelectors(state); | 780 applyCallbackSelectors(state); |
803 | 781 |
804 addContentAttrValuesToFeatures(state.contentAttrValues(), m_features); | 782 addContentAttrValuesToFeatures(state.contentAttrValues(), m_features); |
805 | 783 |
806 // Cache our original display. | 784 // Cache our original display. |
807 state.style()->setOriginalDisplay(state.style()->display()); | 785 state.style()->setOriginalDisplay(state.style()->display()); |
808 | 786 |
809 // FIXME: Passing 0 as the Element* introduces a lot of complexity | 787 // FIXME: Passing 0 as the Element* introduces a lot of complexity |
810 // in the adjustRenderStyle code. | 788 // in the adjustRenderStyle code. |
811 adjustRenderStyle(state, 0); | 789 adjustRenderStyle(state, 0); |
812 | 790 |
813 if (activeAnimations) | 791 if (elementContext.activeAnimations()) |
814 activeAnimations->updateBaseRenderStyle(state.style()); | 792 elementContext.activeAnimations()->updateBaseRenderStyle(state.style
()); |
815 } | 793 } |
816 | 794 |
817 // FIXME: The CSSWG wants to specify that the effects of animations are appl
ied before | 795 // FIXME: The CSSWG wants to specify that the effects of animations are appl
ied before |
818 // important rules, but this currently happens here as we require adjustment
to have happened | 796 // important rules, but this currently happens here as we require adjustment
to have happened |
819 // before deciding which properties to transition. | 797 // before deciding which properties to transition. |
820 if (applyAnimatedProperties(state, pseudoElement)) | 798 if (applyAnimatedProperties(state, pseudoElement)) |
821 adjustRenderStyle(state, 0); | 799 adjustRenderStyle(state, 0); |
822 | 800 |
823 didAccess(); | 801 didAccess(); |
824 | 802 |
825 if (state.style()->hasViewportUnits()) | 803 if (state.style()->hasViewportUnits()) |
826 document().setHasViewportUnits(); | 804 document().setHasViewportUnits(); |
827 | 805 |
828 return true; | 806 return true; |
829 } | 807 } |
830 | 808 |
831 PassRefPtr<RenderStyle> StyleResolver::pseudoStyleForElement(Element* element, c
onst PseudoStyleRequest& pseudoStyleRequest, RenderStyle* parentStyle) | 809 PassRefPtr<RenderStyle> StyleResolver::pseudoStyleForElement(Element* element, c
onst PseudoStyleRequest& pseudoStyleRequest, RenderStyle* parentStyle) |
832 { | 810 { |
833 ASSERT(parentStyle); | 811 ASSERT(parentStyle); |
834 if (!element) | 812 if (!element) |
835 return nullptr; | 813 return nullptr; |
836 | 814 |
837 StyleResolverState state(document(), element, parentStyle); | 815 ElementResolveContext elementContext(document(), element, parentStyle); |
838 if (!pseudoStyleForElementInternal(*element, pseudoStyleRequest, parentStyle
, state)) { | 816 StyleResolverState state(elementContext); |
| 817 if (!pseudoStyleForElementInternal(pseudoStyleRequest, parentStyle, state))
{ |
839 if (pseudoStyleRequest.type == PseudoStyleRequest::ForRenderer) | 818 if (pseudoStyleRequest.type == PseudoStyleRequest::ForRenderer) |
840 return nullptr; | 819 return nullptr; |
841 return state.takeStyle(); | 820 return state.takeStyle(); |
842 } | 821 } |
843 | 822 |
844 if (PseudoElement* pseudoElement = element->pseudoElement(pseudoStyleRequest
.pseudoId)) | 823 if (PseudoElement* pseudoElement = element->pseudoElement(pseudoStyleRequest
.pseudoId)) |
845 setAnimationUpdateIfNeeded(state, *pseudoElement); | 824 setAnimationUpdateIfNeeded(state, *pseudoElement); |
846 | 825 |
847 // Now return the style. | 826 // Now return the style. |
848 return state.takeStyle(); | 827 return state.takeStyle(); |
849 } | 828 } |
850 | 829 |
851 PassRefPtr<RenderStyle> StyleResolver::styleForPage(int pageIndex) | 830 PassRefPtr<RenderStyle> StyleResolver::styleForPage(int pageIndex) |
852 { | 831 { |
853 ASSERT(!hasPendingAuthorStyleSheets()); | 832 ASSERT(!hasPendingAuthorStyleSheets()); |
854 resetDirectionAndWritingModeOnDocument(document()); | 833 resetDirectionAndWritingModeOnDocument(document()); |
855 StyleResolverState state(document(), document().documentElement()); // m_roo
tElementStyle will be set to the document style. | 834 StyleResolverState state(document(), document().documentElement(), RenderSty
le::create()); // m_rootElementStyle will be set to the document style. |
856 | 835 |
857 state.setStyle(RenderStyle::create()); | |
858 const RenderStyle* rootElementStyle = state.rootElementStyle() ? state.rootE
lementStyle() : document().renderStyle(); | 836 const RenderStyle* rootElementStyle = state.rootElementStyle() ? state.rootE
lementStyle() : document().renderStyle(); |
859 ASSERT(rootElementStyle); | 837 ASSERT(rootElementStyle); |
860 state.style()->inheritFrom(rootElementStyle); | 838 state.style()->inheritFrom(rootElementStyle); |
861 | 839 |
862 PageRuleCollector collector(rootElementStyle, pageIndex); | 840 PageRuleCollector collector(rootElementStyle, pageIndex); |
863 | 841 |
864 collector.matchPageRules(CSSDefaultStyleSheets::instance().defaultPrintStyle
()); | 842 collector.matchPageRules(CSSDefaultStyleSheets::instance().defaultPrintStyle
()); |
865 | 843 |
866 if (ScopedStyleResolver* scopedResolver = document().scopedStyleResolver()) | 844 if (ScopedStyleResolver* scopedResolver = document().scopedStyleResolver()) |
867 scopedResolver->matchPageRules(collector); | 845 scopedResolver->matchPageRules(collector); |
868 | 846 |
869 state.setLineHeightValue(0); | |
870 bool inheritedOnly = false; | 847 bool inheritedOnly = false; |
871 | 848 |
872 MatchResult& result = collector.matchedResult(); | 849 MatchResult& result = collector.matchedResult(); |
873 applyMatchedProperties<HighPriorityProperties>(state, result, false, 0, resu
lt.matchedProperties.size() - 1, inheritedOnly); | 850 applyMatchedProperties<HighPriorityProperties>(state, result, false, 0, resu
lt.matchedProperties.size() - 1, inheritedOnly); |
874 | 851 |
875 // If our font got dirtied, go ahead and update it now. | 852 // If our font got dirtied, go ahead and update it now. |
876 updateFont(state); | 853 updateFont(state); |
877 | 854 |
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); | 855 applyMatchedProperties<LowPriorityProperties>(state, result, false, 0, resul
t.matchedProperties.size() - 1, inheritedOnly); |
883 | 856 |
884 addContentAttrValuesToFeatures(state.contentAttrValues(), m_features); | 857 addContentAttrValuesToFeatures(state.contentAttrValues(), m_features); |
885 | 858 |
886 loadPendingResources(state); | 859 loadPendingResources(state); |
887 | 860 |
888 didAccess(); | 861 didAccess(); |
889 | 862 |
890 // Now return the style. | 863 // Now return the style. |
891 return state.takeStyle(); | 864 return state.takeStyle(); |
892 } | 865 } |
893 | 866 |
894 void StyleResolver::collectViewportRules() | 867 void StyleResolver::collectViewportRules() |
895 { | 868 { |
896 CSSDefaultStyleSheets& defaultStyleSheets = CSSDefaultStyleSheets::instance(
); | 869 CSSDefaultStyleSheets& defaultStyleSheets = CSSDefaultStyleSheets::instance(
); |
897 viewportStyleResolver()->collectViewportRules(defaultStyleSheets.defaultStyl
e(), ViewportStyleResolver::UserAgentOrigin); | 870 viewportStyleResolver()->collectViewportRules(defaultStyleSheets.defaultStyl
e(), ViewportStyleResolver::UserAgentOrigin); |
898 | 871 |
899 if (!InspectorInstrumentation::applyViewportStyleOverride(&document(), this)
) | 872 if (!InspectorInstrumentation::applyViewportStyleOverride(&document(), this)
) |
900 viewportStyleResolver()->collectViewportRules(defaultStyleSheets.default
ViewportStyle(), ViewportStyleResolver::UserAgentOrigin); | 873 viewportStyleResolver()->collectViewportRules(defaultStyleSheets.default
ViewportStyle(), ViewportStyleResolver::UserAgentOrigin); |
901 | 874 |
902 if (document().isMobileDocument()) | 875 if (document().isMobileDocument()) |
903 viewportStyleResolver()->collectViewportRules(defaultStyleSheets.default
XHTMLMobileProfileStyle(), ViewportStyleResolver::UserAgentOrigin); | 876 viewportStyleResolver()->collectViewportRules(defaultStyleSheets.default
XHTMLMobileProfileStyle(), ViewportStyleResolver::UserAgentOrigin); |
904 | 877 |
905 if (ScopedStyleResolver* scopedResolver = document().scopedStyleResolver()) | 878 if (ScopedStyleResolver* scopedResolver = document().scopedStyleResolver()) |
906 scopedResolver->collectViewportRulesTo(this); | 879 scopedResolver->collectViewportRulesTo(this); |
907 | 880 |
908 viewportStyleResolver()->resolve(); | 881 viewportStyleResolver()->resolve(); |
909 } | 882 } |
910 | 883 |
911 PassRefPtr<RenderStyle> StyleResolver::defaultStyleForElement() | |
912 { | |
913 StyleResolverState state(document(), 0); | |
914 state.setStyle(RenderStyle::create()); | |
915 state.style()->setLineHeight(RenderStyle::initialLineHeight()); | |
916 state.setLineHeightValue(0); | |
917 state.fontBuilder().setInitial(state.style()->effectiveZoom()); | |
918 state.style()->font().update(document().styleEngine()->fontSelector()); | |
919 return state.takeStyle(); | |
920 } | |
921 | |
922 PassRefPtr<RenderStyle> StyleResolver::styleForText(Text* textNode) | 884 PassRefPtr<RenderStyle> StyleResolver::styleForText(Text* textNode) |
923 { | 885 { |
924 ASSERT(textNode); | 886 ASSERT(textNode); |
925 | 887 |
926 Node* parentNode = NodeRenderingTraversal::parent(textNode); | 888 Node* parentNode = NodeRenderingTraversal::parent(textNode); |
927 if (!parentNode || !parentNode->renderStyle()) | 889 if (!parentNode || !parentNode->renderStyle()) |
928 return defaultStyleForElement(); | 890 return StyleResolverState::defaultStyleForElement(document()); |
929 return parentNode->renderStyle(); | 891 return parentNode->renderStyle(); |
930 } | 892 } |
931 | 893 |
932 void StyleResolver::updateFont(StyleResolverState& state) | 894 void StyleResolver::updateFont(StyleResolverState& state) |
933 { | 895 { |
934 state.fontBuilder().createFont(document().styleEngine()->fontSelector(), sta
te.parentStyle(), state.style()); | 896 state.fontBuilder().createFont(document().styleEngine()->fontSelector(), sta
te.parentStyle(), state.style()); |
935 } | 897 } |
936 | 898 |
937 PassRefPtrWillBeRawPtr<StyleRuleList> StyleResolver::styleRulesForElement(Elemen
t* element, unsigned rulesToInclude) | 899 PassRefPtrWillBeRawPtr<StyleRuleList> StyleResolver::styleRulesForElement(Elemen
t* element, unsigned rulesToInclude) |
938 { | 900 { |
939 ASSERT(element); | 901 ASSERT(element); |
940 StyleResolverState state(document(), element); | 902 ElementResolveContext elementContext(document(), element, nullptr); |
941 ElementRuleCollector collector(state.elementContext(), m_selectorFilter, sta
te.style()); | 903 ElementRuleCollector collector(elementContext, m_selectorFilter, nullptr); |
942 collector.setMode(SelectorChecker::CollectingStyleRules); | 904 collector.setMode(SelectorChecker::CollectingStyleRules); |
943 collectPseudoRulesForElement(element, collector, NOPSEUDO, rulesToInclude); | 905 collectPseudoRulesForElement(element, collector, NOPSEUDO, rulesToInclude); |
944 return collector.matchedStyleRuleList(); | 906 return collector.matchedStyleRuleList(); |
945 } | 907 } |
946 | 908 |
947 PassRefPtrWillBeRawPtr<CSSRuleList> StyleResolver::pseudoCSSRulesForElement(Elem
ent* element, PseudoId pseudoId, unsigned rulesToInclude) | 909 PassRefPtrWillBeRawPtr<CSSRuleList> StyleResolver::pseudoCSSRulesForElement(Elem
ent* element, PseudoId pseudoId, unsigned rulesToInclude) |
948 { | 910 { |
949 ASSERT(element); | 911 ASSERT(element); |
950 StyleResolverState state(document(), element); | 912 ElementResolveContext elementContext(document(), element, nullptr); |
951 ElementRuleCollector collector(state.elementContext(), m_selectorFilter, sta
te.style()); | 913 ElementRuleCollector collector(elementContext, m_selectorFilter, nullptr); |
952 collector.setMode(SelectorChecker::CollectingCSSRules); | 914 collector.setMode(SelectorChecker::CollectingCSSRules); |
953 collectPseudoRulesForElement(element, collector, pseudoId, rulesToInclude); | 915 collectPseudoRulesForElement(element, collector, pseudoId, rulesToInclude); |
954 return collector.matchedCSSRuleList(); | 916 return collector.matchedCSSRuleList(); |
955 } | 917 } |
956 | 918 |
957 PassRefPtrWillBeRawPtr<CSSRuleList> StyleResolver::cssRulesForElement(Element* e
lement, unsigned rulesToInclude) | 919 PassRefPtrWillBeRawPtr<CSSRuleList> StyleResolver::cssRulesForElement(Element* e
lement, unsigned rulesToInclude) |
958 { | 920 { |
959 return pseudoCSSRulesForElement(element, NOPSEUDO, rulesToInclude); | 921 return pseudoCSSRulesForElement(element, NOPSEUDO, rulesToInclude); |
960 } | 922 } |
961 | 923 |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1246 // lastCSSPropertyId<HighPriorityProperties>. | 1208 // lastCSSPropertyId<HighPriorityProperties>. |
1247 template<> CSSPropertyID StyleResolver::firstCSSPropertyId<StyleResolver::HighPr
iorityProperties>() | 1209 template<> CSSPropertyID StyleResolver::firstCSSPropertyId<StyleResolver::HighPr
iorityProperties>() |
1248 { | 1210 { |
1249 COMPILE_ASSERT(CSSPropertyColor == firstCSSProperty, CSS_color_is_first_high
_priority_property); | 1211 COMPILE_ASSERT(CSSPropertyColor == firstCSSProperty, CSS_color_is_first_high
_priority_property); |
1250 return CSSPropertyColor; | 1212 return CSSPropertyColor; |
1251 } | 1213 } |
1252 | 1214 |
1253 // This method returns the last CSSPropertyId of high priority properties. | 1215 // This method returns the last CSSPropertyId of high priority properties. |
1254 template<> CSSPropertyID StyleResolver::lastCSSPropertyId<StyleResolver::HighPri
orityProperties>() | 1216 template<> CSSPropertyID StyleResolver::lastCSSPropertyId<StyleResolver::HighPri
orityProperties>() |
1255 { | 1217 { |
1256 COMPILE_ASSERT(CSSPropertyLineHeight == CSSPropertyColor + 17, CSS_line_heig
ht_is_end_of_high_prioity_property_range); | 1218 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); | 1219 COMPILE_ASSERT(CSSPropertyTextRendering == CSSPropertyZoom - 1, CSS_text_ren
dering_is_before_zoom); |
1258 return CSSPropertyLineHeight; | 1220 return CSSPropertyZoom; |
1259 } | 1221 } |
1260 | 1222 |
1261 // This method returns the first CSSPropertyId of remaining properties, | 1223 // This method returns the first CSSPropertyId of remaining properties, |
1262 // i.e. low priority properties. No properties depend on low priority | 1224 // i.e. low priority properties. No properties depend on low priority |
1263 // properties. So we don't need to resolve such properties quickly. | 1225 // properties. So we don't need to resolve such properties quickly. |
1264 // All low priority properties are obtained by using | 1226 // All low priority properties are obtained by using |
1265 // firstCSSPropertyId<LowPriorityProperties> and | 1227 // firstCSSPropertyId<LowPriorityProperties> and |
1266 // lastCSSPropertyId<LowPriorityProperties>. | 1228 // lastCSSPropertyId<LowPriorityProperties>. |
1267 template<> CSSPropertyID StyleResolver::firstCSSPropertyId<StyleResolver::LowPri
orityProperties>() | 1229 template<> CSSPropertyID StyleResolver::firstCSSPropertyId<StyleResolver::LowPri
orityProperties>() |
1268 { | 1230 { |
1269 COMPILE_ASSERT(CSSPropertyAlignContent == CSSPropertyLineHeight + 1, CSS_bac
kground_is_first_low_priority_property); | 1231 COMPILE_ASSERT(CSSPropertyAlignContent == CSSPropertyZoom + 1, CSS_align_con
tent_is_first_low_priority_property); |
1270 return CSSPropertyAlignContent; | 1232 return CSSPropertyAlignContent; |
1271 } | 1233 } |
1272 | 1234 |
1273 // This method returns the last CSSPropertyId of low priority properties. | 1235 // This method returns the last CSSPropertyId of low priority properties. |
1274 template<> CSSPropertyID StyleResolver::lastCSSPropertyId<StyleResolver::LowPrio
rityProperties>() | 1236 template<> CSSPropertyID StyleResolver::lastCSSPropertyId<StyleResolver::LowPrio
rityProperties>() |
1275 { | 1237 { |
1276 return static_cast<CSSPropertyID>(lastCSSProperty); | 1238 return static_cast<CSSPropertyID>(lastCSSProperty); |
1277 } | 1239 } |
1278 | 1240 |
1279 template <StyleResolver::StyleApplicationPass pass> | 1241 template <StyleResolver::StyleApplicationPass pass> |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1342 ASSERT(!current.value()->isInheritedValue()); | 1304 ASSERT(!current.value()->isInheritedValue()); |
1343 continue; | 1305 continue; |
1344 } | 1306 } |
1345 | 1307 |
1346 if (propertyWhitelistType == PropertyWhitelistCue && !isValidCueStylePro
perty(property)) | 1308 if (propertyWhitelistType == PropertyWhitelistCue && !isValidCueStylePro
perty(property)) |
1347 continue; | 1309 continue; |
1348 if (propertyWhitelistType == PropertyWhitelistFirstLetter && !isValidFir
stLetterStyleProperty(property)) | 1310 if (propertyWhitelistType == PropertyWhitelistFirstLetter && !isValidFir
stLetterStyleProperty(property)) |
1349 continue; | 1311 continue; |
1350 if (!isPropertyForPass<pass>(property)) | 1312 if (!isPropertyForPass<pass>(property)) |
1351 continue; | 1313 continue; |
1352 if (pass == HighPriorityProperties && property == CSSPropertyLineHeight) | 1314 |
1353 state.setLineHeightValue(current.value()); | 1315 StyleBuilder::applyProperty(current.id(), state, current.value()); |
1354 else | |
1355 StyleBuilder::applyProperty(current.id(), state, current.value()); | |
1356 } | 1316 } |
1357 } | 1317 } |
1358 | 1318 |
1359 template <StyleResolver::StyleApplicationPass pass> | 1319 template <StyleResolver::StyleApplicationPass pass> |
1360 void StyleResolver::applyMatchedProperties(StyleResolverState& state, const Matc
hResult& matchResult, bool isImportant, int startIndex, int endIndex, bool inher
itedOnly) | 1320 void StyleResolver::applyMatchedProperties(StyleResolverState& state, const Matc
hResult& matchResult, bool isImportant, int startIndex, int endIndex, bool inher
itedOnly) |
1361 { | 1321 { |
1362 if (startIndex == -1) | 1322 if (startIndex == -1) |
1363 return; | 1323 return; |
1364 | 1324 |
1365 if (state.style()->insideLink() != NotInsideLink) { | 1325 if (state.style()->insideLink() != NotInsideLink) { |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1428 state.style()->setInsideLink(linkStatus); | 1388 state.style()->setInsideLink(linkStatus); |
1429 return; | 1389 return; |
1430 } | 1390 } |
1431 applyInheritedOnly = true; | 1391 applyInheritedOnly = true; |
1432 } | 1392 } |
1433 | 1393 |
1434 // Now we have all of the matched rules in the appropriate order. Walk the r
ules and apply | 1394 // 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. | 1395 // 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 | 1396 // The order is (1) high-priority not important, (2) high-priority important
, (3) normal not important |
1437 // and (4) normal important. | 1397 // and (4) normal important. |
1438 state.setLineHeightValue(0); | |
1439 applyMatchedProperties<HighPriorityProperties>(state, matchResult, false, 0,
matchResult.matchedProperties.size() - 1, applyInheritedOnly); | 1398 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); | 1399 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); | 1400 applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, mat
chResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly); |
1442 | 1401 |
1443 if (UNLIKELY(isSVGForeignObjectElement(element))) { | 1402 if (UNLIKELY(isSVGForeignObjectElement(element))) { |
1444 // RenderSVGRoot handles zooming for the whole SVG subtree, so foreignOb
ject content should not be scaled again. | 1403 // RenderSVGRoot handles zooming for the whole SVG subtree, so foreignOb
ject content should not be scaled again. |
1445 // | 1404 // |
1446 // FIXME: The following hijacks the zoom property for foreignObject so t
hat children of foreignObject get the | 1405 // 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 | 1406 // 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 | 1407 // 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 | 1408 // 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. | 1409 // need to find another way of handling the SVG zoom model. |
1451 state.setEffectiveZoom(RenderStyle::initialZoom()); | 1410 state.setEffectiveZoom(RenderStyle::initialZoom()); |
1452 } | 1411 } |
1453 | 1412 |
1454 if (cachedMatchedProperties && cachedMatchedProperties->renderStyle->effecti
veZoom() != state.style()->effectiveZoom()) { | 1413 if (cachedMatchedProperties && cachedMatchedProperties->renderStyle->effecti
veZoom() != state.style()->effectiveZoom()) { |
1455 state.fontBuilder().setFontDirty(true); | 1414 state.fontBuilder().setFontDirty(true); |
1456 applyInheritedOnly = false; | 1415 applyInheritedOnly = false; |
1457 } | 1416 } |
1458 | 1417 |
1459 // If our font got dirtied, go ahead and update it now. | 1418 // If our font got dirtied, go ahead and update it now. |
1460 updateFont(state); | 1419 updateFont(state); |
1461 | 1420 |
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. | 1421 // 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()) | 1422 if (cachedMatchedProperties && cachedMatchedProperties->renderStyle->fontDes
cription() != state.style()->fontDescription()) |
1468 applyInheritedOnly = false; | 1423 applyInheritedOnly = false; |
1469 | 1424 |
1470 // Now do the normal priority UA properties. | 1425 // Now do the normal priority UA properties. |
1471 applyMatchedProperties<LowPriorityProperties>(state, matchResult, false, mat
chResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly); | 1426 applyMatchedProperties<LowPriorityProperties>(state, matchResult, false, mat
chResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly); |
1472 | 1427 |
1473 // Cache the UA properties to pass them to RenderTheme in adjustRenderStyle. | 1428 // Cache the UA properties to pass them to RenderTheme in adjustRenderStyle. |
1474 state.cacheUserAgentBorderAndBackground(); | 1429 state.cacheUserAgentBorderAndBackground(); |
1475 | 1430 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1536 if (!m_styleResolverStats) | 1491 if (!m_styleResolverStats) |
1537 return; | 1492 return; |
1538 fprintf(stderr, "=== Style Resolver Stats (resolve #%u) (%s) ===\n", ++m_sty
leResolverStatsSequence, document().url().string().utf8().data()); | 1493 fprintf(stderr, "=== Style Resolver Stats (resolve #%u) (%s) ===\n", ++m_sty
leResolverStatsSequence, document().url().string().utf8().data()); |
1539 fprintf(stderr, "%s\n", m_styleResolverStats->report().utf8().data()); | 1494 fprintf(stderr, "%s\n", m_styleResolverStats->report().utf8().data()); |
1540 fprintf(stderr, "== Totals ==\n"); | 1495 fprintf(stderr, "== Totals ==\n"); |
1541 fprintf(stderr, "%s\n", m_styleResolverStatsTotals->report().utf8().data()); | 1496 fprintf(stderr, "%s\n", m_styleResolverStatsTotals->report().utf8().data()); |
1542 } | 1497 } |
1543 | 1498 |
1544 void StyleResolver::applyPropertiesToStyle(const CSSPropertyValue* properties, s
ize_t count, RenderStyle* style) | 1499 void StyleResolver::applyPropertiesToStyle(const CSSPropertyValue* properties, s
ize_t count, RenderStyle* style) |
1545 { | 1500 { |
1546 StyleResolverState state(document(), document().documentElement(), style); | 1501 StyleResolverState state(document(), document().documentElement(), style, st
yle); |
1547 state.setStyle(style); | |
1548 | 1502 |
1549 for (size_t i = 0; i < count; ++i) { | 1503 for (size_t i = 0; i < count; ++i) { |
1550 if (properties[i].value) { | 1504 if (properties[i].value) { |
1551 // As described in BUG66291, setting font-size and line-height on a
font may entail a CSSPrimitiveValue::computeLengthDouble call, | 1505 // As described in BUG66291, setting font-size and line-height on a
font may entail a CSSPrimitiveValue::computeLengthDouble call, |
1552 // which assumes the fontMetrics are available for the affected font
, otherwise a crash occurs (see http://trac.webkit.org/changeset/96122). | 1506 // which assumes the fontMetrics are available for the affected font
, otherwise a crash occurs (see http://trac.webkit.org/changeset/96122). |
1553 // The updateFont() call below updates the fontMetrics and ensure th
e proper setting of font-size and line-height. | 1507 // The updateFont() call below updates the fontMetrics and ensure th
e proper setting of font-size and line-height. |
1554 switch (properties[i].property) { | 1508 switch (properties[i].property) { |
1555 case CSSPropertyFontSize: | 1509 case CSSPropertyFontSize: |
1556 case CSSPropertyLineHeight: | 1510 case CSSPropertyLineHeight: |
1557 updateFont(state); | 1511 updateFont(state); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1592 visitor->trace(m_uncommonAttributeRuleSet); | 1546 visitor->trace(m_uncommonAttributeRuleSet); |
1593 visitor->trace(m_watchedSelectorsRules); | 1547 visitor->trace(m_watchedSelectorsRules); |
1594 visitor->trace(m_treeBoundaryCrossingRules); | 1548 visitor->trace(m_treeBoundaryCrossingRules); |
1595 visitor->trace(m_styleSharingLists); | 1549 visitor->trace(m_styleSharingLists); |
1596 visitor->trace(m_pendingStyleSheets); | 1550 visitor->trace(m_pendingStyleSheets); |
1597 visitor->trace(m_document); | 1551 visitor->trace(m_document); |
1598 #endif | 1552 #endif |
1599 } | 1553 } |
1600 | 1554 |
1601 } // namespace blink | 1555 } // namespace blink |
OLD | NEW |