diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 5be8e9b768a..0cd6b22557d 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -1885,6 +1885,13 @@ impl Document { self.current_parser.get() } + pub fn can_invoke_script(&self) -> bool { + match self.get_current_parser() { + Some(parser) => parser.parser_is_not_active(), + None => true, + } + } + /// Iterate over all iframes in the document. pub fn iter_iframes(&self) -> impl Iterator> { self.upcast::() diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs index 01fbc10c463..43a0a3502a3 100644 --- a/components/script/dom/eventtarget.rs +++ b/components/script/dom/eventtarget.rs @@ -315,10 +315,21 @@ impl EventTarget { pub fn dispatch_event_with_target(&self, target: &EventTarget, event: &Event) -> EventStatus { + if let Some(window) = target.global().downcast::() { + if window.has_document() { + assert!(window.Document().can_invoke_script()); + } + }; + event.dispatch(self, Some(target)) } pub fn dispatch_event(&self, event: &Event) -> EventStatus { + if let Some(window) = self.global().downcast::() { + if window.has_document() { + assert!(window.Document().can_invoke_script()); + } + }; event.dispatch(self, None) } diff --git a/components/script/dom/htmlstyleelement.rs b/components/script/dom/htmlstyleelement.rs index f6d2caaccf8..6a6bc416d2d 100644 --- a/components/script/dom/htmlstyleelement.rs +++ b/components/script/dom/htmlstyleelement.rs @@ -12,7 +12,6 @@ use dom::bindings::root::{DomRoot, MutNullableDom}; use dom::cssstylesheet::CSSStyleSheet; use dom::document::Document; use dom::element::{Element, ElementCreator}; -use dom::eventtarget::EventTarget; use dom::htmlelement::HTMLElement; use dom::node::{ChildrenMutation, Node, UnbindContext, document_from_node, window_from_node}; use dom::stylesheet::StyleSheet as DOMStyleSheet; @@ -105,9 +104,10 @@ impl HTMLStyleElement { let sheet = Arc::new(sheet); - // No subresource loads were triggered, just fire the load event now. + // No subresource loads were triggered, queue load event if self.pending_loads.get() == 0 { - self.upcast::().fire_event(atom!("load")); + let window = window_from_node(self); + window.dom_manipulation_task_source().queue_simple_event(self.upcast(), atom!("load"), &window); } self.set_stylesheet(sheet); diff --git a/components/script/dom/servoparser/mod.rs b/components/script/dom/servoparser/mod.rs index 6947ba5e837..88dd2a740f5 100644 --- a/components/script/dom/servoparser/mod.rs +++ b/components/script/dom/servoparser/mod.rs @@ -102,6 +102,10 @@ enum LastChunkState { } impl ServoParser { + pub fn parser_is_not_active(&self) -> bool { + self.can_write() || self.tokenizer.try_borrow_mut().is_ok() + } + pub fn parse_html_document(document: &Document, input: DOMString, url: ServoUrl) { let parser = if PREFS.get("dom.servoparser.async_html_tokenizer.enabled").as_boolean().unwrap() { ServoParser::new(document, diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 76457e1ba6b..71d13e8e8f7 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -1048,6 +1048,10 @@ impl Window { self.navigation_start_precise.get() } + pub fn has_document(&self) -> bool { + self.document.get().is_some() + } + /// Cancels all the tasks associated with that window. /// /// This sets the current `ignore_further_async_events` sentinel value to diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index 89e0a1b5f3a..f4a05c5a446 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -314573,6 +314573,12 @@ {} ] ], + "html/semantics/document-metadata/the-style-element/style_load_async.html": [ + [ + "/html/semantics/document-metadata/the-style-element/style_load_async.html", + {} + ] + ], "html/semantics/document-metadata/the-style-element/style_media.html": [ [ "/html/semantics/document-metadata/the-style-element/style_media.html", @@ -539856,6 +539862,10 @@ "77a9ee6e0d58d2aa905423f3b6f9d55492ed8eb9", "testharness" ], + "html/semantics/document-metadata/the-style-element/style_load_async.html": [ + "09e5519ec1a2d1f8b044f9d1309cf36695d4631d", + "testharness" + ], "html/semantics/document-metadata/the-style-element/style_media.html": [ "3d608438361d8bec5726feb468a3c2fbd5b7cb7d", "testharness" diff --git a/tests/wpt/metadata/custom-elements/microtasks-and-constructors.html.ini b/tests/wpt/metadata/custom-elements/microtasks-and-constructors.html.ini new file mode 100644 index 00000000000..00638b8a8c2 --- /dev/null +++ b/tests/wpt/metadata/custom-elements/microtasks-and-constructors.html.ini @@ -0,0 +1,4 @@ +[microtasks-and-constructors.html] + expected: CRASH + bug: https://github.com/servo/servo/issues/19392 + diff --git a/tests/wpt/metadata/custom-elements/parser/parser-fallsback-to-unknown-element.html.ini b/tests/wpt/metadata/custom-elements/parser/parser-fallsback-to-unknown-element.html.ini new file mode 100644 index 00000000000..b8c0c4d4172 --- /dev/null +++ b/tests/wpt/metadata/custom-elements/parser/parser-fallsback-to-unknown-element.html.ini @@ -0,0 +1,4 @@ +[parser-fallsback-to-unknown-element.html] + expected: CRASH + bug: https://github.com/servo/servo/issues/19392 + diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-style-element/style_load_async.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-style-element/style_load_async.html new file mode 100644 index 00000000000..ef8ac89c466 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-style-element/style_load_async.html @@ -0,0 +1,25 @@ + + + +Style load event should be async + + + + + + + +
+
+ +