Changeset 122961 in webkit


Ignore:
Timestamp:
Jul 18, 2012 6:39:26 AM (12 years ago)
Author:
Carlos Garcia Campos
Message:

[GTK] Add WebKitWebView::submit-form signal to WebKit2 GTK+ API
https://bugs.webkit.org/show_bug.cgi?id=91605

Reviewed by Gustavo Noronha Silva.

The signal is emitted when a form is about to submitted, with a
form submission request that can be used to get the text fields
and to continue the form submission wheh done.

  • GNUmakefile.list.am: Add new files to compilation.
  • UIProcess/API/gtk/WebKitFormClient.cpp: Added.

(willSubmitForm): Create a WebKitFormSubmissionRequest and call
webkitWebViewSubmitFormRequest() with the request.
(attachFormClientToView): Add impementation for willSubmitForm
callback.

  • UIProcess/API/gtk/WebKitFormClient.h: Added.
  • UIProcess/API/gtk/WebKitFormSubmissionRequest.cpp: Added.

(webkit_form_submission_request_init):
(webkitFormSubmissionRequestFinalize):
(webkit_form_submission_request_class_init):
(webkitFormSubmissionRequestCreate): Create a new
WebKitFormSubmissionRequest for the given values dictionary and
submission listener.
(webkit_form_submission_request_get_text_fields): Create a
GHashTable with the text fields values and return it.
(webkit_form_submission_request_submit): Continue the form
submission.

  • UIProcess/API/gtk/WebKitFormSubmissionRequest.h: Added.
  • UIProcess/API/gtk/WebKitFormSubmissionRequestPrivate.h: Added.
  • UIProcess/API/gtk/WebKitWebView.cpp:

(webkitWebViewConstructed): Attach web view to form client.
(webkit_web_view_class_init): Add WebKitWebView::submit-form
signal.
(webkitWebViewSubmitFormRequest): Emit WebKitWebView::submit-form
signal.

  • UIProcess/API/gtk/WebKitWebView.h:
  • UIProcess/API/gtk/WebKitWebViewPrivate.h:
  • UIProcess/API/gtk/docs/webkit2gtk-docs.sgml: Add new section for

WebKitFormSubmissionRequest.

  • UIProcess/API/gtk/docs/webkit2gtk-sections.txt: Add new symbols.
  • UIProcess/API/gtk/tests/TestWebKitWebView.cpp:

(testWebViewSubmitForm):
(beforeAll):

  • UIProcess/API/gtk/webkit2.h: Include

WebKitFormSubmissionRequest.h.

