Changeset 120918 in webkit


Ignore:
Timestamp:
Jun 21, 2012 5:08:36 AM (12 years ago)
Author:
commit-queue@webkit.org
Message:

[GTK] Backport run-file-chooser to WebKit1
https://bugs.webkit.org/show_bug.cgi?id=87283

Patch by Daniel Drake <dsd@laptop.org> on 2012-06-21
Reviewed by Gustavo Noronha Silva.

This is a relatively straightforward backport of Mario Sanchez
Prada's WebKit2 run-file-chooser signal work, intended for use by
OLPC and others who are not quite ready to move to WebKit2.

Add a new public class to the API, WebKitFileChooserRequest, to be
emitted along with a new WebKitWebView::run-file-chooser signal to
let client applications to provide their own file chooser dialog
when the use interacts with HTML Input elements of type 'file'.

  • GNUmakefile.am: Added new source files and headers.
  • webkit/webkitfilechooserrequest.cpp: Added.

(_WebKitFileChooserRequestPrivate):
(webkit_file_chooser_request_init):
(webkit_file_chooser_request_finalize):
(webkit_file_chooser_request_get_property):
(webkit_file_chooser_request_class_init):
(webkit_file_chooser_request_create):
(webkit_file_chooser_request_get_mime_types):
(webkit_file_chooser_request_get_mime_types_filter):
(webkit_file_chooser_request_get_select_multiple):
(webkit_file_chooser_request_select_files):
(webkit_file_chooser_request_get_selected_files):

  • webkit/webkitfilechooserrequest.h: Added.

(_WebKitFileChooserRequest):
(_WebKitFileChooserRequestClass):

  • webkit/webkitfilechooserrequestprivate.h: Added,

containing the prototype of webkit_file_chooser_request_create.

Provide private API to make a file chooser request from the
WebView, and provide a default handler for it.

  • webkit/webkitwebview.cpp:

(fileChooserDialogResponseCallback): Handler for the 'response'
signal for the GtkFileChooserDialog used in the default
handler. It will call to webkit_file_chooser_request_select_files
or webkit_file_chooser_request_cancel as needed.
(webkitWebViewRealRunFileChooser): Default handler for the new
'run-file-chooser' signal. It will create a GtkFileChooserDialog,
connect to the 'response' signal and show it.
(webkit_web_view_class_init): Connect the 'run-file-chooser'
signal to the default handler, webkitWebViewRunFileChooser.
(webkit_web_view_new):
(webkitWebViewRunFileChooserRequest):

  • webkit/webkitwebview.h:

(_WebKitWebViewClass): Added prototype for the handler of the new
'run-file-chooser' signal.

  • webkit/webkitwebviewprivate.h: Added prototype for

private new function webkitWebViewRunFileChooserRequest.

Update runOpenPanel to use the new API, including a default handler
with similar behaviour to before.

  • WebCoreSupport/ChromeClientGtk.cpp:

(WebKit::ChromeClient::runOpenPanel): Now creates an instance of
WebKitFileChooserRequest and asks the WebView to emit the
new 'run-file-chooser' signal with it.

Added the new public header to the main header.

  • webkit/webkit.h: Added webkitfilechooserrequest.h

New unit tests for the new WebKitFileChooserRequest API.

  • tests/testwebview.c: Various WebKitFileChooserRequest tests,

including MIME type filtering and selection handling.

Updated documentation related files with the new API.

  • docs/webkitgtk-docs.sgml: Added new section.
  • docs/webkitgtk-sections.txt: Added new API.
  • docs/webkitgtk.types: Added get_type function.
