/src/serenity/Userland/Libraries/LibWeb/HTML/Worker.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (c) 2022, Ben Abraham <ben.d.abraham@gmail.com> |
3 | | * |
4 | | * SPDX-License-Identifier: BSD-2-Clause |
5 | | */ |
6 | | |
7 | | #pragma once |
8 | | |
9 | | #include <LibWeb/Forward.h> |
10 | | #include <LibWeb/HTML/AbstractWorker.h> |
11 | | #include <LibWeb/HTML/Window.h> |
12 | | #include <LibWeb/HTML/WorkerAgent.h> |
13 | | #include <LibWeb/WebIDL/ExceptionOr.h> |
14 | | |
15 | | #define ENUMERATE_WORKER_EVENT_HANDLERS(E) \ |
16 | | E(onmessage, HTML::EventNames::message) \ |
17 | | E(onmessageerror, HTML::EventNames::messageerror) |
18 | | |
19 | | namespace Web::HTML { |
20 | | |
21 | | // https://html.spec.whatwg.org/multipage/workers.html#dedicated-workers-and-the-worker-interface |
22 | | class Worker |
23 | | : public DOM::EventTarget |
24 | | , public HTML::AbstractWorker { |
25 | | WEB_PLATFORM_OBJECT(Worker, DOM::EventTarget); |
26 | | JS_DECLARE_ALLOCATOR(Worker); |
27 | | |
28 | | public: |
29 | | static WebIDL::ExceptionOr<JS::NonnullGCPtr<Worker>> create(String const& script_url, WorkerOptions const& options, DOM::Document& document); |
30 | | static WebIDL::ExceptionOr<JS::NonnullGCPtr<Worker>> construct_impl(JS::Realm& realm, String const& script_url, WorkerOptions const& options) |
31 | 0 | { |
32 | 0 | auto& window = verify_cast<HTML::Window>(realm.global_object()); |
33 | 0 | return Worker::create(script_url, options, window.associated_document()); |
34 | 0 | } |
35 | | |
36 | | WebIDL::ExceptionOr<void> terminate(); |
37 | | |
38 | | WebIDL::ExceptionOr<void> post_message(JS::Value message, StructuredSerializeOptions const&); |
39 | | WebIDL::ExceptionOr<void> post_message(JS::Value message, Vector<JS::Handle<JS::Object>> const& transfer); |
40 | | |
41 | 0 | virtual ~Worker() = default; |
42 | | |
43 | 0 | JS::GCPtr<MessagePort> outside_message_port() { return m_outside_port; } |
44 | | |
45 | | #undef __ENUMERATE |
46 | | #define __ENUMERATE(attribute_name, event_name) \ |
47 | | void set_##attribute_name(WebIDL::CallbackType*); \ |
48 | | WebIDL::CallbackType* attribute_name(); |
49 | | ENUMERATE_WORKER_EVENT_HANDLERS(__ENUMERATE) |
50 | | #undef __ENUMERATE |
51 | | |
52 | | protected: |
53 | | Worker(String const&, WorkerOptions const&, DOM::Document&); |
54 | | |
55 | | // ^AbstractWorker |
56 | 0 | virtual DOM::EventTarget& this_event_target() override { return *this; } |
57 | | |
58 | | private: |
59 | | virtual void initialize(JS::Realm&) override; |
60 | | virtual void visit_edges(Cell::Visitor&) override; |
61 | | |
62 | | String m_script_url; |
63 | | WorkerOptions m_options; |
64 | | |
65 | | JS::GCPtr<DOM::Document> m_document; |
66 | | JS::GCPtr<MessagePort> m_outside_port; |
67 | | |
68 | | JS::GCPtr<WorkerAgent> m_agent; |
69 | | |
70 | | void run_a_worker(URL::URL& url, EnvironmentSettingsObject& outside_settings, JS::GCPtr<MessagePort> outside_port, WorkerOptions const& options); |
71 | | }; |
72 | | |
73 | | } |