1use dom_struct::dom_struct;
6use js::rust::HandleObject;
7use script_bindings::reflector::{Reflector, reflect_dom_object_with_proto_and_cx};
8use script_traits::DocumentActivity;
9
10use crate::document_loader::DocumentLoader;
11use crate::dom::bindings::codegen::Bindings::DOMParserBinding;
12use crate::dom::bindings::codegen::Bindings::DOMParserBinding::DOMParserMethods;
13use crate::dom::bindings::codegen::Bindings::DOMParserBinding::SupportedType::{
14 Application_xhtml_xml, Application_xml, Image_svg_xml, Text_html, Text_xml,
15};
16use crate::dom::bindings::codegen::Bindings::DocumentBinding::DocumentReadyState;
17use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
18use crate::dom::bindings::codegen::UnionTypes::TrustedHTMLOrString;
19use crate::dom::bindings::error::Fallible;
20use crate::dom::bindings::root::{Dom, DomRoot};
21use crate::dom::document::{Document, DocumentSource, HasBrowsingContext, IsHTMLDocument};
22use crate::dom::servoparser::ServoParser;
23use crate::dom::trustedtypes::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(
42 cx: &mut js::context::JSContext,
43 window: &Window,
44 proto: Option<HandleObject>,
45 ) -> DomRoot<DOMParser> {
46 reflect_dom_object_with_proto_and_cx(
47 Box::new(DOMParser::new_inherited(window)),
48 window,
49 proto,
50 cx,
51 )
52 }
53}
54
55impl DOMParserMethods<crate::DomTypeHolder> for DOMParser {
56 fn Constructor(
58 cx: &mut js::context::JSContext,
59 window: &Window,
60 proto: Option<HandleObject>,
61 ) -> Fallible<DomRoot<DOMParser>> {
62 Ok(DOMParser::new(cx, window, proto))
63 }
64
65 fn ParseFromString(
67 &self,
68 cx: &mut js::context::JSContext,
69 s: TrustedHTMLOrString,
70 ty: DOMParserBinding::SupportedType,
71 ) -> Fallible<DomRoot<Document>> {
72 let compliant_string = TrustedHTML::get_trusted_type_compliant_string(
76 cx,
77 self.window.as_global_scope(),
78 s,
79 "DOMParser parseFromString",
80 )?;
81 let url = self.window.get_url();
82 let content_type = ty
83 .as_str()
84 .parse()
85 .expect("Supported type is not a MIME type");
86 let doc = self.window.Document();
87 let loader = DocumentLoader::new(&doc.loader());
88 let document = match ty {
90 Text_html => {
91 let document = Document::new(
94 &self.window,
95 HasBrowsingContext::No,
96 Some(url.clone()),
97 None,
98 doc.origin().clone(),
99 IsHTMLDocument::HTMLDocument,
100 Some(content_type),
101 None,
102 DocumentActivity::Inactive,
103 DocumentSource::FromParser,
104 loader,
105 None,
106 None,
107 Default::default(),
108 false,
109 false,
110 Some(doc.insecure_requests_policy()),
111 doc.has_trustworthy_ancestor_or_current_origin(),
112 doc.custom_element_reaction_stack(),
113 doc.creation_sandboxing_flag_set(),
114 doc.pipeline_id(),
115 doc.image_cache(),
116 CanGc::from_cx(cx),
117 );
118 ServoParser::parse_html_document(
120 cx,
121 &document,
122 Some(compliant_string),
123 url,
124 None,
125 None,
126 );
127 document
128 },
129 Text_xml | Application_xml | Application_xhtml_xml | Image_svg_xml => {
130 let document = Document::new(
133 &self.window,
134 HasBrowsingContext::No,
135 Some(url.clone()),
136 None,
137 doc.origin().clone(),
138 IsHTMLDocument::NonHTMLDocument,
139 Some(content_type),
140 None,
141 DocumentActivity::Inactive,
142 DocumentSource::FromParser,
143 loader,
144 None,
145 None,
146 Default::default(),
147 false,
148 false,
149 Some(doc.insecure_requests_policy()),
150 doc.has_trustworthy_ancestor_or_current_origin(),
151 doc.custom_element_reaction_stack(),
152 doc.creation_sandboxing_flag_set(),
153 doc.pipeline_id(),
154 doc.image_cache(),
155 CanGc::from_cx(cx),
156 );
157 ServoParser::parse_xml_document(cx, &document, Some(compliant_string), url, None);
160 document
161 },
162 };
163 document.set_ready_state(cx, DocumentReadyState::Complete);
165 Ok(document)
166 }
167}