Location:
trunk/Source/WebKit/gtk
Files:
3 added
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/gtk/ChangeLog

    r120803 r120918  
     12012-06-21  Daniel Drake  <dsd@laptop.org>
     2
     3        [GTK] Backport run-file-chooser to WebKit1
     4        https://bugs.webkit.org/show_bug.cgi?id=87283
     5
     6        Reviewed by Gustavo Noronha Silva.
     7
     8        This is a relatively straightforward backport of Mario Sanchez
     9        Prada's WebKit2 run-file-chooser signal work, intended for use by
     10        OLPC and others who are not quite ready to move to WebKit2.
     11
     12        Add a new public class to the API, WebKitFileChooserRequest, to be
     13        emitted along with a new WebKitWebView::run-file-chooser signal to
     14        let client applications to provide their own file chooser dialog
     15        when the use interacts with HTML Input elements of type 'file'.
     16
     17        * GNUmakefile.am: Added new source files and headers.
     18        * webkit/webkitfilechooserrequest.cpp: Added.
     19        (_WebKitFileChooserRequestPrivate):
     20        (webkit_file_chooser_request_init):
     21        (webkit_file_chooser_request_finalize):
     22        (webkit_file_chooser_request_get_property):
     23        (webkit_file_chooser_request_class_init):
     24        (webkit_file_chooser_request_create):
     25        (webkit_file_chooser_request_get_mime_types):
     26        (webkit_file_chooser_request_get_mime_types_filter):
     27        (webkit_file_chooser_request_get_select_multiple):
     28        (webkit_file_chooser_request_select_files):
     29        (webkit_file_chooser_request_get_selected_files):
     30        * webkit/webkitfilechooserrequest.h: Added.
     31        (_WebKitFileChooserRequest):
     32        (_WebKitFileChooserRequestClass):
     33        * webkit/webkitfilechooserrequestprivate.h: Added,
     34        containing the prototype of webkit_file_chooser_request_create.
     35
     36        Provide private API to make a file chooser request from the
     37        WebView, and provide a default handler for it.
     38
     39        * webkit/webkitwebview.cpp:
     40        (fileChooserDialogResponseCallback): Handler for the 'response'
     41        signal for the GtkFileChooserDialog used in the default
     42        handler. It will call to webkit_file_chooser_request_select_files
     43        or webkit_file_chooser_request_cancel as needed.
     44        (webkitWebViewRealRunFileChooser): Default handler for the new
     45        'run-file-chooser' signal. It will create a GtkFileChooserDialog,
     46        connect to the 'response' signal and show it.
     47        (webkit_web_view_class_init): Connect the 'run-file-chooser'
     48        signal to the default handler, webkitWebViewRunFileChooser.
     49        (webkit_web_view_new):
     50        (webkitWebViewRunFileChooserRequest):
     51        * webkit/webkitwebview.h:
     52        (_WebKitWebViewClass): Added prototype for the handler of the new
     53        'run-file-chooser' signal.
     54        * webkit/webkitwebviewprivate.h: Added prototype for
     55        private new function webkitWebViewRunFileChooserRequest.
     56
     57        Update runOpenPanel to use the new API, including a default handler
     58        with similar behaviour to before.
     59
     60        * WebCoreSupport/ChromeClientGtk.cpp:
     61        (WebKit::ChromeClient::runOpenPanel): Now creates an instance of
     62        WebKitFileChooserRequest and asks the WebView to emit the
     63        new 'run-file-chooser' signal with it.
     64
     65        Added the new public header to the main header.
     66
     67        * webkit/webkit.h: Added webkitfilechooserrequest.h
     68
     69        New unit tests for the new WebKitFileChooserRequest API.
     70
     71        * tests/testwebview.c: Various WebKitFileChooserRequest tests,
     72        including MIME type filtering and selection handling.
     73
     74        Updated documentation related files with the new API.
     75
     76        * docs/webkitgtk-docs.sgml: Added new section.
     77        * docs/webkitgtk-sections.txt: Added new API.
     78        * docs/webkitgtk.types: Added get_type function.
     79
    1802012-06-19  Chang Wan Hong  <jourmoon@company100.net>
    281
  • trunk/Source/WebKit/gtk/GNUmakefile.am

    r120359 r120918  
    115115        $(srcdir)/Source/WebKit/gtk/webkit/webkiterror.h \
    116116        $(srcdir)/Source/WebKit/gtk/webkit/webkitfavicondatabase.h \
     117        $(srcdir)/Source/WebKit/gtk/webkit/webkitfilechooserrequest.h \
    117118        $(srcdir)/Source/WebKit/gtk/webkit/webkitgeolocationpolicydecision.h \
    118119        $(srcdir)/Source/WebKit/gtk/webkit/webkitglobals.h \
     
    222223        Source/WebKit/gtk/webkit/webkitfavicondatabase.cpp \
    223224        Source/WebKit/gtk/webkit/webkitfavicondatabaseprivate.h \
     225        Source/WebKit/gtk/webkit/webkitfilechooserrequest.cpp \
     226        Source/WebKit/gtk/webkit/webkitfilechooserrequest.h \
     227        Source/WebKit/gtk/webkit/webkitfilechooserrequestprivate.h \
    224228        Source/WebKit/gtk/webkit/webkitgeolocationpolicydecision.cpp \
    225229        Source/WebKit/gtk/webkit/webkitgeolocationpolicydecisionprivate.h \
  • trunk/Source/WebKit/gtk/WebCoreSupport/ChromeClientGtk.cpp

    r120359 r120918  
    5656#include "WebKitDOMHTMLElementPrivate.h"
    5757#include "WindowFeatures.h"
     58#include "webkitfilechooserrequestprivate.h"
    5859#include "webkitgeolocationpolicydecision.h"
    5960#include "webkitgeolocationpolicydecisionprivate.h"
     
    816817void ChromeClient::runOpenPanel(Frame*, PassRefPtr<FileChooser> prpFileChooser)
    817818{
    818     RefPtr<FileChooser> chooser = prpFileChooser;
    819 
    820     GtkWidget* toplevel = gtk_widget_get_toplevel(GTK_WIDGET(m_webView));
    821     if (!widgetIsOnscreenToplevelWindow(toplevel))
    822         toplevel = 0;
    823 
    824     GtkWidget* dialog = gtk_file_chooser_dialog_new(_("Upload File"),
    825                                                     toplevel ? GTK_WINDOW(toplevel) : 0,
    826                                                     GTK_FILE_CHOOSER_ACTION_OPEN,
    827                                                     GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
    828                                                     GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
    829                                                     NULL);
    830 
    831     gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), chooser->settings().allowsMultipleFiles);
    832 
    833     if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
    834         if (gtk_file_chooser_get_select_multiple(GTK_FILE_CHOOSER(dialog))) {
    835             GOwnPtr<GSList> filenames(gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog)));
    836             Vector<String> names;
    837             for (GSList* item = filenames.get() ; item ; item = item->next) {
    838                 if (!item->data)
    839                     continue;
    840                 names.append(filenameToString(static_cast<char*>(item->data)));
    841                 g_free(item->data);
    842             }
    843             chooser->chooseFiles(names);
    844         } else {
    845             gchar* filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
    846             if (filename)
    847                 chooser->chooseFile(filenameToString(filename));
    848             g_free(filename);
    849         }
    850     }
    851     gtk_widget_destroy(dialog);
     819    GRefPtr<WebKitFileChooserRequest> request = adoptGRef(webkit_file_chooser_request_create(prpFileChooser));
     820    webkitWebViewRunFileChooserRequest(m_webView, request.get());
    852821}
    853822
  • trunk/Source/WebKit/gtk/docs/webkitgtk-docs.sgml

    r110999 r120918  
    4242    <xi:include href="xml/webkitspellchecker.xml"/>
    4343    <xi:include href="xml/webkitfavicondatabase.xml"/>
     44    <xi:include href="xml/webkitfilechooserrequest.xml"/>
    4445  </chapter>
    4546
  • trunk/Source/WebKit/gtk/docs/webkitgtk-sections.txt

    r111847 r120918  
    704704
    705705<SECTION>
     706<FILE>webkitfilechooserrequest</FILE>
     707<TITLE>WebKitFileChooserRequest</TITLE>
     708WebKitFileChooserRequest
     709webkit_file_chooser_request_get_select_multiple
     710webkit_file_chooser_request_get_mime_types
     711webkit_file_chooser_request_get_mime_types_filter
     712webkit_file_chooser_request_get_selected_files
     713webkit_file_chooser_request_select_files
     714
     715<SUBSECTION Standard>
     716WEBKIT_TYPE_FILE_CHOOSER_REQUEST
     717WEBKIT_FILE_CHOOSER_REQUEST
     718WEBKIT_IS_FILE_CHOOSER_REQUEST
     719WEBKIT_FILE_CHOOSER_REQUEST_CLASS
     720WEBKIT_IS_FILE_CHOOSER_REQUEST_CLASS
     721WEBKIT_FILE_CHOOSER_REQUEST_GET_CLASS
     722
     723<SUBSECTION Private>
     724WebKitFileChooserRequestClass
     725WebKitFileChooserRequestPrivate
     726webkit_file_chooser_request_get_type
     727</SECTION>
     728
     729<SECTION>
    706730<FILE>webkitdefines</FILE>
    707731WEBKIT_API
  • trunk/Source/WebKit/gtk/docs/webkitgtk.types

    r110999 r120918  
    22webkit_download_get_type
    33webkit_favicon_database_get_type
     4webkit_file_chooser_request_get_type
    45webkit_geolocation_policy_decision_get_type
    56webkit_hit_test_result_get_type
  • trunk/Source/WebKit/gtk/tests/testwebview.c

    r108996 r120918  
    507507}
    508508
     509static gboolean checkMimeTypeForFilter(GtkFileFilter* filter, const gchar* mimeType)
     510{
     511    GtkFileFilterInfo filter_info;
     512    filter_info.contains = GTK_FILE_FILTER_MIME_TYPE;
     513    filter_info.mime_type = mimeType;
     514    return gtk_file_filter_filter(filter, &filter_info);
     515}
     516
     517static gboolean runFileChooserCbNoMultiselNoMime(WebKitWebView* webview, WebKitFileChooserRequest* request, gpointer data)
     518{
     519    g_assert(!webkit_file_chooser_request_get_select_multiple(request));
     520
     521    const gchar* const* mimeTypes = webkit_file_chooser_request_get_mime_types(request);
     522    g_assert(!mimeTypes);
     523    GtkFileFilter* filter = webkit_file_chooser_request_get_mime_types_filter(request);
     524    g_assert(!filter);
     525
     526    const gchar* const* selectedFiles = webkit_file_chooser_request_get_selected_files(request);
     527    g_assert(!selectedFiles);
     528
     529    g_main_loop_quit(loop);
     530    return TRUE;
     531}
     532
     533static gboolean runFileChooserCbMultiselNoMime(WebKitWebView* webview, WebKitFileChooserRequest* request, gpointer data)
     534{
     535    g_assert(webkit_file_chooser_request_get_select_multiple(request));
     536
     537    const gchar* const* mimeTypes = webkit_file_chooser_request_get_mime_types(request);
     538    g_assert(!mimeTypes);
     539    GtkFileFilter* filter = webkit_file_chooser_request_get_mime_types_filter(request);
     540    g_assert(!filter);
     541    const gchar* const* selectedFiles = webkit_file_chooser_request_get_selected_files(request);
     542    g_assert(!selectedFiles);
     543
     544    // Select some files.
     545    const gchar* filesToSelect[4] = { "/foo", "/foo/bar", "/foo/bar/baz", 0 };
     546    webkit_file_chooser_request_select_files(request, filesToSelect);
     547
     548    // Check the files that have been just selected.
     549    selectedFiles = webkit_file_chooser_request_get_selected_files(request);
     550    g_assert(selectedFiles);
     551    g_assert_cmpstr(selectedFiles[0], ==, "/foo");
     552    g_assert_cmpstr(selectedFiles[1], ==, "/foo/bar");
     553    g_assert_cmpstr(selectedFiles[2], ==, "/foo/bar/baz");
     554    g_assert(!selectedFiles[3]);
     555
     556    g_main_loop_quit(loop);
     557    return TRUE;
     558}
     559
     560static gboolean runFileChooserCbSelectionRetained(WebKitWebView* webview, WebKitFileChooserRequest* request, gpointer data)
     561{
     562    const gchar* const* selectedFiles = webkit_file_chooser_request_get_selected_files(request);
     563    g_assert(selectedFiles);
     564    g_assert_cmpstr(selectedFiles[0], ==, "/foo");
     565    g_assert_cmpstr(selectedFiles[1], ==, "/foo/bar");
     566    g_assert_cmpstr(selectedFiles[2], ==, "/foo/bar/baz");
     567    g_assert(!selectedFiles[3]);
     568
     569    g_main_loop_quit(loop);
     570    return TRUE;
     571}
     572
     573static gboolean runFileChooserCbNoMultiselAcceptTypes(WebKitWebView* webview, WebKitFileChooserRequest* request, gpointer data)
     574{
     575    g_assert(!webkit_file_chooser_request_get_select_multiple(request));
     576
     577    const gchar* const* mimeTypes = webkit_file_chooser_request_get_mime_types(request);
     578    g_assert(mimeTypes);
     579    g_assert_cmpstr(mimeTypes[0], ==, "audio/*");
     580    g_assert_cmpstr(mimeTypes[1], ==, "video/*");
     581    g_assert_cmpstr(mimeTypes[2], ==, "image/*");
     582    g_assert(!mimeTypes[3]);
     583
     584    GtkFileFilter* filter = webkit_file_chooser_request_get_mime_types_filter(request);
     585    g_assert(GTK_IS_FILE_FILTER(filter));
     586    g_assert(checkMimeTypeForFilter(filter, "audio/*"));
     587    g_assert(checkMimeTypeForFilter(filter, "video/*"));
     588    g_assert(checkMimeTypeForFilter(filter, "image/*"));
     589
     590    const gchar* const* selectedFiles = webkit_file_chooser_request_get_selected_files(request);
     591    g_assert(!selectedFiles);
     592
     593    g_main_loop_quit(loop);
     594    return TRUE;
     595}
     596
     597void doMouseButtonEvent(GtkWidget* widget, GdkEventType eventType, int x, int y, unsigned int button, unsigned int modifiers)
     598{
     599    g_assert(gtk_widget_get_realized(widget));
     600
     601    GdkEvent* event = gdk_event_new(eventType);
     602    event->button.window = gtk_widget_get_window(widget);
     603    g_object_ref(event->button.window);
     604
     605    event->button.time = GDK_CURRENT_TIME;
     606    event->button.x = x;
     607    event->button.y = y;
     608    event->button.axes = 0;
     609    event->button.state = modifiers;
     610    event->button.button = button;
     611
     612    event->button.device = gdk_device_manager_get_client_pointer(gdk_display_get_device_manager(gtk_widget_get_display(widget)));
     613
     614    int xRoot, yRoot;
     615    gdk_window_get_root_coords(gtk_widget_get_window(widget), x, y, &xRoot, &yRoot);
     616    event->button.x_root = xRoot;
     617    event->button.y_root = yRoot;
     618    gtk_main_do_event(event);
     619}
     620
     621static void clickMouseButton(GtkWidget* widget, int x, int y, unsigned int button, unsigned int modifiers)
     622{
     623    doMouseButtonEvent(widget, GDK_BUTTON_PRESS, x, y, button, modifiers);
     624    doMouseButtonEvent(widget, GDK_BUTTON_RELEASE, x, y, button, modifiers);
     625}
     626
     627static gboolean clickMouseButtonAndWaitForFileChooserRequest(WebKitWebView* webView)
     628{
     629    clickMouseButton(GTK_WIDGET(webView), 5, 5, 1, 0);
     630    return TRUE;
     631}
     632
     633static void test_webkit_web_view_file_chooser()
     634{
     635    const gchar* htmlFormatBase = "<html><body>"
     636            "<input style='position:absolute;left:0;top:0;margin:0;padding:0' type='file' %s/>"
     637            "</body></html>";
     638
     639    GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
     640    GtkWidget* webView = webkit_web_view_new();
     641    gtk_container_add(GTK_CONTAINER(window), webView);
     642    gtk_widget_show_all(window);
     643
     644    loop = g_main_loop_new(NULL, TRUE);
     645
     646    // Multiple selections not allowed, no MIME filtering.
     647    gulong handler = g_signal_connect(webView, "run-file-chooser", G_CALLBACK(runFileChooserCbNoMultiselNoMime), NULL);
     648    gchar* htmlFormat = g_strdup_printf(htmlFormatBase, "");
     649    webkit_web_view_load_string(WEBKIT_WEB_VIEW(webView), htmlFormat, NULL, NULL, NULL);
     650    g_free(htmlFormat);
     651
     652    g_timeout_add(100, (GSourceFunc) clickMouseButtonAndWaitForFileChooserRequest, WEBKIT_WEB_VIEW(webView));
     653    g_main_loop_run(loop);
     654
     655    g_signal_handler_disconnect(webView, handler);
     656
     657    // Multiple selections allowed, no MIME filtering, some pre-selected files.
     658    handler = g_signal_connect(webView, "run-file-chooser", G_CALLBACK(runFileChooserCbMultiselNoMime), NULL);
     659    htmlFormat = g_strdup_printf(htmlFormatBase, "multiple");
     660    webkit_web_view_load_string(WEBKIT_WEB_VIEW(webView), htmlFormat, NULL, NULL, NULL);
     661    g_free(htmlFormat);
     662
     663    g_timeout_add(100, (GSourceFunc) clickMouseButtonAndWaitForFileChooserRequest, WEBKIT_WEB_VIEW(webView));
     664    g_main_loop_run(loop);
     665
     666    g_signal_handler_disconnect(webView, handler);
     667
     668    // Perform another request to check if the list of files selected
     669    // in the previous step appears now as part of the new request.
     670    handler = g_signal_connect(webView, "run-file-chooser", G_CALLBACK(runFileChooserCbSelectionRetained), NULL);
     671    g_timeout_add(100, (GSourceFunc) clickMouseButtonAndWaitForFileChooserRequest, WEBKIT_WEB_VIEW(webView));
     672    g_main_loop_run(loop);
     673
     674    g_signal_handler_disconnect(webView, handler);
     675
     676    // Multiple selections not allowed, only accept images, audio and video files.
     677    handler = g_signal_connect(webView, "run-file-chooser", G_CALLBACK(runFileChooserCbNoMultiselAcceptTypes), NULL);
     678    htmlFormat = g_strdup_printf(htmlFormatBase, "accept='audio/*,video/*,image/*'");
     679    webkit_web_view_load_string(WEBKIT_WEB_VIEW(webView), htmlFormat, NULL, NULL, NULL);
     680    g_free(htmlFormat);
     681
     682    g_timeout_add(100, (GSourceFunc) clickMouseButtonAndWaitForFileChooserRequest, WEBKIT_WEB_VIEW(webView));
     683    g_main_loop_run(loop);
     684
     685    g_signal_handler_disconnect(webView, handler);
     686    gtk_widget_destroy(window);
     687}
     688
    509689int main(int argc, char** argv)
    510690{
     
    538718    g_test_add_data_func("/webkit/webview/fullscreen", GINT_TO_POINTER(FALSE), test_webkit_web_view_fullscreen);
    539719    g_test_add_data_func("/webkit/webview/fullscreen-blocked", GINT_TO_POINTER(TRUE), test_webkit_web_view_fullscreen);
     720    g_test_add_func("/webkit/webview/file-chooser", test_webkit_web_view_file_chooser);
    540721
    541722    return g_test_run ();
  • trunk/Source/WebKit/gtk/webkit/webkit.h

    r110999 r120918  
    2929#include <webkit/webkitenumtypes.h>
    3030#include <webkit/webkitfavicondatabase.h>
     31#include <webkit/webkitfilechooserrequest.h>
    3132#include <webkit/webkitgeolocationpolicydecision.h>
    3233#include <webkit/webkitglobals.h>
  • trunk/Source/WebKit/gtk/webkit/webkitwebview.cpp

    r120359 r120918  
    217217    LEAVING_FULLSCREEN,
    218218    CONTEXT_MENU,
     219    RUN_FILE_CHOOSER,
    219220
    220221    LAST_SIGNAL
     
    12951296}
    12961297
     1298static void fileChooserDialogResponseCallback(GtkDialog* dialog, gint responseID, WebKitFileChooserRequest* request)
     1299{
     1300    GRefPtr<WebKitFileChooserRequest> adoptedRequest = adoptGRef(request);
     1301    if (responseID == GTK_RESPONSE_ACCEPT) {
     1302        GOwnPtr<GSList> filesList(gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog)));
     1303        GRefPtr<GPtrArray> filesArray = adoptGRef(g_ptr_array_new());
     1304        for (GSList* file = filesList.get(); file; file = g_slist_next(file))
     1305            g_ptr_array_add(filesArray.get(), file->data);
     1306        g_ptr_array_add(filesArray.get(), 0);
     1307        webkit_file_chooser_request_select_files(adoptedRequest.get(), reinterpret_cast<const gchar* const*>(filesArray->pdata));
     1308    }
     1309
     1310    gtk_widget_destroy(GTK_WIDGET(dialog));
     1311}
     1312
     1313static gboolean webkitWebViewRealRunFileChooser(WebKitWebView* webView, WebKitFileChooserRequest* request)
     1314{
     1315    GtkWidget* toplevel = gtk_widget_get_toplevel(GTK_WIDGET(webView));
     1316    if (!widgetIsOnscreenToplevelWindow(toplevel))
     1317        toplevel = 0;
     1318
     1319    gboolean allowsMultipleSelection = webkit_file_chooser_request_get_select_multiple(request);
     1320    GtkWidget* dialog = gtk_file_chooser_dialog_new(allowsMultipleSelection ? _("Select Files") : _("Select File"),
     1321                                                    toplevel ? GTK_WINDOW(toplevel) : 0,
     1322                                                    GTK_FILE_CHOOSER_ACTION_OPEN,
     1323                                                    GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
     1324                                                    GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
     1325                                                    NULL);
     1326
     1327    if (GtkFileFilter* filter = webkit_file_chooser_request_get_mime_types_filter(request))
     1328        gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter);
     1329    gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), allowsMultipleSelection);
     1330
     1331    if (const gchar* const* selectedFiles = webkit_file_chooser_request_get_selected_files(request))
     1332        gtk_file_chooser_select_filename(GTK_FILE_CHOOSER(dialog), selectedFiles[0]);
     1333
     1334    g_signal_connect(dialog, "response", G_CALLBACK(fileChooserDialogResponseCallback), g_object_ref(request));
     1335    gtk_widget_show(dialog);
     1336
     1337    return TRUE;
     1338}
     1339
    12971340static void webkit_web_view_dispose(GObject* object)
    12981341{
     
    25472590            G_TYPE_NONE, 1,
    25482591            WEBKIT_TYPE_WEB_FRAME);
     2592
     2593     /**
     2594     * WebKitWebView::run-file-chooser:
     2595     * @web_view: the #WebKitWebView on which the signal is emitted
     2596     * @request: a #WebKitFileChooserRequest
     2597     *
     2598     * This signal is emitted when the user interacts with a &lt;input
     2599     * type='file' /&gt; HTML element, requesting from WebKit to show
     2600     * a dialog to select one or more files to be uploaded. To let the
     2601     * application know the details of the file chooser, as well as to
     2602     * allow the client application to either cancel the request or
     2603     * perform an actual selection of files, the signal will pass an
     2604     * instance of the #WebKitFileChooserRequest in the @request
     2605     * argument.
     2606     *
     2607     * The default signal handler will asynchronously run a regular
     2608     * #GtkFileChooserDialog for the user to interact with.
     2609     *
     2610     * If this signal is to be handled asynchronously, you must
     2611     * call g_object_ref() on the @request, and return %TRUE to indicate
     2612     * that the request is being handled. When you are ready to complete the
     2613     * request, call webkit_file_chooser_request_select_files().
     2614     *
     2615     * Returns: %TRUE to stop other handlers from being invoked for the event.
     2616     *   %FALSE to propagate the event further.
     2617     *
     2618     */
     2619    webkit_web_view_signals[RUN_FILE_CHOOSER] =
     2620        g_signal_new("run-file-chooser",
     2621                     G_TYPE_FROM_CLASS(webViewClass),
     2622                     G_SIGNAL_RUN_LAST,
     2623                     G_STRUCT_OFFSET(WebKitWebViewClass, run_file_chooser),
     2624                     g_signal_accumulator_true_handled, 0 /* accumulator data */,
     2625                     webkit_marshal_BOOLEAN__OBJECT,
     2626                     G_TYPE_BOOLEAN, 1, /* number of parameters */
     2627                     WEBKIT_TYPE_FILE_CHOOSER_REQUEST);
    25492628
    25502629    webkit_web_view_signals[SHOULD_BEGIN_EDITING] = g_signal_new("should-begin-editing",
     
    28572936    webViewClass->entering_fullscreen = webkit_web_view_real_entering_fullscreen;
    28582937    webViewClass->leaving_fullscreen = webkit_web_view_real_leaving_fullscreen;
     2938    webViewClass->run_file_chooser = webkitWebViewRealRunFileChooser;
    28592939
    28602940    GObjectClass* objectClass = G_OBJECT_CLASS(webViewClass);
     
    36113691}
    36123692
     3693void webkitWebViewRunFileChooserRequest(WebKitWebView* webView, WebKitFileChooserRequest* request)
     3694{
     3695    gboolean returnValue;
     3696    g_signal_emit(webView, webkit_web_view_signals[RUN_FILE_CHOOSER], 0, request, &returnValue);
     3697}
     3698
    36133699// for internal use only
    36143700void webkit_web_view_notify_ready(WebKitWebView* webView)
  • trunk/Source/WebKit/gtk/webkit/webkitwebview.h

    r110999 r120918  
    2929#include <webkit/webkitdefines.h>
    3030#include <webkit/webkitdom.h>
     31#include <webkit/webkitfilechooserrequest.h>
    3132#include <webkit/webkitwebbackforwardlist.h>
    3233#include <webkit/webkitwebframe.h>
     
    179180    gboolean                   (* entering_fullscreen) (WebKitWebView   *web_view);
    180181    gboolean                   (* leaving_fullscreen) (WebKitWebView   *web_view);
    181 
    182     /* Padding for future expansion */
    183     void (*_webkit_reserved0) (void);
     182    gboolean                   (* run_file_chooser)       (WebKitWebView            *web_view,
     183                                                           WebKitFileChooserRequest *request);
    184184};
    185185
  • trunk/Source/WebKit/gtk/webkit/webkitwebviewprivate.h

    r119397 r120918  
    138138void webViewExitFullscreen(WebKitWebView* webView);
    139139
     140void webkitWebViewRunFileChooserRequest(WebKitWebView*, WebKitFileChooserRequest*);
     141
    140142#if ENABLE(ICONDATABASE)
    141143void webkitWebViewRegisterForIconNotification(WebKitWebView*, bool shouldRegister);
Note: See TracChangeset for help on using the changeset viewer.