Apply same hack for :before as for :after

svn path=/trunk/netsurf/; revision=12224
This commit is contained in:
John Mark Bell 2011-04-22 14:48:54 +00:00
parent c737dbd5f8
commit b5f94b26dc
1 changed files with 29 additions and 18 deletions

View File

@ -106,8 +106,8 @@ bool box_construct_element(xmlNode *n, struct content *content,
const css_computed_style *parent_style,
struct box *parent, struct box **inline_container,
char *href, const char *target, char *title);
void box_construct_after(xmlNode *n, struct content *content,
struct box *box, const css_computed_style *after_style);
void box_construct_generate(xmlNode *n, struct content *content,
struct box *box, const css_computed_style *style);
bool box_construct_text(xmlNode *n, struct content *content,
const css_computed_style *parent_style,
struct box *parent, struct box **inline_container,
@ -358,6 +358,18 @@ bool box_construct_element(xmlNode *n, struct content *content,
n->parent == NULL)];
}
/* handle the :before pseudo element */
/* TODO: Replace with true implementation.
* Currently we only implement enough of this to support the
* 'clearfix' hack, which is in widespread use and the layout
* of many sites depend on. As such, only bother if box is a
* block for now. */
if (box->type == BOX_BLOCK) {
box_construct_generate(n, content, box,
box->styles->styles[CSS_PSEUDO_ELEMENT_BEFORE]);
}
/* special elements */
element = bsearch((const char *) n->name, element_table,
ELEMENT_TABLE_COUNT, sizeof(element_table[0]),
@ -608,21 +620,20 @@ bool box_construct_element(xmlNode *n, struct content *content,
* of many sites depend on. As such, only bother if box is a
* block for now. */
if (box->type == BOX_BLOCK) {
box_construct_after(n, content, box,
box_construct_generate(n, content, box,
box->styles->styles[CSS_PSEUDO_ELEMENT_AFTER]);
}
return true;
}
/**
* Construct the box required for an :after pseudo element.
* Construct the box required for a generated element.
*
* \param n XML node of type XML_ELEMENT_NODE
* \param content content of type CONTENT_HTML that is being processed
* \param box box which may have an :after s
* \param after_style complete computed style for after pseudo element
* \param box box which may have generated content
* \param style complete computed style for pseudo element
*
* TODO:
* This is currently incomplete. It just does enough to support the clearfix
@ -634,36 +645,36 @@ bool box_construct_element(xmlNode *n, struct content *content,
* We don't actually support generated content yet.
*/
void box_construct_after(xmlNode *n, struct content *content,
struct box *box, const css_computed_style *after_style)
void box_construct_generate(xmlNode *n, struct content *content,
struct box *box, const css_computed_style *style)
{
struct box *after = 0;
struct box *gen = NULL;
const css_computed_content_item *c_item;
if (after_style == NULL ||
css_computed_content(after_style, &c_item) ==
if (style == NULL ||
css_computed_content(style, &c_item) ==
CSS_CONTENT_NORMAL) {
/* No pseudo element */
return;
}
/* create box for this element */
if (css_computed_display(after_style, n->parent == NULL) ==
if (css_computed_display(style, n->parent == NULL) ==
CSS_DISPLAY_BLOCK) {
/* currently only support block level after elements */
/** \todo Not wise to drop const from the computed style */
after = box_create(NULL, (css_computed_style *)after_style,
gen = box_create(NULL, (css_computed_style *) style,
false, NULL, NULL, NULL, NULL, content);
if (after == NULL) {
if (gen == NULL) {
return;
}
/* set box type from computed display */
after->type = box_map[css_computed_display(
after_style, n->parent == NULL)];
gen->type = box_map[css_computed_display(
style, n->parent == NULL)];
box_add_child(box, after);
box_add_child(box, gen);
}
}