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.
This commit is contained in:
Timothy Flynn 2024-09-06 13:22:16 -04:00 committed by Andreas Kling
parent 3c5650f846
commit fc809f9755
Notes: github-actions[bot] 2024-09-07 09:11:36 +00:00
13 changed files with 73 additions and 0 deletions

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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) { }

View file

@ -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));

View file

@ -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 };

View file

@ -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;

View file

@ -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()) {

View file

@ -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;

View file

@ -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);

View file

@ -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;

View file

@ -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) =|