diff --git a/Userland/Libraries/LibWeb/DOM/Document.cpp b/Userland/Libraries/LibWeb/DOM/Document.cpp index d3c63bbd2f8..f9ba09da8b3 100644 --- a/Userland/Libraries/LibWeb/DOM/Document.cpp +++ b/Userland/Libraries/LibWeb/DOM/Document.cpp @@ -5570,10 +5570,10 @@ RefPtr Document::record_display_list(PaintConfig config) Vector> scroll_state; scroll_state.resize(viewport_paintable.scroll_state.size() + viewport_paintable.sticky_state.size()); for (auto& [_, scrollable_frame] : viewport_paintable.scroll_state) { - scroll_state[scrollable_frame->id] = scrollable_frame; + scroll_state[scrollable_frame->id()] = scrollable_frame; } for (auto& [_, scrollable_frame] : viewport_paintable.sticky_state) { - scroll_state[scrollable_frame->id] = scrollable_frame; + scroll_state[scrollable_frame->id()] = scrollable_frame; } display_list->set_scroll_state(move(scroll_state)); diff --git a/Userland/Libraries/LibWeb/Painting/ClippableAndScrollable.cpp b/Userland/Libraries/LibWeb/Painting/ClippableAndScrollable.cpp index 566da53f0f2..d79dc893f48 100644 --- a/Userland/Libraries/LibWeb/Painting/ClippableAndScrollable.cpp +++ b/Userland/Libraries/LibWeb/Painting/ClippableAndScrollable.cpp @@ -12,14 +12,14 @@ namespace Web::Painting { Optional ClippableAndScrollable::own_scroll_frame_id() const { if (m_own_scroll_frame) - return m_own_scroll_frame->id; + return m_own_scroll_frame->id(); return {}; } Optional ClippableAndScrollable::scroll_frame_id() const { if (m_enclosing_scroll_frame) - return m_enclosing_scroll_frame->id; + return m_enclosing_scroll_frame->id(); return {}; } @@ -51,7 +51,7 @@ void ClippableAndScrollable::apply_clip(PaintContext& context) const for (auto const& clip_rect : clip_rects) { Optional clip_scroll_frame_id; if (clip_rect.enclosing_scroll_frame) - clip_scroll_frame_id = clip_rect.enclosing_scroll_frame->id; + clip_scroll_frame_id = clip_rect.enclosing_scroll_frame->id(); display_list_recorder.set_scroll_frame_id(clip_scroll_frame_id); auto rect = context.rounded_device_rect(clip_rect.rect).to_type(); auto corner_radii = clip_rect.corner_radii.as_corners(context); diff --git a/Userland/Libraries/LibWeb/Painting/ClippableAndScrollable.h b/Userland/Libraries/LibWeb/Painting/ClippableAndScrollable.h index dbca508c403..29e42baae06 100644 --- a/Userland/Libraries/LibWeb/Painting/ClippableAndScrollable.h +++ b/Userland/Libraries/LibWeb/Painting/ClippableAndScrollable.h @@ -28,7 +28,7 @@ public: [[nodiscard]] CSSPixelPoint own_scroll_frame_offset() const { if (m_own_scroll_frame) - return m_own_scroll_frame->own_offset; + return m_own_scroll_frame->own_offset(); return {}; } void set_own_scroll_frame(RefPtr scroll_frame) { m_own_scroll_frame = scroll_frame; } diff --git a/Userland/Libraries/LibWeb/Painting/DisplayList.cpp b/Userland/Libraries/LibWeb/Painting/DisplayList.cpp index 065ff3183da..be641277ee5 100644 --- a/Userland/Libraries/LibWeb/Painting/DisplayList.cpp +++ b/Userland/Libraries/LibWeb/Painting/DisplayList.cpp @@ -37,7 +37,7 @@ void DisplayListPlayer::execute(DisplayList& display_list) if (command.has()) { auto& paint_scroll_bar = command.get(); - auto const& scroll_offset = scroll_state[paint_scroll_bar.scroll_frame_id]->own_offset; + auto const& scroll_offset = scroll_state[paint_scroll_bar.scroll_frame_id]->own_offset(); if (paint_scroll_bar.vertical) { auto offset = scroll_offset.y() * paint_scroll_bar.scroll_size; paint_scroll_bar.rect.translate_by(0, -offset.to_int() * device_pixels_per_css_pixel); diff --git a/Userland/Libraries/LibWeb/Painting/ScrollFrame.h b/Userland/Libraries/LibWeb/Painting/ScrollFrame.h index 0c639cc749f..75ac9065160 100644 --- a/Userland/Libraries/LibWeb/Painting/ScrollFrame.h +++ b/Userland/Libraries/LibWeb/Painting/ScrollFrame.h @@ -10,17 +10,30 @@ namespace Web::Painting { -struct ScrollFrame : public RefCounted { - i32 id { -1 }; - CSSPixelPoint own_offset; - RefPtr parent; +class ScrollFrame : public RefCounted { +public: + ScrollFrame(i32 id, RefPtr parent) + : m_id(id) + , m_parent(move(parent)) + { + } + + i32 id() const { return m_id; } CSSPixelPoint cumulative_offset() const { - if (parent) - return parent->cumulative_offset() + own_offset; - return own_offset; + if (m_parent) + return m_parent->cumulative_offset() + m_own_offset; + return m_own_offset; } + + CSSPixelPoint own_offset() const { return m_own_offset; } + void set_own_offset(CSSPixelPoint offset) { m_own_offset = offset; } + +private: + i32 m_id { -1 }; + RefPtr m_parent; + CSSPixelPoint m_own_offset; }; } diff --git a/Userland/Libraries/LibWeb/Painting/ViewportPaintable.cpp b/Userland/Libraries/LibWeb/Painting/ViewportPaintable.cpp index 2f2a5b79e1f..c4149b00439 100644 --- a/Userland/Libraries/LibWeb/Painting/ViewportPaintable.cpp +++ b/Userland/Libraries/LibWeb/Painting/ViewportPaintable.cpp @@ -70,25 +70,26 @@ void ViewportPaintable::assign_scroll_frames() for_each_in_inclusive_subtree_of_type([&](auto& paintable_box) { RefPtr sticky_scroll_frame; if (paintable_box.is_sticky_position()) { - sticky_scroll_frame = adopt_ref(*new ScrollFrame()); - sticky_scroll_frame->id = next_id++; auto const* nearest_scrollable_ancestor = paintable_box.nearest_scrollable_ancestor(); + RefPtr parent_scroll_frame; if (nearest_scrollable_ancestor) { - sticky_scroll_frame->parent = nearest_scrollable_ancestor->nearest_scroll_frame(); + parent_scroll_frame = nearest_scrollable_ancestor->nearest_scroll_frame(); } + sticky_scroll_frame = adopt_ref(*new ScrollFrame(next_id++, parent_scroll_frame)); + const_cast(paintable_box).set_enclosing_scroll_frame(sticky_scroll_frame); const_cast(paintable_box).set_own_scroll_frame(sticky_scroll_frame); sticky_state.set(paintable_box, sticky_scroll_frame); } if (paintable_box.has_scrollable_overflow() || is(paintable_box)) { - auto scroll_frame = adopt_ref(*new ScrollFrame()); - scroll_frame->id = next_id++; + RefPtr parent_scroll_frame; if (sticky_scroll_frame) { - scroll_frame->parent = sticky_scroll_frame; + parent_scroll_frame = sticky_scroll_frame; } else { - scroll_frame->parent = paintable_box.nearest_scroll_frame(); + parent_scroll_frame = paintable_box.nearest_scroll_frame(); } + auto scroll_frame = adopt_ref(*new ScrollFrame(next_id++, parent_scroll_frame)); paintable_box.set_own_scroll_frame(scroll_frame); scroll_state.set(paintable_box, move(scroll_frame)); } @@ -252,13 +253,13 @@ void ViewportPaintable::refresh_scroll_state() } } - scroll_frame.own_offset = sticky_offset; + scroll_frame.set_own_offset(sticky_offset); } for (auto& it : scroll_state) { auto const& paintable_box = *it.key; auto& scroll_frame = *it.value; - scroll_frame.own_offset = -paintable_box.scroll_offset(); + scroll_frame.set_own_offset(-paintable_box.scroll_offset()); } }