1 /*
2 * Copyright (C) 2018-2020 Alexander Borisov
3 *
4 * Author: Alexander Borisov <borisov@lexbor.com>
5 */
6
7 #include "lexbor/html/tree/insertion_mode.h"
8
9
10 bool
lxb_html_tree_insertion_mode_after_frameset(lxb_html_tree_t * tree,lxb_html_token_t * token)11 lxb_html_tree_insertion_mode_after_frameset(lxb_html_tree_t *tree,
12 lxb_html_token_t *token)
13 {
14 switch (token->tag_id) {
15 case LXB_TAG__EM_COMMENT: {
16 lxb_dom_comment_t *comment;
17
18 comment = lxb_html_tree_insert_comment(tree, token, NULL);
19 if (comment == NULL) {
20 return lxb_html_tree_process_abort(tree);
21 }
22
23 break;
24 }
25
26 case LXB_TAG__EM_DOCTYPE:
27 lxb_html_tree_parse_error(tree, token,
28 LXB_HTML_RULES_ERROR_DOTOAFFRMO);
29 break;
30
31 case LXB_TAG_HTML:
32 if (token->type & LXB_HTML_TOKEN_TYPE_CLOSE) {
33 tree->mode = lxb_html_tree_insertion_mode_after_after_frameset;
34
35 return true;
36 }
37
38 return lxb_html_tree_insertion_mode_in_body(tree, token);
39
40 case LXB_TAG_NOFRAMES:
41 return lxb_html_tree_insertion_mode_in_head(tree, token);
42
43 case LXB_TAG__END_OF_FILE: {
44 tree->status = lxb_html_tree_stop_parsing(tree);
45 if (tree->status != LXB_STATUS_OK) {
46 return lxb_html_tree_process_abort(tree);
47 }
48
49 break;
50 }
51
52 case LXB_TAG__TEXT: {
53 size_t cur_len;
54 lexbor_str_t str;
55
56 tree->status = lxb_html_token_make_text(token, &str,
57 tree->document->dom_document.text);
58 if (tree->status != LXB_STATUS_OK) {
59 return lxb_html_tree_process_abort(tree);
60 }
61
62 cur_len = str.length;
63
64 lexbor_str_stay_only_whitespace(&str);
65
66 if (str.length != 0) {
67 tree->status = lxb_html_tree_insert_character_for_data(tree,
68 &str,
69 NULL);
70 if (tree->status != LXB_STATUS_OK) {
71 return lxb_html_tree_process_abort(tree);
72 }
73 }
74
75 if (str.length == cur_len) {
76 return true;
77 }
78 }
79 /* fall through */
80
81 default:
82 lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_UNTO);
83
84 break;
85 }
86
87 return true;
88 }
89