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

Reply via email to