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