Worker.h 2.3 KB

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