diff options
author | Josh Matthews <josh@joshmatthews.net> | 2016-08-12 11:44:56 -0400 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2016-09-22 16:16:52 -0400 |
commit | ab168204ed9b6068c312a98253ab32bcaa5e2239 (patch) | |
tree | 79d1bfd85843fd0995c33c5220bfec042e69b915 /components/script/dom/promisenativehandler.rs | |
parent | 7ba3172ce0d9d9d6a003b27d66450fea876bd563 (diff) | |
download | servo-ab168204ed9b6068c312a98253ab32bcaa5e2239.tar.gz servo-ab168204ed9b6068c312a98253ab32bcaa5e2239.zip |
Support native promise callbacks.
Diffstat (limited to 'components/script/dom/promisenativehandler.rs')
-rw-r--r-- | components/script/dom/promisenativehandler.rs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/components/script/dom/promisenativehandler.rs b/components/script/dom/promisenativehandler.rs new file mode 100644 index 00000000000..603122556ef --- /dev/null +++ b/components/script/dom/promisenativehandler.rs @@ -0,0 +1,49 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::codegen::Bindings::PromiseNativeHandlerBinding; +use dom::bindings::global::GlobalRef; +use dom::bindings::js::Root; +use dom::bindings::reflector::{Reflector, reflect_dom_object}; +use dom::bindings::trace::JSTraceable; +use heapsize::HeapSizeOf; +use js::jsapi::{JSContext, HandleValue}; + +pub trait Callback: JSTraceable + HeapSizeOf { + fn callback(&self, cx: *mut JSContext, v: HandleValue); +} + +#[dom_struct] +pub struct PromiseNativeHandler { + reflector: Reflector, + resolve: Option<Box<Callback>>, + reject: Option<Box<Callback>>, +} + +impl PromiseNativeHandler { + pub fn new(global: GlobalRef, + resolve: Option<Box<Callback>>, + reject: Option<Box<Callback>>) + -> Root<PromiseNativeHandler> { + reflect_dom_object(box PromiseNativeHandler { + reflector: Reflector::new(), + resolve: resolve, + reject: reject, + }, global, PromiseNativeHandlerBinding::Wrap) + } + + fn callback(callback: &Option<Box<Callback>>, cx: *mut JSContext, v: HandleValue) { + if let Some(ref callback) = *callback { + callback.callback(cx, v) + } + } + + pub fn resolved_callback(&self, cx: *mut JSContext, v: HandleValue) { + PromiseNativeHandler::callback(&self.resolve, cx, v) + } + + pub fn rejected_callback(&self, cx: *mut JSContext, v: HandleValue) { + PromiseNativeHandler::callback(&self.reject, cx, v) + } +} |