diff --git a/Ladybird/WebContentView.cpp b/Ladybird/WebContentView.cpp index 29863317db4..d07e3134219 100644 --- a/Ladybird/WebContentView.cpp +++ b/Ladybird/WebContentView.cpp @@ -885,6 +885,12 @@ void WebContentView::notify_server_did_request_image_context_menu(Badge, Gfx::IntPoint content_position, AK::URL const& url, DeprecatedString const&, unsigned, bool is_playing, bool has_user_agent_controls, bool is_looping) +{ + if (on_video_context_menu_request) + on_video_context_menu_request(url, to_widget(content_position), is_playing, has_user_agent_controls, is_looping); +} + void WebContentView::notify_server_did_request_alert(Badge, String const& message) { m_dialog = new QMessageBox(QMessageBox::Icon::Warning, "Ladybird", qstring_from_ak_string(message), QMessageBox::StandardButton::Ok, this); diff --git a/Ladybird/WebContentView.h b/Ladybird/WebContentView.h index 961f7354c2a..0d96d15f1b9 100644 --- a/Ladybird/WebContentView.h +++ b/Ladybird/WebContentView.h @@ -54,6 +54,7 @@ public: Function on_link_click; Function on_link_context_menu_request; Function on_image_context_menu_request; + Function on_video_context_menu_request; Function on_link_middle_click; Function on_link_hover; Function on_title_change; @@ -141,6 +142,7 @@ public: virtual void notify_server_did_request_context_menu(Badge, Gfx::IntPoint) override; virtual void notify_server_did_request_link_context_menu(Badge, Gfx::IntPoint, const AK::URL&, DeprecatedString const& target, unsigned modifiers) override; virtual void notify_server_did_request_image_context_menu(Badge, Gfx::IntPoint, const AK::URL&, DeprecatedString const& target, unsigned modifiers, Gfx::ShareableBitmap const&) override; + virtual void notify_server_did_request_video_context_menu(Badge, Gfx::IntPoint, const AK::URL&, DeprecatedString const& target, unsigned modifiers, bool is_playing, bool has_user_agent_controls, bool is_looping) override; virtual void notify_server_did_request_alert(Badge, String const& message) override; virtual void notify_server_did_request_confirm(Badge, String const& message) override; virtual void notify_server_did_request_prompt(Badge, String const& message, String const& default_) override; diff --git a/Userland/Libraries/LibWeb/Page/EventHandler.cpp b/Userland/Libraries/LibWeb/Page/EventHandler.cpp index 51ca89e1a35..a649d6b8bf2 100644 --- a/Userland/Libraries/LibWeb/Page/EventHandler.cpp +++ b/Userland/Libraries/LibWeb/Page/EventHandler.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -302,6 +303,17 @@ bool EventHandler::handle_mouseup(CSSPixelPoint position, unsigned button, unsig auto image_url = image_element.document().parse_url(image_element.src()); if (auto* page = m_browsing_context->page()) page->client().page_did_request_image_context_menu(m_browsing_context->to_top_level_position(position), image_url, "", modifiers, image_element.bitmap()); + } else if (is(*node)) { + auto& video_element = verify_cast(*node); + + auto video_id = video_element.id(); + auto video_url = video_element.document().parse_url(video_element.current_src()); + auto is_playing = !video_element.potentially_playing(); + auto has_user_agent_controls = video_element.has_attribute(HTML::AttributeNames::controls); + auto is_looping = video_element.has_attribute(HTML::AttributeNames::loop); + + if (auto* page = m_browsing_context->page()) + page->did_request_video_context_menu(video_id, m_browsing_context->to_top_level_position(position), video_url, "", modifiers, is_playing, has_user_agent_controls, is_looping); } else if (auto* page = m_browsing_context->page()) { page->client().page_did_request_context_menu(m_browsing_context->to_top_level_position(position)); } diff --git a/Userland/Libraries/LibWeb/Page/Page.cpp b/Userland/Libraries/LibWeb/Page/Page.cpp index 75264f2c9e8..7a6cd692408 100644 --- a/Userland/Libraries/LibWeb/Page/Page.cpp +++ b/Userland/Libraries/LibWeb/Page/Page.cpp @@ -275,4 +275,10 @@ void Page::accept_dialog() } } +void Page::did_request_video_context_menu(i32 video_id, CSSPixelPoint position, AK::URL const& url, DeprecatedString const& target, unsigned modifiers, bool is_playing, bool has_user_agent_controls, bool is_looping) +{ + m_video_context_menu_element_id = video_id; + client().page_did_request_video_context_menu(position, url, target, modifiers, is_playing, has_user_agent_controls, is_looping); +} + } diff --git a/Userland/Libraries/LibWeb/Page/Page.h b/Userland/Libraries/LibWeb/Page/Page.h index d78834cd383..ac0b9b073a1 100644 --- a/Userland/Libraries/LibWeb/Page/Page.h +++ b/Userland/Libraries/LibWeb/Page/Page.h @@ -115,6 +115,8 @@ public: void dismiss_dialog(); void accept_dialog(); + void did_request_video_context_menu(i32 video_id, CSSPixelPoint, AK::URL const&, DeprecatedString const& target, unsigned modifiers, bool is_playing, bool has_user_agent_controls, bool is_looping); + bool pdf_viewer_supported() const { return m_pdf_viewer_supported; } private: @@ -143,6 +145,8 @@ private: Optional m_pending_confirm_response; Optional> m_pending_prompt_response; + Optional m_video_context_menu_element_id; + // https://html.spec.whatwg.org/multipage/system-state.html#pdf-viewer-supported // Each user agent has a PDF viewer supported boolean, whose value is implementation-defined (and might vary according to user preferences). // Spec Note: This value also impacts the navigation processing model. @@ -178,6 +182,7 @@ public: virtual void page_did_request_context_menu(CSSPixelPoint) { } virtual void page_did_request_link_context_menu(CSSPixelPoint, AK::URL const&, [[maybe_unused]] DeprecatedString const& target, [[maybe_unused]] unsigned modifiers) { } virtual void page_did_request_image_context_menu(CSSPixelPoint, AK::URL const&, [[maybe_unused]] DeprecatedString const& target, [[maybe_unused]] unsigned modifiers, Gfx::Bitmap const*) { } + virtual void page_did_request_video_context_menu(CSSPixelPoint, AK::URL const&, [[maybe_unused]] DeprecatedString const& target, [[maybe_unused]] unsigned modifiers, [[maybe_unused]] bool is_playing, [[maybe_unused]] bool has_user_agent_controls, [[maybe_unused]] bool is_looping) { } virtual void page_did_click_link(const AK::URL&, [[maybe_unused]] DeprecatedString const& target, [[maybe_unused]] unsigned modifiers) { } virtual void page_did_middle_click_link(const AK::URL&, [[maybe_unused]] DeprecatedString const& target, [[maybe_unused]] unsigned modifiers) { } virtual void page_did_enter_tooltip_area(CSSPixelPoint, DeprecatedString const&) { } diff --git a/Userland/Libraries/LibWebView/OutOfProcessWebView.cpp b/Userland/Libraries/LibWebView/OutOfProcessWebView.cpp index 0066e267449..8c47ff9f31a 100644 --- a/Userland/Libraries/LibWebView/OutOfProcessWebView.cpp +++ b/Userland/Libraries/LibWebView/OutOfProcessWebView.cpp @@ -320,6 +320,12 @@ void OutOfProcessWebView::notify_server_did_request_image_context_menu(Badge, Gfx::IntPoint content_position, const AK::URL& url, DeprecatedString const&, unsigned, bool is_playing, bool has_user_agent_controls, bool is_looping) +{ + if (on_video_context_menu_request) + on_video_context_menu_request(url, screen_relative_rect().location().translated(to_widget_position(content_position)), is_playing, has_user_agent_controls, is_looping); +} + void OutOfProcessWebView::notify_server_did_request_alert(Badge, String const& message) { m_dialog = GUI::MessageBox::create(window(), message, "Alert"sv, GUI::MessageBox::Type::Information, GUI::MessageBox::InputType::OK).release_value_but_fixme_should_propagate_errors(); diff --git a/Userland/Libraries/LibWebView/OutOfProcessWebView.h b/Userland/Libraries/LibWebView/OutOfProcessWebView.h index b708d19940d..8d8f3f9c318 100644 --- a/Userland/Libraries/LibWebView/OutOfProcessWebView.h +++ b/Userland/Libraries/LibWebView/OutOfProcessWebView.h @@ -67,6 +67,7 @@ public: Function on_link_click; Function on_link_context_menu_request; Function on_image_context_menu_request; + Function on_video_context_menu_request; Function on_link_middle_click; Function on_link_hover; Function on_title_change; @@ -148,6 +149,7 @@ private: virtual void notify_server_did_request_context_menu(Badge, Gfx::IntPoint) override; virtual void notify_server_did_request_link_context_menu(Badge, Gfx::IntPoint, const AK::URL&, DeprecatedString const& target, unsigned modifiers) override; virtual void notify_server_did_request_image_context_menu(Badge, Gfx::IntPoint, const AK::URL&, DeprecatedString const& target, unsigned modifiers, Gfx::ShareableBitmap const&) override; + virtual void notify_server_did_request_video_context_menu(Badge, Gfx::IntPoint, const AK::URL&, DeprecatedString const& target, unsigned modifiers, bool is_playing, bool has_user_agent_controls, bool is_looping) override; virtual void notify_server_did_request_alert(Badge, String const& message) override; virtual void notify_server_did_request_confirm(Badge, String const& message) override; virtual void notify_server_did_request_prompt(Badge, String const& message, String const& default_) override; diff --git a/Userland/Libraries/LibWebView/ViewImplementation.h b/Userland/Libraries/LibWebView/ViewImplementation.h index e73afc294d1..21ec8de72a2 100644 --- a/Userland/Libraries/LibWebView/ViewImplementation.h +++ b/Userland/Libraries/LibWebView/ViewImplementation.h @@ -93,6 +93,7 @@ public: virtual void notify_server_did_request_context_menu(Badge, Gfx::IntPoint) = 0; virtual void notify_server_did_request_link_context_menu(Badge, Gfx::IntPoint, const AK::URL&, DeprecatedString const& target, unsigned modifiers) = 0; virtual void notify_server_did_request_image_context_menu(Badge, Gfx::IntPoint, const AK::URL&, DeprecatedString const& target, unsigned modifiers, Gfx::ShareableBitmap const&) = 0; + virtual void notify_server_did_request_video_context_menu(Badge, Gfx::IntPoint, const AK::URL&, DeprecatedString const& target, unsigned modifiers, bool is_playing, bool has_user_agent_controls, bool is_looping) = 0; virtual void notify_server_did_request_alert(Badge, String const& message) = 0; virtual void notify_server_did_request_confirm(Badge, String const& message) = 0; virtual void notify_server_did_request_prompt(Badge, String const& message, String const& default_) = 0; diff --git a/Userland/Libraries/LibWebView/WebContentClient.cpp b/Userland/Libraries/LibWebView/WebContentClient.cpp index 01238a23571..4882817bfde 100644 --- a/Userland/Libraries/LibWebView/WebContentClient.cpp +++ b/Userland/Libraries/LibWebView/WebContentClient.cpp @@ -151,6 +151,11 @@ void WebContentClient::did_request_image_context_menu(Gfx::IntPoint content_posi m_view.notify_server_did_request_image_context_menu({}, content_position, url, target, modifiers, bitmap); } +void WebContentClient::did_request_video_context_menu(Gfx::IntPoint content_position, AK::URL const& url, DeprecatedString const& target, unsigned modifiers, bool is_playing, bool has_user_agent_controls, bool is_looping) +{ + m_view.notify_server_did_request_video_context_menu({}, content_position, url, target, modifiers, is_playing, has_user_agent_controls, is_looping); +} + void WebContentClient::did_get_source(AK::URL const& url, DeprecatedString const& source) { m_view.notify_server_did_get_source(url, source); diff --git a/Userland/Libraries/LibWebView/WebContentClient.h b/Userland/Libraries/LibWebView/WebContentClient.h index 295affda79c..2d2b2227bcf 100644 --- a/Userland/Libraries/LibWebView/WebContentClient.h +++ b/Userland/Libraries/LibWebView/WebContentClient.h @@ -52,6 +52,7 @@ private: virtual void did_request_context_menu(Gfx::IntPoint) override; virtual void did_request_link_context_menu(Gfx::IntPoint, AK::URL const&, DeprecatedString const&, unsigned) override; virtual void did_request_image_context_menu(Gfx::IntPoint, AK::URL const&, DeprecatedString const&, unsigned, Gfx::ShareableBitmap const&) override; + virtual void did_request_video_context_menu(Gfx::IntPoint, AK::URL const&, DeprecatedString const&, unsigned, bool, bool, bool) override; virtual void did_get_source(AK::URL const&, DeprecatedString const&) override; virtual void did_get_dom_tree(DeprecatedString const&) override; virtual void did_get_dom_node_properties(i32 node_id, DeprecatedString const& computed_style, DeprecatedString const& resolved_style, DeprecatedString const& custom_properties, DeprecatedString const& node_box_sizing) override; diff --git a/Userland/Services/WebContent/PageHost.cpp b/Userland/Services/WebContent/PageHost.cpp index b4722cc9702..0a505ee6548 100644 --- a/Userland/Services/WebContent/PageHost.cpp +++ b/Userland/Services/WebContent/PageHost.cpp @@ -355,6 +355,11 @@ void PageHost::page_did_request_image_context_menu(Web::CSSPixelPoint content_po m_client.async_did_request_image_context_menu({ content_position.x().value(), content_position.y().value() }, url, target, modifiers, bitmap); } +void PageHost::page_did_request_video_context_menu(Web::CSSPixelPoint content_position, URL const& url, DeprecatedString const& target, unsigned modifiers, bool is_playing, bool has_user_agent_controls, bool is_looping) +{ + m_client.async_did_request_video_context_menu({ content_position.x().value(), content_position.y().value() }, url, target, modifiers, is_playing, has_user_agent_controls, is_looping); +} + Vector PageHost::page_did_request_all_cookies(URL const& url) { return m_client.did_request_all_cookies(url); diff --git a/Userland/Services/WebContent/PageHost.h b/Userland/Services/WebContent/PageHost.h index 07b07aedbaa..08c259f217e 100644 --- a/Userland/Services/WebContent/PageHost.h +++ b/Userland/Services/WebContent/PageHost.h @@ -94,6 +94,7 @@ private: virtual void page_did_request_dismiss_dialog() override; virtual void page_did_change_favicon(Gfx::Bitmap const&) override; virtual void page_did_request_image_context_menu(Web::CSSPixelPoint, const URL&, DeprecatedString const& target, unsigned modifiers, Gfx::Bitmap const*) override; + virtual void page_did_request_video_context_menu(Web::CSSPixelPoint, const URL&, DeprecatedString const& target, unsigned modifiers, bool is_playing, bool has_user_agent_controls, bool is_looping) override; virtual Vector page_did_request_all_cookies(URL const&) override; virtual Optional page_did_request_named_cookie(URL const&, DeprecatedString const&) override; virtual DeprecatedString page_did_request_cookie(const URL&, Web::Cookie::Source) override; diff --git a/Userland/Services/WebContent/WebContentClient.ipc b/Userland/Services/WebContent/WebContentClient.ipc index 06f0516a305..3cde0db35fb 100644 --- a/Userland/Services/WebContent/WebContentClient.ipc +++ b/Userland/Services/WebContent/WebContentClient.ipc @@ -30,6 +30,7 @@ endpoint WebContentClient did_request_context_menu(Gfx::IntPoint content_position) =| did_request_link_context_menu(Gfx::IntPoint content_position, URL url, DeprecatedString target, unsigned modifiers) =| did_request_image_context_menu(Gfx::IntPoint content_position, URL url, DeprecatedString target, unsigned modifiers, Gfx::ShareableBitmap bitmap) =| + did_request_video_context_menu(Gfx::IntPoint content_position, URL url, DeprecatedString target, unsigned modifiers, bool is_playing, bool has_user_agent_controls, bool is_looping) =| did_request_alert(String message) =| did_request_confirm(String message) =| did_request_prompt(String message, String default_) =| diff --git a/Userland/Utilities/headless-browser.cpp b/Userland/Utilities/headless-browser.cpp index 2549a4d19d4..75a1ffa2999 100644 --- a/Userland/Utilities/headless-browser.cpp +++ b/Userland/Utilities/headless-browser.cpp @@ -113,6 +113,7 @@ private: void notify_server_did_request_context_menu(Badge, Gfx::IntPoint) override { } void notify_server_did_request_link_context_menu(Badge, Gfx::IntPoint, const URL&, DeprecatedString const&, unsigned) override { } void notify_server_did_request_image_context_menu(Badge, Gfx::IntPoint, const URL&, DeprecatedString const&, unsigned, Gfx::ShareableBitmap const&) override { } + void notify_server_did_request_video_context_menu(Badge, Gfx::IntPoint, const URL&, DeprecatedString const&, unsigned, bool, bool, bool) override { } void notify_server_did_request_alert(Badge, String const&) override { } void notify_server_did_request_confirm(Badge, String const&) override { } void notify_server_did_request_prompt(Badge, String const&, String const&) override { }