From 0069390e1c2427c92832ba98693224edea361bab Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Sun, 24 Mar 2024 18:23:37 -0400 Subject: [PATCH] Browser: Implement pasting content from the clipboard --- Userland/Applications/Browser/BrowserWindow.cpp | 10 ++++++++++ Userland/Applications/Browser/BrowserWindow.h | 2 ++ Userland/Applications/Browser/Tab.cpp | 1 + 3 files changed, 13 insertions(+) diff --git a/Userland/Applications/Browser/BrowserWindow.cpp b/Userland/Applications/Browser/BrowserWindow.cpp index 4cf5292b1e1..30e431b84db 100644 --- a/Userland/Applications/Browser/BrowserWindow.cpp +++ b/Userland/Applications/Browser/BrowserWindow.cpp @@ -227,6 +227,16 @@ void BrowserWindow::build_menus(StringView const man_file) GUI::Clipboard::the().set_plain_text(selected_text); }); + m_paste_action = GUI::CommonActions::make_paste_action([this](auto&) { + auto& tab = active_tab(); + + auto [data, mime_type, metadata] = GUI::Clipboard::the().fetch_data_and_type(); + if (data.is_empty() || !mime_type.starts_with("text/"sv)) + return; + + tab.view().paste(MUST(String::from_utf8(StringView { data }))); + }); + m_select_all_action = GUI::CommonActions::make_select_all_action([this](auto&) { active_tab().view().select_all(); }); diff --git a/Userland/Applications/Browser/BrowserWindow.h b/Userland/Applications/Browser/BrowserWindow.h index 6269b842902..a275084a24b 100644 --- a/Userland/Applications/Browser/BrowserWindow.h +++ b/Userland/Applications/Browser/BrowserWindow.h @@ -37,6 +37,7 @@ public: GUI::Action& go_home_action() { return *m_go_home_action; } GUI::Action& reload_action() { return *m_reload_action; } GUI::Action& copy_selection_action() { return *m_copy_selection_action; } + GUI::Action& paste_action() { return *m_paste_action; } GUI::Action& select_all_action() { return *m_select_all_action; } GUI::Action& view_source_action() { return *m_view_source_action; } GUI::Action& inspect_dom_tree_action() { return *m_inspect_dom_tree_action; } @@ -69,6 +70,7 @@ private: RefPtr m_go_home_action; RefPtr m_reload_action; RefPtr m_copy_selection_action; + RefPtr m_paste_action; RefPtr m_select_all_action; RefPtr m_view_source_action; RefPtr m_inspect_dom_tree_action; diff --git a/Userland/Applications/Browser/Tab.cpp b/Userland/Applications/Browser/Tab.cpp index a428775068f..cec48fd842d 100644 --- a/Userland/Applications/Browser/Tab.cpp +++ b/Userland/Applications/Browser/Tab.cpp @@ -728,6 +728,7 @@ Tab::Tab(BrowserWindow& window) m_page_context_menu->add_action(window.reload_action()); m_page_context_menu->add_separator(); m_page_context_menu->add_action(window.copy_selection_action()); + m_page_context_menu->add_action(window.paste_action()); m_page_context_menu->add_action(window.select_all_action()); // FIXME: It would be nice to have a separator here, but the below action is sometimes hidden, and WindowServer // does not hide successive separators like other toolkits.