From 7ecab92e9a8508c44a758a8ca58defe9a5965bb4 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Sat, 14 Feb 2009 00:06:01 +0000 Subject: A motley selection of changes. Vague summary: + Add config makefile (not that there's anything to configure at present :) + Fix dumping of UNIT_MS to actually use sprintf and not printf + Extend computed style dumping (still loads of properties missing) + Make result buffer larger in select-auto.c -- avoids buffer overflows when there's way more output than expected + Expand expected test output to contain defaulted properties (more of this will be needed once the computed style dumping is complete) + Store interned string pointers in css_select_state. + Intern pseudo class/element names at start of selecting styles for a sheet + Group properties so we know which ones appear in the extension blocks + Fixup unset properties once the cascade has completed + Implement matching of pseudo class/element selectors + Fix setting of background-image and list-style-image when there's no URL. svn path=/trunk/libcss/; revision=6470 --- test/data/select/tests1.dat | 27 ++++ test/dump.h | 2 +- test/dump_computed.h | 301 ++++++++++++++++++++++++++++++++++++++++++++ test/select-auto.c | 10 +- 4 files changed, 334 insertions(+), 6 deletions(-) (limited to 'test') diff --git a/test/data/select/tests1.dat b/test/data/select/tests1.dat index d8a55b0..5b415f3 100644 --- a/test/data/select/tests1.dat +++ b/test/data/select/tests1.dat @@ -12,6 +12,15 @@ div#foo { background-color: #bbc; } .green { color: #0f0; } #errors #expected +background-attachment: scroll +background-color: transparent +background-image: none +background-position: 0% 0% +background-repeat: repeat +border-top-color: #00000000 +border-right-color: #00000000 +border-bottom-color: #00000000 +border-left-color: #00000000 color: #ff000000 display: block #reset @@ -24,6 +33,15 @@ div { display: block; } div { display: inline; } #errors #expected +background-attachment: scroll +background-color: transparent +background-image: none +background-position: 0% 0% +background-repeat: repeat +border-top-color: #00000000 +border-right-color: #00000000 +border-bottom-color: #00000000 +border-left-color: #00000000 display: block #reset @@ -34,6 +52,15 @@ div { background-color: #000; } div:active { background-color: #bbc; } #errors #expected +background-attachment: scroll background-color: #bbbbcc00 +background-image: none +background-position: 0% 0% +background-repeat: repeat +border-top-color: #00000000 +border-right-color: #00000000 +border-bottom-color: #00000000 +border-left-color: #00000000 +display: inline #reset diff --git a/test/dump.h b/test/dump.h index c217565..98ec1bb 100644 --- a/test/dump.h +++ b/test/dump.h @@ -436,7 +436,7 @@ static void dump_unit(fixed val, uint32_t unit, char **ptr) *ptr += sprintf(*ptr, "rad"); break; case UNIT_MS: - *ptr += printf(*ptr, "ms"); + *ptr += sprintf(*ptr, "ms"); break; case UNIT_S: *ptr += sprintf(*ptr, "s"); diff --git a/test/dump_computed.h b/test/dump_computed.h index dda07c1..f573e9d 100644 --- a/test/dump_computed.h +++ b/test/dump_computed.h @@ -1,6 +1,141 @@ #include #include +#include "utils/fpmath.h" + +static size_t dump_css_fixed(css_fixed f, char *ptr, size_t len) +{ +#define ABS(x) (uint32_t)((x) < 0 ? -(x) : (x)) + uint32_t uintpart = FIXTOINT(ABS(f)); + /* + 500 to ensure round to nearest (division will truncate) */ + uint32_t fracpart = ((ABS(f) & 0x3ff) * 1000 + 500) / (1 << 10); +#undef ABS + size_t flen = 0; + char tmp[20]; + size_t tlen = 0; + char *buf = ptr; + + if (len == 0) + return 0; + + if (f < 0) { + buf[0] = '-'; + buf++; + len--; + } + + do { + tmp[tlen] = "0123456789"[uintpart % 10]; + tlen++; + + uintpart /= 10; + } while (tlen < 20 && uintpart != 0); + + while (tlen > 0 && len > 0) { + buf[0] = tmp[--tlen]; + buf++; + len--; + } + + if (len > 0) { + buf[0] = '.'; + buf++; + len--; + } + + do { + tmp[tlen] = "0123456789"[fracpart % 10]; + tlen++; + + fracpart /= 10; + } while (tlen < 20 && fracpart != 0); + + while (tlen > 0 && len > 0) { + buf[0] = tmp[--tlen]; + buf++; + flen++; + len--; + } + + while (flen < 3 && len > 0) { + buf[0] = '0'; + buf++; + flen++; + len--; + } + + if (len > 0) + buf[0] = '\0'; + + return buf - ptr; +} +static size_t dump_css_number(css_fixed val, char *ptr, size_t len) +{ + if (INTTOFIX(FIXTOINT(val)) == val) + return snprintf(ptr, len, "%d", FIXTOINT(val)); + else + return dump_css_fixed(val, ptr, len); +} + +static size_t dump_css_unit(css_fixed val, css_unit unit, char *ptr, size_t len) +{ + size_t ret = dump_css_number(val, ptr, len); + + switch (unit) { + case CSS_UNIT_PX: + ret += snprintf(ptr + ret, len - ret, "px"); + break; + case CSS_UNIT_EX: + ret += snprintf(ptr + ret, len - ret, "ex"); + break; + case CSS_UNIT_EM: + ret += snprintf(ptr + ret, len - ret, "em"); + break; + case CSS_UNIT_IN: + ret += snprintf(ptr + ret, len - ret, "in"); + break; + case CSS_UNIT_CM: + ret += snprintf(ptr + ret, len - ret, "cm"); + break; + case CSS_UNIT_MM: + ret += snprintf(ptr + ret, len - ret, "mm"); + break; + case CSS_UNIT_PT: + ret += snprintf(ptr + ret, len - ret, "pt"); + break; + case CSS_UNIT_PC: + ret += snprintf(ptr + ret, len - ret, "pc"); + break; + case CSS_UNIT_PCT: + ret += snprintf(ptr + ret, len - ret, "%%"); + break; + case CSS_UNIT_DEG: + ret += snprintf(ptr + ret, len - ret, "deg"); + break; + case CSS_UNIT_GRAD: + ret += snprintf(ptr + ret, len - ret, "grad"); + break; + case CSS_UNIT_RAD: + ret += snprintf(ptr + ret, len - ret, "rad"); + break; + case CSS_UNIT_MS: + ret += snprintf(ptr + ret, len - ret, "ms"); + break; + case CSS_UNIT_S: + ret += snprintf(ptr + ret, len - ret, "s"); + break; + case CSS_UNIT_HZ: + ret += snprintf(ptr + ret, len - ret, "Hz"); + break; + case CSS_UNIT_KHZ: + ret += snprintf(ptr + ret, len - ret, "kHz"); + break; + } + + return ret; +} + + static void dump_computed_style(const css_computed_style *style, char *buf, size_t *len) { @@ -8,6 +143,9 @@ static void dump_computed_style(const css_computed_style *style, char *buf, size_t wrote = 0; uint8_t val; css_color color; + const css_string *url; + css_fixed len1, len2; + css_unit unit1, unit2; val = css_computed_background_attachment(style); switch (val) { @@ -39,6 +177,169 @@ static void dump_computed_style(const css_computed_style *style, char *buf, ptr += wrote; *len -= wrote; + val = css_computed_background_image(style, &url); + if (val == CSS_BACKGROUND_IMAGE_IMAGE && url->data != NULL) { + wrote = snprintf(ptr, *len, "background-image: url('%.*s')\n", + (int) url->len, url->data); + } else if (val == CSS_BACKGROUND_IMAGE_NONE) { + wrote = snprintf(ptr, *len, "background-image: none\n"); + } else { + wrote = 0; + } + ptr += wrote; + *len -= wrote; + + val = css_computed_background_position(style, &len1, &unit1, + &len2, &unit2); + if (val == CSS_BACKGROUND_POSITION_SET) { + wrote = snprintf(ptr, *len, "background-position: "); + ptr += wrote; + *len -= wrote; + + wrote = dump_css_unit(len1, unit1, ptr, *len); + ptr += wrote; + *len -= wrote; + + wrote = snprintf(ptr, *len, " "); + ptr += wrote; + *len -= wrote; + + wrote = dump_css_unit(len2, unit2, ptr, *len); + ptr += wrote; + *len -= wrote; + + wrote = snprintf(ptr, *len, "\n"); + ptr += wrote; + *len -= wrote; + } + + val = css_computed_background_repeat(style); + switch (val) { + case CSS_BACKGROUND_REPEAT_REPEAT_X: + wrote = snprintf(ptr, *len, "background-repeat: repeat-x\n"); + break; + case CSS_BACKGROUND_REPEAT_REPEAT_Y: + wrote = snprintf(ptr, *len, "background-repeat: repeat-y\n"); + break; + case CSS_BACKGROUND_REPEAT_REPEAT: + wrote = snprintf(ptr, *len, "background-repeat: repeat\n"); + break; + case CSS_BACKGROUND_REPEAT_NO_REPEAT: + wrote = snprintf(ptr, *len, "background-repeat: no-repeat\n"); + break; + default: + wrote = 0; + break; + } + ptr += wrote; + *len -= wrote; + + val = css_computed_border_collapse(style); + switch (val) { + case CSS_BORDER_COLLAPSE_SEPARATE: + wrote = snprintf(ptr, *len, "border-collapse: separate\n"); + break; + case CSS_BORDER_COLLAPSE_COLLAPSE: + wrote = snprintf(ptr, *len, "border-collapse: collapse\n"); + break; + default: + wrote = 0; + break; + } + ptr += wrote; + *len -= wrote; + + if (style->uncommon != NULL) { + val = css_computed_border_spacing(style, &len1, &unit1, + &len2, &unit2); + if (val == CSS_BORDER_SPACING_SET) { + wrote = snprintf(ptr, *len, "border-spacing: "); + ptr += wrote; + *len -= wrote; + + wrote = dump_css_unit(len1, unit1, ptr, *len); + ptr += wrote; + *len -= wrote; + + wrote = snprintf(ptr, *len, " "); + ptr += wrote; + *len -= wrote; + + wrote = dump_css_unit(len2, unit2, ptr, *len); + ptr += wrote; + *len -= wrote; + + wrote = snprintf(ptr, *len, "\n"); + ptr += wrote; + *len -= wrote; + } + } + + val = css_computed_border_top_color(style, &color); + switch (val) { + case CSS_BORDER_COLOR_TRANSPARENT: + wrote = snprintf(ptr, *len, "border-top-color: transparent\n"); + break; + case CSS_BORDER_COLOR_COLOR: + wrote = snprintf(ptr, *len, "border-top-color: #%08x\n", color); + break; + default: + wrote = 0; + break; + } + ptr += wrote; + *len -= wrote; + + val = css_computed_border_right_color(style, &color); + switch (val) { + case CSS_BORDER_COLOR_TRANSPARENT: + wrote = snprintf(ptr, *len, + "border-right-color: transparent\n"); + break; + case CSS_BORDER_COLOR_COLOR: + wrote = snprintf(ptr, *len, + "border-right-color: #%08x\n", color); + break; + default: + wrote = 0; + break; + } + ptr += wrote; + *len -= wrote; + + val = css_computed_border_bottom_color(style, &color); + switch (val) { + case CSS_BORDER_COLOR_TRANSPARENT: + wrote = snprintf(ptr, *len, + "border-bottom-color: transparent\n"); + break; + case CSS_BORDER_COLOR_COLOR: + wrote = snprintf(ptr, *len, + "border-bottom-color: #%08x\n", color); + break; + default: + wrote = 0; + break; + } + ptr += wrote; + *len -= wrote; + + val = css_computed_border_left_color(style, &color); + switch (val) { + case CSS_BORDER_COLOR_TRANSPARENT: + wrote = snprintf(ptr, *len, "border-left-color: transparent\n"); + break; + case CSS_BORDER_COLOR_COLOR: + wrote = snprintf(ptr, *len, + "border-left-color: #%08x\n", color); + break; + default: + wrote = 0; + break; + } + ptr += wrote; + *len -= wrote; + val = css_computed_color(style, &color); if (val == CSS_COLOR_COLOR) { wrote = snprintf(ptr, *len, "color: #%08x\n", color); diff --git a/test/select-auto.c b/test/select-auto.c index 75558c4..19af180 100644 --- a/test/select-auto.c +++ b/test/select-auto.c @@ -624,11 +624,11 @@ void run_test(line_ctx *ctx, const char *exp, size_t explen) UNUSED(exp); - buf = malloc(2 * explen); + buf = malloc(8192); if (buf == NULL) { assert(0 && "No memory for result data"); } - buflen = 2 * explen; + buflen = 8192; assert(css_select_ctx_create(myrealloc, NULL, &select) == CSS_OK); @@ -647,10 +647,10 @@ void run_test(line_ctx *ctx, const char *exp, size_t explen) dump_computed_style(computed, buf, &buflen); - if (2 * explen - buflen != explen || memcmp(buf, exp, explen) != 0) { + if (8192 - buflen != explen || memcmp(buf, exp, explen) != 0) { printf("Expected (%zu):\n%.*s\n", explen, (int) explen, exp); - printf("Result (%zu):\n%.*s\n", 2 * explen - buflen, - (int) (2 * explen - buflen), buf); + printf("Result (%zu):\n%.*s\n", 8192 - buflen, + (int) (8192 - buflen), buf); assert(0 && "Result doesn't match expected"); } -- cgit v1.2.3