summaryrefslogtreecommitdiff
path: root/render
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2013-05-23 15:02:15 +0100
committerMichael Drake <tlsa@netsurf-browser.org>2013-05-23 15:02:15 +0100
commit9751a107057cfe19e16e778e945d76b456d3b434 (patch)
tree5f9bef673c9709346c7bb76651a11b6b7e77c64b /render
parente8df19f3d2f4ac68da498b6c114cc08f7a452bfd (diff)
downloadnetsurf-9751a107057cfe19e16e778e945d76b456d3b434.tar.gz
netsurf-9751a107057cfe19e16e778e945d76b456d3b434.tar.bz2
Handle title on dom event. Remove head walker from begin_conversion.
Diffstat (limited to 'render')
-rw-r--r--render/html.c108
-rw-r--r--render/html_internal.h3
2 files changed, 30 insertions, 81 deletions
diff --git a/render/html.c b/render/html.c
index 82c34b374..c3430a4a5 100644
--- a/render/html.c
+++ b/render/html.c
@@ -243,9 +243,6 @@ static bool html_process_title(html_content *c, dom_node *node)
char *title_str;
bool success;
- if (c->base.title != NULL)
- return true;
-
exc = dom_node_get_text_content(node, &title);
if ((exc != DOM_NO_ERR) || (title == NULL)) {
return false;
@@ -588,7 +585,7 @@ dom_default_action_DOMNodeInserted_cb(struct dom_event *evt, void *pw)
/* an element node has been inserted */
exc = dom_node_get_node_name(node, &name);
if ((exc == DOM_NO_ERR) && (name != NULL)) {
- /* LOG(("element htmlc:%p node %p name:%s", htmlc, node, dom_string_data(name))); */
+
if (dom_string_caseless_isequal(name,
corestring_dom_link)) {
/* Handle stylesheet loading */
@@ -607,6 +604,10 @@ dom_default_action_DOMNodeInserted_cb(struct dom_event *evt, void *pw)
name, corestring_lwc_base)) {
html_process_base(htmlc,
(dom_node *)node);
+ } else if (dom_string_caseless_lwc_isequal(
+ name, corestring_lwc_title) &&
+ htmlc->title == NULL) {
+ htmlc->title = dom_node_ref(node);
}
dom_string_unref(name);
@@ -628,15 +629,24 @@ dom_default_action_DOMSubtreeModified_cb(struct dom_event *evt, void *pw)
exc = dom_event_get_target(evt, &node);
if ((exc == DOM_NO_ERR) && (node != NULL)) {
+ if (htmlc->title == (dom_node *)node) {
+ /* Node is our title node */
+ html_process_title(htmlc, (dom_node *)node);
+ dom_node_unref(node);
+ return;
+ }
+
exc = dom_node_get_node_type(node, &type);
if ((exc == DOM_NO_ERR) && (type == DOM_ELEMENT_NODE)) {
- /* an element node has been inserted */
+ /* an element node has been modified */
exc = dom_node_get_node_name(node, &name);
if ((exc == DOM_NO_ERR) && (name != NULL)) {
- /* LOG(("element htmlc:%p node:%p name:%s", htmlc, node, dom_string_data(name))); */
- if (dom_string_caseless_isequal(name, corestring_dom_style)) {
- html_css_update_style(htmlc, (dom_node *)node);
- }
+
+ if (dom_string_caseless_isequal(name,
+ corestring_dom_style)) {
+ html_css_update_style(htmlc,
+ (dom_node *)node);
+ }
dom_string_unref(name);
}
@@ -691,6 +701,7 @@ html_create_html_data(html_content *c, const http_parameter *params)
c->base_target = NULL;
c->aborted = false;
c->refresh = false;
+ c->title = NULL;
c->bctx = NULL;
c->layout = NULL;
c->background_colour = NS_TRANSPARENT;
@@ -944,61 +955,6 @@ html_process_data(struct content *c, const char *data, unsigned int size)
return true;
}
-/**
- * Process elements in <head>.
- *
- * \param c content structure
- * \param head xml node of head element
- * \return true on success, false on memory exhaustion
- *
- * The title and base href are extracted if present.
- */
-
-static nserror html_head(html_content *c, dom_node *head)
-{
- dom_node *node;
- dom_exception exc; /* returned by libdom functions */
- dom_string *node_name;
- dom_node_type node_type;
- dom_node *next_node;
-
- exc = dom_node_get_first_child(head, &node);
- if (exc != DOM_NO_ERR) {
- return NSERROR_DOM;
- }
-
- while (node != NULL) {
- exc = dom_node_get_node_type(node, &node_type);
-
- if ((exc == DOM_NO_ERR) && (node_type == DOM_ELEMENT_NODE)) {
- exc = dom_node_get_node_name(node, &node_name);
-
- if ((exc == DOM_NO_ERR) && (node_name != NULL)) {
- if (dom_string_caseless_lwc_isequal(
- node_name,
- corestring_lwc_title)) {
- html_process_title(c, node);
- }
- }
- if (node_name != NULL) {
- dom_string_unref(node_name);
- }
- }
-
- /* move to next node */
- exc = dom_node_get_next_sibling(node, &next_node);
- dom_node_unref(node);
- if (exc == DOM_NO_ERR) {
- node = next_node;
- } else {
- node = NULL;
- }
- }
-
- return NSERROR_OK;
-}
-
-
/**
* Convert a CONTENT_HTML for display.
@@ -1069,7 +1025,7 @@ bool html_can_begin_conversion(html_content *htmlc)
bool
html_begin_conversion(html_content *htmlc)
{
- dom_node *html, *head;
+ dom_node *html;
nserror ns_error;
struct form *f;
dom_exception exc; /* returned by libdom functions */
@@ -1141,18 +1097,6 @@ html_begin_conversion(html_content *htmlc)
}
dom_string_unref(node_name);
- head = libdom_find_first_element(html, corestring_lwc_head);
- if (head != NULL) {
- ns_error = html_head(htmlc, head);
- if (ns_error != NSERROR_OK) {
- content_broadcast_errorcode(&htmlc->base, ns_error);
-
- dom_node_unref(html);
- dom_node_unref(head);
- return false;
- }
- }
-
/* Retrieve forms from parser */
htmlc->forms = html_forms_get_forms(htmlc->encoding,
(dom_html_document *) htmlc->document);
@@ -1176,7 +1120,6 @@ html_begin_conversion(html_content *htmlc)
content_broadcast_errorcode(&htmlc->base, ns_error);
dom_node_unref(html);
- dom_node_unref(head);
return false;
}
@@ -1188,7 +1131,6 @@ html_begin_conversion(html_content *htmlc)
NSERROR_NOMEM);
dom_node_unref(html);
- dom_node_unref(head);
return false;
}
@@ -1199,13 +1141,11 @@ html_begin_conversion(html_content *htmlc)
content_broadcast_errorcode(&htmlc->base,
NSERROR_NOMEM);
dom_node_unref(html);
- dom_node_unref(head);
return false;
}
}
}
- dom_node_unref(head);
dom_node_unref(html);
if (htmlc->base.active == 0) {
@@ -1419,6 +1359,12 @@ static void html_destroy(struct content *c)
if (html->document != NULL) {
dom_node_unref(html->document);
+ html->document = NULL;
+ }
+
+ if (html->title != NULL) {
+ dom_node_unref(html->title);
+ html->title = NULL;
}
/* Free base target */
diff --git a/render/html_internal.h b/render/html_internal.h
index 7c30fdda0..43fce9bfd 100644
--- a/render/html_internal.h
+++ b/render/html_internal.h
@@ -93,6 +93,9 @@ typedef struct html_content {
/** Whether a meta refresh has been handled */
bool refresh;
+ /* Title element node */
+ dom_node *title;
+
/** A talloc context purely for the render box tree */
int *bctx;
/** Box tree, or NULL. */