script/dom/credentialmanagement/
credentialscontainer.rs1use std::rc::Rc;
5
6use dom_struct::dom_struct;
7use js::realm::CurrentRealm;
8use script_bindings::codegen::GenericBindings::CredentialsContainerBinding::{
9 CredentialCreationOptions, CredentialRequestOptions,
10};
11use script_bindings::codegen::GenericBindings::WindowBinding::WindowMethods;
12use script_bindings::error::{Error, Fallible};
13use script_bindings::reflector::{Reflector, reflect_dom_object};
14
15use crate::dom::bindings::codegen::Bindings::CredentialsContainerBinding::CredentialsContainerMethods;
16use crate::dom::bindings::codegen::DomTypeHolder::DomTypeHolder;
17use crate::dom::bindings::root::DomRoot;
18use crate::dom::credentialmanagement::credential::Credential;
19use crate::dom::globalscope::GlobalScope;
20use crate::dom::promise::Promise;
21use crate::script_runtime::CanGc;
22
23#[dom_struct]
24pub(crate) struct CredentialsContainer {
25 reflector_: Reflector,
26}
27
28impl CredentialsContainer {
29 pub(crate) fn new_inherited() -> CredentialsContainer {
30 CredentialsContainer {
31 reflector_: Reflector::new(),
32 }
33 }
34
35 pub(crate) fn new(global: &GlobalScope, can_gc: CanGc) -> DomRoot<CredentialsContainer> {
36 reflect_dom_object(
37 Box::new(CredentialsContainer::new_inherited()),
38 global,
39 can_gc,
40 )
41 }
42
43 fn request_credential(
45 &self,
46 cx: &mut CurrentRealm,
47 options: &CredentialRequestOptions<DomTypeHolder>,
48 ) -> Fallible<Rc<Promise>> {
49 let global = GlobalScope::from_current_realm(cx);
51 assert!(global.is_secure_context());
53 let document = global.as_window().Document();
55 if !document.is_fully_active() {
57 return Err(Error::InvalidState(None));
58 }
59 if options.signal.as_ref().is_some_and(|s| s.aborted()) {
61 return Err(Error::Abort(None));
62 }
63 Err(Error::NotSupported(None))
64 }
65
66 fn store_credential(
68 &self,
69 cx: &mut CurrentRealm,
70 _credential: &Credential,
71 ) -> Fallible<Rc<Promise>> {
72 let global = GlobalScope::from_current_realm(cx);
74 assert!(global.is_secure_context());
76 if !global.as_window().Document().is_fully_active() {
78 return Err(Error::InvalidState(None));
79 }
80 Err(Error::NotSupported(None))
81 }
82
83 fn create_credential(
85 &self,
86 cx: &mut CurrentRealm,
87 _options: &CredentialCreationOptions<DomTypeHolder>,
88 ) -> Fallible<Rc<Promise>> {
89 let global = GlobalScope::from_current_realm(cx);
91 assert!(global.is_secure_context());
93 let document = global.as_window().Document();
96 if !document.is_fully_active() {
98 return Err(Error::InvalidState(None));
99 }
100 Err(Error::NotSupported(None))
101 }
102}
103
104impl CredentialsContainerMethods<DomTypeHolder> for CredentialsContainer {
105 fn Get(
107 &self,
108 cx: &mut CurrentRealm,
109 options: &CredentialRequestOptions<DomTypeHolder>,
110 ) -> Fallible<Rc<Promise>> {
111 self.request_credential(cx, options)
112 }
113
114 fn Store(&self, cx: &mut CurrentRealm, credential: &Credential) -> Fallible<Rc<Promise>> {
116 self.store_credential(cx, credential)
117 }
118
119 fn Create(
121 &self,
122 cx: &mut CurrentRealm,
123 options: &CredentialCreationOptions<DomTypeHolder>,
124 ) -> Fallible<Rc<Promise>> {
125 self.create_credential(cx, options)
126 }
127
128 fn PreventSilentAccess(&self) -> Fallible<Rc<Promise>> {
130 Err(Error::NotSupported(None))
131 }
132}