Worker.h 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. GC_DECLARE_ALLOCATOR(Worker);
  22. public:
  23. static WebIDL::ExceptionOr<GC::Ref<Worker>> create(String const& script_url, WorkerOptions const& options, DOM::Document& document);
  24. static WebIDL::ExceptionOr<GC::Ref<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. WebIDL::ExceptionOr<void> post_message(JS::Value message, Vector<GC::Root<JS::Object>> const& transfer);
  32. virtual ~Worker() = default;
  33. GC::Ptr<MessagePort> outside_message_port() { return m_outside_port; }
  34. #undef __ENUMERATE
  35. #define __ENUMERATE(attribute_name, event_name) \
  36. void set_##attribute_name(WebIDL::CallbackType*); \
  37. WebIDL::CallbackType* attribute_name();
  38. ENUMERATE_WORKER_EVENT_HANDLERS(__ENUMERATE)
  39. #undef __ENUMERATE
  40. protected:
  41. Worker(String const&, WorkerOptions const&, DOM::Document&);
  42. // ^AbstractWorker
  43. virtual DOM::EventTarget& this_event_target() override { return *this; }
  44. private:
  45. virtual void initialize(JS::Realm&) override;
  46. virtual void visit_edges(Cell::Visitor&) override;
  47. String m_script_url;
  48. WorkerOptions m_options;
  49. GC::Ptr<DOM::Document> m_document;
  50. GC::Ptr<MessagePort> m_outside_port;
  51. GC::Ptr<WorkerAgent> m_agent;
  52. void run_a_worker(URL::URL& url, EnvironmentSettingsObject& outside_settings, GC::Ptr<MessagePort> outside_port, WorkerOptions const& options);
  53. };
  54. }