1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 13:37:44 +00:00

LibJS+Everywhere: Allow Cell::initialize overrides to throw OOM errors

Note that as of this commit, there aren't any such throwers, and the
call site in Heap::allocate will drop exceptions on the floor. This
commit only serves to change the declaration of the overrides, make sure
they return an empty value, and to propagate OOM errors frm their base
initialize invocations.
This commit is contained in:
Timothy Flynn 2023-01-28 12:33:35 -05:00 committed by Linus Groh
parent 1c1b902a6a
commit 2692db8699
694 changed files with 1774 additions and 1065 deletions

View file

@ -25,10 +25,12 @@ AbortController::AbortController(JS::Realm& realm, JS::NonnullGCPtr<AbortSignal>
AbortController::~AbortController() = default;
void AbortController::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> AbortController::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::AbortControllerPrototype>(realm, "AbortController"));
return {};
}
void AbortController::visit_edges(Cell::Visitor& visitor)

View file

@ -28,7 +28,7 @@ public:
private:
AbortController(JS::Realm&, JS::NonnullGCPtr<AbortSignal>);
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
virtual void visit_edges(Cell::Visitor&) override;
// https://dom.spec.whatwg.org/#abortcontroller-signal

View file

@ -22,10 +22,12 @@ AbortSignal::AbortSignal(JS::Realm& realm)
{
}
void AbortSignal::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> AbortSignal::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::AbortSignalPrototype>(realm, "AbortSignal"));
return {};
}
// https://dom.spec.whatwg.org/#abortsignal-add

View file

@ -43,7 +43,7 @@ public:
private:
explicit AbortSignal(JS::Realm&);
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
virtual void visit_edges(JS::Cell::Visitor&) override;
// https://dom.spec.whatwg.org/#abortsignal-abort-reason

View file

@ -21,10 +21,12 @@ AbstractRange::AbstractRange(Node& start_container, u32 start_offset, Node& end_
AbstractRange::~AbstractRange() = default;
void AbstractRange::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> AbstractRange::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::AbstractRangePrototype>(realm, "AbstractRange"));
return {};
}
void AbstractRange::visit_edges(Cell::Visitor& visitor)

View file

@ -36,7 +36,7 @@ public:
protected:
AbstractRange(Node& start_container, u32 start_offset, Node& end_container, u32 end_offset);
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
virtual void visit_edges(Cell::Visitor&) override;
JS::NonnullGCPtr<Node> m_start_container;

View file

@ -31,10 +31,12 @@ Attr::Attr(Document& document, QualifiedName qualified_name, DeprecatedString va
{
}
void Attr::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> Attr::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::AttrPrototype>(realm, "Attr"));
return {};
}
void Attr::visit_edges(Cell::Visitor& visitor)

View file

@ -45,7 +45,7 @@ public:
private:
Attr(Document&, QualifiedName, DeprecatedString value, Element const*);
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
virtual void visit_edges(Cell::Visitor&) override;
QualifiedName m_qualified_name;

View file

@ -16,10 +16,12 @@ CDATASection::CDATASection(Document& document, DeprecatedString const& data)
CDATASection::~CDATASection() = default;
void CDATASection::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> CDATASection::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::CDATASectionPrototype>(realm, "CDATASection"));
return {};
}
}

View file

@ -23,7 +23,7 @@ public:
private:
CDATASection(Document&, DeprecatedString const&);
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
};
template<>

View file

@ -19,10 +19,12 @@ CharacterData::CharacterData(Document& document, NodeType type, DeprecatedString
{
}
void CharacterData::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> CharacterData::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::CharacterDataPrototype>(realm, "CharacterData"));
return {};
}
// https://dom.spec.whatwg.org/#dom-characterdata-data

View file

@ -36,7 +36,7 @@ public:
protected:
CharacterData(Document&, NodeType, DeprecatedString const&);
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
private:
DeprecatedString m_data;

View file

@ -29,10 +29,12 @@ CustomEvent::CustomEvent(JS::Realm& realm, DeprecatedFlyString const& event_name
CustomEvent::~CustomEvent() = default;
void CustomEvent::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> CustomEvent::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::CustomEventPrototype>(realm, "CustomEvent"));
return {};
}
void CustomEvent::visit_edges(JS::Cell::Visitor& visitor)

View file

@ -28,7 +28,7 @@ public:
// https://dom.spec.whatwg.org/#dom-customevent-detail
JS::Value detail() const { return m_detail; }
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
virtual void visit_edges(JS::Cell::Visitor&) override;
void init_custom_event(DeprecatedString const& type, bool bubbles, bool cancelable, JS::Value detail);

View file

@ -31,10 +31,12 @@ DOMImplementation::DOMImplementation(Document& document)
DOMImplementation::~DOMImplementation() = default;
void DOMImplementation::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> DOMImplementation::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::DOMImplementationPrototype>(realm, "DOMImplementation"));
return {};
}
void DOMImplementation::visit_edges(Cell::Visitor& visitor)