Location:
trunk/Source/WebKit2
Files:
5 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r122960 r122961  
     12012-07-18  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK] Add WebKitWebView::submit-form signal to WebKit2 GTK+ API
     4        https://bugs.webkit.org/show_bug.cgi?id=91605
     5
     6        Reviewed by Gustavo Noronha Silva.
     7
     8        The signal is emitted when a form is about to submitted, with a
     9        form submission request that can be used to get the text fields
     10        and to continue the form submission wheh done.
     11
     12        * GNUmakefile.list.am: Add new files to compilation.
     13        * UIProcess/API/gtk/WebKitFormClient.cpp: Added.
     14        (willSubmitForm): Create a WebKitFormSubmissionRequest and call
     15        webkitWebViewSubmitFormRequest() with the request.
     16        (attachFormClientToView): Add impementation for willSubmitForm
     17        callback.
     18        * UIProcess/API/gtk/WebKitFormClient.h: Added.
     19        * UIProcess/API/gtk/WebKitFormSubmissionRequest.cpp: Added.
     20        (webkit_form_submission_request_init):
     21        (webkitFormSubmissionRequestFinalize):
     22        (webkit_form_submission_request_class_init):
     23        (webkitFormSubmissionRequestCreate): Create a new
     24        WebKitFormSubmissionRequest for the given values dictionary and
     25        submission listener.
     26        (webkit_form_submission_request_get_text_fields): Create a
     27        GHashTable with the text fields values and return it.
     28        (webkit_form_submission_request_submit): Continue the form
     29        submission.
     30        * UIProcess/API/gtk/WebKitFormSubmissionRequest.h: Added.
     31        * UIProcess/API/gtk/WebKitFormSubmissionRequestPrivate.h: Added.
     32        * UIProcess/API/gtk/WebKitWebView.cpp:
     33        (webkitWebViewConstructed): Attach web view to form client.
     34        (webkit_web_view_class_init): Add WebKitWebView::submit-form
     35        signal.
     36        (webkitWebViewSubmitFormRequest): Emit WebKitWebView::submit-form
     37        signal.
     38        * UIProcess/API/gtk/WebKitWebView.h:
     39        * UIProcess/API/gtk/WebKitWebViewPrivate.h:
     40        * UIProcess/API/gtk/docs/webkit2gtk-docs.sgml: Add new section for
     41        WebKitFormSubmissionRequest.
     42        * UIProcess/API/gtk/docs/webkit2gtk-sections.txt: Add new symbols.
     43        * UIProcess/API/gtk/tests/TestWebKitWebView.cpp:
     44        (testWebViewSubmitForm):
     45        (beforeAll):
     46        * UIProcess/API/gtk/webkit2.h: Include
     47        WebKitFormSubmissionRequest.h.
     48
    1492012-07-18  Carlos Garcia Campos  <cgarcia@igalia.com>
    250
  • trunk/Source/WebKit2/GNUmakefile.list.am

    r122547 r122961  
    105105        $(WebKit2)/UIProcess/API/gtk/WebKitFileChooserRequest.h \
    106106        $(WebKit2)/UIProcess/API/gtk/WebKitFindController.h \
     107        $(WebKit2)/UIProcess/API/gtk/WebKitFormSubmissionRequest.h \
    107108        $(WebKit2)/UIProcess/API/gtk/WebKitGeolocationPermissionRequest.h \
    108109        $(WebKit2)/UIProcess/API/gtk/WebKitHitTestResult.h \
     
    638639        Source/WebKit2/UIProcess/API/gtk/WebKitFileChooserRequest.h \
    639640        Source/WebKit2/UIProcess/API/gtk/WebKitFileChooserRequestPrivate.h \
     641        Source/WebKit2/UIProcess/API/gtk/WebKitFormSubmissionRequest.cpp \
     642        Source/WebKit2/UIProcess/API/gtk/WebKitFormSubmissionRequest.h \
     643        Source/WebKit2/UIProcess/API/gtk/WebKitFormSubmissionRequestPrivate.h \
     644        Source/WebKit2/UIProcess/API/gtk/WebKitFormClient.cpp \
     645        Source/WebKit2/UIProcess/API/gtk/WebKitFormClient.h \
    640646        Source/WebKit2/UIProcess/API/gtk/WebKitFullscreenClient.cpp \
    641647        Source/WebKit2/UIProcess/API/gtk/WebKitFullscreenClient.h \
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp

    r122960 r122961  
    3030#include "WebKitEnumTypes.h"
    3131#include "WebKitError.h"
     32#include "WebKitFormClient.h"
    3233#include "WebKitFullscreenClient.h"
    3334#include "WebKitHitTestResultPrivate.h"
     
    9192    CONTEXT_MENU_DISMISSED,
    9293
     94    SUBMIT_FORM,
     95
    9396    LAST_SIGNAL
    9497};
     
    326329    attachFullScreenClientToView(webView);
    327330    attachContextMenuClientToView(webView);
     331    attachFormClientToView(webView);
    328332
    329333    WebPageProxy* page = webkitWebViewBaseGetPage(webViewBase);
     
    10611065                     g_cclosure_marshal_VOID__VOID,
    10621066                     G_TYPE_NONE, 0);
     1067
     1068    /**
     1069     * WebKitWebView::submit-form:
     1070     * @web_view: the #WebKitWebView on which the signal is emitted
     1071     * @request: a #WebKitFormSubmissionRequest
     1072     *
     1073     * This signal is emitted when a form is about to be submitted. The @request
     1074     * argument passed contains information about the text fields of the form. This
     1075     * is typically used to store login information that can be used later to
     1076     * pre-fill the form.
     1077     * The form will not be submitted until webkit_form_submission_request_submit() is called.
     1078     *
     1079     * It is possible to handle the form submission request asynchronously, by
     1080     * simply calling g_object_ref() on the @request argument and calling
     1081     * webkit_form_submission_request_submit() when done to continue with the form submission.
     1082     * If the last reference is removed on a #WebKitFormSubmissionRequest and the
     1083     * form has not been submitted, webkit_form_submission_request_submit() will be called.
     1084     */
     1085    signals[SUBMIT_FORM] =
     1086        g_signal_new("submit-form",
     1087                     G_TYPE_FROM_CLASS(webViewClass),
     1088                     G_SIGNAL_RUN_LAST,
     1089                     G_STRUCT_OFFSET(WebKitWebViewClass, submit_form),
     1090                     0, 0,
     1091                     g_cclosure_marshal_VOID__OBJECT,
     1092                     G_TYPE_NONE, 1,
     1093                     WEBKIT_TYPE_FORM_SUBMISSION_REQUEST);
    10631094}
    10641095
     
    13871418    // Clear the menu to make sure it's useless after signal emission.
    13881419    webkit_context_menu_remove_all(contextMenu.get());
     1420}
     1421
     1422void webkitWebViewSubmitFormRequest(WebKitWebView* webView, WebKitFormSubmissionRequest* request)
     1423{
     1424    g_signal_emit(webView, signals[SUBMIT_FORM], 0, request);
    13891425}
    13901426
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h

    r121771 r122961  
    3434#include <webkit2/WebKitFileChooserRequest.h>
    3535#include <webkit2/WebKitFindController.h>
     36#include <webkit2/WebKitFormSubmissionRequest.h>
    3637#include <webkit2/WebKitHitTestResult.h>
    3738#include <webkit2/WebKitJavascriptResult.h>
     
    128129    WebKitWebViewBaseClass parent;
    129130
    130     void       (* load_changed)           (WebKitWebView             *web_view,
    131                                            WebKitLoadEvent            load_event);
    132     gboolean   (* load_failed)            (WebKitWebView             *web_view,
    133                                            WebKitLoadEvent            load_event,
    134                                            const gchar               *failing_uri,
    135                                            GError                    *error);
    136 
    137     GtkWidget *(* create)                 (WebKitWebView             *web_view);
    138     void       (* ready_to_show)          (WebKitWebView             *web_view);
    139     void       (* run_as_modal)           (WebKitWebView             *web_view);
    140     void       (* close)                  (WebKitWebView             *web_view);
    141 
    142     gboolean   (* script_dialog)          (WebKitWebView             *web_view,
    143                                            WebKitScriptDialog        *dialog);
    144 
    145     gboolean   (* decide_policy)          (WebKitWebView             *web_view,
    146                                            WebKitPolicyDecision      *decision,
    147                                            WebKitPolicyDecisionType   type);
    148     gboolean   (* permission_request)     (WebKitWebView             *web_view,
    149                                            WebKitPermissionRequest   *permission_request);
    150     void       (* mouse_target_changed)   (WebKitWebView             *web_view,
    151                                            WebKitHitTestResult       *hit_test_result,
    152                                            guint                      modifiers);
    153     gboolean   (* print_requested)        (WebKitWebView             *web_view,
    154                                            WebKitPrintOperation      *print_operation);
    155     void       (* resource_load_started)  (WebKitWebView             *web_view,
    156                                            WebKitWebResource         *resource,
    157                                            WebKitURIRequest          *request);
    158     gboolean   (* enter_fullscreen)       (WebKitWebView             *web_view);
    159     gboolean   (* leave_fullscreen)       (WebKitWebView             *web_view);
    160     gboolean   (* run_file_chooser)       (WebKitWebView             *web_view,
    161                                            WebKitFileChooserRequest  *request);
    162     gboolean   (* context_menu)           (WebKitWebView             *web_view,
    163                                            WebKitContextMenu         *context_menu,
    164                                            GdkEvent                  *event,
    165                                            WebKitHitTestResult       *hit_test_result);
    166     void       (* context_menu_dismissed) (WebKitWebView             *web_view);
     131    void       (* load_changed)           (WebKitWebView               *web_view,
     132                                           WebKitLoadEvent              load_event);
     133    gboolean   (* load_failed)            (WebKitWebView               *web_view,
     134                                           WebKitLoadEvent              load_event,
     135                                           const gchar                 *failing_uri,
     136                                           GError                      *error);
     137
     138    GtkWidget *(* create)                 (WebKitWebView               *web_view);
     139    void       (* ready_to_show)          (WebKitWebView               *web_view);
     140    void       (* run_as_modal)           (WebKitWebView               *web_view);
     141    void       (* close)                  (WebKitWebView               *web_view);
     142
     143    gboolean   (* script_dialog)          (WebKitWebView               *web_view,
     144                                           WebKitScriptDialog          *dialog);
     145
     146    gboolean   (* decide_policy)          (WebKitWebView               *web_view,
     147                                           WebKitPolicyDecision        *decision,
     148                                           WebKitPolicyDecisionType     type);
     149    gboolean   (* permission_request)     (WebKitWebView               *web_view,
     150                                           WebKitPermissionRequest     *permission_request);
     151    void       (* mouse_target_changed)   (WebKitWebView               *web_view,
     152                                           WebKitHitTestResult         *hit_test_result,
     153                                           guint                        modifiers);
     154    gboolean   (* print_requested)        (WebKitWebView               *web_view,
     155                                           WebKitPrintOperation        *print_operation);
     156    void       (* resource_load_started)  (WebKitWebView               *web_view,
     157                                           WebKitWebResource           *resource,
     158                                           WebKitURIRequest            *request);
     159    gboolean   (* enter_fullscreen)       (WebKitWebView               *web_view);
     160    gboolean   (* leave_fullscreen)       (WebKitWebView               *web_view);
     161    gboolean   (* run_file_chooser)       (WebKitWebView               *web_view,
     162                                           WebKitFileChooserRequest    *request);
     163    gboolean   (* context_menu)           (WebKitWebView               *web_view,
     164                                           WebKitContextMenu           *context_menu,
     165                                           GdkEvent                    *event,
     166                                           WebKitHitTestResult         *hit_test_result);
     167    void       (* context_menu_dismissed) (WebKitWebView               *web_view);
     168    void       (* submit_form)            (WebKitWebView               *web_view,
     169                                           WebKitFormSubmissionRequest *request);
    167170
    168171    /* Padding for future expansion */
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewPrivate.h

    r120908 r122961  
    5656bool webkitWebViewLeaveFullScreen(WebKitWebView*);
    5757void webkitWebViewPopulateContextMenu(WebKitWebView*, WKArrayRef proposedMenu, WKHitTestResultRef);
     58void webkitWebViewSubmitFormRequest(WebKitWebView*, WebKitFormSubmissionRequest*);
    5859
    5960#endif // WebKitWebViewPrivate_h
  • trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-docs.sgml

    r121093 r122961  
    4040    <xi:include href="xml/WebKitContextMenu.xml"/>
    4141    <xi:include href="xml/WebKitContextMenuItem.xml"/>
     42    <xi:include href="xml/WebKitFormSubmissionRequest.xml"/>
    4243  </chapter>
    4344
  • trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt

    r122547 r122961  
    815815webkit_context_menu_item_get_type
    816816</SECTION>
     817
     818<SECTION>
     819<FILE>WebKitFormSubmissionRequest</FILE>
     820WebKitFormSubmissionRequest
     821webkit_form_submission_request_get_text_fields
     822webkit_form_submission_request_submit
     823
     824<SUBSECTION Standard>
     825WebKitFormSubmissionRequestClass
     826WEBKIT_TYPE_FORM_SUBMISSION_REQUEST
     827WEBKIT_FORM_SUBMISSION_REQUEST
     828WEBKIT_IS_FORM_SUBMISSION_REQUEST
     829WEBKIT_FORM_SUBMISSION_REQUEST_CLASS
     830WEBKIT_IS_FORM_SUBMISSION_REQUEST_CLASS
     831WEBKIT_FORM_SUBMISSION_REQUEST_GET_CLASS
     832
     833<SUBSECTION Private>
     834WebKitFormSubmissionRequestPrivate
     835webkit_form_submission_request_get_type
     836</SECTION>
  • trunk/Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebView.cpp

    r121143 r122961  
    866866}
    867867
     868class FormClientTest: public WebViewTest {
     869public:
     870    MAKE_GLIB_TEST_FIXTURE(FormClientTest);
     871
     872    static void submitFormCallback(WebKitWebView*, WebKitFormSubmissionRequest* request, FormClientTest* test)
     873    {
     874        test->submitForm(request);
     875    }
     876
     877    FormClientTest()
     878        : m_submitPositionX(0)
     879        , m_submitPositionY(0)
     880    {
     881        g_signal_connect(m_webView, "submit-form", G_CALLBACK(submitFormCallback), this);
     882    }
     883
     884    ~FormClientTest()
     885    {
     886        g_signal_handlers_disconnect_matched(m_webView, G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, this);
     887    }
     888
     889    void submitForm(WebKitFormSubmissionRequest* request)
     890    {
     891        assertObjectIsDeletedWhenTestFinishes(G_OBJECT(request));
     892        m_request = request;
     893        webkit_form_submission_request_submit(request);
     894        quitMainLoop();
     895    }
     896
     897    GHashTable* waitUntilFormSubmittedAndGetTextFields()
     898    {
     899        g_main_loop_run(m_mainLoop);
     900        return webkit_form_submission_request_get_text_fields(m_request.get());
     901    }
     902
     903    static gboolean doClickIdleCallback(FormClientTest* test)
     904    {
     905        test->clickMouseButton(test->m_submitPositionX, test->m_submitPositionY, 1);
     906        return FALSE;
     907    }
     908
     909    void submitFormAtPosition(int x, int y)
     910    {
     911        m_submitPositionX = x;
     912        m_submitPositionY = y;
     913        g_idle_add(reinterpret_cast<GSourceFunc>(doClickIdleCallback), this);
     914    }
     915
     916    int m_submitPositionX;
     917    int m_submitPositionY;
     918    GRefPtr<WebKitFormSubmissionRequest> m_request;
     919};
     920
     921static void testWebViewSubmitForm(FormClientTest* test, gconstpointer)
     922{
     923    test->showInWindowAndWaitUntilMapped();
     924
     925    const char* formHTML =
     926        "<html><body>"
     927        " <form action='#'>"
     928        "  <input type='text' name='text1' value='value1'>"
     929        "  <input type='text' name='text2' value='value2'>"
     930        "  <input type='password' name='password' value='secret'>"
     931        "  <textarea cols='5' rows='5' name='textarea'>Text</textarea>"
     932        "  <input type='hidden' name='hidden1' value='hidden1'>"
     933        "  <input type='submit' value='Submit' style='position:absolute; left:1; top:1' size='10'>"
     934        " </form>"
     935        "</body></html>";
     936
     937    test->loadHtml(formHTML, "file:///");
     938    test->waitUntilLoadFinished();
     939
     940    test->submitFormAtPosition(5, 5);
     941    GHashTable* values = test->waitUntilFormSubmittedAndGetTextFields();
     942    g_assert(values);
     943    g_assert_cmpuint(g_hash_table_size(values), ==, 3);
     944    g_assert_cmpstr(static_cast<char*>(g_hash_table_lookup(values, "text1")), ==, "value1");
     945    g_assert_cmpstr(static_cast<char*>(g_hash_table_lookup(values, "text2")), ==, "value2");
     946    g_assert_cmpstr(static_cast<char*>(g_hash_table_lookup(values, "password")), ==, "secret");
     947}
     948
    868949void beforeAll()
    869950{
     
    884965    FullScreenClientTest::add("WebKitWebView", "fullscreen", testWebViewFullScreen);
    885966    WebViewTest::add("WebKitWebView", "can-show-mime-type", testWebViewCanShowMIMEType);
     967    FormClientTest::add("WebKitWebView", "submit-form", testWebViewSubmitForm);
    886968}
    887969
  • trunk/Source/WebKit2/UIProcess/API/gtk/webkit2.h

    r121093 r122961  
    3737#include <webkit2/WebKitFileChooserRequest.h>
    3838#include <webkit2/WebKitFindController.h>
     39#include <webkit2/WebKitFormSubmissionRequest.h>
    3940#include <webkit2/WebKitGeolocationPermissionRequest.h>
    4041#include <webkit2/WebKitHitTestResult.h>
Note: See TracChangeset for help on using the changeset viewer.