Jelajahi Sumber

LibWebView: Add context menu support to the Inspector's cookie table

The menu can currently support deleting a specific cookie or all cookies
for the current page.
Timothy Flynn 10 bulan lalu
induk
melakukan
fc809f9755

+ 5 - 0
Base/res/ladybird/inspector.js

@@ -235,6 +235,11 @@ inspector.setCookies = cookies => {
             addColumn(row, new Date(cookie.creationTime).toLocaleString());
             addColumn(row, new Date(cookie.lastAccessTime).toLocaleString());
             addColumn(row, new Date(cookie.expiryTime).toLocaleString());
+
+            row.addEventListener("contextmenu", event => {
+                inspector.requestCookieContextMenu(cookie.index, event.clientX, event.clientY);
+                event.preventDefault();
+            });
         });
 
     oldTable.parentNode.replaceChild(newTable, oldTable);

+ 5 - 0
Userland/Libraries/LibWeb/Internals/Inspector.cpp

@@ -77,6 +77,11 @@ void Inspector::request_dom_tree_context_menu(i32 node_id, i32 client_x, i32 cli
     inspector_page_client().inspector_did_request_dom_tree_context_menu(node_id, { client_x, client_y }, type, tag, attribute_index.map([](auto index) { return static_cast<size_t>(index); }));
 }
 
+void Inspector::request_cookie_context_menu(WebIDL::UnsignedLongLong cookie_index, i32 client_x, i32 client_y)
+{
+    inspector_page_client().inspector_did_request_cookie_context_menu(cookie_index, { client_x, client_y });
+}
+
 void Inspector::request_style_sheet_source(String const& type_string, Optional<i32> const& dom_node_unique_id, Optional<String> const& url)
 {
     auto type = CSS::style_sheet_identifier_type_from_string(type_string);

+ 2 - 0
Userland/Libraries/LibWeb/Internals/Inspector.h

@@ -29,6 +29,8 @@ public:
 
     void request_dom_tree_context_menu(i32 node_id, i32 client_x, i32 client_y, String const& type, Optional<String> const& tag, Optional<WebIDL::UnsignedLongLong> const& attribute_index);
 
+    void request_cookie_context_menu(WebIDL::UnsignedLongLong cookie_index, i32 client_x, i32 client_y);
+
     void request_style_sheet_source(String const& type, Optional<i32> const& dom_node_unique_id, Optional<String> const& url);
 
     void execute_console_script(String const& script);

+ 2 - 0
Userland/Libraries/LibWeb/Internals/Inspector.idl

@@ -12,6 +12,8 @@
 
     undefined requestDOMTreeContextMenu(long nodeID, long clientX, long clientY, DOMString type, DOMString? tag, unsigned long long? attributeIndex);
 
+    undefined requestCookieContextMenu(unsigned long long cookieIndex, long clientX, long clientY);
+
     undefined requestStyleSheetSource(DOMString type, long? domNodeID, DOMString? url);
 
     undefined executeConsoleScript(DOMString script);

+ 1 - 0
Userland/Libraries/LibWeb/Page/Page.h

@@ -377,6 +377,7 @@ public:
     virtual void inspector_did_add_dom_node_attributes([[maybe_unused]] i32 node_id, [[maybe_unused]] JS::NonnullGCPtr<DOM::NamedNodeMap> attributes) { }
     virtual void inspector_did_replace_dom_node_attribute([[maybe_unused]] i32 node_id, [[maybe_unused]] size_t attribute_index, [[maybe_unused]] JS::NonnullGCPtr<DOM::NamedNodeMap> replacement_attributes) { }
     virtual void inspector_did_request_dom_tree_context_menu([[maybe_unused]] i32 node_id, [[maybe_unused]] CSSPixelPoint position, [[maybe_unused]] String const& type, [[maybe_unused]] Optional<String> const& tag, [[maybe_unused]] Optional<size_t> const& attribute_index) { }
+    virtual void inspector_did_request_cookie_context_menu([[maybe_unused]] size_t cookie_index, [[maybe_unused]] CSSPixelPoint position) { }
     virtual void inspector_did_request_style_sheet_source([[maybe_unused]] CSS::StyleSheetIdentifier const& identifier) { }
     virtual void inspector_did_execute_console_script([[maybe_unused]] String const& script) { }
     virtual void inspector_did_export_inspector_html([[maybe_unused]] String const& html) { }

+ 37 - 0
Userland/Libraries/LibWebView/InspectorClient.cpp

@@ -213,6 +213,16 @@ InspectorClient::InspectorClient(ViewImplementation& content_web_view, ViewImple
         m_content_web_view.replace_dom_node_attribute(node_id, attribute.name, replacement_attributes);
     };
 
+    m_inspector_web_view.on_inspector_requested_cookie_context_menu = [this](auto cookie_index, auto position) {
+        if (cookie_index >= m_cookies.size())
+            return;
+
+        m_cookie_context_menu_index = cookie_index;
+
+        if (on_requested_cookie_context_menu)
+            on_requested_cookie_context_menu(position, m_cookies[cookie_index]);
+    };
+
     m_inspector_web_view.on_inspector_requested_style_sheet_source = [this](auto const& identifier) {
         m_content_web_view.request_style_sheet_source(identifier);
     };
@@ -468,6 +478,33 @@ void InspectorClient::context_menu_copy_dom_node_attribute_value()
     m_context_menu_data.clear();
 }
 
