From 43526c80bb09ff2f2ea152dfd99ce6e0314a4a46 Mon Sep 17 00:00:00 2001 From: Connor Brewster Date: Sat, 2 Dec 2017 18:18:35 -0600 Subject: [PATCH] Add a check for when the js execution stack is empty --- components/script/dom/bindings/settings_stack.rs | 6 ++++++ components/script/dom/servoparser/mod.rs | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/components/script/dom/bindings/settings_stack.rs b/components/script/dom/bindings/settings_stack.rs index b540b989bc4..f9438f17065 100644 --- a/components/script/dom/bindings/settings_stack.rs +++ b/components/script/dom/bindings/settings_stack.rs @@ -35,6 +35,12 @@ pub unsafe fn trace(tracer: *mut JSTracer) { }) } +pub fn is_execution_stack_empty() -> bool { + STACK.with(|stack| { + stack.borrow().is_empty() + }) +} + /// RAII struct that pushes and pops entries from the script settings stack. pub struct AutoEntryScript { global: DomRoot, diff --git a/components/script/dom/servoparser/mod.rs b/components/script/dom/servoparser/mod.rs index 988e549d309..25539925e17 100644 --- a/components/script/dom/servoparser/mod.rs +++ b/components/script/dom/servoparser/mod.rs @@ -13,6 +13,7 @@ use dom::bindings::inheritance::Castable; use dom::bindings::refcounted::Trusted; use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::bindings::root::{Dom, DomRoot, MutNullableDom, RootedReference}; +use dom::bindings::settings_stack::is_execution_stack_empty; use dom::bindings::str::DOMString; use dom::characterdata::CharacterData; use dom::comment::Comment; @@ -1001,7 +1002,9 @@ fn create_element_for_token( // Step 6.1. // TODO: handle throw-on-dynamic-markup-insertion counter. // Step 6.2 - // TODO: If the JavaScript execution context stack is empty, then perform a microtask checkpoint. + if is_execution_stack_empty() { + document.window().upcast::().perform_a_microtask_checkpoint(); + } // Step 6.3 ScriptThread::push_new_element_queue() }