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