Index: libgtkhtml/document/htmldocument.c =================================================================== --- libgtkhtml/document/htmldocument.c.orig 2006-02-11 05:21:28.000000000 +0000 +++ libgtkhtml/document/htmldocument.c 2006-02-11 15:41:06.000000000 +0000 @@ -48,6 +48,7 @@ enum { /* DOM change events */ NODE_INSERTED, + NODE_FINISHED, NODE_REMOVED, TEXT_UPDATED, STYLE_UPDATED, @@ -536,6 +537,12 @@ html_document_new_node (HtmlParser *pars } static void +html_document_finished_node (HtmlParser *parser, DomNode *node, HtmlDocument *document) +{ + g_signal_emit (G_OBJECT (document), document_signals [NODE_FINISHED], 0, node); +} + +static void html_document_finalize (GObject *object) { HtmlDocument *document = HTML_DOCUMENT (object); @@ -639,6 +646,16 @@ html_document_class_init (HtmlDocumentCl g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, DOM_TYPE_NODE); + + document_signals [NODE_FINISHED] = + g_signal_new ("node_finished", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (HtmlDocumentClass, node_finished), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + DOM_TYPE_NODE); document_signals [NODE_REMOVED] = g_signal_new ("node_removed", @@ -818,6 +835,9 @@ html_document_open_stream (HtmlDocument g_signal_connect (document->parser, "done_parsing", (GCallback) html_document_done_parsing, document); + g_signal_connect (document->parser, "finished_node", + (GCallback) html_document_finished_node, + document); document->state = HTML_DOCUMENT_STATE_PARSING; return TRUE; Index: libgtkhtml/document/htmldocument.h =================================================================== --- libgtkhtml/document/htmldocument.h.orig 2006-02-11 05:21:28.000000000 +0000 +++ libgtkhtml/document/htmldocument.h 2006-02-11 15:35:38.000000000 +0000 @@ -80,6 +80,7 @@ struct _HtmlDocumentClass { /* DOM change events */ void (*node_inserted) (HtmlDocument *document, DomNode *node); + void (*node_finished) (HtmlDocument *document, DomNode *node); void (*node_removed) (HtmlDocument *document, DomNode *node); void (*text_updated) (HtmlDocument *document, DomNode *node); void (*style_updated) (HtmlDocument *document, DomNode *node, HtmlStyleChange style_change); Index: libgtkhtml/document/htmlparser.c =================================================================== --- libgtkhtml/document/htmlparser.c.orig 2006-01-17 11:50:54.000000000 +0000 +++ libgtkhtml/document/htmlparser.c 2006-02-11 17:21:20.000000000 +0000 @@ -28,6 +28,7 @@ enum { NEW_NODE, DONE_PARSING, PARSED_DOCUMENT_NODE, + FINISHED_NODE, LAST_SIGNAL }; @@ -84,8 +85,13 @@ static void html_endElement (void *ctx, const xmlChar *name) { HtmlParser *parser = HTML_PARSER (ctx); + DomNode *node; xmlSAX2EndElement (parser->xmlctxt, name); + + node = dom_Node_mkref (xmlGetLastChild (parser->xmlctxt->node)); + if (node) + g_signal_emit (G_OBJECT (parser), parser_signals [FINISHED_NODE], 0, node); } static void @@ -241,6 +247,15 @@ html_parser_class_init (HtmlParserClass g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + parser_signals [FINISHED_NODE] = + g_signal_new ("finished_node", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (HtmlParserClass, finished_node), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + DOM_TYPE_NODE); } static void @@ -281,11 +296,11 @@ html_parser_set_type (HtmlParser *parser /* FIXME: Free parser if existing */ if (parser_type == HTML_PARSER_TYPE_HTML) { parser->xmlctxt = htmlCreatePushParserCtxt (SAXHandler, parser, - parser->chars, parser->res, NULL, 0); + NULL, 0, NULL, 0); } else { parser->xmlctxt = xmlCreatePushParserCtxt (SAXHandler, parser, - parser->chars, parser->res, NULL); + NULL, 0, NULL); } Index: libgtkhtml/document/htmlparser.h =================================================================== --- libgtkhtml/document/htmlparser.h.orig 2006-01-17 11:50:54.000000000 +0000 +++ libgtkhtml/document/htmlparser.h 2006-02-11 18:57:51.000000000 +0000 @@ -57,8 +57,6 @@ struct _HtmlParser { /* Used by libxml */ xmlParserCtxtPtr xmlctxt; - int res; - char chars[10]; gboolean blocking; DomNode *blocking_node; @@ -71,6 +69,7 @@ struct _HtmlParserClass { void (* done_parsing) (HtmlParser *parser); void (* new_node) (HtmlParser *parser, DomNode *node); void (* parsed_document_node) (HtmlParser *parser, DomDocument *document); + void (* finished_node) (HtmlParser *parser, DomNode *node); }; typedef struct _HtmlParserClass HtmlParserClass;