diff options
author | Connor Brewster <connor.brewster@eagles.oc.edu> | 2017-07-07 15:18:23 -0600 |
---|---|---|
committer | Connor Brewster <connor.brewster@eagles.oc.edu> | 2017-07-17 22:23:47 -0600 |
commit | 9b587a4f2d1d8abc70fa6d6220ac31e6dac32c72 (patch) | |
tree | 56b448f2841d0dd44cf8ce34fc063fae88d85737 /components/script | |
parent | 46659915036bb44e73e7ef2696ea9f35105f1659 (diff) | |
download | servo-9b587a4f2d1d8abc70fa6d6220ac31e6dac32c72.tar.gz servo-9b587a4f2d1d8abc70fa6d6220ac31e6dac32c72.zip |
Invoke backup element queue via a microtask
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/customelementregistry.rs | 11 | ||||
-rw-r--r-- | components/script/microtask.rs | 5 | ||||
-rw-r--r-- | components/script/script_thread.rs | 9 |
3 files changed, 18 insertions, 7 deletions
diff --git a/components/script/dom/customelementregistry.rs b/components/script/dom/customelementregistry.rs index 6077130c6c4..0d151abb127 100644 --- a/components/script/dom/customelementregistry.rs +++ b/components/script/dom/customelementregistry.rs @@ -29,6 +29,8 @@ use js::conversions::ToJSValConvertible; use js::jsapi::{Construct1, IsCallable, IsConstructor, HandleValueArray, HandleObject, MutableHandleValue}; use js::jsapi::{Heap, JS_GetProperty, JSAutoCompartment, JSContext}; use js::jsval::{JSVal, NullValue, ObjectValue, UndefinedValue}; +use microtask::Microtask; +use script_thread::ScriptThread; use std::cell::Cell; use std::collections::{HashMap, VecDeque}; use std::ops::Deref; @@ -532,13 +534,7 @@ impl CustomElementReactionStack { self.processing_backup_element_queue.set(BackupElementQueueFlag::Processing); // Step 4 - // TODO: Invoke Microtask - - // Step 4.1 - self.backup_queue.invoke_reactions(); - - // Step 4.2 - self.processing_backup_element_queue.set(BackupElementQueueFlag::NotProcessing); + ScriptThread::enqueue_microtask(Microtask::CustomElementReaction); } /// https://html.spec.whatwg.org/multipage/#enqueue-a-custom-element-callback-reaction @@ -630,6 +626,7 @@ impl ElementQueue { while let Some(element) = self.next_element() { element.invoke_reactions() } + self.queue.borrow_mut().clear(); } fn next_element(&self) -> Option<Root<Element>> { diff --git a/components/script/microtask.rs b/components/script/microtask.rs index 5028f2849da..a25b7ff3719 100644 --- a/components/script/microtask.rs +++ b/components/script/microtask.rs @@ -15,6 +15,7 @@ use dom::htmlimageelement::ImageElementMicrotask; use dom::htmlmediaelement::MediaElementMicrotask; use dom::mutationobserver::MutationObserver; use msg::constellation_msg::PipelineId; +use script_thread::ScriptThread; use std::cell::Cell; use std::mem; use std::rc::Rc; @@ -33,6 +34,7 @@ pub enum Microtask { Promise(EnqueuedPromiseCallback), MediaElement(MediaElementMicrotask), ImageElement(ImageElementMicrotask), + CustomElementReaction, NotifyMutationObservers, } @@ -87,6 +89,9 @@ impl MicrotaskQueue { Microtask::ImageElement(ref task) => { task.handler(); }, + Microtask::CustomElementReaction => { + ScriptThread::invoke_backup_element_queue(); + }, Microtask::NotifyMutationObservers => { MutationObserver::notify_mutation_observers(); } diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 1953f5691bd..7e171a1f048 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -755,6 +755,15 @@ impl ScriptThread { }) } + pub fn invoke_backup_element_queue() { + SCRIPT_THREAD_ROOT.with(|root| { + if let Some(script_thread) = root.get() { + let script_thread = unsafe { &*script_thread }; + script_thread.custom_element_reaction_stack.invoke_backup_element_queue(); + } + }) + } + /// Creates a new script thread. pub fn new(state: InitialScriptState, port: Receiver<MainThreadScriptMsg>, |