1 /* 2 * Copyright (C) 1999 Lars Knoll (knoll@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. document()53 Document& document() const { return m_document; } 54 // These are all just pass-through methods to ElementResolveContext. element()55 Element* element() const { return m_elementContext.element(); } parentNode()56 const ContainerNode* parentNode() const { return m_elementContext.parentNode(); } rootElementStyle()57 const RenderStyle* rootElementStyle() const { return m_elementContext.rootElementStyle(); } elementLinkState()58 EInsideLink elementLinkState() const { return m_elementContext.elementLinkState(); } distributedToInsertionPoint()59 bool distributedToInsertionPoint() const { return m_elementContext.distributedToInsertionPoint(); } 60 elementContext()61 const ElementResolveContext& elementContext() const { return m_elementContext; } 62 setStyle(PassRefPtr<RenderStyle> style)63 void setStyle(PassRefPtr<RenderStyle> style) { m_style = style; m_cssToLengthConversionData.setStyle(m_style.get()); } style()64 const RenderStyle* style() const { return m_style.get(); } style()65 RenderStyle* style() { return m_style.get(); } takeStyle()66 PassRefPtr<RenderStyle> takeStyle() { return m_style.release(); } 67 cssToLengthConversionData()68 const CSSToLengthConversionData& cssToLengthConversionData() const { return m_cssToLengthConversionData; } 69 70 void setAnimationUpdate(PassOwnPtrWillBeRawPtr<CSSAnimationUpdate>); animationUpdate()71 const CSSAnimationUpdate* animationUpdate() { return m_animationUpdate.get(); } 72 PassOwnPtrWillBeRawPtr<CSSAnimationUpdate> takeAnimationUpdate(); 73 setParentStyle(PassRefPtr<RenderStyle> parentStyle)74 void setParentStyle(PassRefPtr<RenderStyle> parentStyle) { m_parentStyle = parentStyle; } parentStyle()75 const RenderStyle* parentStyle() const { return m_parentStyle.get(); } parentStyle()76 RenderStyle* parentStyle() { return m_parentStyle.get(); } 77 setCurrentRule(StyleRule * currentRule)78 void setCurrentRule(StyleRule* currentRule) { m_currentRule = 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. setApplyPropertyToRegularStyle(bool isApply)86 void setApplyPropertyToRegularStyle(bool isApply) { m_applyPropertyToRegularStyle = isApply; } setApplyPropertyToVisitedLinkStyle(bool isApply)87 void setApplyPropertyToVisitedLinkStyle(bool isApply) { m_applyPropertyToVisitedLinkStyle = isApply; } applyPropertyToRegularStyle()88 bool applyPropertyToRegularStyle() const { return m_applyPropertyToRegularStyle; } applyPropertyToVisitedLinkStyle()89 bool applyPropertyToVisitedLinkStyle() const { return m_applyPropertyToVisitedLinkStyle; } 90 91 // Holds all attribute names found while applying "content" properties that contain an "attr()" value. contentAttrValues()92 Vector<AtomicString>& contentAttrValues() { return m_contentAttrValues; } 93 setLineHeightValue(CSSValue * value)94 void setLineHeightValue(CSSValue* value) { m_lineHeightValue = value; } lineHeightValue()95 CSSValue* lineHeightValue() { return m_lineHeightValue; } 96 cacheUserAgentBorderAndBackground()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 cachedUAStyle()107 const CachedUAStyle* cachedUAStyle() const 108 { 109 return m_cachedUAStyle.get(); 110 } 111 elementStyleResources()112 ElementStyleResources& elementStyleResources() { return m_elementStyleResources; } styleMap()113 const CSSToStyleMap& styleMap() const { return m_styleMap; } 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. styleImage(CSSPropertyID propertyId,CSSValue * value)119 PassRefPtr<StyleImage> styleImage(CSSPropertyID propertyId, CSSValue* value) 120 { 121 return m_elementStyleResources.styleImage(document(), document().textLinkColors(), style()->color(), propertyId, value); 122 } 123 fontBuilder()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. parentFontDescription()130 const FontDescription& parentFontDescription() { return m_parentStyle->fontDescription(); } setZoom(float f)131 void setZoom(float f) { m_fontBuilder.didChangeFontParameters(m_style->setZoom(f)); } setEffectiveZoom(float f)132 void setEffectiveZoom(float f) { m_fontBuilder.didChangeFontParameters(m_style->setEffectiveZoom(f)); } setWritingMode(WritingMode writingMode)133 void setWritingMode(WritingMode writingMode) { m_fontBuilder.didChangeFontParameters(m_style->setWritingMode(writingMode)); } setTextOrientation(TextOrientation textOrientation)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