diff options
author | CYBAI <cyb.ai.815@gmail.com> | 2018-11-04 14:35:17 +0800 |
---|---|---|
committer | CYBAI <cyb.ai.815@gmail.com> | 2018-11-13 22:29:45 +0800 |
commit | 23a4d646ce779b0e13ea0441bfad081fcaf97928 (patch) | |
tree | c7cb195a3232d68207d62e1b92d34a829c29f7b2 | |
parent | b1a2b6b5bfe72440059834c67dc28ad422b89a82 (diff) | |
download | servo-23a4d646ce779b0e13ea0441bfad081fcaf97928.tar.gz servo-23a4d646ce779b0e13ea0441bfad081fcaf97928.zip |
Introduce rejectionhandled event
-rw-r--r-- | Cargo.lock | 8 | ||||
-rw-r--r-- | components/atoms/static_atoms.txt | 1 | ||||
-rw-r--r-- | components/malloc_size_of/Cargo.toml | 2 | ||||
-rw-r--r-- | components/script/Cargo.toml | 2 | ||||
-rw-r--r-- | components/script/script_runtime.rs | 45 |
5 files changed, 40 insertions, 18 deletions
diff --git a/Cargo.lock b/Cargo.lock index 3e16573c287..7f6d6f2598d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2213,7 +2213,7 @@ dependencies = [ "hyper 0.12.12 (registry+https://github.com/rust-lang/crates.io-index)", "hyper_serde 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "keyboard-types 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "mozjs 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", + "mozjs 0.9.4 (registry+https://github.com/rust-lang/crates.io-index)", "selectors 0.20.0", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde_bytes 0.10.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2435,7 +2435,7 @@ dependencies = [ [[package]] name = "mozjs" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3213,7 +3213,7 @@ dependencies = [ "mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)", "mitochondria 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "mozangle 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "mozjs 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", + "mozjs 0.9.4 (registry+https://github.com/rust-lang/crates.io-index)", "msg 0.0.1", "net_traits 0.0.1", "num-traits 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4938,7 +4938,7 @@ dependencies = [ "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" "checksum mitochondria 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9de3eca27871df31c33b807f834b94ef7d000956f57aa25c5aed9c5f0aae8f6f" "checksum mozangle 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "45a8a18a41cfab0fde25cc2f43ea89064d211a0fbb33225b8ff93ab20406e0e7" -"checksum mozjs 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bd0bdded611cb03c8ca638e0b663befe67eb7fbcb1fe2dfd25061656ee4ff365" +"checksum mozjs 0.9.4 (registry+https://github.com/rust-lang/crates.io-index)" = "2c7319f00f7847cca3290f7af7cef5947110f62fe5c792a6c4cb9a4518076d96" "checksum mozjs_sys 0.61.2 (registry+https://github.com/rust-lang/crates.io-index)" = "28276d28cc79226f3a26c790f00c8ce74459d097d3698f17df05ab9f683c1e52" "checksum msdos_time 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aad9dfe950c057b1bfe9c1f2aa51583a8468ef2a5baba2ebbe06d775efeb7729" "checksum muldiv 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "451a9a05d2a32c566c897835e0ea95cf79ed2fdfe957924045a1721a36c9980f" diff --git a/components/atoms/static_atoms.txt b/components/atoms/static_atoms.txt index 081c8c314cd..5851997071c 100644 --- a/components/atoms/static_atoms.txt +++ b/components/atoms/static_atoms.txt @@ -65,6 +65,7 @@ radio range readystatechange reftest-wait +rejectionhandled reset resize right diff --git a/components/malloc_size_of/Cargo.toml b/components/malloc_size_of/Cargo.toml index 2b62d7180eb..4ca42aa7472 100644 --- a/components/malloc_size_of/Cargo.toml +++ b/components/malloc_size_of/Cargo.toml @@ -32,7 +32,7 @@ hashglobe = { path = "../hashglobe" } hyper = { version = "0.12", optional = true } hyper_serde = { version = "0.9", optional = true } keyboard-types = {version = "0.4.3", optional = true} -mozjs = { version = "0.9.3", optional = true } +mozjs = { version = "0.9.4", optional = true } selectors = { path = "../selectors" } serde = { version = "1.0.27", optional = true } serde_bytes = { version = "0.10", optional = true } diff --git a/components/script/Cargo.toml b/components/script/Cargo.toml index a862caadc59..cce1dee0bcc 100644 --- a/components/script/Cargo.toml +++ b/components/script/Cargo.toml @@ -63,7 +63,7 @@ hyper_serde = "0.9" image = "0.19" ipc-channel = "0.11" itertools = "0.7.6" -js = {package = "mozjs", version = "0.9.3"} +js = {package = "mozjs", version = "0.9.4"} jstraceable_derive = {path = "../jstraceable_derive"} keyboard-types = "0.4.3" lazy_static = "1" diff --git a/components/script/script_runtime.rs b/components/script/script_runtime.rs index f0cdd8ccad0..8cda22d6288 100644 --- a/components/script/script_runtime.rs +++ b/components/script/script_runtime.rs @@ -41,6 +41,7 @@ use js::jsapi::{SetBuildIdOp, SetEnqueuePromiseJobCallback, SetPromiseRejectionT use js::panic::wrap_panic; use js::rust::wrappers::{GetPromiseIsHandled, GetPromiseResult}; use js::rust::Handle; +use js::rust::IntoHandle; use js::rust::Runtime as RustRuntime; use malloc_size_of::MallocSizeOfOps; use msg::constellation_msg::PipelineId; @@ -152,7 +153,7 @@ unsafe extern "C" fn enqueue_job( ) } -#[allow(unsafe_code)] +#[allow(unsafe_code, unrooted_must_root)] /// https://html.spec.whatwg.org/multipage/#the-hostpromiserejectiontracker-implementation unsafe extern "C" fn promise_rejection_tracker( cx: *mut JSContext, @@ -190,14 +191,38 @@ unsafe extern "C" fn promise_rejection_tracker( .borrow() .contains(&Heap::boxed(promise.get())) { - global.add_consumed_rejection(promise); return; } // Step 5-3. global.remove_consumed_rejection(promise); - // TODO: Step 5-4 - Queue a task to fire `rejectionhandled` event + let target = Trusted::new(global.upcast::<EventTarget>()); + let promise = Promise::new_with_js_promise(Handle::from_raw(promise), cx); + let trusted_promise = TrustedPromise::new(promise.clone()); + + // Step 5-4. + global.dom_manipulation_task_source().queue( + task!(rejection_handled_event: move || { + let target = target.root(); + let cx = target.global().get_cx(); + let root_promise = trusted_promise.root(); + + rooted!(in(cx) let reason = GetPromiseResult(root_promise.reflector().get_jsobject())); + + let event = PromiseRejectionEvent::new( + &target.global(), + atom!("rejectionhandled"), + EventBubbles::DoesNotBubble, + EventCancelable::Cancelable, + root_promise, + reason.handle() + ); + + event.upcast::<Event>().fire(&target); + }), + global.upcast(), + ).unwrap(); }, }; }), @@ -254,7 +279,7 @@ pub fn notify_about_rejected_promises(global: &GlobalScope) { atom!("unhandledrejection"), EventBubbles::DoesNotBubble, EventCancelable::Cancelable, - promise, + promise.clone(), reason.handle() ); @@ -265,19 +290,15 @@ pub fn notify_about_rejected_promises(global: &GlobalScope) { // TODO: The promise rejection is not handled; we need to add it back to the list. } - // TODO: Step 4-4 - If [[PromiseIsHandled]] is false, add promise to consumed_rejections + // Step 4-4. + if !promise_is_handled { + target.global().add_consumed_rejection(promise.reflector().get_jsobject().into_handle()); + } } }), global.upcast(), ).unwrap(); } - - if global.get_consumed_rejections().borrow().len() > 0 { - // FIXME(cybai): Implement `rejectionhandled` event instead of clearing the whole - // consumed rejections - // https://html.spec.whatwg.org/multipage/#the-hostpromiserejectiontracker-implementation - global.get_consumed_rejections().borrow_mut().clear(); - } } } |