diff --git a/Userland/Libraries/LibWeb/HTML/HTMLVideoElement.h b/Userland/Libraries/LibWeb/HTML/HTMLVideoElement.h index 2c1c82cb47..0a268189fd 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLVideoElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLVideoElement.h @@ -6,6 +6,7 @@ #pragma once +#include #include #include #include @@ -32,6 +33,9 @@ public: void set_current_frame(Badge, RefPtr frame); RefPtr const& current_frame() const { return m_current_frame; } + void set_layout_mouse_position(Badge, Optional mouse_position) { m_mouse_position = move(mouse_position); } + Optional const& layout_mouse_position(Badge) const { return m_mouse_position; } + private: HTMLVideoElement(DOM::Document&, DOM::QualifiedName); @@ -48,6 +52,9 @@ private: u32 m_video_width { 0 }; u32 m_video_height { 0 }; + + // Cached state for layout + Optional m_mouse_position; }; } diff --git a/Userland/Libraries/LibWeb/Painting/VideoPaintable.cpp b/Userland/Libraries/LibWeb/Painting/VideoPaintable.cpp index 3db544eee5..4b2c3e2058 100644 --- a/Userland/Libraries/LibWeb/Painting/VideoPaintable.cpp +++ b/Userland/Libraries/LibWeb/Painting/VideoPaintable.cpp @@ -64,11 +64,13 @@ void VideoPaintable::paint(PaintContext& context, PaintPhase phase) const auto video_rect = context.rounded_device_rect(absolute_rect()); ScopedCornerRadiusClip corner_clip { context, context.painter(), video_rect, normalized_border_radii_data(ShrinkRadiiForBorders::Yes) }; - Optional mouse_position; - if (m_mouse_position.has_value()) - mouse_position = context.rounded_device_point(*m_mouse_position); - auto const& video_element = layout_box().dom_node(); + auto const& layout_mouse_position = video_element.layout_mouse_position({}); + + Optional mouse_position; + if (layout_mouse_position.has_value() && document().hovered_node() == &video_element) + mouse_position = context.rounded_device_point(*layout_mouse_position); + auto paint_user_agent_controls = video_element.has_attribute(HTML::AttributeNames::controls); if (auto const& bitmap = layout_box().dom_node().current_frame()) { @@ -201,12 +203,14 @@ VideoPaintable::DispatchEventOfSameName VideoPaintable::handle_mouseup(Badge, CSSPixelPoint position, unsigned, unsigned) { + auto& video_element = layout_box().dom_node(); + if (absolute_rect().contains(position)) { - m_mouse_position = position; + video_element.set_layout_mouse_position({}, position); return DispatchEventOfSameName::Yes; } - m_mouse_position.clear(); + video_element.set_layout_mouse_position({}, {}); return DispatchEventOfSameName::No; } diff --git a/Userland/Libraries/LibWeb/Painting/VideoPaintable.h b/Userland/Libraries/LibWeb/Painting/VideoPaintable.h index 1d7204f0a6..ac4e1fa09e 100644 --- a/Userland/Libraries/LibWeb/Painting/VideoPaintable.h +++ b/Userland/Libraries/LibWeb/Painting/VideoPaintable.h @@ -6,7 +6,6 @@ #pragma once -#include #include #include @@ -32,8 +31,6 @@ private: void paint_loaded_video_controls(PaintContext&, HTML::HTMLVideoElement const&, DevicePixelRect video_rect, Optional const& mouse_position) const; void paint_placeholder_video_controls(PaintContext&, DevicePixelRect video_rect, Optional const& mouse_position) const; - - Optional m_mouse_position; }; }