Hubbub
in_frameset.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  switch (token->type) {
31  err = process_characters_expect_whitespace(treebuilder,
32  token, true);
33  if (err == HUBBUB_REPROCESS) {
35  /* Ignore the token */
36  err = HUBBUB_OK;
37  }
38  break;
40  err = process_comment_append(treebuilder, token,
41  treebuilder->context.element_stack[
42  treebuilder->context.current_node].node);
43  break;
46  break;
48  {
50  &token->data.tag.name);
51 
52  if (type == HTML) {
53  err = handle_in_body(treebuilder, token);
54  } else if (type == FRAMESET) {
55  err = insert_element(treebuilder, &token->data.tag,
56  true);
57  } else if (type == FRAME) {
58  err = insert_element(treebuilder, &token->data.tag,
59  false);
61  } else if (type == NOFRAMES) {
62  err = handle_in_head(treebuilder, token);
63  } else {
65  }
66  }
67  break;
69  {
71  &token->data.tag.name);
72 
73  if (type == FRAMESET) {
74  hubbub_ns ns;
75  void *node;
76 
77  /* fragment case -- ignore */
78  if (current_node(treebuilder) == HTML) {
80  break;
81  }
82 
83  element_stack_pop(treebuilder, &ns, &type, &node);
84 
85  treebuilder->tree_handler->unref_node(
86  treebuilder->tree_handler->ctx,
87  node);
88 
89  if (current_node(treebuilder) != FRAMESET) {
90  treebuilder->context.mode = AFTER_FRAMESET;
91  }
92  } else {
94  }
95  }
96  break;
97  case HUBBUB_TOKEN_EOF:
99  break;
100  }
101 
102  return err;
103 }
104 
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_error handle_in_frameset(hubbub_treebuilder *treebuilder, const hubbub_token *token)
Handle token in "in frameset" insertion mode.
Definition: in_frameset.c:24
hubbub_token_type type
The token type.
Definition: types.h:120
void * ctx
Context pointer.
Definition: tree.h:292
Definition: internal.h:18
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
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:375
Definition: internal.h:25
insertion_mode mode
The current insertion mode.
Definition: internal.h:75
hubbub_error handle_in_body(hubbub_treebuilder *treebuilder, const hubbub_token *token)
Handle tokens in "in body" insertion mode.
Definition: in_body.c:123
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
void * node
Node pointer.
Definition: internal.h:54
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.
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
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