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::like::Setlike;
21use script_bindings::reflector::{Reflector, reflect_dom_object_with_proto_and_wrap};
22use wgpu_core::naga::front::wgsl::ImplementedLanguageExtension;
23
24use crate::dom::bindings::root::DomRoot;
25use crate::dom::bindings::str::DOMString;
26
27#[dom_struct]
28pub struct WGSLLanguageFeatures<D: DomTypes> {
29 reflector: Reflector,
30 #[custom_trace]
32 internal: DomRefCell<IndexSet<DOMString>>,
33 #[no_trace = "PhantomData does not exist"]
34 phantom: PhantomData<D>,
35}
36
37impl<D> WGSLLanguageFeatures<D>
38where
39 D: DomTypes<WGSLLanguageFeatures = WGSLLanguageFeatures<D>>,
40{
41 pub fn new(
42 cx: &mut JSContext,
43 global: &D::GlobalScope,
44 proto: Option<HandleObject>,
45 ) -> DomRoot<Self> {
46 let set = ImplementedLanguageExtension::all()
47 .iter()
48 .map(|le| le.to_ident().into())
49 .collect();
50 reflect_dom_object_with_proto_and_wrap::<D, _, _>(
51 Box::new(Self {
52 reflector: Reflector::new(),
53 internal: DomRefCell::new(set),
54 phantom: PhantomData,
55 }),
56 global,
57 proto,
58 cx,
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.get_index(cx, index)
76 }
77 #[inline(always)]
78 fn size(&self, cx: &mut JSContext) -> u32 {
79 self.internal.size(cx)
80 }
81 #[inline(always)]
82 fn add(&self, _cx: &mut JSContext, _key: Self::Key) {
83 unreachable!("readonly");
84 }
85 #[inline(always)]
86 fn has(&self, cx: &mut JSContext, key: Self::Key) -> bool {
87 self.internal.has(cx, key)
88 }
89 #[inline(always)]
90 fn clear(&self, _cx: &mut JSContext) {
91 unreachable!("readonly");
92 }
93 #[inline(always)]
94 fn delete(&self, _cx: &mut JSContext, _key: Self::Key) -> bool {
95 unreachable!("readonly");
96 }
97}