script/dom/
abortcontroller.rs1use dom_struct::dom_struct;
6use js::realm::CurrentRealm;
7use js::rust::{HandleObject, HandleValue};
8
9use crate::dom::abortsignal::AbortSignal;
10use crate::dom::bindings::codegen::Bindings::AbortControllerBinding::AbortControllerMethods;
11use crate::dom::bindings::reflector::{Reflector, reflect_dom_object_with_proto};
12use crate::dom::bindings::root::{Dom, DomRoot};
13use crate::dom::globalscope::GlobalScope;
14use crate::script_runtime::CanGc;
15
16#[dom_struct]
18pub(crate) struct AbortController {
19 reflector_: Reflector,
20
21 signal: Dom<AbortSignal>,
23}
24
25impl AbortController {
26 fn new_inherited(signal: &AbortSignal) -> AbortController {
28 AbortController {
32 reflector_: Reflector::new(),
33 signal: Dom::from_ref(signal),
34 }
35 }
36
37 pub(crate) fn new_with_proto(
39 global: &GlobalScope,
40 proto: Option<HandleObject>,
41 can_gc: CanGc,
42 ) -> DomRoot<AbortController> {
43 let signal = AbortSignal::new_with_proto(global, None, can_gc);
45 reflect_dom_object_with_proto(
47 Box::new(AbortController::new_inherited(&signal)),
48 global,
49 proto,
50 can_gc,
51 )
52 }
53
54 pub(crate) fn signal_abort(&self, cx: &mut CurrentRealm, reason: HandleValue) {
56 self.signal.signal_abort(cx, reason);
59 }
60
61 pub(crate) fn signal(&self) -> DomRoot<AbortSignal> {
63 self.signal.as_rooted()
65 }
66}
67
68impl AbortControllerMethods<crate::DomTypeHolder> for AbortController {
69 fn Constructor(
71 global: &GlobalScope,
72 proto: Option<HandleObject>,
73 can_gc: CanGc,
74 ) -> DomRoot<AbortController> {
75 AbortController::new_with_proto(global, proto, can_gc)
76 }
77
78 fn Abort(&self, cx: &mut CurrentRealm, reason: HandleValue) {
80 self.signal_abort(cx, reason);
83 }
84
85 fn Signal(&self) -> DomRoot<AbortSignal> {
87 self.signal.as_rooted()
89 }
90}