| Index: Source/core/css/resolver/StyleResolver.cpp
|
| diff --git a/Source/core/css/resolver/StyleResolver.cpp b/Source/core/css/resolver/StyleResolver.cpp
|
| index 25373afd5454162b97af8bb6a2f7ffc39d2d53e9..3bbb9e6e0b9e014f1e2c16942b8310e83c877e87 100644
|
| --- a/Source/core/css/resolver/StyleResolver.cpp
|
| +++ b/Source/core/css/resolver/StyleResolver.cpp
|
| @@ -59,6 +59,7 @@
|
| #include "core/css/StyleRuleImport.h"
|
| #include "core/css/StyleSheetContents.h"
|
| #include "core/css/resolver/AnimatedStyleBuilder.h"
|
| +#include "core/css/resolver/ElementResolveContext.h"
|
| #include "core/css/resolver/MatchResult.h"
|
| #include "core/css/resolver/MediaQueryResult.h"
|
| #include "core/css/resolver/SharedStyleFinder.h"
|
| @@ -572,26 +573,20 @@ PassRefPtr<RenderStyle> StyleResolver::styleForElement(Element* element, RenderS
|
|
|
| if (element == document().documentElement())
|
| resetDirectionAndWritingModeOnDocument(document());
|
| - StyleResolverState state(document(), element, defaultParent);
|
|
|
| - if (sharingBehavior == AllowStyleSharing && state.parentStyle()) {
|
| - SharedStyleFinder styleFinder(state.elementContext(), m_features, m_siblingRuleSet.get(), m_uncommonAttributeRuleSet.get(), *this);
|
| + ElementResolveContext elementContext(document(), element, defaultParent);
|
| +
|
| + if (sharingBehavior == AllowStyleSharing && elementContext.parentStyle()) {
|
| + SharedStyleFinder styleFinder(elementContext, m_features, m_siblingRuleSet.get(), m_uncommonAttributeRuleSet.get(), *this);
|
| if (RefPtr<RenderStyle> sharedStyle = styleFinder.findSharedStyle())
|
| return sharedStyle.release();
|
| }
|
|
|
| - ActiveAnimations* activeAnimations = element->activeAnimations();
|
| - const RenderStyle* baseRenderStyle = activeAnimations ? activeAnimations->baseRenderStyle() : nullptr;
|
| + StyleResolverState state(elementContext);
|
| +
|
| + if (!elementContext.baseRenderStyle() && elementContext.parentStyle())
|
| + state.style()->inheritFrom(elementContext.parentStyle(), isAtShadowBoundary(element) ? RenderStyle::AtShadowBoundary : RenderStyle::NotAtShadowBoundary);
|
|
|
| - if (baseRenderStyle) {
|
| - state.setStyle(RenderStyle::clone(baseRenderStyle));
|
| - } else if (state.parentStyle()) {
|
| - state.setStyle(RenderStyle::create());
|
| - state.style()->inheritFrom(state.parentStyle(), isAtShadowBoundary(element) ? RenderStyle::AtShadowBoundary : RenderStyle::NotAtShadowBoundary);
|
| - } else {
|
| - state.setStyle(defaultStyleForElement());
|
| - state.setParentStyle(RenderStyle::clone(state.style()));
|
| - }
|
| // contenteditable attribute (implemented by -webkit-user-modify) should
|
| // be propagated from shadow host to distributed node.
|
| if (state.distributedToInsertionPoint()) {
|
| @@ -612,7 +607,7 @@ PassRefPtr<RenderStyle> StyleResolver::styleForElement(Element* element, RenderS
|
| state.style()->setInsideLink(linkState);
|
| }
|
|
|
| - if (!baseRenderStyle) {
|
| + if (!elementContext.baseRenderStyle()) {
|
|
|
| bool needsCollection = false;
|
| CSSDefaultStyleSheets::instance().ensureDefaultStyleSheetsForElement(element, needsCollection);
|
| @@ -633,8 +628,8 @@ PassRefPtr<RenderStyle> StyleResolver::styleForElement(Element* element, RenderS
|
|
|
| adjustRenderStyle(state, element);
|
|
|
| - if (activeAnimations)
|
| - activeAnimations->updateBaseRenderStyle(state.style());
|
| + if (elementContext.activeAnimations())
|
| + elementContext.activeAnimations()->updateBaseRenderStyle(state.style());
|
| }
|
|
|
| // FIXME: The CSSWG wants to specify that the effects of animations are applied before
|
| @@ -663,16 +658,11 @@ PassRefPtr<RenderStyle> StyleResolver::styleForKeyframe(Element& element, const
|
|
|
| if (&element == document().documentElement())
|
| resetDirectionAndWritingModeOnDocument(document());
|
| - StyleResolverState state(document(), &element, parentStyle);
|
| + StyleResolverState state(document(), &element, RenderStyle::clone(&elementStyle), parentStyle);
|
|
|
| MatchResult result;
|
| result.addMatchedProperties(&keyframe->properties());
|
|
|
| - ASSERT(!state.style());
|
| -
|
| - // Create the style
|
| - state.setStyle(RenderStyle::clone(&elementStyle));
|
| - state.setLineHeightValue(0);
|
|
|
| // We don't need to bother with !important. Since there is only ever one
|
| // decl, there's nothing to override. So just add the first properties.
|
| @@ -685,10 +675,6 @@ PassRefPtr<RenderStyle> StyleResolver::styleForKeyframe(Element& element, const
|
| // If our font got dirtied, go ahead and update it now.
|
| updateFont(state);
|
|
|
| - // Line-height is set when we are sure we decided on the font-size
|
| - if (state.lineHeightValue())
|
| - StyleBuilder::applyProperty(CSSPropertyLineHeight, state, state.lineHeightValue());
|
| -
|
| // Now do rest of the properties.
|
| applyMatchedProperties<LowPriorityProperties>(state, result, false, 0, result.matchedProperties.size() - 1, inheritedOnly);
|
|
|
| @@ -708,8 +694,7 @@ PassRefPtrWillBeRawPtr<AnimatableValue> StyleResolver::createAnimatableValueSnap
|
| style = RenderStyle::clone(element.renderStyle());
|
| else
|
| style = RenderStyle::create();
|
| - StyleResolverState state(element.document(), &element);
|
| - state.setStyle(style);
|
| + StyleResolverState state(element.document(), &element, style);
|
| return createAnimatableValueSnapshot(state, property, value);
|
| }
|
|
|
| @@ -741,8 +726,9 @@ PassRefPtrWillBeRawPtr<PseudoElement> StyleResolver::createPseudoElementIfNeeded
|
| return PseudoElement::create(&parent, pseudoId);
|
| }
|
|
|
| - StyleResolverState state(document(), &parent, parentStyle);
|
| - if (!pseudoStyleForElementInternal(parent, pseudoId, parentStyle, state))
|
| + ElementResolveContext elementContext(document(), &parent, parentStyle);
|
| + StyleResolverState state(elementContext);
|
| + if (!pseudoStyleForElementInternal(pseudoId, parentStyle, state))
|
| return nullptr;
|
| RefPtr<RenderStyle> style = state.takeStyle();
|
| ASSERT(style);
|
| @@ -759,7 +745,7 @@ PassRefPtrWillBeRawPtr<PseudoElement> StyleResolver::createPseudoElementIfNeeded
|
| return pseudo.release();
|
| }
|
|
|
| -bool StyleResolver::pseudoStyleForElementInternal(Element& element, const PseudoStyleRequest& pseudoStyleRequest, RenderStyle* parentStyle, StyleResolverState& state)
|
| +bool StyleResolver::pseudoStyleForElementInternal(const PseudoStyleRequest& pseudoStyleRequest, RenderStyle* parentStyle, StyleResolverState& state)
|
| {
|
| ASSERT(document().frame());
|
| ASSERT(document().settings());
|
| @@ -767,29 +753,21 @@ bool StyleResolver::pseudoStyleForElementInternal(Element& element, const Pseudo
|
|
|
| StyleResolverParentScope::ensureParentStackIsPushed();
|
|
|
| - Element* pseudoElement = element.pseudoElement(pseudoStyleRequest.pseudoId);
|
| -
|
| - ActiveAnimations* activeAnimations = pseudoElement ? pseudoElement->activeAnimations() : nullptr;
|
| - const RenderStyle* baseRenderStyle = activeAnimations ? activeAnimations->baseRenderStyle() : nullptr;
|
| -
|
| - if (baseRenderStyle) {
|
| - state.setStyle(RenderStyle::clone(baseRenderStyle));
|
| - } else if (pseudoStyleRequest.allowsInheritance(state.parentStyle())) {
|
| - state.setStyle(RenderStyle::create());
|
| - state.style()->inheritFrom(state.parentStyle());
|
| - } else {
|
| - state.setStyle(defaultStyleForElement());
|
| - state.setParentStyle(RenderStyle::clone(state.style()));
|
| - }
|
| + const ElementResolveContext& elementContext = state.elementContext();
|
| + Element* pseudoElement = elementContext.element()->pseudoElement(pseudoStyleRequest.pseudoId);
|
|
|
| state.style()->setStyleType(pseudoStyleRequest.pseudoId);
|
|
|
| // Since we don't use pseudo-elements in any of our quirk/print
|
| // user agent rules, don't waste time walking those rules.
|
|
|
| - if (!baseRenderStyle) {
|
| + if (!elementContext.baseRenderStyle()) {
|
| +
|
| + if (pseudoStyleRequest.allowsInheritance(elementContext.parentStyle()))
|
| + state.style()->inheritFrom(elementContext.parentStyle());
|
| +
|
| // Check UA, user and author rules.
|
| - ElementRuleCollector collector(state.elementContext(), m_selectorFilter, state.style());
|
| + ElementRuleCollector collector(elementContext, m_selectorFilter, state.style());
|
| collector.setPseudoStyleRequest(pseudoStyleRequest);
|
|
|
| matchUARules(collector);
|
| @@ -810,8 +788,8 @@ bool StyleResolver::pseudoStyleForElementInternal(Element& element, const Pseudo
|
| // in the adjustRenderStyle code.
|
| adjustRenderStyle(state, 0);
|
|
|
| - if (activeAnimations)
|
| - activeAnimations->updateBaseRenderStyle(state.style());
|
| + if (elementContext.activeAnimations())
|
| + elementContext.activeAnimations()->updateBaseRenderStyle(state.style());
|
| }
|
|
|
| // FIXME: The CSSWG wants to specify that the effects of animations are applied before
|
| @@ -834,8 +812,9 @@ PassRefPtr<RenderStyle> StyleResolver::pseudoStyleForElement(Element* element, c
|
| if (!element)
|
| return nullptr;
|
|
|
| - StyleResolverState state(document(), element, parentStyle);
|
| - if (!pseudoStyleForElementInternal(*element, pseudoStyleRequest, parentStyle, state)) {
|
| + ElementResolveContext elementContext(document(), element, parentStyle);
|
| + StyleResolverState state(elementContext);
|
| + if (!pseudoStyleForElementInternal(pseudoStyleRequest, parentStyle, state)) {
|
| if (pseudoStyleRequest.type == PseudoStyleRequest::ForRenderer)
|
| return nullptr;
|
| return state.takeStyle();
|
| @@ -852,9 +831,8 @@ PassRefPtr<RenderStyle> StyleResolver::styleForPage(int pageIndex)
|
| {
|
| ASSERT(!hasPendingAuthorStyleSheets());
|
| resetDirectionAndWritingModeOnDocument(document());
|
| - StyleResolverState state(document(), document().documentElement()); // m_rootElementStyle will be set to the document style.
|
| + StyleResolverState state(document(), document().documentElement(), RenderStyle::create()); // m_rootElementStyle will be set to the document style.
|
|
|
| - state.setStyle(RenderStyle::create());
|
| const RenderStyle* rootElementStyle = state.rootElementStyle() ? state.rootElementStyle() : document().renderStyle();
|
| ASSERT(rootElementStyle);
|
| state.style()->inheritFrom(rootElementStyle);
|
| @@ -866,7 +844,6 @@ PassRefPtr<RenderStyle> StyleResolver::styleForPage(int pageIndex)
|
| if (ScopedStyleResolver* scopedResolver = document().scopedStyleResolver())
|
| scopedResolver->matchPageRules(collector);
|
|
|
| - state.setLineHeightValue(0);
|
| bool inheritedOnly = false;
|
|
|
| MatchResult& result = collector.matchedResult();
|
| @@ -875,10 +852,6 @@ PassRefPtr<RenderStyle> StyleResolver::styleForPage(int pageIndex)
|
| // If our font got dirtied, go ahead and update it now.
|
| updateFont(state);
|
|
|
| - // Line-height is set when we are sure we decided on the font-size.
|
| - if (state.lineHeightValue())
|
| - StyleBuilder::applyProperty(CSSPropertyLineHeight, state, state.lineHeightValue());
|
| -
|
| applyMatchedProperties<LowPriorityProperties>(state, result, false, 0, result.matchedProperties.size() - 1, inheritedOnly);
|
|
|
| addContentAttrValuesToFeatures(state.contentAttrValues(), m_features);
|
| @@ -908,24 +881,13 @@ void StyleResolver::collectViewportRules()
|
| viewportStyleResolver()->resolve();
|
| }
|
|
|
| -PassRefPtr<RenderStyle> StyleResolver::defaultStyleForElement()
|
| -{
|
| - StyleResolverState state(document(), 0);
|
| - state.setStyle(RenderStyle::create());
|
| - state.style()->setLineHeight(RenderStyle::initialLineHeight());
|
| - state.setLineHeightValue(0);
|
| - state.fontBuilder().setInitial(state.style()->effectiveZoom());
|
| - state.style()->font().update(document().styleEngine()->fontSelector());
|
| - return state.takeStyle();
|
| -}
|
| -
|
| PassRefPtr<RenderStyle> StyleResolver::styleForText(Text* textNode)
|
| {
|
| ASSERT(textNode);
|
|
|
| Node* parentNode = NodeRenderingTraversal::parent(textNode);
|
| if (!parentNode || !parentNode->renderStyle())
|
| - return defaultStyleForElement();
|
| + return StyleResolverState::defaultStyleForElement(document());
|
| return parentNode->renderStyle();
|
| }
|
|
|
| @@ -937,8 +899,8 @@ void StyleResolver::updateFont(StyleResolverState& state)
|
| PassRefPtrWillBeRawPtr<StyleRuleList> StyleResolver::styleRulesForElement(Element* element, unsigned rulesToInclude)
|
| {
|
| ASSERT(element);
|
| - StyleResolverState state(document(), element);
|
| - ElementRuleCollector collector(state.elementContext(), m_selectorFilter, state.style());
|
| + ElementResolveContext elementContext(document(), element, nullptr);
|
| + ElementRuleCollector collector(elementContext, m_selectorFilter, nullptr);
|
| collector.setMode(SelectorChecker::CollectingStyleRules);
|
| collectPseudoRulesForElement(element, collector, NOPSEUDO, rulesToInclude);
|
| return collector.matchedStyleRuleList();
|
| @@ -947,8 +909,8 @@ PassRefPtrWillBeRawPtr<StyleRuleList> StyleResolver::styleRulesForElement(Elemen
|
| PassRefPtrWillBeRawPtr<CSSRuleList> StyleResolver::pseudoCSSRulesForElement(Element* element, PseudoId pseudoId, unsigned rulesToInclude)
|
| {
|
| ASSERT(element);
|
| - StyleResolverState state(document(), element);
|
| - ElementRuleCollector collector(state.elementContext(), m_selectorFilter, state.style());
|
| + ElementResolveContext elementContext(document(), element, nullptr);
|
| + ElementRuleCollector collector(elementContext, m_selectorFilter, nullptr);
|
| collector.setMode(SelectorChecker::CollectingCSSRules);
|
| collectPseudoRulesForElement(element, collector, pseudoId, rulesToInclude);
|
| return collector.matchedCSSRuleList();
|
| @@ -1253,9 +1215,9 @@ template<> CSSPropertyID StyleResolver::firstCSSPropertyId<StyleResolver::HighPr
|
| // This method returns the last CSSPropertyId of high priority properties.
|
| template<> CSSPropertyID StyleResolver::lastCSSPropertyId<StyleResolver::HighPriorityProperties>()
|
| {
|
| - COMPILE_ASSERT(CSSPropertyLineHeight == CSSPropertyColor + 17, CSS_line_height_is_end_of_high_prioity_property_range);
|
| - COMPILE_ASSERT(CSSPropertyZoom == CSSPropertyLineHeight - 1, CSS_zoom_is_before_line_height);
|
| - return CSSPropertyLineHeight;
|
| + COMPILE_ASSERT(CSSPropertyZoom == CSSPropertyColor + 16, CSS_zoom_is_end_of_high_priority_property_range);
|
| + COMPILE_ASSERT(CSSPropertyTextRendering == CSSPropertyZoom - 1, CSS_text_rendering_is_before_zoom);
|
| + return CSSPropertyZoom;
|
| }
|
|
|
| // This method returns the first CSSPropertyId of remaining properties,
|
| @@ -1266,7 +1228,7 @@ template<> CSSPropertyID StyleResolver::lastCSSPropertyId<StyleResolver::HighPri
|
| // lastCSSPropertyId<LowPriorityProperties>.
|
| template<> CSSPropertyID StyleResolver::firstCSSPropertyId<StyleResolver::LowPriorityProperties>()
|
| {
|
| - COMPILE_ASSERT(CSSPropertyAlignContent == CSSPropertyLineHeight + 1, CSS_background_is_first_low_priority_property);
|
| + COMPILE_ASSERT(CSSPropertyAlignContent == CSSPropertyZoom + 1, CSS_align_content_is_first_low_priority_property);
|
| return CSSPropertyAlignContent;
|
| }
|
|
|
| @@ -1349,10 +1311,8 @@ void StyleResolver::applyProperties(StyleResolverState& state, const StyleProper
|
| continue;
|
| if (!isPropertyForPass<pass>(property))
|
| continue;
|
| - if (pass == HighPriorityProperties && property == CSSPropertyLineHeight)
|
| - state.setLineHeightValue(current.value());
|
| - else
|
| - StyleBuilder::applyProperty(current.id(), state, current.value());
|
| +
|
| + StyleBuilder::applyProperty(current.id(), state, current.value());
|
| }
|
| }
|
|
|
| @@ -1435,7 +1395,6 @@ void StyleResolver::applyMatchedProperties(StyleResolverState& state, const Matc
|
| // high-priority properties first, i.e., those properties that other properties depend on.
|
| // The order is (1) high-priority not important, (2) high-priority important, (3) normal not important
|
| // and (4) normal important.
|
| - state.setLineHeightValue(0);
|
| applyMatchedProperties<HighPriorityProperties>(state, matchResult, false, 0, matchResult.matchedProperties.size() - 1, applyInheritedOnly);
|
| applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, matchResult.ranges.firstAuthorRule, matchResult.ranges.lastAuthorRule, applyInheritedOnly);
|
| applyMatchedProperties<HighPriorityProperties>(state, matchResult, true, matchResult.ranges.firstUARule, matchResult.ranges.lastUARule, applyInheritedOnly);
|
| @@ -1459,10 +1418,6 @@ void StyleResolver::applyMatchedProperties(StyleResolverState& state, const Matc
|
| // If our font got dirtied, go ahead and update it now.
|
| updateFont(state);
|
|
|
| - // Line-height is set when we are sure we decided on the font-size.
|
| - if (state.lineHeightValue())
|
| - StyleBuilder::applyProperty(CSSPropertyLineHeight, state, state.lineHeightValue());
|
| -
|
| // Many properties depend on the font. If it changes we just apply all properties.
|
| if (cachedMatchedProperties && cachedMatchedProperties->renderStyle->fontDescription() != state.style()->fontDescription())
|
| applyInheritedOnly = false;
|
| @@ -1543,8 +1498,7 @@ void StyleResolver::printStats()
|
|
|
| void StyleResolver::applyPropertiesToStyle(const CSSPropertyValue* properties, size_t count, RenderStyle* style)
|
| {
|
| - StyleResolverState state(document(), document().documentElement(), style);
|
| - state.setStyle(style);
|
| + StyleResolverState state(document(), document().documentElement(), style, style);
|
|
|
| for (size_t i = 0; i < count; ++i) {
|
| if (properties[i].value) {
|
|
|