diff --git a/Userland/Libraries/LibWeb/Page/Page.h b/Userland/Libraries/LibWeb/Page/Page.h index 24ca38e175..dce615f7b4 100644 --- a/Userland/Libraries/LibWeb/Page/Page.h +++ b/Userland/Libraries/LibWeb/Page/Page.h @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -193,7 +194,9 @@ private: bool m_pdf_viewer_supported { false }; }; -class PageClient { +class PageClient : public JS::Cell { + JS_CELL(PageClient, JS::Cell); + public: virtual Page& page() = 0; virtual Page const& page() const = 0; diff --git a/Userland/Libraries/LibWeb/SVG/SVGDecodedImageData.cpp b/Userland/Libraries/LibWeb/SVG/SVGDecodedImageData.cpp index b7215596c3..e9de384064 100644 --- a/Userland/Libraries/LibWeb/SVG/SVGDecodedImageData.cpp +++ b/Userland/Libraries/LibWeb/SVG/SVGDecodedImageData.cpp @@ -5,6 +5,7 @@ */ #include +#include #include #include #include @@ -23,10 +24,12 @@ namespace Web::SVG { class SVGDecodedImageData::SVGPageClient final : public PageClient { + JS_CELL(SVGDecodedImageData::SVGPageClient, PageClient); + public: - explicit SVGPageClient(Page& host_page) - : m_host_page(host_page) + static JS::NonnullGCPtr create(JS::VM& vm, Page& page) { + return vm.heap().allocate_without_realm(page); } virtual ~SVGPageClient() override = default; @@ -43,11 +46,17 @@ public: virtual CSS::PreferredColorScheme preferred_color_scheme() const override { return m_host_page.client().preferred_color_scheme(); } virtual void request_file(FileRequest) override { } virtual void paint(DevicePixelRect const&, Gfx::Bitmap&) override { } + +private: + explicit SVGPageClient(Page& host_page) + : m_host_page(host_page) + { + } }; ErrorOr> SVGDecodedImageData::create(Page& host_page, AK::URL const& url, ByteBuffer data) { - auto page_client = make(host_page); + auto page_client = SVGPageClient::create(Bindings::main_thread_vm(), host_page); auto page = make(*page_client); page_client->m_svg_page = page.ptr(); page->set_top_level_traversable(MUST(Web::HTML::TraversableNavigable::create_a_fresh_top_level_traversable(*page, AK::URL("about:blank")))); @@ -92,7 +101,7 @@ ErrorOr> SVGDecodedImageData::create(Page& ho return adopt_nonnull_ref_or_enomem(new (nothrow) SVGDecodedImageData(move(page), move(page_client), move(document), move(svg_root))); } -SVGDecodedImageData::SVGDecodedImageData(NonnullOwnPtr page, NonnullOwnPtr page_client, JS::Handle document, JS::Handle root_element) +SVGDecodedImageData::SVGDecodedImageData(NonnullOwnPtr page, JS::Handle page_client, JS::Handle document, JS::Handle root_element) : m_page(move(page)) , m_page_client(move(page_client)) , m_document(move(document)) diff --git a/Userland/Libraries/LibWeb/SVG/SVGDecodedImageData.h b/Userland/Libraries/LibWeb/SVG/SVGDecodedImageData.h index c308e4c0c5..c0c2f4b5bd 100644 --- a/Userland/Libraries/LibWeb/SVG/SVGDecodedImageData.h +++ b/Userland/Libraries/LibWeb/SVG/SVGDecodedImageData.h @@ -32,13 +32,13 @@ public: private: class SVGPageClient; - SVGDecodedImageData(NonnullOwnPtr, NonnullOwnPtr, JS::Handle, JS::Handle); + SVGDecodedImageData(NonnullOwnPtr, JS::Handle, JS::Handle, JS::Handle); RefPtr render(Gfx::IntSize) const; mutable RefPtr m_immutable_bitmap; NonnullOwnPtr m_page; - NonnullOwnPtr m_page_client; + JS::Handle m_page_client; JS::Handle m_document; JS::Handle m_root_element; diff --git a/Userland/Services/WebContent/PageClient.cpp b/Userland/Services/WebContent/PageClient.cpp index 75c9524108..d55199fdba 100644 --- a/Userland/Services/WebContent/PageClient.cpp +++ b/Userland/Services/WebContent/PageClient.cpp @@ -39,6 +39,11 @@ void PageClient::set_use_gpu_painter() s_use_gpu_painter = true; } +JS::NonnullGCPtr PageClient::create(JS::VM& vm, PageHost& page_host, u64 id) +{ + return vm.heap().allocate_without_realm(page_host, id); +} + PageClient::PageClient(PageHost& owner, u64 id) : m_owner(owner) , m_page(make(*this)) diff --git a/Userland/Services/WebContent/PageClient.h b/Userland/Services/WebContent/PageClient.h index 55dc500c58..416a21e941 100644 --- a/Userland/Services/WebContent/PageClient.h +++ b/Userland/Services/WebContent/PageClient.h @@ -17,11 +17,10 @@ namespace WebContent { class PageClient final : public Web::PageClient { - AK_MAKE_NONCOPYABLE(PageClient); - AK_MAKE_NONMOVABLE(PageClient); + JS_CELL(PageClient, Web::PageClient); public: - PageClient(PageHost&, u64 id); + static JS::NonnullGCPtr create(JS::VM& vm, PageHost& page_host, u64 id); static void set_use_gpu_painter(); @@ -60,6 +59,8 @@ public: void set_user_style(String source); private: + PageClient(PageHost&, u64 id); + // ^PageClient virtual bool is_connection_open() const override; virtual Gfx::Palette palette() const override; diff --git a/Userland/Services/WebContent/PageHost.cpp b/Userland/Services/WebContent/PageHost.cpp index b9bb5e7e51..a032eb8ebe 100644 --- a/Userland/Services/WebContent/PageHost.cpp +++ b/Userland/Services/WebContent/PageHost.cpp @@ -6,6 +6,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include #include @@ -23,7 +24,7 @@ PageHost::PageHost(ConnectionFromClient& client) PageClient& PageHost::create_page() { - m_pages.set(m_next_id, make(*this, m_next_id)); + m_pages.set(m_next_id, PageClient::create(Web::Bindings::main_thread_vm(), *this, m_next_id)); ++m_next_id; return *m_pages.get(m_next_id - 1).value(); } diff --git a/Userland/Services/WebContent/PageHost.h b/Userland/Services/WebContent/PageHost.h index 9f58e546f2..f122d4f441 100644 --- a/Userland/Services/WebContent/PageHost.h +++ b/Userland/Services/WebContent/PageHost.h @@ -11,6 +11,7 @@ #include #include #include +#include #include namespace WebContent { @@ -34,7 +35,7 @@ private: explicit PageHost(ConnectionFromClient&); ConnectionFromClient& m_client; - HashMap> m_pages; + HashMap> m_pages; u64 m_next_id { 0 }; }; diff --git a/Userland/Services/WebWorker/ConnectionFromClient.cpp b/Userland/Services/WebWorker/ConnectionFromClient.cpp index 9273914a8c..122dcfcd2b 100644 --- a/Userland/Services/WebWorker/ConnectionFromClient.cpp +++ b/Userland/Services/WebWorker/ConnectionFromClient.cpp @@ -36,7 +36,7 @@ void ConnectionFromClient::request_file(Web::FileRequest request) ConnectionFromClient::ConnectionFromClient(NonnullOwnPtr socket) : IPC::ConnectionFromClient(*this, move(socket), 1) - , m_page_host(PageHost::create(*this)) + , m_page_host(PageHost::create(Web::Bindings::main_thread_vm(), *this)) { } diff --git a/Userland/Services/WebWorker/ConnectionFromClient.h b/Userland/Services/WebWorker/ConnectionFromClient.h index 91bd0b22e2..fe410a1730 100644 --- a/Userland/Services/WebWorker/ConnectionFromClient.h +++ b/Userland/Services/WebWorker/ConnectionFromClient.h @@ -9,10 +9,12 @@ #include #include #include +#include #include #include #include #include +#include #include namespace WebWorker { @@ -40,7 +42,7 @@ private: virtual void start_dedicated_worker(AK::URL const& url, String const&, String const&, String const&, IPC::File const&) override; virtual void handle_file_return(i32 error, Optional const& file, i32 request_id) override; - NonnullOwnPtr m_page_host; + JS::Handle m_page_host; // FIXME: Route console messages to the Browser UI using a ConsoleClient diff --git a/Userland/Services/WebWorker/PageHost.cpp b/Userland/Services/WebWorker/PageHost.cpp index 90da83dae8..ecb356728d 100644 --- a/Userland/Services/WebWorker/PageHost.cpp +++ b/Userland/Services/WebWorker/PageHost.cpp @@ -4,11 +4,17 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include namespace WebWorker { +JS::NonnullGCPtr PageHost::create(JS::VM& vm, ConnectionFromClient& client) +{ + return vm.heap().allocate_without_realm(client); +} + PageHost::~PageHost() = default; Web::Page& PageHost::page() diff --git a/Userland/Services/WebWorker/PageHost.h b/Userland/Services/WebWorker/PageHost.h index 02ed7ebe29..eb979d88fa 100644 --- a/Userland/Services/WebWorker/PageHost.h +++ b/Userland/Services/WebWorker/PageHost.h @@ -14,11 +14,11 @@ namespace WebWorker { class PageHost final : public Web::PageClient { - AK_MAKE_NONCOPYABLE(PageHost); - AK_MAKE_NONMOVABLE(PageHost); + JS_CELL(PageHost, Web::PageClient); public: - static NonnullOwnPtr create(ConnectionFromClient& client) { return adopt_own(*new PageHost(client)); } + static JS::NonnullGCPtr create(JS::VM& vm, ConnectionFromClient& client); + virtual ~PageHost(); virtual Web::Page& page() override;