Hubbub
in_select.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 Andrew Sidwell <takkaria@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 
29  hubbub_ns ns;
30  element_type otype;
31  void *node;
32 
33  switch (token->type) {
35  err = append_text(treebuilder, &token->data.character);
36  break;
38  err = process_comment_append(treebuilder, token,
39  treebuilder->context.element_stack[
40  treebuilder->context.current_node].node);
41  break;
44  break;
46  {
48  &token->data.tag.name);
49 
50  if (type == HTML) {
51  /* Process as if "in body" */
52  err = handle_in_body(treebuilder, token);
53  } else if (type == OPTION) {
54  if (current_node(treebuilder) == OPTION) {
55  element_stack_pop(treebuilder, &ns, &otype,
56  &node);
57 
58  treebuilder->tree_handler->unref_node(
59  treebuilder->tree_handler->ctx,
60  node);
61  }
62 
63  err = insert_element(treebuilder, &token->data.tag,
64  true);
65  } else if (type == OPTGROUP) {
66  if (current_node(treebuilder) == OPTION) {
67  element_stack_pop(treebuilder, &ns, &otype,
68  &node);
69 
70  treebuilder->tree_handler->unref_node(
71  treebuilder->tree_handler->ctx,
72  node);
73  }
74 
75  if (current_node(treebuilder) == OPTGROUP) {
76  element_stack_pop(treebuilder, &ns, &otype,
77  &node);
78 
79  treebuilder->tree_handler->unref_node(
80  treebuilder->tree_handler->ctx,
81  node);
82  }
83 
84  err = insert_element(treebuilder, &token->data.tag,
85  true);
86  } else if (type == SELECT || type == INPUT ||
87  type == TEXTAREA) {
88 
89  if (element_in_scope(treebuilder, SELECT, true)) {
90  element_stack_pop_until(treebuilder,
91  SELECT);
92  reset_insertion_mode(treebuilder);
93  } else {
94  /* fragment case */
96  }
97 
98  if (type != SELECT)
99  err = HUBBUB_REPROCESS;
100  } else if (type == SCRIPT) {
101  err = handle_in_head(treebuilder, token);
102  } else {
104  }
105  }
106  break;
108  {
110  &token->data.tag.name);
111 
112  if (type == OPTGROUP) {
113  if (current_node(treebuilder) == OPTION &&
114  prev_node(treebuilder) == OPTGROUP) {
115  element_stack_pop(treebuilder, &ns, &otype,
116  &node);
117 
118  treebuilder->tree_handler->unref_node(
119  treebuilder->tree_handler->ctx,
120  node);
121  }
122 
123  if (current_node(treebuilder) == OPTGROUP) {
124  element_stack_pop(treebuilder, &ns, &otype,
125  &node);
126 
127  treebuilder->tree_handler->unref_node(
128  treebuilder->tree_handler->ctx,
129  node);
130  } else {
132  }
133  } else if (type == OPTION) {
134  if (current_node(treebuilder) == OPTION) {
135  element_stack_pop(treebuilder, &ns, &otype,
136  &node);
137 
138  treebuilder->tree_handler->unref_node(
139  treebuilder->tree_handler->ctx,
140  node);
141  } else {
143  }
144  } else if (type == SELECT) {
145  if (element_in_scope(treebuilder, SELECT, true)) {
146  element_stack_pop_until(treebuilder,
147  SELECT);
148  reset_insertion_mode(treebuilder);
149  } else {
150  /* fragment case */
152  }
153  }
154  }
155  break;
156  case HUBBUB_TOKEN_EOF:
157  break;
158  }
159 
160  return err;
161 }
162 
element_type current_node(hubbub_treebuilder *treebuilder)
Peek at the top element of the element stack.
Definition: treebuilder.c:1259
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:421
hubbub_token_type type
The token type.
Definition: types.h:120
void * ctx
Context pointer.
Definition: tree.h:292
hubbub_error handle_in_select(hubbub_treebuilder *treebuilder, const hubbub_token *token)
Handle token in "in head" insertion mode.
Definition: in_select.c:24
Token data.
Definition: types.h:119
hubbub_string name
Tag name.
Definition: types.h:110
hubbub_tree_handler * tree_handler
Callback table.
Definition: internal.h:122
element_type
Definition: internal.h:13
Definition: internal.h:25
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: internal.h:20
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:752
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_error
Definition: errors.h:18
hubbub_error element_stack_pop_until(hubbub_treebuilder *treebuilder, element_type type)
Pop elements until an element of type "element" has been popped.
Definition: treebuilder.c:1162
void * node
Node pointer.
Definition: internal.h:54
hubbub_error append_text(hubbub_treebuilder *treebuilder, const hubbub_string *string)
Append text to the current node, inserting into the last child of the current node, iff it's a Text node.
Definition: treebuilder.c:944
hubbub_string character
Definition: types.h:129
hubbub_tree_unref_node unref_node
Unreference node.
Definition: tree.h:279
element_type type
Definition: treebuilder.c:26
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.
element_type prev_node(hubbub_treebuilder *treebuilder)
Peek at the element below the top of the element stack.
Definition: treebuilder.c:1271
uint32_t element_in_scope(hubbub_treebuilder *treebuilder, element_type type, bool in_table)
Determine if an element is in (table) scope.
Definition: treebuilder.c:500
hubbub_error element_stack_pop(hubbub_treebuilder *treebuilder, hubbub_ns *ns, element_type *type, void **node)
Pop an element off the stack of open elements.
Definition: treebuilder.c:1113
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:987
Treebuilder object.
Definition: internal.h:116
void reset_insertion_mode(hubbub_treebuilder *treebuilder)
Reset the insertion mode.
Definition: treebuilder.c:863
element_context * element_stack
Stack of open elements.
Definition: internal.h:79
uint32_t current_node
Index of current node in stack.
Definition: internal.h:81