script_webgpu/
wgsllanguagefeatures.rs1use std::marker::PhantomData;
8
9use dom_struct::dom_struct;
10use indexmap::IndexSet;
11use js::context::JSContext;
12use js::gc::HandleObject;
13use jstraceable_derive::JSTraceable;
14use malloc_size_of_derive::MallocSizeOf;
15use script_bindings::DomTypes;
16use script_bindings::cell::DomRefCell;
17use script_bindings::codegen::GenericBindings::WebGPUBinding::{
18 WGSLLanguageFeaturesMethods, WGSLLanguageFeaturesWrap,
19};
20use script_bindings::domstring::TracedDOMString;
21use script_bindings::like::Setlike;
22use script_bindings::reflector::{Reflector, reflect_dom_object_with_proto_and_wrap};
23use webgpu_traits::ImplementedLanguageExtension;
24
25use crate::dom::bindings::root::DomRoot;
26use crate::dom::bindings::str::DOMString;
27use crate::traits::Equivalence;
28
29#[dom_struct]
30pub struct WGSLLanguageFeatures<D: DomTypes> {
31 reflector: Reflector,
32 #[custom_trace]
34 internal: DomRefCell<IndexSet<TracedDOMString>>,
35 #[no_trace = "PhantomData does not exist"]
36 phantom: PhantomData<D>,
37}
38
39impl<D: Equivalence> WGSLLanguageFeatures<D> {
40 pub fn new(
41 cx: &mut JSContext,
42 global: &D::GlobalScope,
43 proto: Option<HandleObject>,
44 ) -> DomRoot<Self> {
45 reflect_dom_object_with_proto_and_wrap::<D, _, _>(
46 cx,
47 Box::new(Self {
48 reflector: Reflector::new(),
49 internal: DomRefCell::new(
50 ImplementedLanguageExtension::all()
51 .iter()
52 .map(|le| DOMString::from_static(le.to_ident()).traced())
53 .collect(),
54 ),
55 phantom: PhantomData,
56 }),
57 global,
58 proto,
59 WGSLLanguageFeaturesWrap::<D>,
60 )
61 }
62}
63
64impl<D: DomTypes> WGSLLanguageFeaturesMethods<D> for WGSLLanguageFeatures<D> {
65 fn Size(&self) -> u32 {
66 self.internal.borrow().len() as u32
67 }
68}
69
70impl<D: DomTypes> Setlike for WGSLLanguageFeatures<D> {
71 type Key = DOMString;
72
73 #[inline(always)]
74 fn get_index(&self, cx: &mut JSContext, index: u32) -> Option<Self::Key> {
75 self.internal
76 .get_index(cx, index)
77 .map(|domstring| domstring.root())
78 }
79 #[inline(always)]
80 fn size(&self, cx: &mut JSContext) -> u32 {
81 self.internal.size(cx)
82 }
83 #[inline(always)]
84 fn add(&self, _cx: &mut JSContext, _key: Self::Key) {
85 unreachable!("readonly");
86 }
87 #[inline(always)]
88 fn has(&self, cx: &mut JSContext, key: Self::Key) -> bool {
89 self.internal.has(cx, key.traced())
90 }
91 #[inline(always)]
92 fn clear(&self, _cx: &mut JSContext) {
93 unreachable!("readonly");
94 }
95 #[inline(always)]
96 fn delete(&self, _cx: &mut JSContext, _key: Self::Key) -> bool {
97 unreachable!("readonly");
98 }
99}