aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/promisenativehandler.rs
diff options
context:
space:
mode:
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)
+ }
+}