+void InspectorClient::context_menu_delete_cookie()
+{
+    VERIFY(m_cookie_context_menu_index.has_value());
+    VERIFY(*m_cookie_context_menu_index < m_cookies.size());
+
+    auto& cookie = m_cookies[*m_cookie_context_menu_index];
+    cookie.expiry_time = UnixDateTime::earliest();
+
+    Application::cookie_jar().update_cookie(move(cookie));
+    load_cookies();
+
+    m_cookie_context_menu_index.clear();
+}
+
+void InspectorClient::context_menu_delete_all_cookies()
+{
+    for (auto& cookie : m_cookies) {
+        cookie.expiry_time = UnixDateTime::earliest();
+
+        Application::cookie_jar().update_cookie(move(cookie));
+    }
+
+    load_cookies();
+
+    m_cookie_context_menu_index.clear();
+}
+
 void InspectorClient::load_inspector()
 {
     auto inspector_html = MUST(Core::Resource::load_from_uri(INSPECTOR_HTML));

+ 4 - 0
Userland/Libraries/LibWebView/InspectorClient.h

@@ -39,10 +39,13 @@ public:
     void context_menu_add_dom_node_attribute();
     void context_menu_remove_dom_node_attribute();
     void context_menu_copy_dom_node_attribute_value();
+    void context_menu_delete_cookie();
+    void context_menu_delete_all_cookies();
 
     Function<void(Gfx::IntPoint)> on_requested_dom_node_text_context_menu;
     Function<void(Gfx::IntPoint, String const&)> on_requested_dom_node_tag_context_menu;
     Function<void(Gfx::IntPoint, String const&, Attribute const&)> on_requested_dom_node_attribute_context_menu;
+    Function<void(Gfx::IntPoint, Web::Cookie::Cookie const&)> on_requested_cookie_context_menu;
 
 private:
     void load_inspector();
@@ -85,6 +88,7 @@ private:
     HashMap<int, Vector<Attribute>> m_dom_node_attributes;
 
     Vector<Web::Cookie::Cookie> m_cookies;
+    Optional<size_t> m_cookie_context_menu_index;
 
     i32 m_highest_notified_message_index { -1 };
     i32 m_highest_received_message_index { -1 };

+ 1 - 0
Userland/Libraries/LibWebView/ViewImplementation.h

@@ -223,6 +223,7 @@ public:
     Function<void(i32, Vector<Attribute> const&)> on_inspector_added_dom_node_attributes;
     Function<void(i32, size_t, Vector<Attribute> const&)> on_inspector_replaced_dom_node_attribute;
     Function<void(i32, Gfx::IntPoint, String const&, Optional<String> const&, Optional<size_t> const&)> on_inspector_requested_dom_tree_context_menu;
+    Function<void(size_t, Gfx::IntPoint)> on_inspector_requested_cookie_context_menu;
     Function<void(String const&)> on_inspector_executed_console_script;
     Function<void(String const&)> on_inspector_exported_inspector_html;
     Function<IPC::File()> on_request_worker_agent;

+ 8 - 0
Userland/Libraries/LibWebView/WebContentClient.cpp

@@ -685,6 +685,14 @@ void WebContentClient::inspector_did_request_dom_tree_context_menu(u64 page_id,
     }
 }
 
