use dom_struct::dom_struct;
use js::context::JSContext;
use js::realm::CurrentRealm;
use js::rust::{HandleObject, HandleValue};
use script_bindings::reflector::{Reflector, reflect_dom_object_with_proto_and_cx};
use crate::dom::abortsignal::AbortSignal;
use crate::dom::bindings::codegen::Bindings::AbortControllerBinding::AbortControllerMethods;
use crate::dom::bindings::root::{Dom, DomRoot};
use crate::dom::globalscope::GlobalScope;
#[dom_struct]
pub(crate) struct AbortController {
reflector_: Reflector,
signal: Dom<AbortSignal>,
}
impl AbortController {
fn new_inherited(signal: &AbortSignal) -> AbortController {
AbortController {
reflector_: Reflector::new(),
signal: Dom::from_ref(signal),
}
}
pub(crate) fn new_with_proto(
cx: &mut JSContext,
global: &GlobalScope,
proto: Option<HandleObject>,
) -> DomRoot<AbortController> {
let signal = AbortSignal::new_with_proto(cx, global, None);
reflect_dom_object_with_proto_and_cx(
Box::new(AbortController::new_inherited(&signal)),
global,
proto,
cx,
)
}
pub(crate) fn signal_abort(&self, cx: &mut CurrentRealm, reason: HandleValue) {
self.signal.signal_abort(cx, reason);
}
pub(crate) fn signal(&self) -> DomRoot<AbortSignal> {
self.signal.as_rooted()
}
}
impl AbortControllerMethods<crate::DomTypeHolder> for AbortController {
fn Constructor(
cx: &mut JSContext,
global: &GlobalScope,
proto: Option<HandleObject>,
) -> DomRoot<AbortController> {
AbortController::new_with_proto(cx, global, proto)
}
fn Abort(&self, cx: &mut CurrentRealm, reason: HandleValue) {
self.signal_abort(cx, reason);
}
fn Signal(&self) -> DomRoot<AbortSignal> {
self.signal.as_rooted()
}
}