diff options
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) + } +} |