Index: libgtkhtml/dom/core/dom-element.c
===================================================================
--- libgtkhtml/dom/core/dom-element.c.orig	2006-03-29 01:30:17.000000000 +0100
+++ libgtkhtml/dom/core/dom-element.c	2006-03-29 01:30:57.000000000 +0100
@@ -24,6 +24,7 @@
 
 #include "dom-element.h"
 #include "dom-attr.h"
+#include <dom/events/dom-attrevent.h>
 
 /**
  * dom_Element__get_tagName:
@@ -65,7 +66,23 @@ dom_Element_getAttribute (DomElement *el
 void
 dom_Element_setAttribute (DomElement *element, DomString *name, const DomString *value)
 {
+	gushort attr_change;
+	xmlChar *prevValue = NULL;
+	DomNode *attr;
+	
+	if (xmlHasProp (DOM_NODE (element)->xmlnode, name)) {
+		attr_change = DOM_ATTR_CHANGE_MODIFIED;
+		prevValue = xmlGetProp (DOM_NODE (element)->xmlnode, name);
+	} else
+		attr_change = DOM_ATTR_CHANGE_ADDED;
 	xmlSetProp (DOM_NODE (element)->xmlnode, name, value);
+	attr = dom_Node_mkref (xmlHasProp (DOM_NODE (element)->xmlnode, name));
+	
+	dom_AttrEvent_invoke (DOM_EVENT_TARGET (element), "DOMAttrModified",
+			       TRUE, FALSE, name, attr_change, prevValue,
+			       prevValue ? value : NULL, attr);
+			       
+	xmlFree (prevValue);
 }
 
 
@@ -94,7 +111,15 @@ dom_Element_hasAttribute (DomElement *el
 void
 dom_Element_removeAttribute (DomElement *element, const DomString *name)
 {
-	xmlRemoveProp (xmlHasProp (DOM_NODE (element)->xmlnode, name));
+	xmlAttrPtr attr = xmlHasProp (DOM_NODE (element)->xmlnode, name);
+	if (attr) {
+		DomNode *node = dom_Node_mkref (attr);
+		dom_StyleEvent_invoke (
+			DOM_EVENT_TARGET (element), "DOMAttrModified",
+			TRUE, FALSE, name, DOM_ATTR_CHANGE_REMOVED,
+			NULL, NULL, node);
+		xmlRemoveProp (xmlHasProp (DOM_NODE (element)->xmlnode, name));
+	}
 }
 
 DomAttr *
Index: libgtkhtml/dom/core/dom-node.c
===================================================================
--- libgtkhtml/dom/core/dom-node.c.orig	2006-03-29 01:30:17.000000000 +0100
+++ libgtkhtml/dom/core/dom-node.c	2006-04-01 13:38:58.000000000 +0100
@@ -286,6 +286,83 @@ dom_Node_appendChild (DomNode *node, Dom
 	return newChild;
 }
 
+/**
+ * dom_Node_insertBefore:
+ * @node: a DomNode
+ * @newChild: the DomNode to add
+ * @target: the DomNode to insert before
+ * @exc: return location for an exception.
+ * 
+ * Inserts the node newChild before the node target, with node as reference.
+ * If newChild is already in the tree, it is first removed.
+ * 
+ * Return value: The node added.
+ **/
+DomNode *
+dom_Node_insertBefore (DomNode *node, DomNode *newChild, DomNode *target,
+		      DomException *exc)
+{
+	if (!target)
+		return dom_Node_appendChild (node, newChild, exc);
+
+	if (node->xmlnode->doc != newChild->xmlnode->doc) {
+		DOM_SET_EXCEPTION (DOM_WRONG_DOCUMENT_ERR);
+
+		return NULL;
+	}
+
+	if (node->xmlnode->type == XML_TEXT_NODE) {
+		DOM_SET_EXCEPTION (DOM_HIERARCHY_REQUEST_ERR);
+
+		return NULL;
+	}
+	
+	if (target->xmlnode->parent != node->xmlnode) {
+		DOM_SET_EXCEPTION (DOM_NOT_FOUND_ERR);
+		
+		return NULL;
+	}
+	
+#ifdef NODE_INSERTION_IMPLEMENTED
+	/* Remove the child node if it has a parent */
+	if (newChild->xmlnode->parent != NULL)
+		dom_Node_removeChild (dom_Node_mkref (newChild->xmlnode->parent), newChild, NULL);
+
+	/* Insert before */
+	newChild->xmlnode->parent = target->xmlnode;
+	if (node->xmlnode->children == target->xmlnode)
+		node->xmlnode->children = newChild->xmlnode;
+	newChild->xmlnode->prev = target->xmlnode->prev;
+	newChild->xmlnode->next = target->xmlnode;
+	target->xmlnode->prev = newChild->xmlnode;
+	if (newChild->xmlnode->prev)
+		newChild->xmlnode->prev->next = newChild->xmlnode;
+
+	/* Emit mutation events */
+	dom_MutationEvent_invoke_recursively (DOM_EVENT_TARGET (newChild), "DOMNodeInsertedIntoDocument", FALSE, FALSE,
+					      NULL, NULL, NULL, NULL, 0, DOM_EVENT_TRAVERSER_PRE_ORDER);
+	dom_MutationEvent_invoke (DOM_EVENT_TARGET (newChild), "DOMNodeInserted", TRUE, FALSE,
+				  node, NULL, NULL, NULL, 0);
+#else
+{
+	/* TODO: Handle exceptions here properly */
+	GList *nodes = NULL, *n;
+	while (target) {
+		DomNode *next = dom_Node__get_nextSibling (target);
+		nodes = g_list_append (nodes, target);
+		dom_Node_removeChild (node, target, exc);
+		target = next;
+	}
+	dom_Node_appendChild (node, newChild, exc);
+	for (n = nodes; n; n = n->next)
+		dom_Node_appendChild (node, (DomNode *)n->data, exc);
+	g_list_free (nodes);
+}
+#endif
+	
+	return newChild;
+}
+
 static void
 dom_Node_notifyLiveObjectsAboutRemoval (DomDocument *document, DomNode *node)
 {
@@ -583,6 +660,32 @@ dom_Node__get_ownerDocument (DomNode *no
 	return DOM_DOCUMENT (dom_Node_mkref ((xmlNode *)node->xmlnode->doc));
 }
 
+HtmlStyle *
+dom_Node__get_style (DomNode *node)
+{
+	return node->style;
+}
+
+void
+dom_Node__set_style (DomNode *node, HtmlStyle *style)
+{
+	HtmlStyleChange style_change;
+	
+	if (node->style) {
+		style_change = html_style_compare (node->style, style);
+		if (style_change == HTML_STYLE_CHANGE_NONE) {
+			html_style_unref (style);
+			return;
+		}
+		html_style_unref (node->style);
+	} else
+		style_change = HTML_STYLE_CHANGE_RECREATE;
+
+	node->style = html_style_ref (style);
+	dom_StyleEvent_invoke (DOM_EVENT_TARGET (node), "StyleChanged",
+			       TRUE, FALSE, style_change);
+}
+
 static void
 dom_Node_addEventListener (DomEventTarget *target, const DomString *type, DomEventListener *listener, DomBoolean useCapture)
 {
Index: libgtkhtml/dom/core/dom-node.h
===================================================================
--- libgtkhtml/dom/core/dom-node.h.orig	2006-03-29 01:30:17.000000000 +0100
+++ libgtkhtml/dom/core/dom-node.h	2006-03-30 23:06:52.000000000 +0100
@@ -75,6 +75,7 @@ gushort dom_Node__get_nodeType (DomNode 
 DomBoolean dom_Node_hasAttributes (DomNode *node);
 DomNode *dom_Node_cloneNode (DomNode *node, DomBoolean deep);
 DomNode *dom_Node_appendChild (DomNode *node, DomNode *newChild, DomException *exc);
+DomNode *dom_Node_insertBefore (DomNode *node, DomNode *newChild, DomNode *target, DomException *exc);
 DomString *dom_Node__get_localName (DomNode *node);
 DomString *dom_Node__get_namespaceURI (DomNode *node);
 DomNode *dom_Node__get_previousSibling (DomNode *node);
@@ -82,4 +83,6 @@ DomNode *dom_Node__get_lastChild (DomNod
 void dom_Node__set_nodeValue (DomNode *node, const DomString *value, DomException *exc);
 DomDocument *dom_Node__get_ownerDocument (DomNode *node);
 gboolean dom_Node_hasAttributes (DomNode *node);
+HtmlStyle *dom_Node__get_style (DomNode *node);
+void dom_Node__set_style (DomNode *node, HtmlStyle *style);
 #endif /* __DOM_NODE_H__ */
Index: libgtkhtml/dom/events/Makefile.am
===================================================================
--- libgtkhtml/dom/events/Makefile.am.orig	2006-03-29 01:30:17.000000000 +0100
+++ libgtkhtml/dom/events/Makefile.am	2006-03-29 01:30:57.000000000 +0100
@@ -25,7 +25,9 @@ libdomevents_la_SOURCES = 	\
 	dom-styleevent.c	\
 	dom-styleevent.h	\
 	dom-uievent.c		\
-	dom-uievent.h
+	dom-uievent.h		\
+	dom-attrevent.c		\
+	dom-attrevent.h
 
 libgtkhtmlinclude_HEADERS = 	\
 	dom-event.h		\
Index: libgtkhtml/dom/events/dom-event-utils.c
===================================================================
--- libgtkhtml/dom/events/dom-event-utils.c.orig	2006-03-29 01:30:17.000000000 +0100
+++ libgtkhtml/dom/events/dom-event-utils.c	2006-03-29 01:30:57.000000000 +0100
@@ -129,6 +129,17 @@ dom_StyleEvent_invoke (DomEventTarget *t
 	g_object_unref (event);
 }
 
+void
+dom_AttrEvent_invoke (DomEventTarget *target, const gchar *eventType, DomBoolean canBubble, DomBoolean cancelable, const DomString *attrNameArg, gushort attrChangeArg, const DomString *prevValueArg, const DomString *newValueArg, DomNode *relatedNodeArg)
+{
+	DomAttrEvent *event = g_object_new (DOM_TYPE_ATTR_EVENT, NULL);
+
+	dom_AttrEvent_initAttrEvent (event, eventType, canBubble, cancelable, attrNameArg, attrChangeArg, prevValueArg, newValueArg, relatedNodeArg);
+	dom_EventTarget_dispatchEvent (target, DOM_EVENT (event), NULL);
+
+	g_object_unref (event);
+}
+
 gboolean
 dom_MouseEvent_invoke (DomEventTarget *target, const gchar *eventType, gboolean canBubble, gboolean cancelable, DomAbstractView *viewArg, glong detailArg, glong screenXArg, glong screenYArg, glong clientXArg, glong clientYArg, DomBoolean ctrlKeyArg, DomBoolean altKeyArg, DomBoolean shiftKeyArg, DomBoolean metaKeyArg, gushort buttonArg, DomEventTarget *relatedTargetArg)
 {
Index: libgtkhtml/dom/events/dom-event-utils.h
===================================================================
--- libgtkhtml/dom/events/dom-event-utils.h.orig	2006-03-29 01:30:17.000000000 +0100
+++ libgtkhtml/dom/events/dom-event-utils.h	2006-03-29 01:30:57.000000000 +0100
@@ -25,6 +25,7 @@
 
 #include <libgtkhtml/dom/events/dom-mutationevent.h>
 #include <libgtkhtml/dom/events/dom-styleevent.h>
+#include <libgtkhtml/dom/events/dom-attrevent.h>
 #include <libgtkhtml/dom/events/dom-mouseevent.h>
 
 DomEventListener *dom_event_listener_signal_new (void);
@@ -43,6 +44,8 @@ dom_Event_invoke (DomEventTarget *target
 
 void dom_StyleEvent_invoke (DomEventTarget *target, const gchar *eventType, DomBoolean canBubble, DomBoolean cancelable, gushort styleChange);
 
+void dom_AttrEvent_invoke (DomEventTarget *target, const gchar *eventType, DomBoolean canBubble, DomBoolean cancelable, const DomString *attrNameArg, gushort attrChangeArg, const DomString *prevValueArg, const DomString *newValueArg, DomNode *relatedNodeArg);
+
 void dom_MutationEvent_invoke_recursively (DomEventTarget *target, const gchar *eventType, DomBoolean canBubble, DomBoolean cancelable,
 					   DomNode *relatedNode, const gchar *prevValue, const gchar *newValue, const gchar *attrName, gushort attrChange, DomEventTraverserType traverser_type);
 
Index: libgtkhtml/dom/events/dom-attrevent.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ libgtkhtml/dom/events/dom-attrevent.c	2006-03-29 01:30:57.000000000 +0100
@@ -0,0 +1,138 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+   Copyright (C) 2006 Chris Lord <chris@openedhand.com>
+   
+   derived from dom-styleevent.c,
+   
+   Copyright (C) 2000 CodeFactory AB
+   Copyright (C) 2000 Jonas Borgstr\366m <jonas@codefactory.se>
+   Copyright (C) 2000 Anders Carlsson <andersca@codefactory.se>
+   
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public License
+   along with this library; see the file COPYING.LIB.  If not, write to
+   the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.
+*/
+
+#include "dom-attrevent.h"
+
+static DomEventClass *parent_class = NULL;
+
+const DomString *
+dom_AttrEvent__get_attrName (DomAttrEvent *event)
+{
+	return event->attrName;
+}
+
+gushort
+dom_AttrEvent__get_attrChange (DomAttrEvent *event)
+{
+	return event->attrChange;
+}
+
+const DomString *
+dom_AttrEvent__get_prevValue (DomAttrEvent *event)
+{
+	return event->prevValue;
+}
+
+const DomString *
+dom_AttrEvent__get_newValue (DomAttrEvent *event)
+{
+	return event->newValue;
+}
+
+DomNode *
+dom_AttrEvent__get_relatedNode (DomAttrEvent *event)
+{
+	return event->relatedNode;
+}
+
+void
+dom_AttrEvent_initAttrEvent (DomAttrEvent *event, const DomString *typeArg, DomBoolean canBubbleArg, DomBoolean cancelableArg, const DomString *attrNameArg, gushort attrChangeArg, const DomString *prevValueArg, const DomString *newValueArg, DomNode *relatedNodeArg)
+{
+	dom_Event_initEvent (DOM_EVENT (event), typeArg, canBubbleArg, cancelableArg);
+
+	if (event->attrName)
+		g_free (event->attrName);
+
+	if (event->prevValue)
+		g_free (event->prevValue);
+
+	if (event->newValue)
+		g_free (event->newValue);
+
+	if (event->relatedNode)
+		g_object_unref (event->relatedNode);
+
+	event->attrName = g_strdup (attrNameArg);
+	event->attrChange = attrChangeArg;
+	event->prevValue = g_strdup (prevValueArg);
+	event->newValue = g_strdup (newValueArg);
+	event->relatedNode = g_object_ref (relatedNodeArg);
+}
+
+static void
+dom_attr_event_finalize (GObject *object)
+{
+	DomAttrEvent *event = DOM_ATTR_EVENT (object);
+	
+	if (event->attrName)
+		g_free (event->attrName);
+
+	if (event->prevValue)
+		g_free (event->prevValue);
+
+	if (event->newValue)
+		g_free (event->newValue);
+
+	if (event->relatedNode)
+		g_object_unref (event->relatedNode);
+		
+	G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+dom_attr_event_class_init (DomAttrEventClass *klass)
+{
+	GObjectClass *object_class = (GObjectClass *)klass;
+
+	object_class->finalize = dom_attr_event_finalize;
+
+	parent_class = g_type_class_peek_parent (klass);
+}
+
+GType
+dom_attr_event_get_type (void)
+{
+	static GType dom_attr_event_type = 0;
+
+	if (!dom_attr_event_type) {
+		static const GTypeInfo dom_attr_event_info = {
+			sizeof (DomAttrEventClass),
+			NULL, /* base_init */
+			NULL, /* base_finalize */
+			(GClassInitFunc) dom_attr_event_class_init,
+			NULL, /* class_finalize */
+			NULL, /* class_data */
+			sizeof (DomAttrEvent),
+			16,   /* n_preallocs */
+			NULL,
+		};
+
+		dom_attr_event_type = g_type_register_static (DOM_TYPE_EVENT, "DomAttrEvent", &dom_attr_event_info, 0);
+	}
+
+	return dom_attr_event_type;
+}
+
Index: libgtkhtml/dom/events/dom-attrevent.h
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ libgtkhtml/dom/events/dom-attrevent.h	2006-03-29 01:30:57.000000000 +0100
@@ -0,0 +1,75 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+   Copyright (C) 2006 Chris Lord <chris@openedhand.com>
+   
+   derived from dom-styleevent.h,
+
+   Copyright (C) 2000 CodeFactory AB
+   Copyright (C) 2000 Jonas Borgstr\366m <jonas@codefactory.se>
+   Copyright (C) 2000 Anders Carlsson <andersca@codefactory.se>
+   
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public License
+   along with this library; see the file COPYING.LIB.  If not, write to
+   the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.
+*/
+
+#ifndef __DOM_ATTR_EVENT_H__
+#define __DOM_ATTR_EVENT_H__
+
+typedef struct _DomAttrEvent DomAttrEvent;
+typedef struct _DomAttrEventClass DomAttrEventClass;
+
+#include <glib-object.h>
+
+#include <dom/core/dom-node.h>
+#include <dom/events/dom-event.h>
+
+#define DOM_TYPE_ATTR_EVENT             (dom_attr_event_get_type ())
+#define DOM_ATTR_EVENT(object)          (G_TYPE_CHECK_INSTANCE_CAST ((object), DOM_TYPE_ATTR_EVENT, DomAttrEvent))
+#define DOM_ATTR_EVENT_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), DOM_TYPE_ATTR_EVENT, DomAttrEventClass))
+#define DOM_IS_ATTR_EVENT(object)       (G_TYPE_CHECK_INSTANCE_TYPE ((object),  DOM_TYPE_ATTR_EVENT))
+#define DOM_IS_ATTR_EVENT_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), DOM_TYPE_ATTR_EVENT))
+#define DOM_ATTR_EVENT_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), DOM_TYPE_ATTR_EVENT, DomAttrEventClass))
+
+struct _DomAttrEvent {
+	DomEvent parent;
+
+	DomString *attrName;
+	gushort attrChange;
+	DomString *prevValue;
+	DomString *newValue;
+	DomNode *relatedNode;
+};
+
+struct _DomAttrEventClass {
+	DomEventClass parent_class;
+};
+
+enum {
+	DOM_ATTR_CHANGE_MODIFIED,
+	DOM_ATTR_CHANGE_ADDED,
+	DOM_ATTR_CHANGE_REMOVED
+};
+
+GType dom_attr_event_get_type (void);
+
+const DomString *dom_AttrEvent__get_attrName (DomAttrEvent *event);
+gushort dom_AttrEvent__get_attrChange (DomAttrEvent *event);
+const DomString *dom_AttrEvent__get_prevValue (DomAttrEvent *event);
+const DomString *dom_AttrEvent__get_newValue (DomAttrEvent *event);
+DomNode *dom_AttrEvent__get_relatedNode (DomAttrEvent *event);
+
+void dom_AttrEvent_initAttrEvent (DomAttrEvent *event, const DomString *typeArg, DomBoolean canBubbleArg, DomBoolean cancelableArg, const DomString *attrNameArg, gushort attrChangeArg, const DomString *prevValueArg, const DomString *newValueArg, DomNode *relatedNodeArg);
+
+#endif /* __DOM_ATTR_EVENT_H__ */
Index: libgtkhtml/document/htmldocument.c
===================================================================
--- libgtkhtml/document/htmldocument.c.orig	2006-03-29 01:30:56.000000000 +0100
+++ libgtkhtml/document/htmldocument.c	2006-04-01 05:46:27.000000000 +0100
@@ -421,8 +421,22 @@ html_document_dom_event (DomEventListene
 	else if (strcmp (type, "DOMCharacterDataModified") == 0) {
 		g_signal_emit (G_OBJECT (document), document_signals [TEXT_UPDATED], 0, node);
 	}
+	else if (strcmp (type, "DOMAttrModified") == 0) {
+		if (strcmp (dom_AttrEvent__get_attrName (
+		    DOM_ATTR_EVENT (event)), "style") == 0) {
+			HtmlStyleChange style_change;
+			style_change = html_document_restyle_node (
+				document, node, NULL, TRUE);
+			g_signal_emit (G_OBJECT (document),
+				document_signals [STYLE_UPDATED], 0,
+				node, style_change);
+		}
+	}
 	else if (strcmp (type, "StyleChanged") == 0) {
-		g_signal_emit (G_OBJECT (document), document_signals [STYLE_UPDATED], 0, node, dom_StyleEvent__get_styleChange (DOM_STYLE_EVENT (event)));
+		g_signal_emit (G_OBJECT (document),
+			document_signals [STYLE_UPDATED], 0, node,
+			dom_StyleEvent__get_styleChange (
+				DOM_STYLE_EVENT (event)));
 	}
 	else if (strcmp (type, "mousedown") == 0) {
 		gboolean return_value = FALSE;
@@ -507,6 +521,8 @@ html_document_parsed_document_node (Html
 	dom_EventTarget_addEventListener (DOM_EVENT_TARGET (document->dom_document),
 					  "DOMCharacterDataModified", listener, FALSE);
 	dom_EventTarget_addEventListener (DOM_EVENT_TARGET (document->dom_document),
+					  "DOMAttrModified", listener, FALSE);
+	dom_EventTarget_addEventListener (DOM_EVENT_TARGET (document->dom_document),
 					  "StyleChanged", listener, FALSE);
 	dom_EventTarget_addEventListener (DOM_EVENT_TARGET (document->dom_document),
 					  "mousedown", listener, FALSE);
@@ -901,6 +917,8 @@ html_document_clear (HtmlDocument *docum
 		dom_EventTarget_removeEventListener (DOM_EVENT_TARGET (document->dom_document),
 						     "DOMCharacterDataModified", listener, FALSE);
 		dom_EventTarget_removeEventListener (DOM_EVENT_TARGET (document->dom_document),
+						     "DOMAttrModified", listener, FALSE);
+		dom_EventTarget_removeEventListener (DOM_EVENT_TARGET (document->dom_document),
 						     "StyleChanged", listener, FALSE);
 		dom_EventTarget_removeEventListener (DOM_EVENT_TARGET (document->dom_document),
 						     "mousedown", listener, FALSE);
Index: libgtkhtml/view/htmlview.c
===================================================================
--- libgtkhtml/view/htmlview.c.orig	2006-03-22 21:06:12.000000000 +0000
+++ libgtkhtml/view/htmlview.c	2006-04-01 05:44:13.000000000 +0100
@@ -1938,6 +1938,14 @@ html_view_insert_node (HtmlView *view, D
 			html_view_set_cursor_position (view, 0);
 			html_view_set_selection_bound (view, 0);
 		 } else {
+		 	DomNode *prev = dom_Node__get_previousSibling (node);
+		 	DomNode *next = dom_Node__get_nextSibling (node);
+		 	if (prev && next) {
+		 		/* FIXME: Implement node insertion */
+#ifdef NODE_INSERTION_IMPLEMENTED
+		 		g_warning ("Node insertion is not implemented");
+#endif
+		 	}
 			html_box_append_child (parent_box, new_box);
 
 			/* Mark the boxes that need to be relayouted */
Index: libgtkhtml/layout/htmlstyle.c
===================================================================
--- libgtkhtml/layout/htmlstyle.c.orig	2006-03-22 21:06:12.000000000 +0000
+++ libgtkhtml/layout/htmlstyle.c	2006-04-01 13:47:08.000000000 +0100
@@ -336,6 +336,25 @@ html_style_new (HtmlStyle *parent)
 	return style;
 }
 
+HtmlStyle *
+html_style_dup (HtmlStyle *style)
+{
+	HtmlStyle *new_style = g_new (HtmlStyle, 1);
+	
+	memcpy (new_style, style, sizeof (HtmlStyle));
+	new_style->inherited = html_style_inherited_dup (style->inherited);
+	new_style->box = html_style_box_dup (style->box);
+	new_style->surround = html_style_surround_dup (style->surround);
+	new_style->background = html_style_background_dup (style->background);
+	new_style->border = html_style_border_dup (style->border);
+	new_style->outline = html_style_outline_dup (style->outline);
+
+	new_style->visual = g_new (HtmlStyleVisual, 1);
+	new_style->visual->clip = style->visual->clip;
+	
+	return new_style;
+}
+
 static void
 html_debug_print_length (HtmlLength *length)
 {
Index: libgtkhtml/layout/htmlstyle.h
===================================================================
--- libgtkhtml/layout/htmlstyle.h.orig	2006-01-19 22:47:23.000000000 +0000
+++ libgtkhtml/layout/htmlstyle.h	2006-04-01 13:29:03.000000000 +0100
@@ -367,6 +367,7 @@ struct _HtmlStyle {
 };
 
 HtmlStyle *html_style_new         (HtmlStyle *parent);
+HtmlStyle *html_style_dup         (HtmlStyle *style);
 HtmlStyle *html_default_style_new (void);
 HtmlStyle *html_style_ref         (HtmlStyle *style);
 void       html_style_unref       (HtmlStyle *style);
Index: libgtkhtml/view/htmlevent.c
===================================================================
--- libgtkhtml/view/htmlevent.c.orig	2006-03-29 01:30:40.000000000 +0100
+++ libgtkhtml/view/htmlevent.c	2006-04-12 11:55:34.000000000 +0100
@@ -100,24 +100,26 @@ html_event_find_box_traverser (HtmlBox *
         while (box) {
 		/* These boxes always has x = 0, y = 0, w = 0 and h = 0 so we have to do
 		 * a special case for these */
-		if (HTML_IS_BOX_INLINE (box) || HTML_IS_BOX_TABLE_ROW_GROUP (box) || HTML_IS_BOX_FORM (box)) {
+		if (HTML_BOX_GET_STYLE(box) && ((HTML_BOX_GET_STYLE(box))->display != HTML_DISPLAY_NONE)) {
+			if (HTML_IS_BOX_INLINE (box) || HTML_IS_BOX_TABLE_ROW_GROUP (box) || HTML_IS_BOX_FORM (box)) {
 
-			HtmlBox *old_smallest = *smallest;
-			html_event_find_box_traverser (box,
-						       box->x + tx + html_box_left_mbp_sum (box, -1),
-						       box->y + ty + html_box_top_mbp_sum (box, -1), x, y, smallest);
+				HtmlBox *old_smallest = *smallest;
+				html_event_find_box_traverser (box,
+							       box->x + tx + html_box_left_mbp_sum (box, -1),
+							       box->y + ty + html_box_top_mbp_sum (box, -1), x, y, smallest);
 
-			if (old_smallest != *smallest)
+				if (old_smallest != *smallest)
+					break;
+			}
+			else if (html_event_xy_in_box (box, tx, ty, x, y)) {
+				
+				*smallest = box;
+				html_event_find_box_traverser (box,
+							       box->x + tx + html_box_left_mbp_sum (box, -1),
+							       box->y + ty + html_box_top_mbp_sum (box, -1), x, y, smallest);
 				break;
-		}
-		else if (html_event_xy_in_box (box, tx, ty, x, y)) {
 			
-			*smallest = box;
-			html_event_find_box_traverser (box,
-						       box->x + tx + html_box_left_mbp_sum (box, -1),
-						       box->y + ty + html_box_top_mbp_sum (box, -1), x, y, smallest);
-			break;
-		
+	                }
                 }
 
                 box = box->next;
