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