1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 05:47:35 +00:00

LibWeb: Make DOMImplementation GC-allocated

This commit is contained in:
Andreas Kling 2022-08-08 15:52:48 +02:00
parent cfdb8f2a8e
commit 967a3e5a45
6 changed files with 47 additions and 26 deletions

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2020, the SerenityOS developers.
* Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@ -7,25 +8,20 @@
#pragma once
#include <AK/NonnullRefPtr.h>
#include <AK/RefCountForwarder.h>
#include <AK/RefCounted.h>
#include <AK/Weakable.h>
#include <LibWeb/Bindings/Wrappable.h>
#include <LibWeb/Bindings/PlatformObject.h>
#include <LibWeb/DOM/Document.h>
namespace Web::DOM {
class DOMImplementation final
: public RefCountForwarder<Document>
, public Weakable<DOMImplementation>
, public Bindings::Wrappable {
public:
using WrapperType = Bindings::DOMImplementationWrapper;
class DOMImplementation final : public Bindings::PlatformObject {
JS_OBJECT(DOMImplementation, Bindings::PlatformObject);
static NonnullOwnPtr<DOMImplementation> create(Badge<Document>, Document& document)
{
return adopt_own(*new DOMImplementation(document));
}
public:
static JS::NonnullGCPtr<DOMImplementation> create(Document&);
explicit DOMImplementation(Document&);
virtual ~DOMImplementation();
DOMImplementation& impl() { return *this; }
ExceptionOr<NonnullRefPtr<Document>> create_document(String const&, String const&, RefPtr<DocumentType>) const;
NonnullRefPtr<Document> create_html_document(String const& title) const;
@ -35,10 +31,17 @@ public:
bool has_feature() const { return true; }
private:
explicit DOMImplementation(Document&);
virtual void visit_edges(Cell::Visitor&) override;
Document& document() { return ref_count_target(); }
Document const& document() const { return ref_count_target(); }
Document& document() { return m_document; }
Document const& document() const { return m_document; }
Document& m_document;
};
}
namespace Web::Bindings {
inline JS::Object* wrap(JS::Realm&, Web::DOM::DOMImplementation& object) { return &object; }
using DOMImplementationWrapper = Web::DOM::DOMImplementation;
}