Changeset 218325 in webkit


Ignore:
Timestamp:
Jun 15, 2017 2:41:27 AM (7 years ago)
Author:
Carlos Garcia Campos
Message:

[GTK] Add API to allow overriding popup menus
https://bugs.webkit.org/show_bug.cgi?id=172905

Reviewed by Michael Catanzaro.

Source/WebKit2:

The GTK+ API uses GTK+ for the default implementation of several UI elements like the file chooser, print dialog,
color picker, context menu, etc. but in all those cases it allows to override the default implementation. It's
not possible to override the popup menu used for select elements. This patch adds WebKitOptionMenu to represent
a select dropdown menu. It's passed as an argument of the new signal WebKitWebView::show-option-menu, and
contains WebKitOptionMenuItem elements representing the items to be displayed.

  • PlatformGTK.cmake:
  • UIProcess/API/gtk/PageClientImpl.cpp:

(WebKit::PageClientImpl::createPopupMenuProxy): Create a WebKitPopupMenu.

  • UIProcess/API/gtk/WebKitOptionMenu.cpp: Added.

(webkitOptionMenuCreate):
(webkit_option_menu_get_n_items):
(webkit_option_menu_get_item):
(webkit_option_menu_select_item):
(webkit_option_menu_activate_item):
(webkit_option_menu_close):

  • UIProcess/API/gtk/WebKitOptionMenu.h: Added.
  • UIProcess/API/gtk/WebKitOptionMenuItem.cpp: Added.

(webkit_option_menu_item_copy):
(webkit_option_menu_item_free):
(webkit_option_menu_item_get_label):
(webkit_option_menu_item_get_tooltip):
(webkit_option_menu_item_is_group_label):
(webkit_option_menu_item_is_group_child):
(webkit_option_menu_item_is_enabled):
(webkit_option_menu_item_is_selected):

  • UIProcess/API/gtk/WebKitOptionMenuItem.h: Added.
  • UIProcess/API/gtk/WebKitOptionMenuItemPrivate.h: Added.

(_WebKitOptionMenuItem::_WebKitOptionMenuItem):

  • UIProcess/API/gtk/WebKitOptionMenuPrivate.h: Added.
  • UIProcess/API/gtk/WebKitPopupMenu.cpp: Added.

(WebKit::WebKitPopupMenu::WebKitPopupMenu):
(WebKit::menuCloseCallback):
(WebKit::WebKitPopupMenu::showPopupMenu): Call webkitWebViewShowOptionMenu() falling back to default
implementation if the user didn't handle the signal.
(WebKit::WebKitPopupMenu::hidePopupMenu):
(WebKit::WebKitPopupMenu::cancelTracking):
(WebKit::WebKitPopupMenu::selectItem):
(WebKit::WebKitPopupMenu::activateItem):

  • UIProcess/API/gtk/WebKitPopupMenu.h: Added.
  • UIProcess/API/gtk/WebKitWebView.cpp:

(webkit_web_view_class_init):
(webkitWebViewShowOptionMenu): Emit WebKitWebView::show-option-menu.

  • UIProcess/API/gtk/WebKitWebView.h:
  • UIProcess/API/gtk/WebKitWebViewPrivate.h:
  • UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt: Add new symbols.
  • UIProcess/API/gtk/docs/webkit2gtk-4.0.types: Add new get_type functions.
  • UIProcess/API/gtk/docs/webkit2gtk-docs.sgml: Add new sections.
  • UIProcess/API/gtk/webkit2.h: Add new public headers.
  • UIProcess/gtk/WebPopupMenuProxyGtk.cpp:

(WebKit::WebPopupMenuProxyGtk::WebPopupMenuProxyGtk): Do not create the GtkMenu in constructor.
(WebKit::WebPopupMenuProxyGtk::showPopupMenu): Create the GtkMenu and connect to the signals here.
(WebKit::WebPopupMenuProxyGtk::hidePopupMenu): Return early if the Gtk hasn't been shown.

  • UIProcess/gtk/WebPopupMenuProxyGtk.h: Make constructor and webview protected.

