| 
									
										
										
										
											2023-03-05 17:29:11 +01:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2023, Kenneth Myhra <kennethmyhra@serenityos.org> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <LibJS/Runtime/Array.h>
 | 
					
						
							| 
									
										
										
										
											2023-07-19 06:54:48 -04:00
										 |  |  | #include <LibJS/Runtime/Iterator.h>
 | 
					
						
							| 
									
										
										
										
											2023-03-05 17:29:11 +01:00
										 |  |  | #include <LibWeb/Bindings/FormDataIteratorPrototype.h>
 | 
					
						
							|  |  |  | #include <LibWeb/Bindings/Intrinsics.h>
 | 
					
						
							| 
									
										
										
										
											2024-09-23 11:13:14 -04:00
										 |  |  | #include <LibWeb/FileAPI/File.h>
 | 
					
						
							| 
									
										
										
										
											2023-03-05 17:29:11 +01:00
										 |  |  | #include <LibWeb/XHR/FormDataIterator.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Web::Bindings { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template<> | 
					
						
							|  |  |  | void Intrinsics::create_web_prototype_and_constructor<FormDataIteratorPrototype>(JS::Realm& realm) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2024-11-14 05:50:17 +13:00
										 |  |  |     auto prototype = realm.create<FormDataIteratorPrototype>(realm); | 
					
						
							| 
									
										
										
										
											2023-11-22 12:55:21 +13:00
										 |  |  |     m_prototypes.set("FormDataIterator"_fly_string, prototype); | 
					
						
							| 
									
										
										
										
											2023-03-05 17:29:11 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Web::XHR { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  | GC_DEFINE_ALLOCATOR(FormDataIterator); | 
					
						
							| 
									
										
										
										
											2023-11-19 19:47:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  | GC::Ref<FormDataIterator> FormDataIterator::create(FormData const& form_data, JS::Object::PropertyKind iterator_kind) | 
					
						
							| 
									
										
										
										
											2023-03-05 17:29:11 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2024-11-14 05:50:17 +13:00
										 |  |  |     return form_data.realm().create<FormDataIterator>(form_data, iterator_kind); | 
					
						
							| 
									
										
										
										
											2023-03-05 17:29:11 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | FormDataIterator::FormDataIterator(Web::XHR::FormData const& form_data, JS::Object::PropertyKind iterator_kind) | 
					
						
							|  |  |  |     : PlatformObject(form_data.realm()) | 
					
						
							|  |  |  |     , m_form_data(form_data) | 
					
						
							|  |  |  |     , m_iterator_kind(iterator_kind) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | FormDataIterator::~FormDataIterator() = default; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-07 08:41:28 +02:00
										 |  |  | void FormDataIterator::initialize(JS::Realm& realm) | 
					
						
							| 
									
										
										
										
											2023-03-05 17:29:11 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2023-08-07 08:41:28 +02:00
										 |  |  |     Base::initialize(realm); | 
					
						
							| 
									
										
										
										
											2024-03-16 13:13:08 +01:00
										 |  |  |     WEB_SET_PROTOTYPE_FOR_INTERFACE(FormDataIterator); | 
					
						
							| 
									
										
										
										
											2023-03-05 17:29:11 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void FormDataIterator::visit_edges(Cell::Visitor& visitor) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Base::visit_edges(visitor); | 
					
						
							| 
									
										
										
										
											2023-02-26 16:09:02 -07:00
										 |  |  |     visitor.visit(m_form_data); | 
					
						
							| 
									
										
										
										
											2023-03-05 17:29:11 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | JS::Object* FormDataIterator::next() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     auto& vm = this->vm(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-26 16:09:02 -07:00
										 |  |  |     if (m_index >= m_form_data->m_entry_list.size()) | 
					
						
							| 
									
										
										
										
											2023-03-05 17:29:11 +01:00
										 |  |  |         return create_iterator_result_object(vm, JS::js_undefined(), true); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-26 16:09:02 -07:00
										 |  |  |     auto entry = m_form_data->m_entry_list[m_index++]; | 
					
						
							| 
									
										
										
										
											2023-03-05 17:29:11 +01:00
										 |  |  |     if (m_iterator_kind == JS::Object::PropertyKind::Key) | 
					
						
							|  |  |  |         return create_iterator_result_object(vm, JS::PrimitiveString::create(vm, entry.name), false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto entry_value = entry.value.visit( | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  |         [&](GC::Root<FileAPI::File> const& file) -> JS::Value { | 
					
						
							| 
									
										
										
										
											2023-03-05 17:29:11 +01:00
										 |  |  |             return file.cell(); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         [&](String const& string) -> JS::Value { | 
					
						
							|  |  |  |             return JS::PrimitiveString::create(vm, string); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (m_iterator_kind == JS::Object::PropertyKind::Value) | 
					
						
							|  |  |  |         return create_iterator_result_object(vm, entry_value, false); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-15 16:26:42 +02:00
										 |  |  |     return create_iterator_result_object(vm, JS::Array::create_from(realm(), { JS::PrimitiveString::create(vm, entry.name), entry_value }), false).ptr(); | 
					
						
							| 
									
										
										
										
											2023-03-05 17:29:11 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |