script/dom/
abortcontroller.rs1use dom_struct::dom_struct;
6use js::rust::{HandleObject, HandleValue};
7
8use crate::dom::abortsignal::AbortSignal;
9use crate::dom::bindings::codegen::Bindings::AbortControllerBinding::AbortControllerMethods;
10use crate::dom::bindings::reflector::{Reflector, reflect_dom_object_with_proto};
11use crate::dom::bindings::root::{Dom, DomRoot};
12use crate::dom::globalscope::GlobalScope;
13use crate::realms::InRealm;
14use crate::script_runtime::{CanGc, JSContext};
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);
46 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(
56 &self,
57 cx: JSContext,
58 reason: HandleValue,
59 realm: InRealm,
60 can_gc: CanGc,
61 ) {
62 self.signal.signal_abort(cx, reason, realm, can_gc);
64 }
65
66 pub(crate) fn signal(&self) -> DomRoot<AbortSignal> {
68 self.signal.as_rooted()
70 }
71}
72
73impl AbortControllerMethods<crate::DomTypeHolder> for AbortController {
74 fn Constructor(
76 global: &GlobalScope,
77 proto: Option<HandleObject>,
78 can_gc: CanGc,
79 ) -> DomRoot<AbortController> {
80 AbortController::new_with_proto(global, proto, can_gc)
81 }
82
83 fn Abort(&self, cx: JSContext, reason: HandleValue, realm: InRealm, can_gc: CanGc) {
85 self.signal_abort(cx, reason, realm, can_gc);
88 }
89
90 fn Signal(&self) -> DomRoot<AbortSignal> {
92 self.signal.as_rooted()
94 }
95}