Tools:

Add a unit test to check the new API.

  • TestWebKitAPI/Tests/WebKit2Gtk/CMakeLists.txt:
  • TestWebKitAPI/Tests/WebKit2Gtk/TestOptionMenu.cpp: Added.

(OptionMenuTest::OptionMenuTest):
(OptionMenuTest::~OptionMenuTest):
(OptionMenuTest::destroyMenu):
(OptionMenuTest::showOptionMenuCallback):
(OptionMenuTest::menuCloseCallback):
(OptionMenuTest::showOptionMenu):
(OptionMenuTest::clickAtPositionAndWaitUntilOptionMenuShown):
(OptionMenuTest::close):
(OptionMenuTest::activateItem):
(OptionMenuTest::selectItem):
(testOptionMenuSimple):
(testOptionMenuGroups):
(testOptionMenuActivate):
(testOptionMenuSelect):
(beforeAll):
(afterAll):

Location:
trunk
Files:
9 added
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r218324 r218325  
     12017-06-15  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK] Add API to allow overriding popup menus
     4        https://bugs.webkit.org/show_bug.cgi?id=172905
     5
     6        Reviewed by Michael Catanzaro.
     7
     8        The GTK+ API uses GTK+ for the default implementation of several UI elements like the file chooser, print dialog,
     9        color picker, context menu, etc. but in all those cases it allows to override the default implementation. It's
     10        not possible to override the popup menu used for select elements. This patch adds WebKitOptionMenu to represent
     11        a select dropdown menu. It's passed as an argument of the new signal WebKitWebView::show-option-menu, and
     12        contains WebKitOptionMenuItem elements representing the items to be displayed.
     13
     14        * PlatformGTK.cmake:
     15        * UIProcess/API/gtk/PageClientImpl.cpp:
     16        (WebKit::PageClientImpl::createPopupMenuProxy): Create a WebKitPopupMenu.
     17        * UIProcess/API/gtk/WebKitOptionMenu.cpp: Added.
     18        (webkitOptionMenuCreate):
     19        (webkit_option_menu_get_n_items):
     20        (webkit_option_menu_get_item):
     21        (webkit_option_menu_select_item):
     22        (webkit_option_menu_activate_item):
     23        (webkit_option_menu_close):
     24        * UIProcess/API/gtk/WebKitOptionMenu.h: Added.
     25        * UIProcess/API/gtk/WebKitOptionMenuItem.cpp: Added.
     26        (webkit_option_menu_item_copy):
     27        (webkit_option_menu_item_free):
     28        (webkit_option_menu_item_get_label):
     29        (webkit_option_menu_item_get_tooltip):
     30        (webkit_option_menu_item_is_group_label):
     31        (webkit_option_menu_item_is_group_child):
     32        (webkit_option_menu_item_is_enabled):
     33        (webkit_option_menu_item_is_selected):
     34        * UIProcess/API/gtk/WebKitOptionMenuItem.h: Added.
     35        * UIProcess/API/gtk/WebKitOptionMenuItemPrivate.h: Added.
     36        (_WebKitOptionMenuItem::_WebKitOptionMenuItem):
     37        * UIProcess/API/gtk/WebKitOptionMenuPrivate.h: Added.
     38        * UIProcess/API/gtk/WebKitPopupMenu.cpp: Added.
     39        (WebKit::WebKitPopupMenu::WebKitPopupMenu):
     40        (WebKit::menuCloseCallback):
     41        (WebKit::WebKitPopupMenu::showPopupMenu): Call webkitWebViewShowOptionMenu() falling back to default
     42        implementation if the user didn't handle the signal.
     43        (WebKit::WebKitPopupMenu::hidePopupMenu):
     44        (WebKit::WebKitPopupMenu::cancelTracking):
     45        (WebKit::WebKitPopupMenu::selectItem):
     46        (WebKit::WebKitPopupMenu::activateItem):
     47        * UIProcess/API/gtk/WebKitPopupMenu.h: Added.
     48        * UIProcess/API/gtk/WebKitWebView.cpp:
     49        (webkit_web_view_class_init):
     50        (webkitWebViewShowOptionMenu): Emit WebKitWebView::show-option-menu.
     51        * UIProcess/API/gtk/WebKitWebView.h:
     52        * UIProcess/API/gtk/WebKitWebViewPrivate.h:
     53        * UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt: Add new symbols.
     54        * UIProcess/API/gtk/docs/webkit2gtk-4.0.types: Add new get_type functions.
     55        * UIProcess/API/gtk/docs/webkit2gtk-docs.sgml: Add new sections.
     56        * UIProcess/API/gtk/webkit2.h: Add new public headers.
     57        * UIProcess/gtk/WebPopupMenuProxyGtk.cpp:
     58        (WebKit::WebPopupMenuProxyGtk::WebPopupMenuProxyGtk): Do not create the GtkMenu in constructor.
     59        (WebKit::WebPopupMenuProxyGtk::showPopupMenu): Create the GtkMenu and connect to the signals here.
     60        (WebKit::WebPopupMenuProxyGtk::hidePopupMenu): Return early if the Gtk hasn't been shown.
     61        * UIProcess/gtk/WebPopupMenuProxyGtk.h: Make constructor and webview protected.
     62
    1632017-06-14  Carlos Garcia Campos  <cgarcia@igalia.com>
    264
  • trunk/Source/WebKit2/PlatformGTK.cmake

    r218089 r218325  
    213213    UIProcess/API/gtk/WebKitNotificationProvider.cpp
    214214    UIProcess/API/gtk/WebKitNotificationProvider.h
     215    UIProcess/API/gtk/WebKitOptionMenu.cpp
     216    UIProcess/API/gtk/WebKitOptionMenu.h
     217    UIProcess/API/gtk/WebKitOptionMenuPrivate.h
     218    UIProcess/API/gtk/WebKitOptionMenuItem.cpp
     219    UIProcess/API/gtk/WebKitOptionMenuItem.h
     220    UIProcess/API/gtk/WebKitOptionMenuItemPrivate.h
    215221    UIProcess/API/gtk/WebKitPermissionRequest.cpp
    216222    UIProcess/API/gtk/WebKitPermissionRequest.h
     
    223229    UIProcess/API/gtk/WebKitPolicyDecision.h
    224230    UIProcess/API/gtk/WebKitPolicyDecisionPrivate.h
     231    UIProcess/API/gtk/WebKitPopupMenu.cpp
    225232    UIProcess/API/gtk/WebKitPrintCustomWidget.cpp
    226233    UIProcess/API/gtk/WebKitPrintCustomWidget.h
     
    561568    ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitNotificationPermissionRequest.h
    562569    ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitNotification.h
     570    ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitOptionMenu.h
     571    ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitOptionMenuItem.h
    563572    ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitPermissionRequest.h
    564573    ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitPlugin.h
  • trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp

    r218064 r218325  
    3838#include "WebEventFactory.h"
    3939#include "WebKitColorChooser.h"
     40#include "WebKitPopupMenu.h"
    4041#include "WebKitWebViewBasePrivate.h"
    4142#include "WebKitWebViewPrivate.h"
    4243#include "WebPageProxy.h"
    43 #include "WebPopupMenuProxyGtk.h"
    4444#include "WebProcessPool.h"
    4545#include <WebCore/CairoUtilities.h>
     
    207207RefPtr<WebPopupMenuProxy> PageClientImpl::createPopupMenuProxy(WebPageProxy& page)
    208208{
    209     return WebPopupMenuProxyGtk::create(m_viewWidget, page);
     209    return WebKitPopupMenu::create(m_viewWidget, page);
    210210}
    211211
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp

    r218098 r218325  
    138138    RUN_COLOR_CHOOSER,
    139139
     140    SHOW_OPTION_MENU,
     141
    140142    LAST_SIGNAL
    141143};
     
    18841886        G_TYPE_BOOLEAN, 1,
    18851887        WEBKIT_TYPE_COLOR_CHOOSER_REQUEST);
     1888
     1889    /**
     1890     * WebKitWebView::show-option-menu:
     1891     * @web_view: the #WebKitWebView on which the signal is emitted
     1892     * @menu: the #WebKitOptionMenu
     1893     * @event: the #GdkEvent that triggered the menu, or %NULL
     1894     * @rectangle: the option element area
     1895     *
     1896     * This signal is emitted when a select element in @web_view needs to display a
     1897     * dropdown menu. This signal can be used to show a custom menu, using @menu to get
     1898     * the details of all items that should be displayed. The area of the element in the
     1899     * #WebKitWebView is given as @rectangle parameter, it can be used to position the
     1900     * menu. If this was triggered by a user interaction, like a mouse click,
     1901     * @event parameter provides the #GdkEvent.
     1902     * To handle this signal asynchronously you should keep a ref of the @menu.
     1903     *
     1904     * The default signal handler will pop up a #GtkMenu.
     1905     *
     1906     * Returns: %TRUE to stop other handlers from being invoked for the event.
     1907     *   %FALSE to propagate the event further.
     1908     *
     1909     * Since: 2.18.
     1910     */
     1911    signals[SHOW_OPTION_MENU] = g_signal_new(
     1912        "show-option-menu",
     1913        G_TYPE_FROM_CLASS(webViewClass),
     1914        G_SIGNAL_RUN_LAST,
     1915        G_STRUCT_OFFSET(WebKitWebViewClass, show_option_menu),
     1916        g_signal_accumulator_true_handled, nullptr,
     1917        g_cclosure_marshal_generic,
     1918        G_TYPE_BOOLEAN, 3,
     1919        WEBKIT_TYPE_OPTION_MENU,
     1920        GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE,
     1921        GDK_TYPE_RECTANGLE | G_SIGNAL_TYPE_STATIC_SCOPE);
    18861922}
    18871923
     
    22112247{
    22122248    return webView->priv->websiteDataManager.get();
     2249}
     2250
     2251bool webkitWebViewShowOptionMenu(WebKitWebView* webView, const IntRect& rect, WebKitOptionMenu* menu, const GdkEvent* event)
     2252{
     2253    GdkRectangle menuRect = rect;
     2254    gboolean handled;
     2255    g_signal_emit(webView, signals[SHOW_OPTION_MENU], 0, menu, event, &menuRect, &handled);
     2256    return handled;
    22132257}
    22142258
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h

    r216006 r218325  
    4343#include <webkit2/WebKitNavigationAction.h>
    4444#include <webkit2/WebKitNotification.h>
     45#include <webkit2/WebKitOptionMenu.h>
    4546#include <webkit2/WebKitPermissionRequest.h>
    4647#include <webkit2/WebKitPolicyDecision.h>
     
    250251    gboolean   (* run_color_chooser)           (WebKitWebView               *web_view,
    251252                                                WebKitColorChooserRequest   *request);
     253    gboolean   (* show_option_menu)            (WebKitWebView               *web_view,
     254                                                GdkRectangle                *rectangle,
     255                                                WebKitOptionMenu            *menu);
    252256
    253257    void (*_webkit_reserved0) (void);
    254258    void (*_webkit_reserved1) (void);
    255259    void (*_webkit_reserved2) (void);
    256     void (*_webkit_reserved3) (void);
    257260};
    258261
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewPrivate.h

    r218098 r218325  
    3535#include "WebKitWebView.h"
    3636#include "WebPageProxy.h"
     37#include <WebCore/IntRect.h>
    3738#include <wtf/text/CString.h>
    3839
     
    7374void webkitWebViewRequestInstallMissingMediaPlugins(WebKitWebView*, WebKit::InstallMissingMediaPluginsPermissionRequest&);
    7475WebKitWebsiteDataManager* webkitWebViewGetWebsiteDataManager(WebKitWebView*);
     76bool webkitWebViewShowOptionMenu(WebKitWebView*, const WebCore::IntRect&, WebKitOptionMenu*, const GdkEvent*);
  • trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt

    r217209 r218325  
    11771177
    11781178<SECTION>
     1179<FILE>WebKitOptionMenu</FILE>
     1180WebKitOptionMenu
     1181webkit_option_menu_get_n_items
     1182webkit_option_menu_get_item
     1183webkit_option_menu_select_item
     1184webkit_option_menu_activate_item
     1185webkit_option_menu_close
     1186
     1187<SUBSECTION Standard>
     1188WebKitOptionMenuClass
     1189WEBKIT_TYPE_OPTION_MENU
     1190WEBKIT_OPTION_MENU
     1191WEBKIT_IS_OPTION_MENU
     1192WEBKIT_OPTION_MENU_CLASS
     1193WEBKIT_IS_OPTION_MENU_CLASS
     1194WEBKIT_OPTION_MENU_GET_CLASS
     1195
     1196<SUBSECTION Private>
     1197WebKitOptionMenuPrivate
     1198webkit_option_menu_get_type
     1199</SECTION>
     1200
     1201<SECTION>
     1202<FILE>WebKitOptionMenuItem</FILE>
     1203WebKitOptionMenuItem
     1204webkit_option_menu_item_copy
     1205webkit_option_menu_item_free
     1206webkit_option_menu_item_get_label
     1207webkit_option_menu_item_get_tooltip
     1208webkit_option_menu_item_is_group_label
     1209webkit_option_menu_item_is_group_child
     1210webkit_option_menu_item_is_enabled
     1211webkit_option_menu_item_is_selected
     1212
     1213<SUBSECTION Standard>
     1214WEBKIT_TYPE_OPTION_MENU_ITEM
     1215
     1216<SUBSECTION Private>
     1217webkit_option_menu_item_get_type
     1218</SECTION>
     1219
     1220<SECTION>
    11791221<FILE>WebKitFormSubmissionRequest</FILE>
    11801222WebKitFormSubmissionRequest
  • trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0.types

    r216006 r218325  
    3737webkit_print_custom_widget_get_type
    3838webkit_automation_session_get_type
     39webkit_option_menu_get_type
     40webkit_option_menu_item_get_type
  • trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-docs.sgml

    r216006 r218325  
    4747    <xi:include href="xml/WebKitContextMenu.xml"/>
    4848    <xi:include href="xml/WebKitContextMenuItem.xml"/>
     49    <xi:include href="xml/WebKitOptionMenu.xml"/>
     50    <xi:include href="xml/WebKitOptionMenuItem.xml"/>
    4951    <xi:include href="xml/WebKitFormSubmissionRequest.xml"/>
    5052    <xi:include href="xml/WebKitSecurityManager.xml"/>
  • trunk/Source/WebKit2/UIProcess/API/gtk/webkit2.h

    r216006 r218325  
    5858#include <webkit2/WebKitNotification.h>
    5959#include <webkit2/WebKitNotificationPermissionRequest.h>
     60#include <webkit2/WebKitOptionMenu.h>
     61#include <webkit2/WebKitOptionMenuItem.h>
    6062#include <webkit2/WebKitPermissionRequest.h>
    6163#include <webkit2/WebKitPlugin.h>
  • trunk/Source/WebKit2/UIProcess/gtk/WebPopupMenuProxyGtk.cpp

    r215225 r218325  
    4242    : WebPopupMenuProxy(client)
    4343    , m_webView(webView)
    44     , m_popup(gtk_menu_new())
    4544    , m_dismissMenuTimer(RunLoop::main(), this, &WebPopupMenuProxyGtk::dismissMenuTimerFired)
    4645{
    47     g_signal_connect(m_popup, "key-press-event", G_CALLBACK(keyPressEventCallback), this);
    48     g_signal_connect(m_popup, "unmap", G_CALLBACK(menuUnmappedCallback), this);
    4946}
    5047
     
    8986void WebPopupMenuProxyGtk::showPopupMenu(const IntRect& rect, TextDirection, double /* pageScaleFactor */, const Vector<WebPopupItem>& items, const PlatformPopupMenuData&, int32_t selectedIndex)
    9087{
    91     m_dismissMenuTimer.stop();
     88    ASSERT(!m_popup);
     89    m_popup = gtk_menu_new();
     90    g_signal_connect(m_popup, "key-press-event", G_CALLBACK(keyPressEventCallback), this);
     91    g_signal_connect(m_popup, "unmap", G_CALLBACK(menuUnmappedCallback), this);
    9292
    9393    populatePopupMenu(items);
     
    179179void WebPopupMenuProxyGtk::hidePopupMenu()
    180180{
     181    if (!m_popup)
     182        return;
     183
    181184    gtk_menu_popdown(GTK_MENU(m_popup));
    182185    resetTypeAheadFindState();
  • trunk/Source/WebKit2/UIProcess/gtk/WebPopupMenuProxyGtk.h

    r202611 r218325  
    4949    void cancelTracking() override;
    5050
    51 private:
     51protected:
    5252    WebPopupMenuProxyGtk(GtkWidget*, WebPopupMenuProxy::Client&);
    5353
     54    GtkWidget* m_webView { nullptr };
     55
     56private:
    5457    void setCurrentlySelectedMenuItem(GtkWidget* item) { m_currentlySelectedMenuItem = item; }
    5558    GtkAction* createGtkActionForMenuItem(const WebPopupItem&, int itemIndex);
     
    6568    static void menuUnmappedCallback(GtkWidget*, WebPopupMenuProxyGtk*);
    6669
    67     GtkWidget* m_webView { nullptr };
    6870    GtkWidget* m_popup { nullptr };
    6971
  • trunk/Tools/ChangeLog

    r218320 r218325  
     12017-06-15  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK] Add API to allow overriding popup menus
     4        https://bugs.webkit.org/show_bug.cgi?id=172905
     5
     6        Reviewed by Michael Catanzaro.
     7
     8        Add a unit test to check the new API.
     9
     10        * TestWebKitAPI/Tests/WebKit2Gtk/CMakeLists.txt:
     11        * TestWebKitAPI/Tests/WebKit2Gtk/TestOptionMenu.cpp: Added.
     12        (OptionMenuTest::OptionMenuTest):
     13        (OptionMenuTest::~OptionMenuTest):
     14        (OptionMenuTest::destroyMenu):
     15        (OptionMenuTest::showOptionMenuCallback):
     16        (OptionMenuTest::menuCloseCallback):
     17        (OptionMenuTest::showOptionMenu):
     18        (OptionMenuTest::clickAtPositionAndWaitUntilOptionMenuShown):
     19        (OptionMenuTest::close):
     20        (OptionMenuTest::activateItem):
     21        (OptionMenuTest::selectItem):
     22        (testOptionMenuSimple):
     23        (testOptionMenuGroups):
     24        (testOptionMenuActivate):
     25        (testOptionMenuSelect):
     26        (beforeAll):
     27        (afterAll):
     28
    1292017-06-15  Fujii Hironori  <Hironori.Fujii@sony.com>
    230
  • trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/CMakeLists.txt

    r216006 r218325  
    115115ADD_WK2_TEST(TestLoaderClient TestLoaderClient.cpp)
    116116ADD_WK2_TEST(TestMultiprocess TestMultiprocess.cpp)
     117ADD_WK2_TEST(TestOptionMenu TestOptionMenu.cpp)
    117118ADD_WK2_TEST(TestPrinting TestPrinting.cpp)
    118119ADD_WK2_TEST(TestResources TestResources.cpp)
Note: See TracChangeset for help on using the changeset viewer.