Paintable.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /*
  2. * Copyright (c) 2022-2023, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibWeb/DOM/Document.h>
  7. #include <LibWeb/Layout/BlockContainer.h>
  8. #include <LibWeb/Painting/Paintable.h>
  9. #include <LibWeb/Painting/PaintableBox.h>
  10. #include <LibWeb/Painting/StackingContext.h>
  11. namespace Web::Painting {
  12. Paintable::Paintable(Layout::Node const& layout_node)
  13. : m_layout_node(layout_node)
  14. , m_browsing_context(const_cast<HTML::BrowsingContext&>(layout_node.browsing_context()))
  15. {
  16. }
  17. Paintable::~Paintable()
  18. {
  19. }
  20. void Paintable::visit_edges(Cell::Visitor& visitor)
  21. {
  22. Base::visit_edges(visitor);
  23. TreeNode::visit_edges(visitor);
  24. visitor.visit(m_dom_node);
  25. visitor.visit(m_layout_node);
  26. visitor.visit(m_browsing_context);
  27. if (m_containing_block.has_value())
  28. visitor.visit(m_containing_block.value());
  29. }
  30. bool Paintable::is_visible() const
  31. {
  32. return computed_values().visibility() == CSS::Visibility::Visible && computed_values().opacity() != 0;
  33. }
  34. bool Paintable::is_positioned() const
  35. {
  36. if (layout_node().is_grid_item() && computed_values().z_index().has_value()) {
  37. // https://www.w3.org/TR/css-grid-2/#z-order
  38. // grid items with z_index should behave as if position were "relative"
  39. return true;
  40. }
  41. return computed_values().position() != CSS::Positioning::Static;
  42. }
  43. void Paintable::set_dom_node(JS::GCPtr<DOM::Node> dom_node)
  44. {
  45. m_dom_node = dom_node;
  46. }
  47. JS::GCPtr<DOM::Node> Paintable::dom_node()
  48. {
  49. return m_dom_node;
  50. }
  51. JS::GCPtr<DOM::Node const> Paintable::dom_node() const
  52. {
  53. return m_dom_node;
  54. }
  55. HTML::BrowsingContext const& Paintable::browsing_context() const
  56. {
  57. return m_browsing_context;
  58. }
  59. HTML::BrowsingContext& Paintable::browsing_context()
  60. {
  61. return m_browsing_context;
  62. }
  63. Paintable::DispatchEventOfSameName Paintable::handle_mousedown(Badge<EventHandler>, CSSPixelPoint, unsigned, unsigned)
  64. {
  65. return DispatchEventOfSameName::Yes;
  66. }
  67. Paintable::DispatchEventOfSameName Paintable::handle_mouseup(Badge<EventHandler>, CSSPixelPoint, unsigned, unsigned)
  68. {
  69. return DispatchEventOfSameName::Yes;
  70. }
  71. Paintable::DispatchEventOfSameName Paintable::handle_mousemove(Badge<EventHandler>, CSSPixelPoint, unsigned, unsigned)
  72. {
  73. return DispatchEventOfSameName::Yes;
  74. }
  75. bool Paintable::handle_mousewheel(Badge<EventHandler>, CSSPixelPoint, unsigned, unsigned, int, int)
  76. {
  77. return false;
  78. }
  79. Optional<HitTestResult> Paintable::hit_test(CSSPixelPoint, HitTestType) const
  80. {
  81. return {};
  82. }
  83. StackingContext* Paintable::enclosing_stacking_context()
  84. {
  85. for (auto* ancestor = parent(); ancestor; ancestor = ancestor->parent()) {
  86. if (auto* stacking_context = ancestor->stacking_context())
  87. return const_cast<StackingContext*>(stacking_context);
  88. }
  89. // We should always reach the viewport's stacking context.
  90. VERIFY_NOT_REACHED();
  91. }
  92. void Paintable::set_stacking_context(NonnullOwnPtr<StackingContext> stacking_context)
  93. {
  94. m_stacking_context = move(stacking_context);
  95. }
  96. void Paintable::invalidate_stacking_context()
  97. {
  98. m_stacking_context = nullptr;
  99. }
  100. PaintableBox const* Paintable::nearest_scrollable_ancestor_within_stacking_context() const
  101. {
  102. auto* ancestor = parent();
  103. while (ancestor) {
  104. if (ancestor->stacking_context())
  105. return nullptr;
  106. if (ancestor->is_paintable_box() && static_cast<PaintableBox const*>(ancestor)->has_scrollable_overflow())
  107. return static_cast<PaintableBox const*>(ancestor);
  108. ancestor = ancestor->parent();
  109. }
  110. return nullptr;
  111. }
  112. }