Hubbub
after_head.c
Go to the documentation of this file.
1 /*
2  * This file is part of Hubbub.
3  * Licensed under the MIT License,
4  * http://www.opensource.org/licenses/mit-license.php
5  * Copyright 2008 John-Mark Bell <jmb@netsurf-browser.org>
6  */
7 
8 #include <assert.h>
9 #include <string.h>
10 
11 #include "treebuilder/modes.h"
12 #include "treebuilder/internal.h"
14 #include "utils/utils.h"
15 
16 
25  const hubbub_token *token)
26 {
27  hubbub_error err = HUBBUB_OK;
28  bool handled = false;
29 
30  switch (token->type) {
32  err = process_characters_expect_whitespace(treebuilder,
33  token, true);
34  break;
36  err = process_comment_append(treebuilder, token,
37  treebuilder->context.element_stack[
38  treebuilder->context.current_node].node);
39  break;
42  break;
44  {
46  &token->data.tag.name);
47 
48  if (type == HTML) {
49  /* Process as if "in body" */
50  err = handle_in_body(treebuilder, token);
51  } else if (type == BODY) {
52  handled = true;
53  } else if (type == FRAMESET) {
54  err = insert_element(treebuilder, &token->data.tag,
55  true);
56  if (err == HUBBUB_OK)
57  treebuilder->context.mode = IN_FRAMESET;
58  } else if (type == BASE || type == LINK || type == META ||
59  type == NOFRAMES || type == SCRIPT ||
60  type == STYLE || type == TITLE) {
61  hubbub_ns ns;
62  element_type otype;
63  void *node;
64  uint32_t index;
65 
68  err = element_stack_push(treebuilder,
70  HEAD,
71  treebuilder->context.head_element);
72  if (err != HUBBUB_OK)
73  return err;
74 
75  index = treebuilder->context.current_node;
76 
77  /* Process as "in head" */
78  err = handle_in_head(treebuilder, token);
79 
80  element_stack_remove(treebuilder, index,
81  &ns, &otype, &node);
82 
83  /* No need to unref node as we never increased
84  * its reference count when pushing it on the stack */
85  } else if (type == HEAD) {
87  } else {
88  err = HUBBUB_REPROCESS;
89  }
90  }
91  break;
93  {
95  &token->data.tag.name);
96 
97  if (type == HTML || type == BODY || type == BR) {
98  err = HUBBUB_REPROCESS;
99  } else {
101  }
102  }
103  break;
104  case HUBBUB_TOKEN_EOF:
105  err = HUBBUB_REPROCESS;
106  break;
107  }
108 
109  if (handled || err == HUBBUB_REPROCESS) {
110  hubbub_error e;
111  hubbub_tag tag;
112 
113  if (err == HUBBUB_REPROCESS) {
114  /* Manufacture body */
115  tag.ns = HUBBUB_NS_HTML;
116  tag.name.ptr = (const uint8_t *) "body";
117  tag.name.len = SLEN("body");
118 
119  tag.n_attributes = 0;
120  tag.attributes = NULL;
121  } else {
122  tag = token->data.tag;
123  }
124 
125  e = insert_element(treebuilder, &tag, true);
126  if (e != HUBBUB_OK)
127  return e;
128 
129  treebuilder->context.mode = IN_BODY;
130  }
131 
132  return err;
133 }
134 
#define SLEN(s)
Definition: utils.h:34
Definition: internal.h:20
hubbub_error process_comment_append(hubbub_treebuilder *treebuilder, const hubbub_token *token, void *parent)
Process a comment token, appending it to the given parent.
Definition: treebuilder.c:420
hubbub_token_type type
The token type.
Definition: types.h:120
Definition: internal.h:20
hubbub_ns ns
Tag namespace.
Definition: types.h:109
hubbub_error handle_after_head(hubbub_treebuilder *treebuilder, const hubbub_token *token)
Handle tokens in "after head" insertion mode.
Definition: after_head.c:24
Data for a tag.
Definition: types.h:108
Token data.
Definition: types.h:119
hubbub_string name
Tag name.
Definition: types.h:110
Definition: internal.h:16
const uint8_t * ptr
Pointer to data.
Definition: types.h:77
element_type
Definition: internal.h:13
hubbub_error process_characters_expect_whitespace(hubbub_treebuilder *treebuilder, const hubbub_token *token, bool insert_into_current_node)
Process a character token in cases where we expect only whitespace.
Definition: treebuilder.c:374
Definition: internal.h:17
Definition: internal.h:25
insertion_mode mode
The current insertion mode.
Definition: internal.h:75
size_t len
Byte length of string.
Definition: types.h:78
Definition: internal.h:22
Definition: internal.h:22
hubbub_error handle_in_body(hubbub_treebuilder *treebuilder, const hubbub_token *token)
Handle tokens in "in body" insertion mode.
Definition: in_body.c:123
Definition: modes.h:22
void * head_element
Pointer to HEAD element.
Definition: internal.h:88
hubbub_error element_stack_push(hubbub_treebuilder *treebuilder, hubbub_ns ns, element_type type, void *node)
Push an element onto the stack of open elements.
Definition: treebuilder.c:1075
hubbub_treebuilder_context context
Our context.
Definition: internal.h:120
hubbub_error insert_element(hubbub_treebuilder *treebuilder, const hubbub_tag *tag_name, bool push)
Create element and insert it into the DOM, potentially pushing it on the stack.
Definition: treebuilder.c:751
hubbub_error handle_in_head(hubbub_treebuilder *treebuilder, const hubbub_token *token)
Handle token in "in head" insertion mode.
Definition: in_head.c:109
hubbub_attribute * attributes
Array of attribute data.
Definition: types.h:112
hubbub_error
Definition: errors.h:18
void * node
Node pointer.
Definition: internal.h:54
element_type type
Definition: treebuilder.c:25
No error.
Definition: errors.h:19
hubbub_tag tag
Definition: types.h:125
hubbub_ns
Possible namespaces.
Definition: types.h:63
union hubbub_token::@3 data
Type-specific data.
Definition: internal.h:17
hubbub_error element_stack_remove(hubbub_treebuilder *treebuilder, uint32_t index, hubbub_ns *ns, element_type *type, void **removed)
Remove a node from the stack of open elements.
Definition: treebuilder.c:1190
element_type element_type_from_name(hubbub_treebuilder *treebuilder, const hubbub_string *tag_name)
Convert an element name into an element type.
Definition: treebuilder.c:986
Treebuilder object.
Definition: internal.h:116
element_context * element_stack
Stack of open elements.
Definition: internal.h:79
uint32_t n_attributes
Count of attributes.
Definition: types.h:111
uint32_t current_node
Index of current node in stack.
Definition: internal.h:81
Definition: internal.h:19