aboutsummaryrefslogtreecommitdiffstats
path: root/components/script_bindings/like.rs
diff options
context:
space:
mode:
authorJosh Matthews <josh@joshmatthews.net>2025-02-23 09:25:46 -0500
committerGitHub <noreply@github.com>2025-02-23 14:25:46 +0000
commit381e168877d1ddba81a73493ca8e2814ae9b07c3 (patch)
treed2fc48902138717013a6f8c11d6eb4bf381355b7 /components/script_bindings/like.rs
parent0383ba9a5b940de76823462ebc1b95298ea50903 (diff)
downloadservo-381e168877d1ddba81a73493ca8e2814ae9b07c3.tar.gz
servo-381e168877d1ddba81a73493ca8e2814ae9b07c3.zip
Move more bindings types to script_bindings (#35620)
* Move weak references implementation to script_bindings. Signed-off-by: Josh Matthews <josh@joshmatthews.net> * Move maplike/setlike definitions to script_bindings. Signed-off-by: Josh Matthews <josh@joshmatthews.net> * Move base error types to script_bindings. Signed-off-by: Josh Matthews <josh@joshmatthews.net> * Formatting. Signed-off-by: Josh Matthews <josh@joshmatthews.net> --------- Signed-off-by: Josh Matthews <josh@joshmatthews.net>
Diffstat (limited to 'components/script_bindings/like.rs')
-rw-r--r--components/script_bindings/like.rs111
1 files changed, 111 insertions, 0 deletions
diff --git a/components/script_bindings/like.rs b/components/script_bindings/like.rs
new file mode 100644
index 00000000000..c2b14fb39fb
--- /dev/null
+++ b/components/script_bindings/like.rs
@@ -0,0 +1,111 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+//! Implementation of `setlike<...>` and `maplike<..., ...>` WebIDL declarations.
+
+use js::conversions::ToJSValConvertible;
+
+use crate::iterable::Iterable;
+
+/// Every Setlike dom_struct must implement this to provide access to underlying storage
+/// so codegen can automatically generate all setlike methods
+///
+/// In case you use a type that implements Setlike as underlying storage it's recommended to use `setlike` macro.
+// In webidl: `setlike<Key>`
+pub trait Setlike {
+ /// The type of the key of the set.
+ type Key: ToJSValConvertible + Clone; // clone is for impl<T: Setlike> Maplike for T
+
+ fn get_index(&self, index: u32) -> Option<Self::Key>;
+
+ fn size(&self) -> u32;
+ fn add(&self, key: Self::Key);
+ fn has(&self, key: Self::Key) -> bool;
+ fn clear(&self);
+ fn delete(&self, key: Self::Key) -> bool;
+}
+
+// we can only have one iterable for T
+// so we have impl<T: Maplike> Iterable for T
+// and minimal:
+impl<T: Setlike> Maplike for T {
+ type Key = <T as Setlike>::Key;
+
+ type Value = <T as Setlike>::Key;
+
+ #[inline]
+ fn get_index(&self, index: u32) -> Option<(Self::Key, Self::Value)> {
+ self.get_index(index).map(|k| (k.clone(), k))
+ }
+
+ fn get(&self, _key: Self::Key) -> Option<Self::Value> {
+ unimplemented!()
+ }
+
+ #[inline]
+ fn size(&self) -> u32 {
+ self.size()
+ }
+
+ fn set(&self, _key: Self::Key, _value: Self::Value) {
+ unimplemented!()
+ }
+
+ fn has(&self, _key: Self::Key) -> bool {
+ unimplemented!()
+ }
+
+ fn clear(&self) {
+ unimplemented!()
+ }
+
+ fn delete(&self, _key: Self::Key) -> bool {
+ unimplemented!()
+ }
+}
+
+/// Every Maplike dom_struct must implement this
+/// to provide access to underlying storage
+/// so codegen can automatically generate all maplike methods
+///
+/// In case you use a type that implements Maplike as underlying storage it's recommended to use `maplike` macro.
+// In webidl: `maplike<Key, Value>`
+pub trait Maplike {
+ /// The type of the key of the map.
+ type Key: ToJSValConvertible;
+ /// The type of the value of the map.
+ type Value: ToJSValConvertible;
+
+ fn get_index(&self, index: u32) -> Option<(Self::Key, Self::Value)>;
+
+ fn get(&self, key: Self::Key) -> Option<Self::Value>;
+ fn size(&self) -> u32;
+ fn set(&self, key: Self::Key, value: Self::Value);
+ fn has(&self, key: Self::Key) -> bool;
+ fn clear(&self);
+ fn delete(&self, key: Self::Key) -> bool;
+}
+
+impl<T: Maplike> Iterable for T {
+ type Key = T::Key;
+
+ type Value = T::Value;
+
+ #[inline]
+ fn get_iterable_length(&self) -> u32 {
+ self.size()
+ }
+
+ #[inline]
+ fn get_value_at_index(&self, index: u32) -> <T as Maplike>::Value {
+ // SAFETY: we are checking bounds manually
+ self.get_index(index).unwrap().1
+ }
+
+ #[inline]
+ fn get_key_at_index(&self, index: u32) -> <T as Maplike>::Key {
+ // SAFETY: we are checking bounds manually
+ self.get_index(index).unwrap().0
+ }
+}