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 177
|
/* 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 <stdlib.h>
#include <string.h>
#include <array>
// Do not consider properties not valid in style rules
#define CSS_PROP_LIST_EXCLUDE_NOT_IN_STYLE
// 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_, flags_, 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_, flags_, 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-scale",
"-moz-default-appearance",
"-moz-theme",
"-moz-inert",
"-moz-script-level", // parsed by UA sheets only
"-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-box-collapse", // chrome-only internal properties
"-moz-subtree-hidden-only-visually", // chrome-only internal properties
"-moz-user-focus", // chrome-only internal properties
"-moz-window-input-region-margin", // chrome-only internal properties
"-moz-window-dragging", // chrome-only internal properties
"-moz-window-opacity", // chrome-only internal properties
"-moz-window-transform", // chrome-only internal properties
"-moz-window-shadow", // chrome-only internal properties
};
inline int is_inaccessible(const char* aPropName) {
for (unsigned j = 0; j < std::size(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,
std::size(gLonghandProperties), gLonghandPropertiesWithDOMProp,
std::size(gLonghandPropertiesWithDOMProp));
print_array("gShorthandProperties", gShorthandProperties,
std::size(gShorthandProperties), gShorthandPropertiesWithDOMProp,
std::size(gShorthandPropertiesWithDOMProp));
return 0;
}
|