aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/bindings/iterable.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/bindings/iterable.rs')
-rw-r--r--components/script/dom/bindings/iterable.rs180
1 files changed, 0 insertions, 180 deletions
diff --git a/components/script/dom/bindings/iterable.rs b/components/script/dom/bindings/iterable.rs
deleted file mode 100644
index c81551f7960..00000000000
--- a/components/script/dom/bindings/iterable.rs
+++ /dev/null
@@ -1,180 +0,0 @@
-/* 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/. */
-
-#![allow(unsafe_code)]
-
-//! Implementation of `iterable<...>` and `iterable<..., ...>` WebIDL declarations.
-
-use std::cell::Cell;
-use std::marker::PhantomData;
-use std::ptr;
-use std::ptr::NonNull;
-
-use dom_struct::dom_struct;
-use js::conversions::ToJSValConvertible;
-use js::jsapi::{Heap, JSObject};
-use js::jsval::UndefinedValue;
-use js::rust::{HandleObject, HandleValue, MutableHandleObject};
-use script_bindings::conversions::IDLInterface;
-pub(crate) use script_bindings::iterable::*;
-use script_bindings::utils::DOMClass;
-
-use crate::DomTypes;
-use crate::dom::bindings::codegen::Bindings::IterableIteratorBinding::{
- IterableKeyAndValueResult, IterableKeyOrValueResult,
-};
-use crate::dom::bindings::error::Fallible;
-use crate::dom::bindings::reflector::{
- DomGlobalGeneric, DomObjectIteratorWrap, DomObjectWrap, Reflector,
-};
-use crate::dom::bindings::root::{Dom, DomRoot, Root};
-use crate::dom::bindings::trace::{JSTraceable, NoTrace, RootedTraceableBox};
-use crate::dom::bindings::utils::DomHelpers;
-use crate::realms::InRealm;
-use crate::script_runtime::{CanGc, JSContext};
-
-/// An iterator over the iterable entries of a given DOM interface.
-#[dom_struct]
-pub(crate) struct IterableIterator<
- D: DomTypes,
- T: DomObjectIteratorWrap<D> + JSTraceable + Iterable + DomGlobalGeneric<D>,
-> {
- reflector: Reflector,
- iterable: Dom<T>,
- type_: IteratorType,
- index: Cell<u32>,
- _marker: NoTrace<PhantomData<D>>,
-}
-
-impl<D: DomTypes, T: DomObjectIteratorWrap<D> + JSTraceable + Iterable> IterableIterator<D, T> {
- pub fn global_(&self, realm: InRealm) -> DomRoot<D::GlobalScope> {
- <Self as DomGlobalGeneric<D>>::global_(self, realm)
- }
-}
-
-impl<
- D: DomTypes,
- T: DomObjectIteratorWrap<D>
- + JSTraceable
- + Iterable
- + DomGlobalGeneric<D>
- + IDLInterface
- + IteratorDerives,
-> IDLInterface for IterableIterator<D, T>
-{
- fn derives(class: &'static DOMClass) -> bool {
- <T as IteratorDerives>::derives(class)
- }
-}
-
-impl<D: DomTypes, T: DomObjectIteratorWrap<D> + JSTraceable + Iterable + DomGlobalGeneric<D>>
- IterableIterator<D, T>
-{
- /// Create a new iterator instance for the provided iterable DOM interface.
- pub(crate) fn new(iterable: &T, type_: IteratorType, realm: InRealm) -> DomRoot<Self> {
- let iterator = Box::new(IterableIterator {
- reflector: Reflector::new(),
- type_,
- iterable: Dom::from_ref(iterable),
- index: Cell::new(0),
- _marker: NoTrace(PhantomData),
- });
- <D as DomHelpers<D>>::reflect_dom_object(iterator, &*iterable.global_(realm), CanGc::note())
- }
-
- /// Return the next value from the iterable object.
- #[allow(non_snake_case)]
- pub(crate) fn Next(&self, cx: JSContext) -> Fallible<NonNull<JSObject>> {
- let index = self.index.get();
- rooted!(in(*cx) let mut value = UndefinedValue());
- rooted!(in(*cx) let mut rval = ptr::null_mut::<JSObject>());
- let result = if index >= self.iterable.get_iterable_length() {
- dict_return(cx, rval.handle_mut(), true, value.handle())
- } else {
- match self.type_ {
- IteratorType::Keys => {
- unsafe {
- self.iterable
- .get_key_at_index(index)
- .to_jsval(*cx, value.handle_mut());
- }
- dict_return(cx, rval.handle_mut(), false, value.handle())
- },
- IteratorType::Values => {
- unsafe {
- self.iterable
- .get_value_at_index(index)
- .to_jsval(*cx, value.handle_mut());
- }
- dict_return(cx, rval.handle_mut(), false, value.handle())
- },
- IteratorType::Entries => {
- rooted!(in(*cx) let mut key = UndefinedValue());
- unsafe {
- self.iterable
- .get_key_at_index(index)
- .to_jsval(*cx, key.handle_mut());
- self.iterable
- .get_value_at_index(index)
- .to_jsval(*cx, value.handle_mut());
- }
- key_and_value_return(cx, rval.handle_mut(), key.handle(), value.handle())
- },
- }
- };
- self.index.set(index + 1);
- result.map(|_| NonNull::new(rval.get()).expect("got a null pointer"))
- }
-}
-
-impl<D: DomTypes, T: DomObjectIteratorWrap<D> + JSTraceable + Iterable + DomGlobalGeneric<D>>
- DomObjectWrap<D> for IterableIterator<D, T>
-{
- const WRAP: unsafe fn(
- JSContext,
- &D::GlobalScope,
- Option<HandleObject>,
- Box<Self>,
- CanGc,
- ) -> Root<Dom<Self>> = T::ITER_WRAP;
-}
-
-fn dict_return(
- cx: JSContext,
- mut result: MutableHandleObject,
- done: bool,
- value: HandleValue,
-) -> Fallible<()> {
- let mut dict = IterableKeyOrValueResult::empty();
- dict.done = done;
- dict.value.set(value.get());
- rooted!(in(*cx) let mut dict_value = UndefinedValue());
- unsafe {
- dict.to_jsval(*cx, dict_value.handle_mut());
- }
- result.set(dict_value.to_object());
- Ok(())
-}
-
-fn key_and_value_return(
- cx: JSContext,
- mut result: MutableHandleObject,
- key: HandleValue,
- value: HandleValue,
-) -> Fallible<()> {
- let mut dict = IterableKeyAndValueResult::empty();
- dict.done = false;
- dict.value = Some(
- vec![key, value]
- .into_iter()
- .map(|handle| RootedTraceableBox::from_box(Heap::boxed(handle.get())))
- .collect(),
- );
- rooted!(in(*cx) let mut dict_value = UndefinedValue());
- unsafe {
- dict.to_jsval(*cx, dict_value.handle_mut());
- }
- result.set(dict_value.to_object());
- Ok(())
-}