View file

@ -30,7 +30,7 @@ public:
private:
explicit DOMImplementation(Document&);
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
virtual void visit_edges(Cell::Visitor&) override;
Document& document() { return m_document; }

View file

@ -68,10 +68,12 @@ DOMTokenList::DOMTokenList(Element const& associated_element, DeprecatedFlyStrin
associated_attribute_changed(value);
}
void DOMTokenList::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> DOMTokenList::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::DOMTokenListPrototype>(realm, "DOMTokenList"));
return {};
}
void DOMTokenList::visit_edges(Cell::Visitor& visitor)

View file

@ -45,7 +45,7 @@ public:
private:
DOMTokenList(Element const& associated_element, DeprecatedFlyString associated_attribute);
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
virtual void visit_edges(Cell::Visitor&) override;
WebIDL::ExceptionOr<void> validate_token(StringView token) const;

View file

@ -314,10 +314,12 @@ Document::~Document()
HTML::main_thread_event_loop().unregister_document({}, *this);
}
void Document::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> Document::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::DocumentPrototype>(realm, "Document"));
return {};
}
void Document::visit_edges(Cell::Visitor& visitor)

View file

@ -450,7 +450,7 @@ public:
DeprecatedString dump_accessibility_tree_as_json();
protected:
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
virtual void visit_edges(Cell::Visitor&) override;
private:

View file

@ -14,10 +14,12 @@ DocumentFragment::DocumentFragment(Document& document)
{
}
void DocumentFragment::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> DocumentFragment::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::DocumentFragmentPrototype>(realm, "DocumentFragment"));
return {};
}
void DocumentFragment::visit_edges(Cell::Visitor& visitor)

View file

@ -33,7 +33,7 @@ public:
protected:
explicit DocumentFragment(Document& document);
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
virtual void visit_edges(Cell::Visitor&) override;
private:

View file

@ -19,10 +19,12 @@ DocumentType::DocumentType(Document& document)
{
}
void DocumentType::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> DocumentType::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::DocumentTypePrototype>(realm, "DocumentType"));
return {};
}
}

View file

@ -36,7 +36,7 @@ public:
private:
explicit DocumentType(Document&);
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
DeprecatedString m_name;
DeprecatedString m_public_id;

View file

@ -61,12 +61,14 @@ Element::Element(Document& document, DOM::QualifiedName qualified_name)
Element::~Element() = default;
void Element::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> Element::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::ElementPrototype>(realm, "Element"));
m_attributes = NamedNodeMap::create(*this);
return {};
}
void Element::visit_edges(Cell::Visitor& visitor)

View file

@ -251,7 +251,7 @@ public:
protected:
Element(Document&, DOM::QualifiedName);
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
virtual void children_changed() override;
virtual i32 default_tab_index_value() const;

View file

@ -41,10 +41,12 @@ Event::Event(JS::Realm& realm, DeprecatedFlyString const& type, EventInit const&
{
}
void Event::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> Event::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::EventPrototype>(realm, "Event"));
return {};
}
void Event::visit_edges(Visitor& visitor)

View file

@ -146,7 +146,7 @@ public:
protected:
void initialize_event(DeprecatedString const&, bool, bool);
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
virtual void visit_edges(Visitor&) override;
private:

View file

@ -27,10 +27,12 @@ HTMLCollection::HTMLCollection(ParentNode& root, Function<bool(Element const&)>
HTMLCollection::~HTMLCollection() = default;
void HTMLCollection::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> HTMLCollection::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::HTMLCollectionPrototype>(realm, "HTMLCollection"));
return {};
}
void HTMLCollection::visit_edges(Cell::Visitor& visitor)

View file

@ -47,7 +47,7 @@ public:
protected:
HTMLCollection(ParentNode& root, Function<bool(Element const&)> filter);
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
JS::NonnullGCPtr<ParentNode> root() { return *m_root; }

View file

@ -31,10 +31,12 @@ MutationObserver::MutationObserver(JS::Realm& realm, JS::GCPtr<WebIDL::CallbackT
MutationObserver::~MutationObserver() = default;
void MutationObserver::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> MutationObserver::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::MutationObserverPrototype>(realm, "MutationObserver"));
return {};
}
void MutationObserver::visit_edges(Cell::Visitor& visitor)

View file

@ -52,7 +52,7 @@ public:
private:
MutationObserver(JS::Realm&, JS::GCPtr<WebIDL::CallbackType>);
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
virtual void visit_edges(Cell::Visitor&) override;
// https://dom.spec.whatwg.org/#concept-mo-callback

View file

@ -33,10 +33,12 @@ MutationRecord::MutationRecord(JS::Realm& realm, DeprecatedFlyString const& type
MutationRecord::~MutationRecord() = default;
void MutationRecord::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> MutationRecord::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::MutationRecordPrototype>(realm, "MutationRecord"));
return {};
}
void MutationRecord::visit_edges(Cell::Visitor& visitor)

