| 
									
										
										
										
											2023-11-23 20:07:25 +13:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2023, Shannon Booth <shannon@serenityos.org> | 
					
						
							|  |  |  |  * Copyright (c) 2023, Matthew Olsson <mattco@serenityos.org> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <AK/Variant.h>
 | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  | #include <LibGC/CellAllocator.h>
 | 
					
						
							| 
									
										
										
										
											2023-11-23 20:07:25 +13:00
										 |  |  | #include <LibJS/Forward.h>
 | 
					
						
							|  |  |  | #include <LibJS/Heap/Cell.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Web::WebIDL { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | using BufferableObject = Variant< | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  |     GC::Ref<JS::TypedArrayBase>, | 
					
						
							|  |  |  |     GC::Ref<JS::DataView>, | 
					
						
							|  |  |  |     GC::Ref<JS::ArrayBuffer>>; | 
					
						
							| 
									
										
										
										
											2023-11-23 20:07:25 +13:00
										 |  |  | 
 | 
					
						
							|  |  |  | class BufferableObjectBase : public JS::Cell { | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  |     GC_CELL(BufferableObjectBase, JS::Cell); | 
					
						
							|  |  |  |     GC_DECLARE_ALLOCATOR(BufferableObjectBase); | 
					
						
							| 
									
										
										
										
											2023-11-23 20:07:25 +13:00
										 |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     virtual ~BufferableObjectBase() override = default; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     u32 byte_length() const; | 
					
						
							| 
									
										
										
										
											2024-12-16 19:22:41 +00:00
										 |  |  |     u32 element_size() const; | 
					
						
							| 
									
										
										
										
											2023-11-23 20:07:25 +13:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  |     GC::Ref<JS::Object> raw_object(); | 
					
						
							|  |  |  |     GC::Ref<JS::Object const> raw_object() const { return const_cast<BufferableObjectBase&>(*this).raw_object(); } | 
					
						
							| 
									
										
										
										
											2024-05-26 16:21:37 +12:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  |     GC::Ptr<JS::ArrayBuffer> viewed_array_buffer(); | 
					
						
							| 
									
										
										
										
											2023-11-23 20:07:25 +13:00
										 |  |  | 
 | 
					
						
							|  |  |  |     BufferableObject const& bufferable_object() const { return m_bufferable_object; } | 
					
						
							|  |  |  |     BufferableObject& bufferable_object() { return m_bufferable_object; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | protected: | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  |     BufferableObjectBase(GC::Ref<JS::Object>); | 
					
						
							| 
									
										
										
										
											2023-11-23 20:07:25 +13:00
										 |  |  | 
 | 
					
						
							|  |  |  |     virtual void visit_edges(Visitor&) override; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bool is_data_view() const; | 
					
						
							|  |  |  |     bool is_typed_array_base() const; | 
					
						
							|  |  |  |     bool is_array_buffer() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  |     static BufferableObject bufferable_object_from_raw_object(GC::Ref<JS::Object>); | 
					
						
							| 
									
										
										
										
											2023-11-23 20:07:25 +13:00
										 |  |  | 
 | 
					
						
							|  |  |  |     BufferableObject m_bufferable_object; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // https://webidl.spec.whatwg.org/#ArrayBufferView
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // typedef (Int8Array or Int16Array or Int32Array or
 | 
					
						
							|  |  |  | //          Uint8Array or Uint16Array or Uint32Array or Uint8ClampedArray or
 | 
					
						
							|  |  |  | //          BigInt64Array or BigUint64Array or
 | 
					
						
							|  |  |  | //          Float32Array or Float64Array or DataView) ArrayBufferView;
 | 
					
						
							|  |  |  | class ArrayBufferView : public BufferableObjectBase { | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  |     GC_CELL(ArrayBufferView, BufferableObjectBase); | 
					
						
							|  |  |  |     GC_DECLARE_ALLOCATOR(ArrayBufferView); | 
					
						
							| 
									
										
										
										
											2023-11-23 20:07:25 +13:00
										 |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     using BufferableObjectBase::BufferableObjectBase; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtual ~ArrayBufferView() override; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     using BufferableObjectBase::is_data_view; | 
					
						
							|  |  |  |     using BufferableObjectBase::is_typed_array_base; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     u32 byte_offset() const; | 
					
						
							| 
									
										
										
										
											2024-12-23 16:19:17 +13:00
										 |  |  |     void write(ReadonlyBytes, u32 starting_offset = 0); | 
					
						
							| 
									
										
										
										
											2023-11-23 20:07:25 +13:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // https://webidl.spec.whatwg.org/#BufferSource
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // typedef (ArrayBufferView or ArrayBuffer) BufferSource;
 | 
					
						
							|  |  |  | class BufferSource : public BufferableObjectBase { | 
					
						
							| 
									
										
										
										
											2024-11-15 04:01:23 +13:00
										 |  |  |     GC_CELL(BufferSource, BufferableObjectBase); | 
					
						
							|  |  |  |     GC_DECLARE_ALLOCATOR(BufferSource); | 
					
						
							| 
									
										
										
										
											2023-11-23 20:07:25 +13:00
										 |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     using BufferableObjectBase::BufferableObjectBase; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtual ~BufferSource() override; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     using BufferableObjectBase::is_array_buffer; | 
					
						
							|  |  |  |     using BufferableObjectBase::is_data_view; | 
					
						
							|  |  |  |     using BufferableObjectBase::is_typed_array_base; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |