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;