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 "core/CSSPropertyNames.h"
     26 
     27 #include "core/css/CSSSVGDocumentValue.h"
     28 #include "core/css/CSSToLengthConversionData.h"
     29 #include "core/css/resolver/CSSToStyleMap.h"
     30 #include "core/css/resolver/ElementResolveContext.h"
     31 #include "core/css/resolver/ElementStyleResources.h"
     32 #include "core/css/resolver/FontBuilder.h"
     33 #include "core/dom/Element.h"
     34 #include "core/rendering/style/CachedUAStyle.h"
     35 #include "core/rendering/style/RenderStyle.h"
     36 #include "core/rendering/style/StyleInheritedData.h"
     37 
     38 namespace WebCore {
     39 
     40 class CSSAnimationUpdate;
     41 class FontDescription;
     42 class StyleRule;
     43 
     44 class StyleResolverState {
     45     STACK_ALLOCATED();
     46     WTF_MAKE_NONCOPYABLE(StyleResolverState);
     47 public:
     48     StyleResolverState(Document&, Element*, RenderStyle* parentStyle = 0);
     49     ~StyleResolverState();
     50 
     51     // In FontFaceSet and CanvasRenderingContext2D, we don't have an element to grab the document from.
     52     // This is why we have to store the document separately.
     53     Document& document() const { return m_document; }
     54     // These are all just pass-through methods to ElementResolveContext.
     55     Element* element() const { return m_elementContext.element(); }
     56     const ContainerNode* parentNode() const { return m_elementContext.parentNode(); }
     57     const RenderStyle* rootElementStyle() const { return m_elementContext.rootElementStyle(); }
     58     EInsideLink elementLinkState() const { return m_elementContext.elementLinkState(); }
     59     bool distributedToInsertionPoint() const { return m_elementContext.distributedToInsertionPoint(); }
     60 
     61     const ElementResolveContext& elementContext() const { return m_elementContext; }
     62 
     63     void setStyle(PassRefPtr<RenderStyle> style) { m_style = style; m_cssToLengthConversionData.setStyle(m_style.get()); }
     64     const RenderStyle* style() const { return m_style.get(); }
     65     RenderStyle* style() { return m_style.get(); }
     66     PassRefPtr<RenderStyle> takeStyle() { return m_style.release(); }
     67 
     68     const CSSToLengthConversionData& cssToLengthConversionData() const { return m_cssToLengthConversionData; }
     69 
     70     void setAnimationUpdate(PassOwnPtrWillBeRawPtr<CSSAnimationUpdate>);
     71     const CSSAnimationUpdate* animationUpdate() { return m_animationUpdate.get(); }
     72     PassOwnPtrWillBeRawPtr<CSSAnimationUpdate> takeAnimationUpdate();
     73 
     74     void setParentStyle(PassRefPtr<RenderStyle> parentStyle) { m_parentStyle = parentStyle; }
     75     const RenderStyle* parentStyle() const { return m_parentStyle.get(); }
     76     RenderStyle* parentStyle() { return m_parentStyle.get(); }
     77 
     78     void setCurrentRule(StyleRule* currentRule) { m_currentRule = currentRule; }
     79     const StyleRule* currentRule() const { return m_currentRule; }
     80 
     81     // FIXME: These are effectively side-channel "out parameters" for the various
     82     // map functions. When we map from CSS to style objects we use this state object
     83     // to track various meta-data about that mapping (e.g. if it's cache-able).
     84     // We need to move this data off of StyleResolverState and closer to the
     85     // objects it applies to. Possibly separating (immutable) inputs from (mutable) outputs.
     86     void setApplyPropertyToRegularStyle(bool isApply) { m_applyPropertyToRegularStyle = isApply; }
     87     void setApplyPropertyToVisitedLinkStyle(bool isApply) { m_applyPropertyToVisitedLinkStyle = isApply; }
     88     bool applyPropertyToRegularStyle() const { return m_applyPropertyToRegularStyle; }
     89     bool applyPropertyToVisitedLinkStyle() const { return m_applyPropertyToVisitedLinkStyle; }
     90 
     91     // Holds all attribute names found while applying "content" properties that contain an "attr()" value.
     92     Vector<AtomicString>& contentAttrValues() { return m_contentAttrValues; }
     93 
     94     void setLineHeightValue(CSSValue* value) { m_lineHeightValue = value; }
     95     CSSValue* lineHeightValue() { return m_lineHeightValue; }
     96 
     97     void cacheUserAgentBorderAndBackground()
     98     {
     99         // RenderTheme only needs the cached style if it has an appearance,
    100         // and constructing it is expensive so we avoid it if possible.
    101         if (!style()->hasAppearance())
    102             return;
    103 
    104         m_cachedUAStyle = CachedUAStyle::create(style());
    105     }
    106 
    107     const CachedUAStyle* cachedUAStyle() const
    108     {
    109         return m_cachedUAStyle.get();
    110     }
    111 
    112     ElementStyleResources& elementStyleResources() { return m_elementStyleResources; }
    113     const CSSToStyleMap& styleMap() const { return m_styleMap; }
    114     CSSToStyleMap& styleMap() { return m_styleMap; }
    115 
    116     // FIXME: Once styleImage can be made to not take a StyleResolverState
    117     // this convenience function should be removed. As-is, without this, call
    118     // sites are extremely verbose.
    119     PassRefPtr<StyleImage> styleImage(CSSPropertyID propertyId, CSSValue* value)
    120     {
    121         return m_elementStyleResources.styleImage(document(), document().textLinkColors(), style()->color(), propertyId, value);
    122     }
    123 
    124     FontBuilder& fontBuilder() { return m_fontBuilder; }
    125     // FIXME: These exist as a primitive way to track mutations to font-related properties
    126     // on a RenderStyle. As designed, these are very error-prone, as some callers
    127     // set these directly on the RenderStyle w/o telling us. Presumably we'll
    128     // want to design a better wrapper around RenderStyle for tracking these mutations
    129     // and separate it from StyleResolverState.
    130     const FontDescription& parentFontDescription() { return m_parentStyle->fontDescription(); }
    131     void setZoom(float f) { m_fontBuilder.didChangeFontParameters(m_style->setZoom(f)); }
    132     void setEffectiveZoom(float f) { m_fontBuilder.didChangeFontParameters(m_style->setEffectiveZoom(f)); }
    133     void setWritingMode(WritingMode writingMode) { m_fontBuilder.didChangeFontParameters(m_style->setWritingMode(writingMode)); }
    134     void setTextOrientation(TextOrientation textOrientation) { m_fontBuilder.didChangeFontParameters(m_style->setTextOrientation(textOrientation)); }
    135 
    136 private:
    137     ElementResolveContext m_elementContext;
    138     Document& m_document;
    139 
    140     // m_style is the primary output for each element's style resolve.
    141     RefPtr<RenderStyle> m_style;
    142 
    143     CSSToLengthConversionData m_cssToLengthConversionData;
    144 
    145     // m_parentStyle is not always just element->parentNode()->style()
    146     // so we keep it separate from m_elementContext.
    147     RefPtr<RenderStyle> m_parentStyle;
    148 
    149     OwnPtrWillBeMember<CSSAnimationUpdate> m_animationUpdate;
    150 
    151     bool m_applyPropertyToRegularStyle;
    152     bool m_applyPropertyToVisitedLinkStyle;
    153 
    154     RawPtrWillBeMember<CSSValue> m_lineHeightValue;
    155 
    156     FontBuilder m_fontBuilder;
    157 
    158     OwnPtr<CachedUAStyle> m_cachedUAStyle;
    159 
    160     ElementStyleResources m_elementStyleResources;
    161     // CSSToStyleMap is a pure-logic class and only contains
    162     // a back-pointer to this object.
    163     CSSToStyleMap m_styleMap;
    164     Vector<AtomicString> m_contentAttrValues;
    165 
    166     RawPtrWillBeMember<StyleRule> m_currentRule;
    167 };
    168 
    169 } // namespace WebCore
    170 
    171 #endif // StyleResolverState_h
    172