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_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
#include
+#include
#include
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
+
+ derived from dom-styleevent.c,
+
+ Copyright (C) 2000 CodeFactory AB
+ Copyright (C) 2000 Jonas Borgstr\366m
+ Copyright (C) 2000 Anders Carlsson
+
+ 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
+
+ derived from dom-styleevent.h,
+
+ Copyright (C) 2000 CodeFactory AB
+ Copyright (C) 2000 Jonas Borgstr\366m
+ Copyright (C) 2000 Anders Carlsson
+
+ 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
+
+#include
+#include
+
+#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;