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() }