aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/document.rs7
-rw-r--r--components/script/dom/eventtarget.rs11
-rw-r--r--components/script/dom/htmlstyleelement.rs6
-rw-r--r--components/script/dom/servoparser/mod.rs4
-rw-r--r--components/script/dom/window.rs4
5 files changed, 29 insertions, 3 deletions
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<Item=DomRoot<HTMLIFrameElement>> {
self.upcast::<Node>()
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::<Window>() {
+ 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::<Window>() {
+ 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::<EventTarget>().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