aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorConnor Brewster <connor.brewster@eagles.oc.edu>2017-07-07 15:18:23 -0600
committerConnor Brewster <connor.brewster@eagles.oc.edu>2017-07-17 22:23:47 -0600
commit9b587a4f2d1d8abc70fa6d6220ac31e6dac32c72 (patch)
tree56b448f2841d0dd44cf8ce34fc063fae88d85737 /components/script
parent46659915036bb44e73e7ef2696ea9f35105f1659 (diff)
downloadservo-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.rs11
-rw-r--r--components/script/microtask.rs5
-rw-r--r--components/script/script_thread.rs9
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>,