View file

@ -32,7 +32,7 @@ public:
private:
MutationRecord(JS::Realm& realm, DeprecatedFlyString const& type, Node& target, NodeList& added_nodes, NodeList& removed_nodes, Node* previous_sibling, Node* next_sibling, DeprecatedString const& attribute_name, DeprecatedString const& attribute_namespace, DeprecatedString const& old_value);
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
virtual void visit_edges(Cell::Visitor&) override;
DeprecatedFlyString m_type;

View file

@ -25,10 +25,12 @@ NamedNodeMap::NamedNodeMap(Element& element)
{
}
void NamedNodeMap::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> NamedNodeMap::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::NamedNodeMapPrototype>(realm, "NamedNodeMap"));
return {};
}
void NamedNodeMap::visit_edges(Cell::Visitor& visitor)

View file

@ -56,7 +56,7 @@ public:
private:
explicit NamedNodeMap(Element&);
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
virtual void visit_edges(Cell::Visitor&) override;
Element& associated_element() { return *m_element; }

View file

@ -21,10 +21,12 @@ NodeIterator::NodeIterator(Node& root)
NodeIterator::~NodeIterator() = default;
void NodeIterator::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> NodeIterator::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::NodeIteratorPrototype>(realm, "NodeIterator"));
return {};
}
void NodeIterator::finalize()

View file

@ -37,7 +37,7 @@ public:
private:
explicit NodeIterator(Node& root);
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
virtual void visit_edges(Cell::Visitor&) override;
virtual void finalize() override;

View file

@ -17,10 +17,12 @@ NodeList::NodeList(JS::Realm& realm)
NodeList::~NodeList() = default;
void NodeList::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> NodeList::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::NodeListPrototype>(realm, "NodeList"));
return {};
}
JS::Value NodeList::item_value(size_t index) const

View file

@ -27,7 +27,7 @@ public:
protected:
explicit NodeList(JS::Realm&);
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
};
}

View file

@ -17,10 +17,12 @@ ProcessingInstruction::ProcessingInstruction(Document& document, DeprecatedStrin
{
}
void ProcessingInstruction::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> ProcessingInstruction::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::ProcessingInstructionPrototype>(realm, "ProcessingInstruction"));
return {};
}
}

View file

@ -24,7 +24,7 @@ public:
private:
ProcessingInstruction(Document&, DeprecatedString const& data, DeprecatedString const& target);
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
DeprecatedString m_target;
};

View file

@ -66,10 +66,12 @@ Range::~Range()
live_ranges().remove(this);
}
void Range::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> Range::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::RangePrototype>(realm, "Range"));
return {};
}
void Range::visit_edges(Cell::Visitor& visitor)

View file

@ -93,7 +93,7 @@ private:
explicit Range(Document&);
Range(Node& start_container, u32 start_offset, Node& end_container, u32 end_offset);
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
virtual void visit_edges(Cell::Visitor&) override;
Node& root();

View file

@ -35,10 +35,12 @@ WebIDL::ExceptionOr<StaticRange*> StaticRange::construct_impl(JS::Realm& realm,
return realm.heap().allocate<StaticRange>(realm, *init.start_container, init.start_offset, *init.end_container, init.end_offset).ptr();
}
void StaticRange::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> StaticRange::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::StaticRangePrototype>(realm, "StaticRange"));
return {};
}
}

View file

@ -29,7 +29,7 @@ public:
StaticRange(Node& start_container, u32 start_offset, Node& end_container, u32 end_offset);
virtual ~StaticRange() override;
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
};
}

View file

@ -24,10 +24,12 @@ Text::Text(Document& document, NodeType type, DeprecatedString const& data)
{
}
void Text::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> Text::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::TextPrototype>(realm, "Text"));
return {};
}
void Text::visit_edges(Cell::Visitor& visitor)

View file

@ -38,7 +38,7 @@ protected:
Text(Document&, DeprecatedString const&);
Text(Document&, NodeType, DeprecatedString const&);
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
virtual void visit_edges(Cell::Visitor&) override;
private:

View file

@ -22,10 +22,12 @@ TreeWalker::TreeWalker(Node& root)
TreeWalker::~TreeWalker() = default;
void TreeWalker::initialize(JS::Realm& realm)
JS::ThrowCompletionOr<void> TreeWalker::initialize(JS::Realm& realm)
{
Base::initialize(realm);
MUST_OR_THROW_OOM(Base::initialize(realm));
set_prototype(&Bindings::ensure_web_prototype<Bindings::TreeWalkerPrototype>(realm, "TreeWalker"));
return {};
}
void TreeWalker::visit_edges(Cell::Visitor& visitor)

View file

@ -39,7 +39,7 @@ public:
private:
explicit TreeWalker(Node& root);
virtual void initialize(JS::Realm&) override;
virtual JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
virtual void visit_edges(Cell::Visitor&) override;
enum class ChildTraversalType {