Buffers.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /*
  2. * Copyright (c) 2023, Shannon Booth <shannon@serenityos.org>
  3. * Copyright (c) 2023, Matthew Olsson <mattco@serenityos.org>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #pragma once
  8. #include <AK/Variant.h>
  9. #include <LibGC/CellAllocator.h>
  10. #include <LibJS/Forward.h>
  11. #include <LibJS/Heap/Cell.h>
  12. namespace Web::WebIDL {
  13. using BufferableObject = Variant<
  14. GC::Ref<JS::TypedArrayBase>,
  15. GC::Ref<JS::DataView>,
  16. GC::Ref<JS::ArrayBuffer>>;
  17. class BufferableObjectBase : public JS::Cell {
  18. GC_CELL(BufferableObjectBase, JS::Cell);
  19. GC_DECLARE_ALLOCATOR(BufferableObjectBase);
  20. public:
  21. virtual ~BufferableObjectBase() override = default;
  22. u32 byte_length() const;
  23. u32 element_size() const;
  24. GC::Ref<JS::Object> raw_object();
  25. GC::Ref<JS::Object const> raw_object() const { return const_cast<BufferableObjectBase&>(*this).raw_object(); }
  26. GC::Ptr<JS::ArrayBuffer> viewed_array_buffer();
  27. BufferableObject const& bufferable_object() const { return m_bufferable_object; }
  28. BufferableObject& bufferable_object() { return m_bufferable_object; }
  29. protected:
  30. BufferableObjectBase(GC::Ref<JS::Object>);
  31. virtual void visit_edges(Visitor&) override;
  32. bool is_data_view() const;
  33. bool is_typed_array_base() const;
  34. bool is_array_buffer() const;
  35. static BufferableObject bufferable_object_from_raw_object(GC::Ref<JS::Object>);
  36. BufferableObject m_bufferable_object;
  37. };
  38. // https://webidl.spec.whatwg.org/#ArrayBufferView
  39. //
  40. // typedef (Int8Array or Int16Array or Int32Array or
  41. // Uint8Array or Uint16Array or Uint32Array or Uint8ClampedArray or
  42. // BigInt64Array or BigUint64Array or
  43. // Float32Array or Float64Array or DataView) ArrayBufferView;
  44. class ArrayBufferView : public BufferableObjectBase {
  45. GC_CELL(ArrayBufferView, BufferableObjectBase);
  46. GC_DECLARE_ALLOCATOR(ArrayBufferView);
  47. public:
  48. using BufferableObjectBase::BufferableObjectBase;
  49. virtual ~ArrayBufferView() override;
  50. using BufferableObjectBase::is_data_view;
  51. using BufferableObjectBase::is_typed_array_base;
  52. u32 byte_offset() const;
  53. void write(ReadonlyBytes, u32 starting_offset = 0);
  54. };
  55. // https://webidl.spec.whatwg.org/#BufferSource
  56. //
  57. // typedef (ArrayBufferView or ArrayBuffer) BufferSource;
  58. class BufferSource : public BufferableObjectBase {
  59. GC_CELL(BufferSource, BufferableObjectBase);
  60. GC_DECLARE_ALLOCATOR(BufferSource);
  61. public:
  62. using BufferableObjectBase::BufferableObjectBase;
  63. virtual ~BufferSource() override;
  64. using BufferableObjectBase::is_array_buffer;
  65. using BufferableObjectBase::is_data_view;
  66. using BufferableObjectBase::is_typed_array_base;
  67. };
  68. }