+void WebContentClient::inspector_did_request_cookie_context_menu(u64 page_id, size_t cookie_index, Gfx::IntPoint position)
+{
+    if (auto view = view_for_page_id(page_id); view.has_value()) {
+        if (view->on_inspector_requested_cookie_context_menu)
+            view->on_inspector_requested_cookie_context_menu(cookie_index, view->to_widget_position(position));
+    }
+}
+
 void WebContentClient::inspector_did_execute_console_script(u64 page_id, String const& script)
 {
     if (auto view = view_for_page_id(page_id); view.has_value()) {

+ 1 - 0
Userland/Libraries/LibWebView/WebContentClient.h

@@ -120,6 +120,7 @@ private:
     virtual void inspector_did_add_dom_node_attributes(u64 page_id, i32 node_id, Vector<Attribute> const& attributes) override;
     virtual void inspector_did_replace_dom_node_attribute(u64 page_id, i32 node_id, size_t attribute_index, Vector<Attribute> const& replacement_attributes) override;
     virtual void inspector_did_request_dom_tree_context_menu(u64 page_id, i32 node_id, Gfx::IntPoint position, String const& type, Optional<String> const& tag, Optional<size_t> const& attribute_index) override;
+    virtual void inspector_did_request_cookie_context_menu(u64 page_id, size_t cookie_index, Gfx::IntPoint position) override;
     virtual void inspector_did_execute_console_script(u64 page_id, String const& script) override;
     virtual void inspector_did_export_inspector_html(u64 page_id, String const& html) override;
     virtual Messages::WebContentClient::RequestWorkerAgentResponse request_worker_agent(u64 page_id) override;

+ 5 - 0
Userland/Services/WebContent/PageClient.cpp

@@ -658,6 +658,11 @@ void PageClient::inspector_did_request_dom_tree_context_menu(i32 node_id, Web::C
     client().async_inspector_did_request_dom_tree_context_menu(m_id, node_id, page().css_to_device_point(position).to_type<int>(), type, tag, attribute_index);
 }
 
+void PageClient::inspector_did_request_cookie_context_menu(size_t cookie_index, Web::CSSPixelPoint position)
+{
+    client().async_inspector_did_request_cookie_context_menu(m_id, cookie_index, page().css_to_device_point(position).to_type<int>());
+}
+
 void PageClient::inspector_did_request_style_sheet_source(Web::CSS::StyleSheetIdentifier const& identifier)
 {
     client().async_inspector_did_request_style_sheet_source(m_id, identifier);

+ 1 - 0
Userland/Services/WebContent/PageClient.h

@@ -169,6 +169,7 @@ private:
     virtual void inspector_did_add_dom_node_attributes(i32 node_id, JS::NonnullGCPtr<Web::DOM::NamedNodeMap> attributes) override;
     virtual void inspector_did_replace_dom_node_attribute(i32 node_id, size_t attribute_index, JS::NonnullGCPtr<Web::DOM::NamedNodeMap> replacement_attributes) override;
     virtual void inspector_did_request_dom_tree_context_menu(i32 node_id, Web::CSSPixelPoint position, String const& type, Optional<String> const& tag, Optional<size_t> const& attribute_index) override;
+    virtual void inspector_did_request_cookie_context_menu(size_t cookie_index, Web::CSSPixelPoint position) override;
     virtual void inspector_did_request_style_sheet_source(Web::CSS::StyleSheetIdentifier const& stylesheet_source) override;
     virtual void inspector_did_execute_console_script(String const& script) override;
     virtual void inspector_did_export_inspector_html(String const& script) override;

+ 1 - 0
Userland/Services/WebContent/WebContentClient.ipc

@@ -105,6 +105,7 @@ endpoint WebContentClient
     inspector_did_add_dom_node_attributes(u64 page_id, i32 node_id, Vector<WebView::Attribute> attributes) =|
     inspector_did_replace_dom_node_attribute(u64 page_id, i32 node_id, size_t attribute_index, Vector<WebView::Attribute> replacement_attributes) =|
     inspector_did_request_dom_tree_context_menu(u64 page_id, i32 node_id, Gfx::IntPoint position, String type, Optional<String> tag, Optional<size_t> attribute_index) =|
+    inspector_did_request_cookie_context_menu(u64 page_id, size_t cookie_index, Gfx::IntPoint position) =|
     inspector_did_execute_console_script(u64 page_id, String script) =|
     inspector_did_export_inspector_html(u64 page_id, String html) =|