Home | History | Annotate | Download | only in resolver
      1 /*
      2  * Copyright (C) 1999 Lars Knoll (knoll (at) kde.org)
      3  * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
      4  *
      5  * This library is free software; you can redistribute it and/or
      6  * modify it under the terms of the GNU Library General Public
      7  * License as published by the Free Software Foundation; either
      8  * version 2 of the License, or (at your option) any later version.
      9  *
     10  * This library is distributed in the hope that it will be useful,
     11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13  * Library General Public License for more details.
     14  *
     15  * You should have received a copy of the GNU Library General Public License
     16  * along with this library; see the file COPYING.LIB.  If not, write to
     17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     18  * Boston, MA 02110-1301, USA.
     19  *
     20  */
     21 
     22 #ifndef StyleResolverState_h
     23 #define StyleResolverState_h
     24 
     25 #include "CSSPropertyNames.h"
     26 
     27 #include "core/animation/css/CSSAnimations.h"
     28 #include "core/css/CSSSVGDocumentValue.h"
     29 #include "core/css/CSSToLengthConversionData.h"
     30 #include "core/css/resolver/CSSToStyleMap.h"
     31 #include "core/css/resolver/ElementResolveContext.h"
     32 #include "core/css/resolver/ElementStyleResources.h"
     33 #include "core/css/resolver/FontBuilder.h"
     34 #include "core/dom/Element.h"
     35 #include "core/rendering/style/CachedUAStyle.h"
     36 #include "core/rendering/style/RenderStyle.h"
     37 #include "core/rendering/style/StyleInheritedData.h"
     38 
     39 namespace WebCore {
     40 
     41 class FontDescription;
     42 class RenderRegion;
     43 class StyleRule;
     44 
     45 class StyleResolverState {
     46 WTF_MAKE_NONCOPYABLE(StyleResolverState);
     47 public:
     48     StyleResolverState(Document&, Element*, RenderStyle* parentStyle = 0, RenderRegion* regionForStyling = 0);
     49 
     50     // In FontFaceSet and CanvasRenderingContext2D, we don't have an element to grab the document from.
     51     // This is why we have to store the document separately.
     52     Document& document() const { return m_document; }
     53     // These are all just pass-through methods to ElementResolveContext.
     54     Element* element() const { return m_elementContext.element(); }
     55     const ContainerNode* parentNode() const { return m_elementContext.parentNode(); }
     56     const RenderStyle* rootElementStyle() const { return m_elementContext.rootElementStyle(); }
     57     EInsideLink elementLinkState() const { return m_elementContext.elementLinkState(); }
     58     bool distributedToInsertionPoint() const { return m_elementContext.distributedToInsertionPoint(); }
     59 
     60     const ElementResolveContext& elementContext() const { return m_elementContext; }
     61 
     62     void setStyle(PassRefPtr<RenderStyle> style) { m_style = style; m_cssToLengthConversionData.setStyle(m_style.get()); }
     63     const RenderStyle* style() const { return m_style.get(); }
     64     RenderStyle* style() { return m_style.get(); }
     65     PassRefPtr<RenderStyle> takeStyle() { return m_style.release(); }
     66 
     67     const CSSToLengthConversionData& cssToLengthConversionData() const { return m_cssToLengthConversionData; }
     68 
     69     void setAnimationUpdate(PassOwnPtr<CSSAnimationUpdate> update) { m_animationUpdate = update; }
     70     const CSSAnimationUpdate* animationUpdate() { return m_animationUpdate.get(); }
     71     PassOwnPtr<CSSAnimationUpdate> takeAnimationUpdate() { return m_animationUpdate.release(); }
     72 
     73     void setParentStyle(PassRefPtr<RenderStyle> parentStyle) { m_parentStyle = parentStyle; }
     74     const RenderStyle* parentStyle() const { return m_parentStyle.get(); }
     75     RenderStyle* parentStyle() { return m_parentStyle.get(); }
     76 
     77     const RenderRegion* regionForStyling() const { return m_regionForStyling; }
     78 
     79     void setCurrentRule(StyleRule* currentRule) { m_currentRule = currentRule; }
     80     const StyleRule* currentRule() const { return m_currentRule; }
     81 
     82     // FIXME: These are effectively side-channel "out parameters" for the various
     83     // map functions. When we map from CSS to style objects we use this state object
     84     // to track various meta-data about that mapping (e.g. if it's cache-able).
     85     // We need to move this data off of StyleResolverState and closer to the
     86     // objects it applies to. Possibly separating (immutable) inputs from (mutable) outputs.
     87     void setApplyPropertyToRegularStyle(bool isApply) { m_applyPropertyToRegularStyle = isApply; }
     88     void setApplyPropertyToVisitedLinkStyle(bool isApply) { m_applyPropertyToVisitedLinkStyle = isApply; }
     89     bool applyPropertyToRegularStyle() const { return m_applyPropertyToRegularStyle; }
     90     bool applyPropertyToVisitedLinkStyle() const { return m_applyPropertyToVisitedLinkStyle; }
     91 
     92     // Holds all attribute names found while applying "content" properties that contain an "attr()" value.
     93     Vector<AtomicString>& contentAttrValues() { return m_contentAttrValues; }
     94 
     95     void setLineHeightValue(CSSValue* value) { m_lineHeightValue = value; }
     96     CSSValue* lineHeightValue() { return m_lineHeightValue; }
     97 
     98     void cacheUserAgentBorderAndBackground() { m_cachedUAStyle = CachedUAStyle(style()); }
     99     const CachedUAStyle& cachedUAStyle() const { return m_cachedUAStyle; }
    100 
    101     ElementStyleResources& elementStyleResources() { return m_elementStyleResources; }
    102     const CSSToStyleMap& styleMap() const { return m_styleMap; }
    103     CSSToStyleMap& styleMap() { return m_styleMap; }
    104 
    105     // FIXME: Once styleImage can be made to not take a StyleResolverState
    106     // this convenience function should be removed. As-is, without this, call
    107     // sites are extremely verbose.
    108     PassRefPtr<StyleImage> styleImage(CSSPropertyID propertyId, CSSValue* value)
    109     {
    110         return m_elementStyleResources.styleImage(document().textLinkColors(), style()->color(), propertyId, value);
    111     }
    112 
    113     FontBuilder& fontBuilder() { return m_fontBuilder; }
    114     // FIXME: These exist as a primitive way to track mutations to font-related properties
    115     // on a RenderStyle. As designed, these are very error-prone, as some callers
    116     // set these directly on the RenderStyle w/o telling us. Presumably we'll
    117     // want to design a better wrapper around RenderStyle for tracking these mutations
    118     // and separate it from StyleResolverState.
    119     const FontDescription& parentFontDescription() { return m_parentStyle->fontDescription(); }
    120     void setZoom(float f) { m_fontBuilder.didChangeFontParameters(m_style->setZoom(f)); }
    121     void setEffectiveZoom(float f) { m_fontBuilder.didChangeFontParameters(m_style->setEffectiveZoom(f)); }
    122     void setWritingMode(WritingMode writingMode) { m_fontBuilder.didChangeFontParameters(m_style->setWritingMode(writingMode)); }
    123     void setTextOrientation(TextOrientation textOrientation) { m_fontBuilder.didChangeFontParameters(m_style->setTextOrientation(textOrientation)); }
    124 
    125     // SVG handles zooming in a different way compared to CSS. The whole document is scaled instead
    126     // of each individual length value in the render style / tree. CSSPrimitiveValue::computeLength*()
    127     // multiplies each resolved length with the zoom multiplier - so for SVG we need to disable that.
    128     // Though all CSS values that can be applied to outermost <svg> elements (width/height/border/padding...)
    129     // need to respect the scaling. RenderBox (the parent class of RenderSVGRoot) grabs values like
    130     // width/height/border/padding/... from the RenderStyle -> for SVG these values would never scale,
    131     // if we'd pass a 1.0 zoom factor everyhwere. So we only pass a zoom factor of 1.0 for specific
    132     // properties that are NOT allowed to scale within a zoomed SVG document (letter/word-spacing/font-size).
    133     bool useSVGZoomRules() const { return element() && element()->isSVGElement(); }
    134 
    135 private:
    136     friend class StyleResolveScope;
    137 
    138     ElementResolveContext m_elementContext;
    139     Document& m_document;
    140 
    141     // m_style is the primary output for each element's style resolve.
    142     RefPtr<RenderStyle> m_style;
    143 
    144     CSSToLengthConversionData m_cssToLengthConversionData;
    145 
    146     // m_parentStyle is not always just element->parentNode()->style()
    147     // so we keep it separate from m_elementContext.
    148     RefPtr<RenderStyle> m_parentStyle;
    149 
    150     OwnPtr<CSSAnimationUpdate> m_animationUpdate;
    151 
    152     // Required to ASSERT in applyProperties.
    153     // FIXME: Regions should not need special state on StyleResolverState
    154     // no other @rule does.
    155     RenderRegion* m_regionForStyling;
    156 
    157     bool m_applyPropertyToRegularStyle;
    158     bool m_applyPropertyToVisitedLinkStyle;
    159 
    160     CSSValue* m_lineHeightValue;
    161 
    162     FontBuilder m_fontBuilder;
    163 
    164     CachedUAStyle m_cachedUAStyle;
    165 
    166     ElementStyleResources m_elementStyleResources;
    167     // CSSToStyleMap is a pure-logic class and only contains
    168     // a back-pointer to this object.
    169     CSSToStyleMap m_styleMap;
    170     Vector<AtomicString> m_contentAttrValues;
    171 
    172     StyleRule* m_currentRule;
    173 };
    174 
    175 } // namespace WebCore
    176 
    177 #endif // StyleResolverState_h
    178