浏览代码

Ladybird: Move the page context menu from the BrowserWindow to the Tab

This will allow us to show different context menus depending on what
element is clicked, much like we do for Browser on Serenity.
Timothy Flynn 2 年之前
父节点
当前提交
a0e31bf1de
共有 5 个文件被更改,包括 62 次插入37 次删除
  1. 17 33
      Ladybird/BrowserWindow.cpp
  2. 24 2
      Ladybird/BrowserWindow.h
  3. 17 0
      Ladybird/Tab.cpp
  4. 2 0
      Ladybird/Tab.h
  5. 2 2
      Ladybird/WebContentView.cpp

+ 17 - 33
Ladybird/BrowserWindow.cpp

@@ -62,15 +62,15 @@ BrowserWindow::BrowserWindow(Browser::CookieJar& cookie_jar, StringView webdrive
 
     auto* edit_menu = menuBar()->addMenu("&Edit");
 
-    auto* copy_action = new QAction("&Copy", this);
-    copy_action->setShortcuts(QKeySequence::keyBindings(QKeySequence::StandardKey::Copy));
-    edit_menu->addAction(copy_action);
-    QObject::connect(copy_action, &QAction::triggered, this, &BrowserWindow::copy_selected_text);
+    m_copy_selection_action = make<QAction>("&Copy", this);
+    m_copy_selection_action->setShortcuts(QKeySequence::keyBindings(QKeySequence::StandardKey::Copy));
+    edit_menu->addAction(m_copy_selection_action);
+    QObject::connect(m_copy_selection_action, &QAction::triggered, this, &BrowserWindow::copy_selected_text);
 
-    auto* select_all_action = new QAction("Select &All", this);
-    select_all_action->setShortcuts(QKeySequence::keyBindings(QKeySequence::StandardKey::SelectAll));
-    edit_menu->addAction(select_all_action);
-    QObject::connect(select_all_action, &QAction::triggered, this, &BrowserWindow::select_all);
+    m_select_all_action = make<QAction>("Select &All", this);
+    m_select_all_action->setShortcuts(QKeySequence::keyBindings(QKeySequence::StandardKey::SelectAll));
+    edit_menu->addAction(m_select_all_action);
+    QObject::connect(m_select_all_action, &QAction::triggered, this, &BrowserWindow::select_all);
 
     auto* view_menu = menuBar()->addMenu("&View");
 
@@ -133,11 +133,11 @@ BrowserWindow::BrowserWindow(Browser::CookieJar& cookie_jar, StringView webdrive
 
     auto* inspect_menu = menuBar()->addMenu("&Inspect");
 
-    auto* view_source_action = new QAction("View &Source", this);
-    view_source_action->setIcon(QIcon(QString("%1/res/icons/16x16/filetype-html.png").arg(s_serenity_resource_root.characters())));
-    view_source_action->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_U));
-    inspect_menu->addAction(view_source_action);
-    QObject::connect(view_source_action, &QAction::triggered, this, [this] {
+    m_view_source_action = make<QAction>("View &Source", this);
+    m_view_source_action->setIcon(QIcon(QString("%1/res/icons/16x16/filetype-html.png").arg(s_serenity_resource_root.characters())));
+    m_view_source_action->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_U));
+    inspect_menu->addAction(m_view_source_action);
+    QObject::connect(m_view_source_action, &QAction::triggered, this, [this] {
         if (m_current_tab) {
             m_current_tab->view().get_source();
         }
@@ -330,12 +330,8 @@ BrowserWindow::BrowserWindow(Browser::CookieJar& cookie_jar, StringView webdrive
     QObject::connect(m_tabs_container, &QTabWidget::tabCloseRequested, this, &BrowserWindow::close_tab);
     QObject::connect(close_current_tab_action, &QAction::triggered, this, &BrowserWindow::close_current_tab);
 
-    setContextMenuPolicy(Qt::CustomContextMenu);
-    QObject::connect(this, &QWidget::customContextMenuRequested, this, &BrowserWindow::show_context_menu);
-
-    m_context_menu = make<QMenu>("Context menu", this);
-    auto* inspect_element_action = new QAction("&Inspect Element", this);
-    connect(inspect_element_action, &QAction::triggered, this, [this] {
+    m_inspect_dom_node_action = make<QAction>("&Inspect Element", this);
+    connect(m_inspect_dom_node_action, &QAction::triggered, this, [this] {
         if (m_current_tab)
             m_current_tab->view().show_inspector(WebContentView::InspectorTarget::HoveredElement);
     });
@@ -354,15 +350,7 @@ BrowserWindow::BrowserWindow(Browser::CookieJar& cookie_jar, StringView webdrive
         if (m_current_tab)
             m_current_tab->reload();
     });
-    m_context_menu->addAction(m_go_back_action);
-    m_context_menu->addAction(m_go_forward_action);
-    m_context_menu->addAction(m_reload_action);
-    m_context_menu->addSeparator();
-    m_context_menu->addAction(copy_action);
-    m_context_menu->addAction(select_all_action);
-    m_context_menu->addSeparator();
-    m_context_menu->addAction(view_source_action);
-    m_context_menu->addAction(inspect_element_action);
+
     m_go_back_action->setShortcuts(QKeySequence::keyBindings(QKeySequence::StandardKey::Back));
     m_go_forward_action->setShortcuts(QKeySequence::keyBindings(QKeySequence::StandardKey::Forward));
     m_reload_action->setShortcuts(QKeySequence::keyBindings(QKeySequence::StandardKey::Refresh));
@@ -372,11 +360,7 @@ BrowserWindow::BrowserWindow(Browser::CookieJar& cookie_jar, StringView webdrive
     new_tab(s_settings->new_tab_page(), Web::HTML::ActivateTab::Yes);
 
     setCentralWidget(m_tabs_container);
-}
-
-void BrowserWindow::show_context_menu(QPoint const& point)
-{
-    m_context_menu->exec(mapToGlobal(point));
+    setContextMenuPolicy(Qt::PreventContextMenu);
 }
 
 void BrowserWindow::set_current_tab(Tab* tab)

+ 24 - 2
Ladybird/BrowserWindow.h

@@ -47,6 +47,26 @@ public:
         return *m_reload_action;
     }
 
+    QAction& copy_selection_action()
+    {
+        return *m_copy_selection_action;
+    }
+
+    QAction& select_all_action()
+    {
+        return *m_select_all_action;
+    }
+
+    QAction& view_source_action()
+    {
+        return *m_view_source_action;
+    }
+
+    QAction& inspect_dom_node_action()
+    {
+        return *m_inspect_dom_node_action;
+    }
+
 public slots:
     void tab_title_changed(int index, QString const&);
     void tab_favicon_changed(int index, QIcon icon);
@@ -64,7 +84,6 @@ public slots:
     void reset_zoom();
     void select_all();
     void copy_selected_text();
-    void show_context_menu(QPoint const&);
 
 protected:
     bool eventFilter(QObject* obj, QEvent* event) override;
@@ -83,10 +102,13 @@ private:
     Tab* m_current_tab { nullptr };
     QMenu* m_zoom_menu { nullptr };
 
-    OwnPtr<QMenu> m_context_menu {};
     OwnPtr<QAction> m_go_back_action {};
     OwnPtr<QAction> m_go_forward_action {};
     OwnPtr<QAction> m_reload_action {};
+    OwnPtr<QAction> m_copy_selection_action {};
+    OwnPtr<QAction> m_select_all_action {};
+    OwnPtr<QAction> m_view_source_action {};
+    OwnPtr<QAction> m_inspect_dom_node_action {};
 
     Browser::CookieJar& m_cookie_jar;
 

+ 17 - 0
Ladybird/Tab.cpp

@@ -13,6 +13,7 @@
 #include <QCoreApplication>
 #include <QFont>
 #include <QFontMetrics>
+#include <QMenu>
 #include <QPainter>
 #include <QPlainTextEdit>
 #include <QPoint>
@@ -177,6 +178,22 @@ Tab::Tab(BrowserWindow* window, StringView webdriver_content_ipc_path, WebView::
         m_window->showFullScreen();
         return Gfx::IntRect { m_window->x(), m_window->y(), m_window->width(), m_window->height() };
     });
+
+    m_page_context_menu = make<QMenu>("Context menu", this);
+    m_page_context_menu->addAction(&m_window->go_back_action());
+    m_page_context_menu->addAction(&m_window->go_forward_action());
+    m_page_context_menu->addAction(&m_window->reload_action());
+    m_page_context_menu->addSeparator();
+    m_page_context_menu->addAction(&m_window->copy_selection_action());
+    m_page_context_menu->addAction(&m_window->select_all_action());
+    m_page_context_menu->addSeparator();
+    m_page_context_menu->addAction(&m_window->view_source_action());
+    m_page_context_menu->addAction(&m_window->inspect_dom_node_action());
+
+    view().on_context_menu_request = [this](auto widget_position) {
+        auto screen_position = mapToGlobal(QPoint { widget_position.x(), widget_position.y() });
+        m_page_context_menu->exec(screen_position);
+    };
 }
 
 void Tab::update_reset_zoom_button()

+ 2 - 0
Ladybird/Tab.h

@@ -67,6 +67,8 @@ private:
     QString m_title;
     QLabel* m_hover_label { nullptr };
 
+    OwnPtr<QMenu> m_page_context_menu;
+
     int tab_index();
 
     bool m_is_history_navigation { false };

+ 2 - 2
Ladybird/WebContentView.cpp

@@ -866,8 +866,8 @@ void WebContentView::notify_server_did_request_refresh(Badge<WebContentClient>)
 
 void WebContentView::notify_server_did_request_context_menu(Badge<WebContentClient>, Gfx::IntPoint content_position)
 {
-    // FIXME
-    (void)content_position;
+    if (on_context_menu_request)
+        on_context_menu_request(to_widget(content_position));
 }
 
 void WebContentView::notify_server_did_request_link_context_menu(Badge<WebContentClient>, Gfx::IntPoint content_position, AK::URL const& url, DeprecatedString const&, unsigned)