CSSStyleDeclaration.h 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/String.h>
  8. #include <AK/Vector.h>
  9. #include <LibWeb/Bindings/Wrappable.h>
  10. #include <LibWeb/CSS/StyleValue.h>
  11. namespace Web::CSS {
  12. struct StyleProperty {
  13. CSS::PropertyID property_id;
  14. NonnullRefPtr<StyleValue> value;
  15. bool important { false };
  16. };
  17. class CSSStyleDeclaration
  18. : public RefCounted<CSSStyleDeclaration>
  19. , public Bindings::Wrappable {
  20. public:
  21. using WrapperType = Bindings::CSSStyleDeclarationWrapper;
  22. static NonnullRefPtr<CSSStyleDeclaration> create(Vector<StyleProperty>&& properties)
  23. {
  24. return adopt(*new CSSStyleDeclaration(move(properties)));
  25. }
  26. virtual ~CSSStyleDeclaration();
  27. const Vector<StyleProperty>& properties() const { return m_properties; }
  28. size_t length() const { return m_properties.size(); }
  29. String item(size_t index) const;
  30. protected:
  31. explicit CSSStyleDeclaration(Vector<StyleProperty>&&);
  32. private:
  33. friend class Bindings::CSSStyleDeclarationWrapper;
  34. Vector<StyleProperty> m_properties;
  35. };
  36. class ElementInlineCSSStyleDeclaration final : public CSSStyleDeclaration {
  37. public:
  38. static NonnullRefPtr<ElementInlineCSSStyleDeclaration> create(DOM::Element& element) { return adopt(*new ElementInlineCSSStyleDeclaration(element)); }
  39. virtual ~ElementInlineCSSStyleDeclaration() override;
  40. DOM::Element* element() { return m_element.ptr(); }
  41. const DOM::Element* element() const { return m_element.ptr(); }
  42. private:
  43. explicit ElementInlineCSSStyleDeclaration(DOM::Element&);
  44. WeakPtr<DOM::Element> m_element;
  45. };
  46. }
  47. namespace Web::Bindings {
  48. CSSStyleDeclarationWrapper* wrap(JS::GlobalObject&, CSS::CSSStyleDeclaration&);
  49. }