From b162b7eec68c1b75ded1923fcd2be968183447e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Babiarz?= <5783815+Sauler@users.noreply.github.com> Date: Sat, 7 May 2022 22:45:43 +0200 Subject: [PATCH] Browser+LibWeb+WebContent: Add ability to inspect session storage --- .../Applications/Browser/BrowserWindow.cpp | 4 +++ Userland/Applications/Browser/CMakeLists.txt | 2 +- ...LocalStorageModel.cpp => StorageModel.cpp} | 16 +++++----- .../{LocalStorageModel.h => StorageModel.h} | 2 +- .../Applications/Browser/StorageWidget.cpp | 31 +++++++++++++++++-- .../Applications/Browser/StorageWidget.gml | 22 +++++++++++++ Userland/Applications/Browser/StorageWidget.h | 12 +++++-- Userland/Applications/Browser/Tab.cpp | 6 ++++ Userland/Applications/Browser/Tab.h | 1 + .../LibWebView/OutOfProcessWebView.cpp | 5 +++ .../LibWebView/OutOfProcessWebView.h | 1 + .../WebContent/ConnectionFromClient.cpp | 7 +++++ .../WebContent/ConnectionFromClient.h | 1 + .../Services/WebContent/WebContentServer.ipc | 2 +- 14 files changed, 97 insertions(+), 15 deletions(-) rename Userland/Applications/Browser/{LocalStorageModel.cpp => StorageModel.cpp} (77%) rename Userland/Applications/Browser/{LocalStorageModel.h => StorageModel.h} (95%) diff --git a/Userland/Applications/Browser/BrowserWindow.cpp b/Userland/Applications/Browser/BrowserWindow.cpp index 8f66fef667..f07ab53d1b 100644 --- a/Userland/Applications/Browser/BrowserWindow.cpp +++ b/Userland/Applications/Browser/BrowserWindow.cpp @@ -566,6 +566,10 @@ void BrowserWindow::create_new_tab(URL url, bool activate) return active_tab().view().get_local_storage_entries(); }; + new_tab.on_get_session_storage_entries = [this]() { + return active_tab().view().get_session_storage_entries(); + }; + new_tab.load(url); dbgln_if(SPAM_DEBUG, "Added new tab {:p}, loading {}", &new_tab, url); diff --git a/Userland/Applications/Browser/CMakeLists.txt b/Userland/Applications/Browser/CMakeLists.txt index b4d2b20df9..73a2f8560b 100644 --- a/Userland/Applications/Browser/CMakeLists.txt +++ b/Userland/Applications/Browser/CMakeLists.txt @@ -23,7 +23,7 @@ set(SOURCES History.cpp IconBag.cpp InspectorWidget.cpp - LocalStorageModel.cpp + StorageModel.cpp StorageWidget.cpp StorageWidgetGML.h Tab.cpp diff --git a/Userland/Applications/Browser/LocalStorageModel.cpp b/Userland/Applications/Browser/StorageModel.cpp similarity index 77% rename from Userland/Applications/Browser/LocalStorageModel.cpp rename to Userland/Applications/Browser/StorageModel.cpp index 8f199a0767..490960118f 100644 --- a/Userland/Applications/Browser/LocalStorageModel.cpp +++ b/Userland/Applications/Browser/StorageModel.cpp @@ -4,13 +4,13 @@ * SPDX-License-Identifier: BSD-2-Clause */ -#include "LocalStorageModel.h" +#include "StorageModel.h" #include namespace Browser { -void LocalStorageModel::set_items(OrderedHashMap map) +void StorageModel::set_items(OrderedHashMap map) { begin_insert_rows({}, m_local_storage_entries.size(), m_local_storage_entries.size()); m_local_storage_entries = map; @@ -19,7 +19,7 @@ void LocalStorageModel::set_items(OrderedHashMap map) did_update(DontInvalidateIndices); } -void LocalStorageModel::clear_items() +void StorageModel::clear_items() { begin_insert_rows({}, m_local_storage_entries.size(), m_local_storage_entries.size()); m_local_storage_entries.clear(); @@ -28,14 +28,14 @@ void LocalStorageModel::clear_items() did_update(DontInvalidateIndices); } -int LocalStorageModel::row_count(GUI::ModelIndex const& index) const +int StorageModel::row_count(GUI::ModelIndex const& index) const { if (!index.is_valid()) return m_local_storage_entries.size(); return 0; } -String LocalStorageModel::column_name(int column) const +String StorageModel::column_name(int column) const { switch (column) { case Column::Key: @@ -49,14 +49,14 @@ String LocalStorageModel::column_name(int column) const return {}; } -GUI::ModelIndex LocalStorageModel::index(int row, int column, GUI::ModelIndex const&) const +GUI::ModelIndex StorageModel::index(int row, int column, GUI::ModelIndex const&) const { if (static_cast(row) < m_local_storage_entries.size()) return create_index(row, column, NULL); return {}; } -GUI::Variant LocalStorageModel::data(GUI::ModelIndex const& index, GUI::ModelRole role) const +GUI::Variant StorageModel::data(GUI::ModelIndex const& index, GUI::ModelRole role) const { if (role != GUI::ModelRole::Display) return {}; @@ -75,7 +75,7 @@ GUI::Variant LocalStorageModel::data(GUI::ModelIndex const& index, GUI::ModelRol VERIFY_NOT_REACHED(); } -TriState LocalStorageModel::data_matches(GUI::ModelIndex const& index, GUI::Variant const& term) const +TriState StorageModel::data_matches(GUI::ModelIndex const& index, GUI::Variant const& term) const { auto needle = term.as_string(); if (needle.is_empty()) diff --git a/Userland/Applications/Browser/LocalStorageModel.h b/Userland/Applications/Browser/StorageModel.h similarity index 95% rename from Userland/Applications/Browser/LocalStorageModel.h rename to Userland/Applications/Browser/StorageModel.h index 12870f4b28..f4d9ee592d 100644 --- a/Userland/Applications/Browser/LocalStorageModel.h +++ b/Userland/Applications/Browser/StorageModel.h @@ -10,7 +10,7 @@ namespace Browser { -class LocalStorageModel final : public GUI::Model { +class StorageModel final : public GUI::Model { public: enum Column { Key, diff --git a/Userland/Applications/Browser/StorageWidget.cpp b/Userland/Applications/Browser/StorageWidget.cpp index 4d1799de6a..56991ba06d 100644 --- a/Userland/Applications/Browser/StorageWidget.cpp +++ b/Userland/Applications/Browser/StorageWidget.cpp @@ -6,7 +6,7 @@ #include "StorageWidget.h" #include "CookiesModel.h" -#include "LocalStorageModel.h" +#include "StorageModel.h" #include #include #include @@ -39,7 +39,7 @@ StorageWidget::StorageWidget() m_local_storage_table_view = tab_widget.find_descendant_of_type_named("local_storage_tableview"); m_local_storage_textbox = tab_widget.find_descendant_of_type_named("local_storage_filter_textbox"); - m_local_storage_model = adopt_ref(*new LocalStorageModel()); + m_local_storage_model = adopt_ref(*new StorageModel()); m_local_storage_filtering_model = MUST(GUI::FilteringProxyModel::create(*m_local_storage_model)); m_local_storage_filtering_model->set_filter_term(""); @@ -53,6 +53,23 @@ StorageWidget::StorageWidget() m_local_storage_table_view->set_model(m_local_storage_filtering_model); m_local_storage_table_view->set_column_headers_visible(true); m_local_storage_table_view->set_alternating_row_colors(true); + + m_session_storage_table_view = tab_widget.find_descendant_of_type_named("session_storage_tableview"); + m_session_storage_textbox = tab_widget.find_descendant_of_type_named("session_storage_filter_textbox"); + m_session_storage_model = adopt_ref(*new StorageModel()); + + m_session_storage_filtering_model = MUST(GUI::FilteringProxyModel::create(*m_session_storage_model)); + m_session_storage_filtering_model->set_filter_term(""); + + m_session_storage_textbox->on_change = [this] { + m_session_storage_filtering_model->set_filter_term(m_session_storage_textbox->text()); + if (m_session_storage_filtering_model->row_count() != 0) + m_session_storage_table_view->set_cursor(m_session_storage_filtering_model->index(0, 0), GUI::AbstractView::SelectionUpdate::Set); + }; + + m_session_storage_table_view->set_model(m_session_storage_filtering_model); + m_session_storage_table_view->set_column_headers_visible(true); + m_session_storage_table_view->set_alternating_row_colors(true); } void StorageWidget::set_cookies_entries(Vector entries) @@ -75,4 +92,14 @@ void StorageWidget::clear_local_storage_entries() m_local_storage_model->clear_items(); } +void StorageWidget::set_session_storage_entries(OrderedHashMap entries) +{ + m_session_storage_model->set_items(entries); +} + +void StorageWidget::clear_session_storage_entries() +{ + m_session_storage_model->clear_items(); +} + } diff --git a/Userland/Applications/Browser/StorageWidget.gml b/Userland/Applications/Browser/StorageWidget.gml index cb76eeb647..e201499e4c 100644 --- a/Userland/Applications/Browser/StorageWidget.gml +++ b/Userland/Applications/Browser/StorageWidget.gml @@ -50,5 +50,27 @@ } } } + + @GUI::Widget { + title: "Session Storage" + layout: @GUI::VerticalBoxLayout { + margins: [4] + } + + @GUI::TextBox { + name: "session_storage_filter_textbox" + placeholder: "Filter" + } + + @GUI::GroupBox { + layout: @GUI::VerticalBoxLayout { + margins: [6] + } + + @GUI::TableView { + name: "session_storage_tableview" + } + } + } } } diff --git a/Userland/Applications/Browser/StorageWidget.h b/Userland/Applications/Browser/StorageWidget.h index 69397aa0d3..cfde2c7295 100644 --- a/Userland/Applications/Browser/StorageWidget.h +++ b/Userland/Applications/Browser/StorageWidget.h @@ -7,7 +7,7 @@ #pragma once #include "CookiesModel.h" -#include "LocalStorageModel.h" +#include "StorageModel.h" #include "Tab.h" #include #include @@ -27,6 +27,9 @@ public: void set_local_storage_entries(OrderedHashMap entries); void clear_local_storage_entries(); + void set_session_storage_entries(OrderedHashMap entries); + void clear_session_storage_entries(); + private: StorageWidget(); @@ -37,8 +40,13 @@ private: RefPtr m_local_storage_table_view; RefPtr m_local_storage_textbox; - RefPtr m_local_storage_model; + RefPtr m_local_storage_model; RefPtr m_local_storage_filtering_model; + + RefPtr m_session_storage_table_view; + RefPtr m_session_storage_textbox; + RefPtr m_session_storage_model; + RefPtr m_session_storage_filtering_model; }; } diff --git a/Userland/Applications/Browser/Tab.cpp b/Userland/Applications/Browser/Tab.cpp index 07355893f4..e17915f640 100644 --- a/Userland/Applications/Browser/Tab.cpp +++ b/Userland/Applications/Browser/Tab.cpp @@ -615,6 +615,12 @@ void Tab::show_storage_inspector() m_storage_widget->set_local_storage_entries(local_storage_entries); } + if (on_get_session_storage_entries) { + auto session_storage_entries = on_get_session_storage_entries(); + m_storage_widget->clear_session_storage_entries(); + m_storage_widget->set_session_storage_entries(session_storage_entries); + } + auto* window = m_storage_widget->window(); window->show(); window->move_to_front(); diff --git a/Userland/Applications/Browser/Tab.h b/Userland/Applications/Browser/Tab.h index 3a93437b33..1a49c08a34 100644 --- a/Userland/Applications/Browser/Tab.h +++ b/Userland/Applications/Browser/Tab.h @@ -66,6 +66,7 @@ public: Function on_dump_cookies; Function()> on_get_cookies_entries; Function()> on_get_local_storage_entries; + Function()> on_get_session_storage_entries; enum class InspectorTarget { Document, diff --git a/Userland/Libraries/LibWebView/OutOfProcessWebView.cpp b/Userland/Libraries/LibWebView/OutOfProcessWebView.cpp index 9a99d5feeb..f5949ed857 100644 --- a/Userland/Libraries/LibWebView/OutOfProcessWebView.cpp +++ b/Userland/Libraries/LibWebView/OutOfProcessWebView.cpp @@ -495,6 +495,11 @@ OrderedHashMap OutOfProcessWebView::get_local_storage_entries() return client().get_local_storage_entries(); } +OrderedHashMap OutOfProcessWebView::get_session_storage_entries() +{ + return client().get_session_storage_entries(); +} + void OutOfProcessWebView::set_content_filters(Vector filters) { client().async_set_content_filters(filters); diff --git a/Userland/Libraries/LibWebView/OutOfProcessWebView.h b/Userland/Libraries/LibWebView/OutOfProcessWebView.h index c4fb09f134..3a7cf3ab15 100644 --- a/Userland/Libraries/LibWebView/OutOfProcessWebView.h +++ b/Userland/Libraries/LibWebView/OutOfProcessWebView.h @@ -53,6 +53,7 @@ public: String dump_layout_tree(); OrderedHashMap get_local_storage_entries(); + OrderedHashMap get_session_storage_entries(); void set_content_filters(Vector); void set_proxy_mappings(Vector proxies, HashMap mappings); diff --git a/Userland/Services/WebContent/ConnectionFromClient.cpp b/Userland/Services/WebContent/ConnectionFromClient.cpp index a8e00d6df6..89f7620de7 100644 --- a/Userland/Services/WebContent/ConnectionFromClient.cpp +++ b/Userland/Services/WebContent/ConnectionFromClient.cpp @@ -493,4 +493,11 @@ Messages::WebContentServer::GetLocalStorageEntriesResponse ConnectionFromClient: auto local_storage = document->window().local_storage(); return local_storage->map(); } + +Messages::WebContentServer::GetSessionStorageEntriesResponse ConnectionFromClient::get_session_storage_entries() +{ + auto* document = page().top_level_browsing_context().active_document(); + auto session_storage = document->window().session_storage(); + return session_storage->map(); +} } diff --git a/Userland/Services/WebContent/ConnectionFromClient.h b/Userland/Services/WebContent/ConnectionFromClient.h index 9af25ca3a7..a9e1535220 100644 --- a/Userland/Services/WebContent/ConnectionFromClient.h +++ b/Userland/Services/WebContent/ConnectionFromClient.h @@ -69,6 +69,7 @@ private: virtual void js_console_request_messages(i32) override; virtual Messages::WebContentServer::GetLocalStorageEntriesResponse get_local_storage_entries() override; + virtual Messages::WebContentServer::GetSessionStorageEntriesResponse get_session_storage_entries() override; virtual Messages::WebContentServer::GetSelectedTextResponse get_selected_text() override; virtual void select_all() override; diff --git a/Userland/Services/WebContent/WebContentServer.ipc b/Userland/Services/WebContent/WebContentServer.ipc index 6cf876f62e..dca0221d36 100644 --- a/Userland/Services/WebContent/WebContentServer.ipc +++ b/Userland/Services/WebContent/WebContentServer.ipc @@ -49,5 +49,5 @@ endpoint WebContentServer set_is_scripting_enabled(bool is_scripting_enabled) =| get_local_storage_entries() => (OrderedHashMap entries) - + get_session_storage_entries() => (OrderedHashMap entries) }