aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/promisenativehandler.rs
diff options
context:
space:
mode:
authorJosh Matthews <josh@joshmatthews.net>2016-08-12 11:44:56 -0400
committerJosh Matthews <josh@joshmatthews.net>2016-09-22 16:16:52 -0400
commitab168204ed9b6068c312a98253ab32bcaa5e2239 (patch)
tree79d1bfd85843fd0995c33c5220bfec042e69b915 /components/script/dom/promisenativehandler.rs
parent7ba3172ce0d9d9d6a003b27d66450fea876bd563 (diff)
downloadservo-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.rs49
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)
+ }
+}