1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
|
/* vim: set shiftwidth=4 tabstop=8 autoindent cindent expandtab: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* build (from code) lists of all supported CSS properties */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "mozilla/ArrayUtils.h"
// Need an extra level of macro nesting to force expansion of method_
// params before they get pasted.
#define STRINGIFY_METHOD(method_) #method_
struct PropertyInfo {
const char* propName;
const char* domName;
const char* pref;
};
const PropertyInfo gLonghandProperties[] = {
#define CSS_PROP_PUBLIC_OR_PRIVATE(publicname_, privatename_) publicname_
#define CSS_PROP_LONGHAND(name_, id_, method_, flags_, pref_, ...) \
{#name_, STRINGIFY_METHOD(method_), pref_},
#include "mozilla/ServoCSSPropList.h"
#undef CSS_PROP_LONGHAND
#undef CSS_PROP_PUBLIC_OR_PRIVATE
};
/*
* These are the properties for which domName in the above list should
* be used. They're in the same order as the above list, with some
* items skipped.
*/
const char* gLonghandPropertiesWithDOMProp[] = {
#define CSS_PROP_LIST_EXCLUDE_INTERNAL
#define CSS_PROP_LONGHAND(name_, ...) #name_,
#include "mozilla/ServoCSSPropList.h"
#undef CSS_PROP_LONGHAND
#undef CSS_PROP_LIST_EXCLUDE_INTERNAL
};
const PropertyInfo gShorthandProperties[] = {
#define CSS_PROP_PUBLIC_OR_PRIVATE(publicname_, privatename_) publicname_
#define CSS_PROP_SHORTHAND(name_, id_, method_, flags_, pref_) \
{#name_, STRINGIFY_METHOD(method_), pref_},
#define CSS_PROP_ALIAS(name_, aliasid_, id_, method_, pref_) \
{#name_, #method_, pref_},
#include "mozilla/ServoCSSPropList.h"
#undef CSS_PROP_ALIAS
#undef CSS_PROP_SHORTHAND
#undef CSS_PROP_PUBLIC_OR_PRIVATE
};
/* see gLonghandPropertiesWithDOMProp */
const char* gShorthandPropertiesWithDOMProp[] = {
#define CSS_PROP_LIST_EXCLUDE_INTERNAL
#define CSS_PROP_SHORTHAND(name_, id_, method_, flags_, pref_) #name_,
#define CSS_PROP_ALIAS(name_, aliasid_, id_, method_, pref_) #name_,
#include "mozilla/ServoCSSPropList.h"
#undef CSS_PROP_ALIAS
#undef CSS_PROP_SHORTHAND
#undef CSS_PROP_LIST_EXCLUDE_INTERNAL
};
#undef STRINGIFY_METHOD
const char* gInaccessibleProperties[] = {
// Don't print the properties that aren't accepted by the parser, per
// CSSParserImpl::ParseProperty
"-x-cols",
"-x-lang",
"-x-span",
"-x-text-zoom",
"-moz-context-properties",
"-moz-control-character-visibility",
"-moz-default-appearance",
"-moz-inert",
"-moz-list-reversed", // parsed by UA sheets only
"-moz-script-level", // parsed by UA sheets only
"-moz-script-size-multiplier",
"-moz-script-min-size",
"-moz-math-variant",
"-moz-math-display", // parsed by UA sheets only
"-moz-top-layer", // parsed by UA sheets only
"-moz-min-font-size-ratio", // parsed by UA sheets only
"-moz-font-smoothing-background-color", // chrome-only internal properties
"-moz-window-opacity", // chrome-only internal properties
"-moz-window-transform", // chrome-only internal properties
"-moz-window-transform-origin", // chrome-only internal properties
"-moz-window-shadow", // chrome-only internal properties
};
inline int is_inaccessible(const char* aPropName) {
for (unsigned j = 0; j < MOZ_ARRAY_LENGTH(gInaccessibleProperties); ++j) {
if (strcmp(aPropName, gInaccessibleProperties[j]) == 0) return 1;
}
return 0;
}
void print_array(const char* aName, const PropertyInfo* aProps,
unsigned aPropsLength, const char* const* aDOMProps,
unsigned aDOMPropsLength) {
printf("var %s = [\n", aName);
int first = 1;
unsigned j = 0; // index into DOM prop list
for (unsigned i = 0; i < aPropsLength; ++i) {
const PropertyInfo* p = aProps + i;
if (is_inaccessible(p->propName))
// inaccessible properties never have DOM props, so don't
// worry about incrementing j. The assertion below will
// catch if they do.
continue;
if (first)
first = 0;
else
printf(",\n");
printf("\t{ name: \"%s\", prop: ", p->propName);
if (j >= aDOMPropsLength || strcmp(p->propName, aDOMProps[j]) != 0)
printf("null");
else {
++j;
if (strncmp(p->domName, "Moz", 3) == 0)
printf("\"%s\"", p->domName);
else
// lowercase the first letter
printf("\"%c%s\"", p->domName[0] + 32, p->domName + 1);
}
if (p->pref[0]) {
printf(", pref: \"%s\"", p->pref);
}
printf(" }");
}
if (j != aDOMPropsLength) {
fprintf(stderr, "Assertion failure %s:%d\n", __FILE__, __LINE__);
fprintf(stderr, "j==%d, aDOMPropsLength == %d\n", j, aDOMPropsLength);
exit(1);
}
printf("\n];\n\n");
}
int main() {
print_array("gLonghandProperties", gLonghandProperties,
MOZ_ARRAY_LENGTH(gLonghandProperties),
gLonghandPropertiesWithDOMProp,
MOZ_ARRAY_LENGTH(gLonghandPropertiesWithDOMProp));
print_array("gShorthandProperties", gShorthandProperties,
MOZ_ARRAY_LENGTH(gShorthandProperties),
gShorthandPropertiesWithDOMProp,
MOZ_ARRAY_LENGTH(gShorthandPropertiesWithDOMProp));
return 0;
}
|