|
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 |
|
32 static void initShorthandMap(ShorthandMap& shorthandMap) |
|
33 { |
|
34 #define SET_SHORTHAND_MAP_ENTRY(map, propID, array) \ |
|
35 map.set(propID, CSSPropertyLonghand(array, sizeof(array) / sizeof(array[0]))) |
|
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[] = { CSSPropertyWebkitMarginTopCollapse, CSSPropertyWebkitMarginBottomCollapse }; |
|
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 #undef SET_SHORTHAND_MAP_ENTRY |
|
211 } |
|
212 |
|
213 CSSPropertyLonghand longhandForProperty(int propertyID) |
|
214 { |
|
215 DEFINE_STATIC_LOCAL(ShorthandMap, shorthandMap, ()); |
|
216 if (shorthandMap.isEmpty()) |
|
217 initShorthandMap(shorthandMap); |
|
218 |
|
219 return shorthandMap.get(propertyID); |
|
220 } |
|
221 |
|
222 |
|
223 } // namespace WebCore |