mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2026-06-28 04:00:33 +00:00
Represent BufferSource and ArrayBufferView as ordinary IDL typedefs over their underlying union types, instead of special casing in the IDL generator. This allows the union conversion/return machinery handle these types consistently with other typedefs, which removes buffer specific paths from the IDL generator. This necessitates changing the WebIDL::BufferSource and WebIDL::ArrayBufferView classes as views over these variants. This replaces the old GC backed BufferableObject wrapper structure and provide convenience helpers to determine things such as the byte length, byte offset, backing buffer, and typed-array APIs.
76 lines
2.9 KiB
C++
76 lines
2.9 KiB
C++
/*
|
|
* Copyright (c) 2022-2024, Kenneth Myhra <kennethmyhra@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/NonnullRefPtr.h>
|
|
#include <AK/Vector.h>
|
|
#include <LibWeb/Bindings/Blob.h>
|
|
#include <LibWeb/Bindings/PlatformObject.h>
|
|
#include <LibWeb/Bindings/Serializable.h>
|
|
#include <LibWeb/Export.h>
|
|
#include <LibWeb/Forward.h>
|
|
#include <LibWeb/WebIDL/Buffers.h>
|
|
#include <LibWeb/WebIDL/ExceptionOr.h>
|
|
|
|
namespace Web::FileAPI {
|
|
|
|
using BlobPart = FlattenVariant<WebIDL::BufferSourceVariant, Variant<GC::Ref<Blob>, String>>;
|
|
using BlobParts = GC::ConservativeVector<BlobPart>;
|
|
using BlobPartsOrByteBuffer = Variant<BlobParts, ByteBuffer>;
|
|
|
|
[[nodiscard]] ErrorOr<String> convert_line_endings_to_native(StringView string);
|
|
[[nodiscard]] ErrorOr<ByteBuffer> process_blob_parts(BlobParts const& blob_parts, Optional<Bindings::BlobPropertyBag> const& options = {});
|
|
[[nodiscard]] bool is_basic_latin(StringView view);
|
|
|
|
class WEB_API Blob
|
|
: public Bindings::PlatformObject
|
|
, public Bindings::Serializable {
|
|
WEB_PLATFORM_OBJECT(Blob, Bindings::PlatformObject);
|
|
GC_DECLARE_ALLOCATOR(Blob);
|
|
|
|
public:
|
|
virtual ~Blob() override;
|
|
|
|
[[nodiscard]] static GC::Ref<Blob> create(JS::Realm&, ByteBuffer, String type);
|
|
[[nodiscard]] static GC::Ref<Blob> create(JS::Realm&, Optional<BlobPartsOrByteBuffer> const& blob_parts_or_byte_buffer = {}, Optional<Bindings::BlobPropertyBag> const& options = {});
|
|
static WebIDL::ExceptionOr<GC::Ref<Blob>> construct_impl(JS::Realm&, Optional<BlobParts> const& blob_parts = {}, Optional<Bindings::BlobPropertyBag> const& options = {});
|
|
|
|
// https://w3c.github.io/FileAPI/#dfn-size
|
|
u64 size() const { return m_byte_buffer.size(); }
|
|
// https://w3c.github.io/FileAPI/#dfn-type
|
|
String const& type() const { return m_type; }
|
|
|
|
WebIDL::ExceptionOr<GC::Ref<Blob>> slice(Optional<i64> start = {}, Optional<i64> end = {}, Optional<String> const& content_type = {});
|
|
|
|
GC::Ref<Streams::ReadableStream> stream();
|
|
GC::Ref<WebIDL::Promise> text();
|
|
GC::Ref<WebIDL::Promise> array_buffer();
|
|
GC::Ref<WebIDL::Promise> bytes();
|
|
|
|
ReadonlyBytes raw_bytes() const LIFETIME_BOUND { return m_byte_buffer.bytes(); }
|
|
|
|
GC::Ref<Streams::ReadableStream> get_stream();
|
|
|
|
virtual WebIDL::ExceptionOr<void> serialization_steps(HTML::TransferDataEncoder&, bool for_storage, HTML::SerializationMemory&) override;
|
|
virtual WebIDL::ExceptionOr<void> deserialization_steps(HTML::TransferDataDecoder&, HTML::DeserializationMemory&) override;
|
|
|
|
protected:
|
|
Blob(JS::Realm&, ByteBuffer, String type);
|
|
Blob(JS::Realm&, ByteBuffer);
|
|
|
|
virtual void initialize(JS::Realm&) override;
|
|
|
|
WebIDL::ExceptionOr<GC::Ref<Blob>> slice_blob(Optional<i64> start = {}, Optional<i64> end = {}, Optional<String> const& content_type = {});
|
|
|
|
ByteBuffer m_byte_buffer {};
|
|
String m_type {};
|
|
|
|
private:
|
|
explicit Blob(JS::Realm&);
|
|
};
|
|
|
|
}
|