ladybird/Userland/Libraries/LibWeb/FileAPI/FileReader.h
Andreas Kling bfd354492e LibWeb: Put most LibWeb GC objects in type-specific heap blocks
With this change, we now have ~1200 CellAllocators across both LibJS and
LibWeb in a normal WebContent instance.

This gives us a minimum heap size of 4.7 MiB in the scenario where we
only have one cell allocated per type. Of course, in practice there will
be many more of each type, so the effective overhead is quite a bit
smaller than that in practice.

I left a few types unconverted to this mechanism because I got tired of
doing this. :^)
2023-11-19 22:00:48 +01:00

117 lines
3.9 KiB
C++

/*
* Copyright (c) 2023, Shannon Booth <shannon@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/NonnullRefPtr.h>
#include <LibWeb/Bindings/PlatformObject.h>
#include <LibWeb/DOM/EventTarget.h>
#include <LibWeb/Forward.h>
#include <LibWeb/WebIDL/ExceptionOr.h>
namespace Web::FileAPI {
// https://w3c.github.io/FileAPI/#dfn-filereader
class FileReader : public DOM::EventTarget {
WEB_PLATFORM_OBJECT(FileReader, EventTarget);
JS_DECLARE_ALLOCATOR(FileReader);
public:
using Result = Variant<Empty, String, JS::Handle<JS::ArrayBuffer>>;
virtual ~FileReader() override;
[[nodiscard]] static JS::NonnullGCPtr<FileReader> create(JS::Realm&);
static JS::NonnullGCPtr<FileReader> construct_impl(JS::Realm&);
// async read methods
WebIDL::ExceptionOr<void> read_as_array_buffer(Blob&);
WebIDL::ExceptionOr<void> read_as_binary_string(Blob&);
WebIDL::ExceptionOr<void> read_as_text(Blob&, Optional<String> const& encoding = {});
WebIDL::ExceptionOr<void> read_as_data_url(Blob&);
void abort();
// states
enum class State : u16 {
// The FileReader object has been constructed, and there are no pending reads. None of the read methods have been called.
// This is the default state of a newly minted FileReader object, until one of the read methods have been called on it.
Empty = 0,
// A File or Blob is being read. One of the read methods is being processed, and no error has occurred during the read.
Loading = 1,
// The entire File or Blob has been read into memory, OR a file read error occurred, OR the read was aborted using abort().
// The FileReader is no longer reading a File or Blob.
// If readyState is set to DONE it means at least one of the read methods have been called on this FileReader.
Done = 2,
};
// https://w3c.github.io/FileAPI/#dom-filereader-readystate
State ready_state() const { return m_state; }
// File or Blob data
// https://w3c.github.io/FileAPI/#dom-filereader-result
Result result() const { return m_result; }
// https://w3c.github.io/FileAPI/#dom-filereader-error
JS::GCPtr<WebIDL::DOMException> error() const { return m_error; }
// event handler attributes
void set_onloadstart(WebIDL::CallbackType*);
WebIDL::CallbackType* onloadstart();
void set_onprogress(WebIDL::CallbackType*);
WebIDL::CallbackType* onprogress();
void set_onload(WebIDL::CallbackType*);
WebIDL::CallbackType* onload();
void set_onabort(WebIDL::CallbackType*);
WebIDL::CallbackType* onabort();
void set_onerror(WebIDL::CallbackType*);
WebIDL::CallbackType* onerror();
void set_onloadend(WebIDL::CallbackType*);
WebIDL::CallbackType* onloadend();
protected:
FileReader(JS::Realm&, ByteBuffer);
virtual void initialize(JS::Realm&) override;
virtual void visit_edges(JS::Cell::Visitor&) override;
private:
explicit FileReader(JS::Realm&);
enum class Type {
ArrayBuffer,
BinaryString,
Text,
DataURL,
};
WebIDL::ExceptionOr<void> read_operation(Blob&, Type, Optional<String> const& encoding_name = {});
static WebIDL::ExceptionOr<Result> blob_package_data(JS::Realm& realm, ByteBuffer, FileReader::Type type, Optional<String> const&, Optional<String> const& encoding_name);
// A FileReader has an associated state, that is "empty", "loading", or "done". It is initially "empty".
// https://w3c.github.io/FileAPI/#filereader-state
State m_state { State::Empty };
// A FileReader has an associated result (null, a DOMString or an ArrayBuffer). It is initially null.
// https://w3c.github.io/FileAPI/#filereader-result
Result m_result;
// A FileReader has an associated error (null or a DOMException). It is initially null.
// https://w3c.github.io/FileAPI/#filereader-error
JS::GCPtr<WebIDL::DOMException> m_error;
};
}