Index: gtkhtml2/libgtkhtml/document/htmldocument.c =================================================================== --- gtkhtml2.orig/libgtkhtml/document/htmldocument.c 2006-01-25 19:19:23.000000000 +0000 +++ gtkhtml2/libgtkhtml/document/htmldocument.c 2006-01-25 19:21:10.000000000 +0000 @@ -110,11 +110,6 @@ if (style_change != HTML_STYLE_CHANGE_NONE) { - /* FIXME: Workaround bug #199, we don't support recreation - * of dom nodes and layout boxes / jonas - */ - new_style->display = node->style->display; - html_style_ref (new_style); html_style_unref (node->style); node->style = new_style; Index: gtkhtml2/libgtkhtml/layout/htmlboxfactory.c =================================================================== --- gtkhtml2.orig/libgtkhtml/layout/htmlboxfactory.c 2006-01-25 19:19:23.000000000 +0000 +++ gtkhtml2/libgtkhtml/layout/htmlboxfactory.c 2006-01-25 19:21:10.000000000 +0000 @@ -99,7 +99,7 @@ HtmlBox * -html_box_factory_new_box (HtmlView *view, DomNode *node) +html_box_factory_new_box (HtmlView *view, DomNode *node, gboolean force_new) { HtmlBox *box = NULL, *parent_box; HtmlStyle *style = node->style, *parent_style = NULL; @@ -117,7 +117,7 @@ box = parent_box->children; - while (box) { + while (box && !force_new) { if (HTML_IS_BOX_TEXT (box) && box->dom_node == node) { html_box_text_set_text (HTML_BOX_TEXT (box), node->xmlnode->content); Index: gtkhtml2/libgtkhtml/layout/htmlboxfactory.h =================================================================== --- gtkhtml2.orig/libgtkhtml/layout/htmlboxfactory.h 2006-01-25 19:19:23.000000000 +0000 +++ gtkhtml2/libgtkhtml/layout/htmlboxfactory.h 2006-01-25 19:21:10.000000000 +0000 @@ -33,7 +33,7 @@ HtmlBox * html_box_factory_get_box (HtmlView *view, DomNode *node, HtmlBox *parent_box); HtmlStyleChange html_box_factory_restyle_box (HtmlView *view, HtmlBox *box, HtmlAtom pseudo); -HtmlBox * html_box_factory_new_box (HtmlView *view, DomNode *node); +HtmlBox * html_box_factory_new_box (HtmlView *view, DomNode *node, gboolean force_new); G_END_DECLS Index: gtkhtml2/libgtkhtml/layout/htmlstyle.c =================================================================== --- gtkhtml2.orig/libgtkhtml/layout/htmlstyle.c 2006-01-25 19:19:23.000000000 +0000 +++ gtkhtml2/libgtkhtml/layout/htmlstyle.c 2006-01-25 19:21:10.000000000 +0000 @@ -416,7 +416,7 @@ html_style_compare (const HtmlStyle *s1, const HtmlStyle *s2) { /* RECREATE begin */ - if (s1->display != s1->display) + if (s1->display != s2->display) return HTML_STYLE_CHANGE_RECREATE; /* RECREATE end */ Index: gtkhtml2/libgtkhtml/view/htmlview.c =================================================================== --- gtkhtml2.orig/libgtkhtml/view/htmlview.c 2006-01-25 19:19:23.000000000 +0000 +++ gtkhtml2/libgtkhtml/view/htmlview.c 2006-01-25 19:21:10.000000000 +0000 @@ -1908,7 +1908,7 @@ g_assert (node->style != NULL); - new_box = html_box_factory_new_box (view, node); + new_box = html_box_factory_new_box (view, node, FALSE); if (new_box) { @@ -2001,8 +2001,9 @@ html_view_remove_layout_box (view, box->dom_node); /* Check if we're trying to remove the root box */ - if (box == view->root) + if (box == view->root) { view->root = NULL; + } html_box_remove (box); g_object_unref (G_OBJECT (box)); @@ -2131,6 +2132,56 @@ } switch (style_change) { + case HTML_STYLE_CHANGE_RECREATE: { + HtmlBox *new_box = NULL; + + /* Don't replace boxes where display: none has been set */ + if (style->display == HTML_DISPLAY_NONE) { + html_view_removed (document, node, view); + break; + } + + new_box = html_box_factory_new_box (view, node, TRUE); + g_assert (new_box); + + new_box->dom_node = node; + g_object_add_weak_pointer (G_OBJECT (node), (gpointer *)&(new_box->dom_node)); + new_box->next = box->next; + new_box->prev = box->prev; + new_box->parent = box->parent; + new_box->children = box->children; + + if (box->next) box->next->prev = new_box; + if (box->prev) box->prev->next = new_box; + if (box->parent) + if (box->parent->children == box) + box->parent->children = new_box; + if (box->children) { + HtmlBox *child = box->children; + while (child) { + if (child->parent == box) + child->parent = new_box; + child = child->prev; + } + child = box->children->next; + while (child) { + if (child->parent == box) + child->parent = new_box; + child = child->next; + } + } + + if (view->root == box) + view->root = new_box; + + html_view_remove_layout_box (view, node); + g_object_unref (box); + + html_box_handle_html_properties (new_box, node->xmlnode); + html_view_add_layout_box (view, node, new_box); + html_view_relayout_callback (document, node, view); + break; + } case HTML_STYLE_CHANGE_REPAINT: html_view_repaint_callback (document, node, view); break; Index: gtkhtml2/libgtkhtml/css/cssmatcher.c =================================================================== --- gtkhtml2.orig/libgtkhtml/css/cssmatcher.c 2006-01-25 19:19:23.000000000 +0000 +++ gtkhtml2/libgtkhtml/css/cssmatcher.c 2006-01-25 19:21:10.000000000 +0000 @@ -2781,7 +2781,7 @@ } } if (strcasecmp ("table", n->name) == 0) { - if ((str = xmlGetProp (n, "align"))) { + if ((style->display != HTML_DISPLAY_BLOCK) && (str = xmlGetProp (n, "align"))) { if (strcasecmp (str, "left") == 0) style->Float = HTML_FLOAT_LEFT; else if (strcasecmp (str, "right") == 0) Index: gtkhtml2/libgtkhtml/layout/htmlbox.c =================================================================== --- gtkhtml2.orig/libgtkhtml/layout/htmlbox.c 2006-01-25 19:21:09.000000000 +0000 +++ gtkhtml2/libgtkhtml/layout/htmlbox.c 2006-01-25 19:21:10.000000000 +0000 @@ -308,7 +308,7 @@ else if (style->surround->margin.left.type != HTML_LENGTH_AUTO && style->surround->margin.right.type != HTML_LENGTH_AUTO) { - if (HTML_BOX_GET_STYLE (box->parent)->inherited->direction == HTML_DIRECTION_RTL) { + if (HTML_BOX_GET_STYLE (html_box_get_containing_block (box))->inherited->direction == HTML_DIRECTION_RTL) { return width - html_length_get_value (&style->box->width, width) - html_box_left_padding (box, width) - html_box_right_padding (box, width) - @@ -348,7 +348,7 @@ else if (style->surround->margin.left.type != HTML_LENGTH_AUTO && style->surround->margin.right.type != HTML_LENGTH_AUTO) { - if (HTML_BOX_GET_STYLE (box->parent)->inherited->direction == HTML_DIRECTION_LTR) { + if (HTML_BOX_GET_STYLE (html_box_get_containing_block (box))->inherited->direction == HTML_DIRECTION_LTR) { return width - html_length_get_value (&style->box->width, width) - html_box_left_padding (box, width) - html_box_right_padding (box, width) - @@ -820,35 +820,36 @@ int tmp; gint old_width = *boxwidth; gint old_height = *boxheight; + HtmlBox *parent = html_box_get_containing_block (self); - if (self->parent) { + if (parent) { if (HTML_BOX_GET_STYLE (self)->box->min_width.type != HTML_LENGTH_AUTO) { - tmp = html_length_get_value (&HTML_BOX_GET_STYLE (self)->box->min_width, self->parent->width - - html_box_horizontal_mbp_sum (self->parent) - html_box_horizontal_mbp_sum (self)); + tmp = html_length_get_value (&HTML_BOX_GET_STYLE (self)->box->min_width, parent->width - + html_box_horizontal_mbp_sum (parent) - html_box_horizontal_mbp_sum (self)); if (*boxwidth < tmp) *boxwidth = tmp; } if (HTML_BOX_GET_STYLE (self)->box->max_width.type != HTML_LENGTH_AUTO) { - tmp = html_length_get_value (&HTML_BOX_GET_STYLE (self)->box->max_width, self->parent->width - - html_box_horizontal_mbp_sum (self->parent) - html_box_horizontal_mbp_sum (self)); + tmp = html_length_get_value (&HTML_BOX_GET_STYLE (self)->box->max_width, parent->width - + html_box_horizontal_mbp_sum (parent) - html_box_horizontal_mbp_sum (self)); if (*boxwidth > tmp) *boxwidth = tmp; } if (HTML_BOX_GET_STYLE (self)->box->min_height.type != HTML_LENGTH_AUTO) { - tmp = html_length_get_value (&HTML_BOX_GET_STYLE (self)->box->min_height, self->parent->height - - html_box_horizontal_mbp_sum (self->parent) - html_box_horizontal_mbp_sum (self)); + tmp = html_length_get_value (&HTML_BOX_GET_STYLE (self)->box->min_height, parent->height - + html_box_horizontal_mbp_sum (parent) - html_box_horizontal_mbp_sum (self)); if (*boxheight < tmp) *boxheight = tmp; } if (HTML_BOX_GET_STYLE (self)->box->max_height.type != HTML_LENGTH_AUTO) { - tmp = html_length_get_value (&HTML_BOX_GET_STYLE (self)->box->max_height, self->parent->height - - html_box_horizontal_mbp_sum (self->parent) - html_box_horizontal_mbp_sum (self)); + tmp = html_length_get_value (&HTML_BOX_GET_STYLE (self)->box->max_height, parent->height - + html_box_horizontal_mbp_sum (parent) - html_box_horizontal_mbp_sum (self)); if (*boxheight > tmp) *boxheight = tmp; Index: gtkhtml2/libgtkhtml/layout/htmlboxblock.c =================================================================== --- gtkhtml2.orig/libgtkhtml/layout/htmlboxblock.c 2006-01-25 19:19:23.000000000 +0000 +++ gtkhtml2/libgtkhtml/layout/htmlboxblock.c 2006-01-25 19:21:10.000000000 +0000 @@ -358,8 +358,7 @@ /* Get the prefered width */ /* If the width wasn't specified by CSS, use the width of the containing box (parent) */ - - if (self->parent) { + if (html_box_get_containing_block (self)) { if (style->Float != HTML_FLOAT_NONE) new_width = html_length_get_value (&style->box->width, html_box_get_containing_block_width (self)); Index: gtkhtml2/libgtkhtml/graphics/htmlimagefactory.c =================================================================== --- gtkhtml2.orig/libgtkhtml/graphics/htmlimagefactory.c 2006-01-25 19:19:23.000000000 +0000 +++ gtkhtml2/libgtkhtml/graphics/htmlimagefactory.c 2006-01-25 19:21:10.000000000 +0000 @@ -127,7 +127,7 @@ } static void -html_image_shutdown (HtmlImage *image, HtmlImageFactory *image_factory) +html_image_shutdown (HtmlImageFactory *image_factory, HtmlImage *image) { g_hash_table_remove (image_factory->image_hash, image->uri); } @@ -146,8 +146,7 @@ image = HTML_IMAGE (g_object_new (HTML_IMAGE_TYPE, NULL)); - g_signal_connect (G_OBJECT (image), "last_unref", - G_CALLBACK (html_image_shutdown), image_factory); + g_object_weak_ref (G_OBJECT (image), (GWeakNotify)html_image_shutdown, image_factory); image->loading = TRUE; Index: gtkhtml2/libgtkhtml/layout/html/htmlboxembeddedimage.c =================================================================== --- gtkhtml2.orig/libgtkhtml/layout/html/htmlboxembeddedimage.c 2006-01-25 19:19:23.000000000 +0000 +++ gtkhtml2/libgtkhtml/layout/html/htmlboxembeddedimage.c 2006-01-25 19:21:10.000000000 +0000 @@ -64,25 +64,36 @@ } static void -html_box_embedded_image_class_init (HtmlBoxClass *klass) +html_box_embedded_image_resize_image (HtmlImage *image, HtmlBoxEmbeddedImage *box) { - - klass->paint = html_box_embedded_image_paint; - klass->relayout = html_box_embedded_image_relayout; + g_signal_emit_by_name (G_OBJECT (box->view->document), "relayout_node", HTML_BOX (box)->dom_node); +} - parent_class = g_type_class_peek_parent (klass); +static void +html_box_embedded_image_repaint_image (HtmlImage *image, gint x, gint y, gint width, gint height, HtmlBoxEmbeddedImage *box) +{ + g_signal_emit_by_name (G_OBJECT (box->view->document), "repaint_node", HTML_BOX (box)->dom_node); } static void -html_box_embedded_image_resize_image (HtmlImage *image, HtmlBoxEmbeddedImage *box) +html_box_embedded_image_finalize (GObject *object) { - g_signal_emit_by_name (G_OBJECT (box->view->document), "relayout_node", HTML_BOX (box)->dom_node); + HtmlBoxEmbeddedImage *image = HTML_BOX_EMBEDDED_IMAGE (object); + + g_signal_handlers_disconnect_by_func (G_OBJECT (image->image), G_CALLBACK (html_box_embedded_image_resize_image), image); + g_signal_handlers_disconnect_by_func (G_OBJECT (image->image), G_CALLBACK (html_box_embedded_image_repaint_image), image); } static void -html_box_embedded_image_repaint_image (HtmlImage *image, gint x, gint y, gint width, gint height, HtmlBoxEmbeddedImage *box) +html_box_embedded_image_class_init (HtmlBoxClass *klass) { - g_signal_emit_by_name (G_OBJECT (box->view->document), "repaint_node", HTML_BOX (box)->dom_node); + GObjectClass *object_class = (GObjectClass *)klass; + + klass->paint = html_box_embedded_image_paint; + klass->relayout = html_box_embedded_image_relayout; + object_class->finalize = html_box_embedded_image_finalize; + + parent_class = g_type_class_peek_parent (klass); } void Index: gtkhtml2/libgtkhtml/layout/htmlboxtext.c =================================================================== --- gtkhtml2.orig/libgtkhtml/layout/htmlboxtext.c 2006-01-25 19:19:23.000000000 +0000 +++ gtkhtml2/libgtkhtml/layout/htmlboxtext.c 2006-01-25 19:21:10.000000000 +0000 @@ -146,6 +146,7 @@ master = text->master; if (master) { + html_box_text_destroy_slaves (text); html_box_text_free_master (master); g_free (master); text->master = NULL; Index: gtkhtml2/libgtkhtml/layout/html/htmlboximage.c =================================================================== --- gtkhtml2.orig/libgtkhtml/layout/html/htmlboximage.c 2006-01-25 19:21:09.000000000 +0000 +++ gtkhtml2/libgtkhtml/layout/html/htmlboximage.c 2006-01-25 19:21:33.000000000 +0000 @@ -195,10 +195,41 @@ } static void +html_box_image_resize_image (HtmlImage *image, HtmlBoxImage *box) +{ + g_signal_emit_by_name (G_OBJECT (box->view->document), "relayout_node", HTML_BOX (box)->dom_node); +} + +static void +html_box_image_repaint_image (HtmlImage *image, gint x, gint y, gint width, gint height, HtmlBoxImage *box) +{ + gdouble real_x, real_y; + gdouble real_width, real_height; + + if (box->scaled_pixbuf && image->pixbuf) { + + html_box_image_update_scaled_pixbuf (box, gdk_pixbuf_get_width (box->scaled_pixbuf), gdk_pixbuf_get_height (box->scaled_pixbuf)); + real_y = (y * gdk_pixbuf_get_height (box->scaled_pixbuf)) / (gdouble)gdk_pixbuf_get_height (image->pixbuf); + real_x = (x * gdk_pixbuf_get_width (box->scaled_pixbuf)) / (gdouble)gdk_pixbuf_get_width (image->pixbuf); + + real_height = (height * gdk_pixbuf_get_height (box->scaled_pixbuf)) / (gdouble)gdk_pixbuf_get_height (image->pixbuf); + real_width = (width * gdk_pixbuf_get_width (box->scaled_pixbuf)) / (gdouble)gdk_pixbuf_get_width (image->pixbuf); + + gtk_widget_queue_draw_area (GTK_WIDGET (box->view), + html_box_get_absolute_x (HTML_BOX (box)), /* + floor (real_x + 0.5),*/ + html_box_get_absolute_y (HTML_BOX (box)),/* + floor (real_y + 0.5),*/ + floor (real_width + real_x + 0.5), + floor (real_height + real_y + 0.5)); + } +} + +static void html_box_image_finalize (GObject *object) { HtmlBoxImage *image = HTML_BOX_IMAGE (object); + g_signal_handlers_disconnect_by_func (G_OBJECT (image->image), G_CALLBACK (html_box_image_resize_image), image); + g_signal_handlers_disconnect_by_func (G_OBJECT (image->image), G_CALLBACK (html_box_image_repaint_image), image); if (image->scaled_pixbuf) g_object_unref (image->scaled_pixbuf); @@ -262,35 +293,6 @@ return HTML_BOX (box); } -static void -html_box_image_resize_image (HtmlImage *image, HtmlBoxImage *box) -{ - g_signal_emit_by_name (G_OBJECT (box->view->document), "relayout_node", HTML_BOX (box)->dom_node); -} - -static void -html_box_image_repaint_image (HtmlImage *image, gint x, gint y, gint width, gint height, HtmlBoxImage *box) -{ - gdouble real_x, real_y; - gdouble real_width, real_height; - - if (box->scaled_pixbuf && image->pixbuf) { - - html_box_image_update_scaled_pixbuf (box, gdk_pixbuf_get_width (box->scaled_pixbuf), gdk_pixbuf_get_height (box->scaled_pixbuf)); - real_y = (y * gdk_pixbuf_get_height (box->scaled_pixbuf)) / (gdouble)gdk_pixbuf_get_height (image->pixbuf); - real_x = (x * gdk_pixbuf_get_width (box->scaled_pixbuf)) / (gdouble)gdk_pixbuf_get_width (image->pixbuf); - - real_height = (height * gdk_pixbuf_get_height (box->scaled_pixbuf)) / (gdouble)gdk_pixbuf_get_height (image->pixbuf); - real_width = (width * gdk_pixbuf_get_width (box->scaled_pixbuf)) / (gdouble)gdk_pixbuf_get_width (image->pixbuf); - - gtk_widget_queue_draw_area (GTK_WIDGET (box->view), - html_box_get_absolute_x (HTML_BOX (box)), /* + floor (real_x + 0.5),*/ - html_box_get_absolute_y (HTML_BOX (box)),/* + floor (real_y + 0.5),*/ - floor (real_width + real_x + 0.5), - floor (real_height + real_y + 0.5)); - } -} - void html_box_image_set_image (HtmlBoxImage *box, HtmlImage *image) {