WindowObject.h 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /*
  2. * Copyright (c) 2020-2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/TypeCasts.h>
  8. #include <AK/Weakable.h>
  9. #include <LibJS/Runtime/GlobalObject.h>
  10. #include <LibWeb/Forward.h>
  11. namespace Web {
  12. namespace Bindings {
  13. class WindowObject final
  14. : public JS::GlobalObject
  15. , public Weakable<WindowObject> {
  16. JS_OBJECT(WindowObject, JS::GlobalObject);
  17. public:
  18. explicit WindowObject(DOM::Window&);
  19. virtual void initialize_global_object() override;
  20. virtual ~WindowObject() override;
  21. DOM::Window& impl() { return *m_impl; }
  22. const DOM::Window& impl() const { return *m_impl; }
  23. Origin origin() const;
  24. JS::Object* web_prototype(const String& class_name) { return m_prototypes.get(class_name).value_or(nullptr); }
  25. JS::NativeFunction* web_constructor(const String& class_name) { return m_constructors.get(class_name).value_or(nullptr); }
  26. template<typename T>
  27. JS::Object& ensure_web_prototype(const String& class_name)
  28. {
  29. auto it = m_prototypes.find(class_name);
  30. if (it != m_prototypes.end())
  31. return *it->value;
  32. auto* prototype = heap().allocate<T>(*this, *this);
  33. m_prototypes.set(class_name, prototype);
  34. return *prototype;
  35. }
  36. template<typename T>
  37. JS::NativeFunction& ensure_web_constructor(const String& class_name)
  38. {
  39. auto it = m_constructors.find(class_name);
  40. if (it != m_constructors.end())
  41. return *it->value;
  42. auto* constructor = heap().allocate<T>(*this, *this);
  43. m_constructors.set(class_name, constructor);
  44. define_direct_property(class_name, JS::Value(constructor), JS::Attribute::Writable | JS::Attribute::Configurable);
  45. return *constructor;
  46. }
  47. private:
  48. virtual void visit_edges(Visitor&) override;
  49. JS_DECLARE_NATIVE_FUNCTION(top_getter);
  50. JS_DECLARE_NATIVE_FUNCTION(document_getter);
  51. JS_DECLARE_NATIVE_FUNCTION(performance_getter);
  52. JS_DECLARE_NATIVE_FUNCTION(screen_getter);
  53. JS_DECLARE_NATIVE_FUNCTION(event_getter);
  54. JS_DECLARE_NATIVE_FUNCTION(inner_width_getter);
  55. JS_DECLARE_NATIVE_FUNCTION(inner_height_getter);
  56. JS_DECLARE_NATIVE_FUNCTION(parent_getter);
  57. JS_DECLARE_NATIVE_FUNCTION(alert);
  58. JS_DECLARE_NATIVE_FUNCTION(confirm);
  59. JS_DECLARE_NATIVE_FUNCTION(prompt);
  60. JS_DECLARE_NATIVE_FUNCTION(set_interval);
  61. JS_DECLARE_NATIVE_FUNCTION(set_timeout);
  62. JS_DECLARE_NATIVE_FUNCTION(clear_interval);
  63. JS_DECLARE_NATIVE_FUNCTION(clear_timeout);
  64. JS_DECLARE_NATIVE_FUNCTION(request_animation_frame);
  65. JS_DECLARE_NATIVE_FUNCTION(cancel_animation_frame);
  66. JS_DECLARE_NATIVE_FUNCTION(atob);
  67. JS_DECLARE_NATIVE_FUNCTION(btoa);
  68. NonnullRefPtr<DOM::Window> m_impl;
  69. HashMap<String, JS::Object*> m_prototypes;
  70. HashMap<String, JS::NativeFunction*> m_constructors;
  71. };
  72. }
  73. }