1 /*
2  * (C) 1999-2003 Lars Knoll (knoll@kde.org)
3  * Copyright (C) 2004, 2005, 2006, 2007, 2008 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 #include "config.h"
22 #include "CSSPropertyLonghand.h"
23 
24 #include "CSSPropertyNames.h"
25 #include <wtf/HashMap.h>
26 #include <wtf/StdLibExtras.h>
27 
28 namespace WebCore {
29 
30 typedef HashMap<int, CSSPropertyLonghand> ShorthandMap;
31 
initShorthandMap(ShorthandMap & shorthandMap)32 static void initShorthandMap(ShorthandMap& shorthandMap)
33 {
34     #define SET_SHORTHAND_MAP_ENTRY(map, propID, array) \
35         map.set(propID, CSSPropertyLonghand(array, WTF_ARRAY_LENGTH(array)))
36 
37     // FIXME: The 'font' property has "shorthand nature" but is not parsed as a shorthand.
38 
39     // Do not change the order of the following four shorthands, and keep them together.
40     static const int borderProperties[4][3] = {
41         { CSSPropertyBorderTopColor, CSSPropertyBorderTopStyle, CSSPropertyBorderTopWidth },
42         { CSSPropertyBorderRightColor, CSSPropertyBorderRightStyle, CSSPropertyBorderRightWidth },
43         { CSSPropertyBorderBottomColor, CSSPropertyBorderBottomStyle, CSSPropertyBorderBottomWidth },
44         { CSSPropertyBorderLeftColor, CSSPropertyBorderLeftStyle, CSSPropertyBorderLeftWidth }
45     };
46     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyBorderTop, borderProperties[0]);
47     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyBorderRight, borderProperties[1]);
48     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyBorderBottom, borderProperties[2]);
49     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyBorderLeft, borderProperties[3]);
50 
51     shorthandMap.set(CSSPropertyBorder, CSSPropertyLonghand(borderProperties[0], sizeof(borderProperties) / sizeof(borderProperties[0][0])));
52 
53     static const int borderColorProperties[] = {
54         CSSPropertyBorderTopColor,
55         CSSPropertyBorderRightColor,
56         CSSPropertyBorderBottomColor,
57         CSSPropertyBorderLeftColor
58     };
59     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyBorderColor, borderColorProperties);
60 
61     static const int borderStyleProperties[] = {
62         CSSPropertyBorderTopStyle,
63         CSSPropertyBorderRightStyle,
64         CSSPropertyBorderBottomStyle,
65         CSSPropertyBorderLeftStyle
66     };
67     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyBorderStyle, borderStyleProperties);
68 
69     static const int borderWidthProperties[] = {
70         CSSPropertyBorderTopWidth,
71         CSSPropertyBorderRightWidth,
72         CSSPropertyBorderBottomWidth,
73         CSSPropertyBorderLeftWidth
74     };
75     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyBorderWidth, borderWidthProperties);
76 
77     static const int backgroundPositionProperties[] = { CSSPropertyBackgroundPositionX, CSSPropertyBackgroundPositionY };
78     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyBackgroundPosition, backgroundPositionProperties);
79 
80     static const int backgroundRepeatProperties[] = { CSSPropertyBackgroundRepeatX, CSSPropertyBackgroundRepeatY };
81     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyBackgroundRepeat, backgroundRepeatProperties);
82 
83     static const int borderSpacingProperties[] = { CSSPropertyWebkitBorderHorizontalSpacing, CSSPropertyWebkitBorderVerticalSpacing };
84     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyBorderSpacing, borderSpacingProperties);
85 
86     static const int listStyleProperties[] = {
87         CSSPropertyListStyleImage,
88         CSSPropertyListStylePosition,
89         CSSPropertyListStyleType
90     };
91     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyListStyle, listStyleProperties);
92 
93     static const int marginProperties[] = {
94         CSSPropertyMarginTop,
95         CSSPropertyMarginRight,
96         CSSPropertyMarginBottom,
97         CSSPropertyMarginLeft
98     };
99     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyMargin, marginProperties);
100 
101     static const int marginCollapseProperties[] = { CSSPropertyWebkitMarginBeforeCollapse, CSSPropertyWebkitMarginAfterCollapse };
102     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyWebkitMarginCollapse, marginCollapseProperties);
103 
104     static const int marqueeProperties[] = {
105         CSSPropertyWebkitMarqueeDirection,
106         CSSPropertyWebkitMarqueeIncrement,
107         CSSPropertyWebkitMarqueeRepetition,
108         CSSPropertyWebkitMarqueeStyle,
109         CSSPropertyWebkitMarqueeSpeed
110     };
111     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyWebkitMarquee, marqueeProperties);
112 
113     static const int outlineProperties[] = {
114         CSSPropertyOutlineColor,
115         CSSPropertyOutlineOffset,
116         CSSPropertyOutlineStyle,
117         CSSPropertyOutlineWidth
118     };
119     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyOutline, outlineProperties);
120 
121     static const int paddingProperties[] = {
122         CSSPropertyPaddingTop,
123         CSSPropertyPaddingRight,
124         CSSPropertyPaddingBottom,
125         CSSPropertyPaddingLeft
126     };
127     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyPadding, paddingProperties);
128 
129     static const int textStrokeProperties[] = { CSSPropertyWebkitTextStrokeColor, CSSPropertyWebkitTextStrokeWidth };
130     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyWebkitTextStroke, textStrokeProperties);
131 
132     static const int backgroundProperties[] = {
133         CSSPropertyBackgroundAttachment,
134         CSSPropertyBackgroundClip,
135         CSSPropertyBackgroundColor,
136         CSSPropertyBackgroundImage,
137         CSSPropertyBackgroundOrigin,
138         CSSPropertyBackgroundPositionX,
139         CSSPropertyBackgroundPositionY,
140         CSSPropertyBackgroundRepeatX,
141         CSSPropertyBackgroundRepeatY
142     };
143     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyBackground, backgroundProperties);
144 
145     static const int columnsProperties[] = { CSSPropertyWebkitColumnWidth, CSSPropertyWebkitColumnCount };
146     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyWebkitColumns, columnsProperties);
147 
148     static const int columnRuleProperties[] = {
149         CSSPropertyWebkitColumnRuleColor,
150         CSSPropertyWebkitColumnRuleStyle,
151         CSSPropertyWebkitColumnRuleWidth
152     };
153     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyWebkitColumnRule, columnRuleProperties);
154 
155     static const int overflowProperties[] = { CSSPropertyOverflowX, CSSPropertyOverflowY };
156     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyOverflow, overflowProperties);
157 
158     static const int borderRadiusProperties[] = {
159         CSSPropertyBorderTopRightRadius,
160         CSSPropertyBorderTopLeftRadius,
161         CSSPropertyBorderBottomLeftRadius,
162         CSSPropertyBorderBottomRightRadius
163     };
164     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyBorderRadius, borderRadiusProperties);
165     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyWebkitBorderRadius, borderRadiusProperties);
166 
167     static const int maskPositionProperties[] = { CSSPropertyWebkitMaskPositionX, CSSPropertyWebkitMaskPositionY };
168     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyWebkitMaskPosition, maskPositionProperties);
169 
170     static const int maskRepeatProperties[] = { CSSPropertyWebkitMaskRepeatX, CSSPropertyWebkitMaskRepeatY };
171     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyWebkitMaskRepeat, maskRepeatProperties);
172 
173     static const int maskProperties[] = {
174         CSSPropertyWebkitMaskAttachment,
175         CSSPropertyWebkitMaskClip,
176         CSSPropertyWebkitMaskImage,
177         CSSPropertyWebkitMaskOrigin,
178         CSSPropertyWebkitMaskPositionX,
179         CSSPropertyWebkitMaskPositionY,
180         CSSPropertyWebkitMaskRepeatX,
181         CSSPropertyWebkitMaskRepeatY
182     };
183     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyWebkitMask, maskProperties);
184 
185     static const int animationProperties[] = {
186         CSSPropertyWebkitAnimationName,
187         CSSPropertyWebkitAnimationDuration,
188         CSSPropertyWebkitAnimationTimingFunction,
189         CSSPropertyWebkitAnimationDelay,
190         CSSPropertyWebkitAnimationIterationCount,
191         CSSPropertyWebkitAnimationDirection,
192         CSSPropertyWebkitAnimationFillMode
193     };
194     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyWebkitAnimation, animationProperties);
195 
196     static const int transitionProperties[] = {
197         CSSPropertyWebkitTransitionProperty,
198         CSSPropertyWebkitTransitionDuration,
199         CSSPropertyWebkitTransitionTimingFunction,
200         CSSPropertyWebkitTransitionDelay
201     };
202     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyWebkitTransition, transitionProperties);
203 
204     static const int transformOriginProperties[] = {
205         CSSPropertyWebkitTransformOriginX,
206         CSSPropertyWebkitTransformOriginY
207     };
208     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyWebkitTransformOrigin, transformOriginProperties);
209 
210     static const int textEmphasisProperties[] = {
211         CSSPropertyWebkitTextEmphasisColor,
212         CSSPropertyWebkitTextEmphasisStyle
213     };
214     SET_SHORTHAND_MAP_ENTRY(shorthandMap, CSSPropertyWebkitTextEmphasis, textEmphasisProperties);
215 
216     #undef SET_SHORTHAND_MAP_ENTRY
217 }
218 
longhandForProperty(int propertyID)219 CSSPropertyLonghand longhandForProperty(int propertyID)
220 {
221     DEFINE_STATIC_LOCAL(ShorthandMap, shorthandMap, ());
222     if (shorthandMap.isEmpty())
223         initShorthandMap(shorthandMap);
224 
225     return shorthandMap.get(propertyID);
226 }
227 
228 
229 } // namespace WebCore
230