Author: jmb
Date: Fri Jan 16 10:02:06 2009
New Revision: 6088
URL: http://source.netsurf-browser.org?rev=6088&view=rev
Log:
Fix parsing of dimensions without a unit specifier.
Modified:
trunk/libcss/src/parse/properties.c
Modified: trunk/libcss/src/parse/properties.c
URL:
http://source.netsurf-browser.org/trunk/libcss/src/parse/properties.c?rev=6088&r1=6087&r2=6088&view=diff
==============================================================================
--- trunk/libcss/src/parse/properties.c (original)
+++ trunk/libcss/src/parse/properties.c Fri Jan 16 10:02:06 2009
@@ -317,6 +317,7 @@
uint32_t *result);
static inline css_error parse_unit_specifier(css_language *c,
const parserutils_vector *vector, int *ctx,
+ uint32_t default_unit,
fixed *length, uint32_t *unit);
static inline css_error parse_border_side_color(css_language *c,
@@ -562,7 +563,8 @@
}
}
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ error = parse_unit_specifier(c, vector, ctx, UNIT_DEG,
+ &length, &unit);
if (error != CSS_OK)
return error;
@@ -811,7 +813,7 @@
}
} else {
error = parse_unit_specifier(c, vector, ctx,
- &length[i], &unit[i]);
+ UNIT_PX, &length[i], &unit[i]);
if (error != CSS_OK)
return error;
@@ -1081,7 +1083,7 @@
} else {
int num_lengths = 0;
- error = parse_unit_specifier(c, vector, ctx,
+ error = parse_unit_specifier(c, vector, ctx, UNIT_PX,
&length[0], &unit[0]);
if (error != CSS_OK)
return error;
@@ -1096,7 +1098,7 @@
token = parserutils_vector_peek(vector, *ctx);
if (token != NULL && tokenIsChar(token, '!') == false) {
- error = parse_unit_specifier(c, vector, ctx,
+ error = parse_unit_specifier(c, vector, ctx, UNIT_PX,
&length[1], &unit[1]);
if (error != CSS_OK)
return error;
@@ -1202,7 +1204,8 @@
parserutils_vector_iterate(vector, ctx);
value = BOTTOM_AUTO;
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ error = parse_unit_specifier(c, vector, ctx, UNIT_PX,
+ &length, &unit);
if (error != CSS_OK)
return error;
@@ -1372,7 +1375,7 @@
return CSS_INVALID;
} else {
error = parse_unit_specifier(c, vector, ctx,
- &length[i], &unit[i]);
+ UNIT_PX, &length[i], &unit[i]);
if (error != CSS_OK)
return error;
@@ -2429,7 +2432,8 @@
parserutils_vector_iterate(vector, ctx);
value = ELEVATION_LOWER;
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ error = parse_unit_specifier(c, vector, ctx, UNIT_DEG,
+ &length, &unit);
if (error != CSS_OK)
return error;
@@ -2945,7 +2949,8 @@
parserutils_vector_iterate(vector, ctx);
value = FONT_SIZE_SMALLER;
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ error = parse_unit_specifier(c, vector, ctx, UNIT_PX,
+ &length, &unit);
if (error != CSS_OK)
return error;
@@ -3160,7 +3165,8 @@
parserutils_vector_iterate(vector, ctx);
value = HEIGHT_AUTO;
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ error = parse_unit_specifier(c, vector, ctx, UNIT_PX,
+ &length, &unit);
if (error != CSS_OK)
return error;
@@ -3224,7 +3230,8 @@
parserutils_vector_iterate(vector, ctx);
value = LEFT_AUTO;
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ error = parse_unit_specifier(c, vector, ctx, UNIT_PX,
+ &length, &unit);
if (error != CSS_OK)
return error;
@@ -3288,7 +3295,8 @@
parserutils_vector_iterate(vector, ctx);
value = LETTER_SPACING_NORMAL;
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ error = parse_unit_specifier(c, vector, ctx, UNIT_PX,
+ &length, &unit);
if (error != CSS_OK)
return error;
@@ -3362,7 +3370,8 @@
value = LINE_HEIGHT_NUMBER;
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ error = parse_unit_specifier(c, vector, ctx, UNIT_PX,
+ &length, &unit);
if (error != CSS_OK)
return error;
@@ -3597,7 +3606,8 @@
parserutils_vector_iterate(vector, ctx);
value = MAX_HEIGHT_NONE;
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ error = parse_unit_specifier(c, vector, ctx, UNIT_PX,
+ &length, &unit);
if (error != CSS_OK)
return error;
@@ -3661,7 +3671,8 @@
parserutils_vector_iterate(vector, ctx);
value = MAX_WIDTH_NONE;
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ error = parse_unit_specifier(c, vector, ctx, UNIT_PX,
+ &length, &unit);
if (error != CSS_OK)
return error;
@@ -3721,7 +3732,8 @@
parserutils_vector_iterate(vector, ctx);
flags = FLAG_INHERIT;
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ error = parse_unit_specifier(c, vector, ctx, UNIT_PX,
+ &length, &unit);
if (error != CSS_OK)
return error;
@@ -3781,7 +3793,8 @@
parserutils_vector_iterate(vector, ctx);
flags = FLAG_INHERIT;
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ error = parse_unit_specifier(c, vector, ctx, UNIT_PX,
+ &length, &unit);
if (error != CSS_OK)
return error;
@@ -4219,7 +4232,8 @@
parserutils_vector_iterate(vector, ctx);
flags = FLAG_INHERIT;
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ error = parse_unit_specifier(c, vector, ctx, UNIT_S,
+ &length, &unit);
if (error != CSS_OK)
return error;
@@ -4279,7 +4293,8 @@
parserutils_vector_iterate(vector, ctx);
flags = FLAG_INHERIT;
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ error = parse_unit_specifier(c, vector, ctx, UNIT_S,
+ &length, &unit);
if (error != CSS_OK)
return error;
@@ -4412,7 +4427,8 @@
token->ilower == c->strings[X_HIGH]) {
value = PITCH_X_HIGH;
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ error = parse_unit_specifier(c, vector, ctx, UNIT_HZ,
+ &length, &unit);
if (error != CSS_OK)
return error;
@@ -4804,7 +4820,8 @@
parserutils_vector_iterate(vector, ctx);
value = RIGHT_AUTO;
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ error = parse_unit_specifier(c, vector, ctx, UNIT_PX,
+ &length, &unit);
if (error != CSS_OK)
return error;
@@ -5324,7 +5341,8 @@
parserutils_vector_iterate(vector, ctx);
flags = FLAG_INHERIT;
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ error = parse_unit_specifier(c, vector, ctx, UNIT_PX,
+ &length, &unit);
if (error != CSS_OK)
return error;
@@ -5433,7 +5451,8 @@
parserutils_vector_iterate(vector, ctx);
value = TOP_AUTO;
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ error = parse_unit_specifier(c, vector, ctx, UNIT_PX,
+ &length, &unit);
if (error != CSS_OK)
return error;
@@ -5570,7 +5589,8 @@
parserutils_vector_iterate(vector, ctx);
value = VERTICAL_ALIGN_TEXT_BOTTOM;
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ error = parse_unit_specifier(c, vector, ctx, UNIT_PX,
+ &length, &unit);
if (error != CSS_OK)
return error;
@@ -6023,7 +6043,9 @@
value = VOLUME_NUMBER;
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ /* Yes, really UNIT_PX -- percentages MUST have a % sign */
+ error = parse_unit_specifier(c, vector, ctx, UNIT_PX,
+ &length, &unit);
if (error != CSS_OK)
return error;
@@ -6195,7 +6217,8 @@
parserutils_vector_iterate(vector, ctx);
value = WIDTH_AUTO;
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ error = parse_unit_specifier(c, vector, ctx, UNIT_PX,
+ &length, &unit);
if (error != CSS_OK)
return error;
@@ -6259,7 +6282,8 @@
parserutils_vector_iterate(vector, ctx);
value = WORD_SPACING_NORMAL;
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ error = parse_unit_specifier(c, vector, ctx, UNIT_PX,
+ &length, &unit);
if (error != CSS_OK)
return error;
@@ -6500,6 +6524,7 @@
css_error parse_unit_specifier(css_language *c,
const parserutils_vector *vector, int *ctx,
+ uint32_t default_unit,
fixed *length, uint32_t *unit)
{
const css_token *token;
@@ -6513,6 +6538,7 @@
token = parserutils_vector_iterate(vector, ctx);
if (token == NULL || (token->type != CSS_TOKEN_DIMENSION &&
+ token->type != CSS_TOKEN_NUMBER &&
token->type != CSS_TOKEN_PERCENTAGE))
return CSS_INVALID;
@@ -6521,13 +6547,7 @@
num = number_from_css_string(&tmp, false, &consumed);
if (token->type == CSS_TOKEN_DIMENSION) {
- if (consumed == token->idata->len) {
- /** \todo In quirks mode, non-zero units should be
- * treated as px too */
- if (num != 0)
- return CSS_INVALID;
- *unit = UNIT_PX;
- } else if (token->idata->len - consumed == 4) {
+ if (token->idata->len - consumed == 4) {
if (strncasecmp((char *) token->idata->data + consumed,
"grad", 4) == 0)
*unit = UNIT_GRAD;
@@ -6586,6 +6606,14 @@
return CSS_INVALID;
} else
return CSS_INVALID;
+ } else if (token->type == CSS_TOKEN_NUMBER) {
+ /** \todo In quirks mode, non-zero units should be
+ * treated as default_unit too */
+ /** \todo also, in quirks mode, we need to cater for dimensions
+ * separated from their units by whitespace (e.g. "0 px") */
+ if (num != 0)
+ return CSS_INVALID;
+ *unit = default_unit;
} else {
if (consumed != token->idata->len)
return CSS_INVALID;
@@ -6748,7 +6776,8 @@
parserutils_vector_iterate(vector, ctx);
value = BORDER_WIDTH_THICK;
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ error = parse_unit_specifier(c, vector, ctx, UNIT_PX,
+ &length, &unit);
if (error != CSS_OK)
return error;
@@ -6813,7 +6842,8 @@
parserutils_vector_iterate(vector, ctx);
value = MARGIN_AUTO;
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ error = parse_unit_specifier(c, vector, ctx, UNIT_PX,
+ &length, &unit);
if (error != CSS_OK)
return error;
@@ -6873,7 +6903,8 @@
parserutils_vector_iterate(vector, ctx);
flags = FLAG_INHERIT;
} else {
- error = parse_unit_specifier(c, vector, ctx, &length, &unit);
+ error = parse_unit_specifier(c, vector, ctx, UNIT_PX,
+ &length, &unit);
if (error != CSS_OK)
return error;
_______________________________________________
netsurf-commits mailing list
[email protected]
http://vlists.pepperfish.net/cgi-bin/mailman/listinfo/netsurf-commits-netsurf-browser.org