/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use dom_struct::dom_struct; use js::rust::HandleObject; use script_traits::DocumentActivity; use crate::document_loader::DocumentLoader; use crate::dom::bindings::codegen::Bindings::DOMParserBinding; use crate::dom::bindings::codegen::Bindings::DOMParserBinding::DOMParserMethods; use crate::dom::bindings::codegen::Bindings::DOMParserBinding::SupportedType::{ Application_xhtml_xml, Application_xml, Image_svg_xml, Text_html, Text_xml, }; use crate::dom::bindings::codegen::Bindings::DocumentBinding::DocumentReadyState; use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use crate::dom::bindings::codegen::UnionTypes::TrustedHTMLOrString; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::reflector::{Reflector, reflect_dom_object_with_proto}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::document::{Document, DocumentSource, HasBrowsingContext, IsHTMLDocument}; use crate::dom::servoparser::ServoParser; use crate::dom::trustedhtml::TrustedHTML; use crate::dom::window::Window; use crate::script_runtime::CanGc; #[dom_struct] pub(crate) struct DOMParser { reflector_: Reflector, window: Dom, // XXXjdm Document instead? } impl DOMParser { fn new_inherited(window: &Window) -> DOMParser { DOMParser { reflector_: Reflector::new(), window: Dom::from_ref(window), } } fn new(window: &Window, proto: Option, can_gc: CanGc) -> DomRoot { reflect_dom_object_with_proto( Box::new(DOMParser::new_inherited(window)), window, proto, can_gc, ) } } impl DOMParserMethods for DOMParser { /// fn Constructor( window: &Window, proto: Option, can_gc: CanGc, ) -> Fallible> { Ok(DOMParser::new(window, proto, can_gc)) } /// fn ParseFromString( &self, s: TrustedHTMLOrString, ty: DOMParserBinding::SupportedType, can_gc: CanGc, ) -> Fallible> { // Step 1. Let compliantString be the result of invoking the // Get Trusted Type compliant string algorithm with TrustedHTML, // this's relevant global object, string, "DOMParser parseFromString", and "script". let compliant_string = TrustedHTML::get_trusted_script_compliant_string( self.window.as_global_scope(), s, "DOMParser parseFromString", can_gc, )?; let url = self.window.get_url(); let content_type = ty .as_str() .parse() .expect("Supported type is not a MIME type"); let doc = self.window.Document(); let loader = DocumentLoader::new(&doc.loader()); // Step 3. Switch on type: let document = match ty { Text_html => { // Step 2. Let document be a new Document, whose content type is type // and URL is this's relevant global object's associated Document's URL. let document = Document::new( &self.window, HasBrowsingContext::No, Some(url.clone()), doc.origin().clone(), IsHTMLDocument::HTMLDocument, Some(content_type), None, DocumentActivity::Inactive, DocumentSource::FromParser, loader, None, None, Default::default(), false, false, Some(doc.insecure_requests_policy()), doc.has_trustworthy_ancestor_or_current_origin(), doc.custom_element_reaction_stack(), can_gc, ); // Step switch-1. Parse HTML from a string given document and compliantString. ServoParser::parse_html_document(&document, Some(compliant_string), url, can_gc); document }, Text_xml | Application_xml | Application_xhtml_xml | Image_svg_xml => { // Step 2. Let document be a new Document, whose content type is type // and URL is this's relevant global object's associated Document's URL. let document = Document::new( &self.window, HasBrowsingContext::No, Some(url.clone()), doc.origin().clone(), IsHTMLDocument::NonHTMLDocument, Some(content_type), None, DocumentActivity::Inactive, DocumentSource::FromParser, loader, None, None, Default::default(), false, false, Some(doc.insecure_requests_policy()), doc.has_trustworthy_ancestor_or_current_origin(), doc.custom_element_reaction_stack(), can_gc, ); // Step switch-1. Create an XML parser parser, associated with document, // and with XML scripting support disabled. ServoParser::parse_xml_document(&document, Some(compliant_string), url, can_gc); document }, }; // Step 4. Return document. document.set_ready_state(DocumentReadyState::Complete, can_gc); Ok(document) } }