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/Document.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 blink {
     40 
     41 class CSSAnimationUpdate;
     42 class FontDescription;
     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     // FIXME: These are effectively side-channel "out parameters" for the various
     79     // map functions. When we map from CSS to style objects we use this state object
     80     // to track various meta-data about that mapping (e.g. if it's cache-able).
     81     // We need to move this data off of StyleResolverState and closer to the
     82     // objects it applies to. Possibly separating (immutable) inputs from (mutable) outputs.
     83     void setApplyPropertyToRegularStyle(bool isApply) { m_applyPropertyToRegularStyle = isApply; }
     84     void setApplyPropertyToVisitedLinkStyle(bool isApply) { m_applyPropertyToVisitedLinkStyle = isApply; }
     85     bool applyPropertyToRegularStyle() const { return m_applyPropertyToRegularStyle; }
     86     bool applyPropertyToVisitedLinkStyle() const { return m_applyPropertyToVisitedLinkStyle; }
     87 
     88     // Holds all attribute names found while applying "content" properties that contain an "attr()" value.
     89     Vector<AtomicString>& contentAttrValues() { return m_contentAttrValues; }
     90 
     91     void setLineHeightValue(CSSValue* value) { m_lineHeightValue = value; }
     92     CSSValue* lineHeightValue() { return m_lineHeightValue; }
     93 
     94     void cacheUserAgentBorderAndBackground()
     95     {
     96         // RenderTheme only needs the cached style if it has an appearance,
     97         // and constructing it is expensive so we avoid it if possible.
     98         if (!style()->hasAppearance())
     99             return;
    100 
    101         m_cachedUAStyle = CachedUAStyle::create(style());
    102     }
    103 
    104     const CachedUAStyle* cachedUAStyle() const
    105     {
    106         return m_cachedUAStyle.get();
    107     }
    108 
    109     ElementStyleResources& elementStyleResources() { return m_elementStyleResources; }
    110     const CSSToStyleMap& styleMap() const { return m_styleMap; }
    111     CSSToStyleMap& styleMap() { return m_styleMap; }
    112 
    113     // FIXME: Once styleImage can be made to not take a StyleResolverState
    114     // this convenience function should be removed. As-is, without this, call
    115     // sites are extremely verbose.
    116     PassRefPtr<StyleImage> styleImage(CSSPropertyID propertyId, CSSValue* value)
    117     {
    118         return m_elementStyleResources.styleImage(document(), document().textLinkColors(), style()->color(), propertyId, value);
    119     }
    120 
    121     FontBuilder& fontBuilder() { return m_fontBuilder; }
    122     // FIXME: These exist as a primitive way to track mutations to font-related properties
    123     // on a RenderStyle. As designed, these are very error-prone, as some callers
    124     // set these directly on the RenderStyle w/o telling us. Presumably we'll
    125     // want to design a better wrapper around RenderStyle for tracking these mutations
    126     // and separate it from StyleResolverState.
    127     const FontDescription& parentFontDescription() { return m_parentStyle->fontDescription(); }
    128     void setZoom(float f) { m_fontBuilder.didChangeFontParameters(m_style->setZoom(f)); }
    129     void setEffectiveZoom(float f) { m_fontBuilder.didChangeFontParameters(m_style->setEffectiveZoom(f)); }
    130     void setWritingMode(WritingMode writingMode) { m_fontBuilder.didChangeFontParameters(m_style->setWritingMode(writingMode)); }
    131     void setTextOrientation(TextOrientation textOrientation) { m_fontBuilder.didChangeFontParameters(m_style->setTextOrientation(textOrientation)); }
    132 
    133 private:
    134     ElementResolveContext m_elementContext;
    135     RawPtrWillBeMember<Document> m_document;
    136 
    137     // m_style is the primary output for each element's style resolve.
    138     RefPtr<RenderStyle> m_style;
    139 
    140     CSSToLengthConversionData m_cssToLengthConversionData;
    141 
    142     // m_parentStyle is not always just element->parentNode()->style()
    143     // so we keep it separate from m_elementContext.
    144     RefPtr<RenderStyle> m_parentStyle;
    145 
    146     OwnPtrWillBeMember<CSSAnimationUpdate> m_animationUpdate;
    147 
    148     bool m_applyPropertyToRegularStyle;
    149     bool m_applyPropertyToVisitedLinkStyle;
    150 
    151     RawPtrWillBeMember<CSSValue> m_lineHeightValue;
    152 
    153     FontBuilder m_fontBuilder;
    154 
    155     OwnPtr<CachedUAStyle> m_cachedUAStyle;
    156 
    157     ElementStyleResources m_elementStyleResources;
    158     // CSSToStyleMap is a pure-logic class and only contains
    159     // a back-pointer to this object.
    160     CSSToStyleMap m_styleMap;
    161     Vector<AtomicString> m_contentAttrValues;
    162 };
    163 
    164 } // namespace blink
    165 
    166 #endif // StyleResolverState_h
    167