1use dom_struct::dom_struct;
6use js::rust::HandleObject;
7use script_traits::DocumentActivity;
8
9use crate::document_loader::DocumentLoader;
10use crate::dom::bindings::codegen::Bindings::DOMParserBinding;
11use crate::dom::bindings::codegen::Bindings::DOMParserBinding::DOMParserMethods;
12use crate::dom::bindings::codegen::Bindings::DOMParserBinding::SupportedType::{
13 Application_xhtml_xml, Application_xml, Image_svg_xml, Text_html, Text_xml,
14};
15use crate::dom::bindings::codegen::Bindings::DocumentBinding::DocumentReadyState;
16use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
17use crate::dom::bindings::codegen::UnionTypes::TrustedHTMLOrString;
18use crate::dom::bindings::error::Fallible;
19use crate::dom::bindings::reflector::{Reflector, reflect_dom_object_with_proto};
20use crate::dom::bindings::root::{Dom, DomRoot};
21use crate::dom::document::{Document, DocumentSource, HasBrowsingContext, IsHTMLDocument};
22use crate::dom::servoparser::ServoParser;
23use crate::dom::trustedhtml::TrustedHTML;
24use crate::dom::window::Window;
25use crate::script_runtime::CanGc;
26
27#[dom_struct]
28pub(crate) struct DOMParser {
29 reflector_: Reflector,
30 window: Dom<Window>, }
32
33impl DOMParser {
34 fn new_inherited(window: &Window) -> DOMParser {
35 DOMParser {
36 reflector_: Reflector::new(),
37 window: Dom::from_ref(window),
38 }
39 }
40
41 fn new(window: &Window, proto: Option<HandleObject>, can_gc: CanGc) -> DomRoot<DOMParser> {
42 reflect_dom_object_with_proto(
43 Box::new(DOMParser::new_inherited(window)),
44 window,
45 proto,
46 can_gc,
47 )
48 }
49}
50
51impl DOMParserMethods<crate::DomTypeHolder> for DOMParser {
52 fn Constructor(
54 window: &Window,
55 proto: Option<HandleObject>,
56 can_gc: CanGc,
57 ) -> Fallible<DomRoot<DOMParser>> {
58 Ok(DOMParser::new(window, proto, can_gc))
59 }
60
61 fn ParseFromString(
63 &self,
64 s: TrustedHTMLOrString,
65 ty: DOMParserBinding::SupportedType,
66 can_gc: CanGc,
67 ) -> Fallible<DomRoot<Document>> {
68 let compliant_string = TrustedHTML::get_trusted_script_compliant_string(
72 self.window.as_global_scope(),
73 s,
74 "DOMParser parseFromString",
75 can_gc,
76 )?;
77 let url = self.window.get_url();
78 let content_type = ty
79 .as_str()
80 .parse()
81 .expect("Supported type is not a MIME type");
82 let doc = self.window.Document();
83 let loader = DocumentLoader::new(&doc.loader());
84 let document = match ty {
86 Text_html => {
87 let document = Document::new(
90 &self.window,
91 HasBrowsingContext::No,
92 Some(url.clone()),
93 None,
94 doc.origin().clone(),
95 IsHTMLDocument::HTMLDocument,
96 Some(content_type),
97 None,
98 DocumentActivity::Inactive,
99 DocumentSource::FromParser,
100 loader,
101 None,
102 None,
103 Default::default(),
104 false,
105 false,
106 Some(doc.insecure_requests_policy()),
107 doc.has_trustworthy_ancestor_or_current_origin(),
108 doc.custom_element_reaction_stack(),
109 doc.creation_sandboxing_flag_set(),
110 can_gc,
111 );
112 ServoParser::parse_html_document(
114 &document,
115 Some(compliant_string),
116 url,
117 None,
118 None,
119 can_gc,
120 );
121 document
122 },
123 Text_xml | Application_xml | Application_xhtml_xml | Image_svg_xml => {
124 let document = Document::new(
127 &self.window,
128 HasBrowsingContext::No,
129 Some(url.clone()),
130 None,
131 doc.origin().clone(),
132 IsHTMLDocument::NonHTMLDocument,
133 Some(content_type),
134 None,
135 DocumentActivity::Inactive,
136 DocumentSource::FromParser,
137 loader,
138 None,
139 None,
140 Default::default(),
141 false,
142 false,
143 Some(doc.insecure_requests_policy()),
144 doc.has_trustworthy_ancestor_or_current_origin(),
145 doc.custom_element_reaction_stack(),
146 doc.creation_sandboxing_flag_set(),
147 can_gc,
148 );
149 ServoParser::parse_xml_document(
152 &document,
153 Some(compliant_string),
154 url,
155 None,
156 can_gc,
157 );
158 document
159 },
160 };
161 document.set_ready_state(DocumentReadyState::Complete, can_gc);
163 Ok(document)
164 }
165}