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