#include "gtk/gtkfilechooserdefault.h"
#include "gtk/gtkfilechooserentry.h"
+#if 0
+static const char *
+get_action_name (GtkFileChooserAction action)
+{
+ switch (action)
+ {
+ case GTK_FILE_CHOOSER_ACTION_OPEN: return "OPEN";
+ case GTK_FILE_CHOOSER_ACTION_SAVE: return "SAVE";
+ case GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER: return "SELECT_FOLDER";
+ case GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER: return "CREATE_FOLDER";
+
+ default:
+ g_assert_not_reached ();
+ return NULL;
+ }
+}
+#endif
+
#ifdef BROKEN_TESTS
static void
log_test (gboolean passed, const char *test_name, ...)
g_free (str);
}
-static const char *get_action_name (GtkFileChooserAction action);
-
typedef void (* SetFilenameFn) (GtkFileChooser *chooser, gpointer data);
typedef void (* CompareFilenameFn) (GtkFileChooser *chooser, gpointer data);
g_main_context_iteration (NULL, FALSE);
}
+static void
+build_children_list (GtkWidget *widget, gpointer data)
+{
+ GList **list;
+
+ list = data;
+ *list = g_list_prepend (*list, widget);
+}
+
+static GtkWidget *
+find_child_widget_with_atk_role (GtkWidget *widget, AtkRole role)
+{
+ AtkObject *accessible;
+ AtkRole a_role;
+
+ accessible = gtk_widget_get_accessible (widget);
+ a_role = atk_object_get_role (accessible);
+
+ if (a_role == role)
+ return widget;
+ else
+ {
+ GtkWidget *found_child;
+
+ found_child = NULL;
+
+ if (GTK_IS_CONTAINER (widget))
+ {
+ GList *children;
+ GList *l;
+
+ children = NULL;
+ gtk_container_forall (GTK_CONTAINER (widget), build_children_list, &children);
+
+ l = children;
+
+ while (l && !found_child)
+ {
+ GtkWidget *child;
+
+ child = GTK_WIDGET (l->data);
+
+ found_child = find_child_widget_with_atk_role (child, role);
+
+ l = l->next;
+ }
+
+ g_list_free (children);
+ }
+
+ return found_child;
+ }
+}
+
+static const char *
+get_atk_name_for_filechooser_button (GtkFileChooserButton *button)
+{
+ GtkFileChooserAction action;
+ GtkWidget *widget;
+ AtkObject *accessible;
+
+ action = gtk_file_chooser_get_action (GTK_FILE_CHOOSER (button));
+ g_assert (action == GTK_FILE_CHOOSER_ACTION_OPEN || action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
+
+ if (action == GTK_FILE_CHOOSER_ACTION_OPEN)
+ widget = find_child_widget_with_atk_role (GTK_WIDGET (button), ATK_ROLE_PUSH_BUTTON);
+ else
+ widget = find_child_widget_with_atk_role (GTK_WIDGET (button), ATK_ROLE_COMBO_BOX);
+
+ accessible = gtk_widget_get_accessible (widget);
+ return atk_object_get_name (accessible);
+}
+
+static void
+check_that_basename_is_shown (GtkFileChooserButton *button, const char *expected_filename)
+{
+ GtkFileChooserAction action;
+ const char *name_on_button;
+ char *expected_basename;
+
+ name_on_button = get_atk_name_for_filechooser_button (button);
+
+ action = gtk_file_chooser_get_action (GTK_FILE_CHOOSER (button));
+ g_assert (action == GTK_FILE_CHOOSER_ACTION_OPEN || action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
+
+ if (expected_filename)
+ expected_basename = g_path_get_basename (expected_filename);
+ else
+ expected_basename = NULL;
+
+ if (expected_basename)
+ g_assert_cmpstr (expected_basename, ==, name_on_button);
+ else
+ g_assert_cmpstr (name_on_button, ==, "(None)"); /* see gtkfilechooserbutton.c:FALLBACK_DISPLAY_NAME */ /* FIXME: how do we translate this? */
+
+ g_free (expected_basename);
+}
+
+static const char *
+get_expected_shown_filename (GtkFileChooserAction action, const char *folder_name, const char *filename)
+{
+ if (action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER)
+ {
+ if (filename)
+ return filename;
+ else
+ return folder_name;
+ }
+ else
+ return filename;
+}
+
static void
test_file_chooser_button (gconstpointer data)
{
GtkWidget *window;
GtkWidget *fc_button;
GtkWidget *fc_dialog;
+ int iterations;
+ int i;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_file_chooser_select_filename (GTK_FILE_CHOOSER (fc_button), setup->initial_filename);
gtk_widget_show_all (window);
- wait_for_idle ();
+ sleep_in_main_loop ();
+ check_that_basename_is_shown (GTK_FILE_CHOOSER_BUTTON (fc_button),
+ get_expected_shown_filename (setup->action, setup->initial_current_folder, setup->initial_filename));
+
+ /* If there is a dialog to be opened, we actually test going through it a
+ * couple of times. This ensures that any state that the button frobs for
+ * each appearance of the dialog will make sense.
+ */
if (setup->open_dialog)
+ iterations = 2;
+ else
+ iterations = 1;
+
+ for (i = 0; i < iterations; i++)
{
- GList *children;
+ if (setup->open_dialog)
+ {
+ GList *children;
- /* Hack our way into the file chooser button; get its GtkButton child and click it */
- children = gtk_container_get_children (GTK_CONTAINER (fc_button));
- g_assert (children && GTK_IS_BUTTON (children->data));
- gtk_button_clicked (GTK_BUTTON (children->data));
- g_list_free (children);
+ /* Hack our way into the file chooser button; get its GtkButton child and click it */
+ children = gtk_container_get_children (GTK_CONTAINER (fc_button));
+ g_assert (children && GTK_IS_BUTTON (children->data));
+ gtk_button_clicked (GTK_BUTTON (children->data));
+ g_list_free (children);
- wait_for_idle ();
+ sleep_in_main_loop ();
- /* Give me the internal dialog, damnit */
- fc_dialog = g_object_get_qdata (G_OBJECT (fc_button), delegate_get_quark ());
- g_assert (GTK_IS_FILE_CHOOSER (fc_dialog));
- g_assert (GTK_IS_DIALOG (fc_dialog));
- }
+ /* Give me the internal dialog, damnit */
+ fc_dialog = g_object_get_qdata (G_OBJECT (fc_button), delegate_get_quark ());
+ g_assert (GTK_IS_FILE_CHOOSER (fc_dialog));
+ g_assert (GTK_IS_DIALOG (fc_dialog));
+ }
- /* Okay, now frob the button and its optional dialog */
+ /* Okay, now frob the button and its optional dialog */
- if (setup->tweak_current_folder)
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (fc_button), setup->tweak_current_folder);
+ if (setup->tweak_current_folder)
+ gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (fc_button), setup->tweak_current_folder);
- if (setup->tweak_filename)
- gtk_file_chooser_select_filename (GTK_FILE_CHOOSER (fc_button), setup->tweak_filename);
+ if (setup->tweak_filename)
+ gtk_file_chooser_select_filename (GTK_FILE_CHOOSER (fc_button), setup->tweak_filename);
- sleep_in_main_loop ();
+ sleep_in_main_loop ();
- if (setup->open_dialog)
- {
- gtk_dialog_response (GTK_DIALOG (fc_dialog), setup->dialog_response);
- wait_for_idle ();
- }
+ if (setup->open_dialog)
+ {
+ gtk_dialog_response (GTK_DIALOG (fc_dialog), setup->dialog_response);
+ wait_for_idle ();
+ }
- if (setup->final_current_folder)
- {
- char *folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (fc_button));
+ if (setup->final_current_folder)
+ {
+ char *folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (fc_button));
- g_assert_cmpstr (folder, ==, setup->final_current_folder);
- g_free (folder);
- }
+ g_assert_cmpstr (folder, ==, setup->final_current_folder);
+ g_free (folder);
+ }
- if (setup->final_filename)
- {
- char *filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (fc_button));
+ if (setup->final_filename)
+ {
+ char *filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (fc_button));
- g_assert_cmpstr (filename, ==, setup->final_filename);
- g_free (filename);
+ g_assert_cmpstr (filename, ==, setup->final_filename);
+ g_free (filename);
+ }
+
+ check_that_basename_is_shown (GTK_FILE_CHOOSER_BUTTON (fc_button),
+ get_expected_shown_filename (setup->action, setup->final_current_folder, setup->final_filename));
}
gtk_widget_destroy (window);
NULL /* final_filename */
},
+ /* OPEN tests with dialog, cancelled via closing the dialog (not by selecting the Cancel button) */
+
+ {
+ "open-dialog-close-1",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ NULL, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+ NULL, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "open-dialog-close-2",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ NULL, /* initial_current_folder */
+ FILE_NAME, /* initial_filename */
+ TRUE, /* open_dialog */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+ NULL, /* final_current_folder */
+ FILE_NAME /* final_filename */
+ },
+ {
+ "open-dialog-close-3",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+ FOLDER_NAME, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "open-dialog-close-4",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ NULL, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ NULL, /* tweak_current_folder */
+ FILE_NAME, /* tweak_filename */
+ GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+ NULL, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "open-dialog-close-5",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ NULL, /* initial_current_folder */
+ FILE_NAME, /* initial_filename */
+ TRUE, /* open_dialog */
+ NULL, /* tweak_current_folder */
+ FILE_NAME_2, /* tweak_filename */
+ GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+ NULL, /* final_current_folder */
+ FILE_NAME /* final_filename */
+ },
+ {
+ "open-dialog-close-6",
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ NULL, /* tweak_current_folder */
+ FILE_NAME_2, /* tweak_filename */
+ GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+ FOLDER_NAME, /* final_current_folder */
+ NULL /* final_filename */
+ },
+
/* SELECT_FOLDER tests with dialog, cancelled */
{
FOLDER_NAME_2, /* tweak_filename */
GTK_RESPONSE_CANCEL, /* dialog_response */
NULL, /* final_current_folder */
- FOLDER_NAME /* final_filename */
+ FOLDER_NAME /* final_filename */
},
{
"select-folder-dialog-cancel-7",
FOLDER_NAME /* final_filename */
},
+ /* SELECT_FOLDER tests with dialog, cancelled via closing the dialog (not selecting the Cancel button) */
+
+ {
+ "select-folder-dialog-close-1",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ NULL, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+ NULL, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "select-folder-dialog-close-2",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ NULL, /* initial_current_folder */
+ FOLDER_NAME, /* initial_filename */
+ TRUE, /* open_dialog */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+ NULL, /* final_current_folder */
+ FOLDER_NAME /* final_filename */
+ },
+ {
+ "select-folder-dialog-close-3",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+ FOLDER_NAME, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "select-folder-dialog-close-4",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ NULL, /* tweak_current_folder */
+ NULL, /* tweak_filename */
+ GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+ NULL, /* final_current_folder */
+ FOLDER_NAME /* final_filename */
+ },
+ {
+ "select-folder-dialog-close-5",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ NULL, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ NULL, /* tweak_current_folder */
+ FOLDER_NAME, /* tweak_filename */
+ GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+ NULL, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "select-folder-dialog-close-6",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ NULL, /* initial_current_folder */
+ FOLDER_NAME, /* initial_filename */
+ TRUE, /* open_dialog */
+ NULL, /* tweak_current_folder */
+ FOLDER_NAME_2, /* tweak_filename */
+ GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+ NULL, /* final_current_folder */
+ FOLDER_NAME /* final_filename */
+ },
+ {
+ "select-folder-dialog-close-7",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ NULL, /* tweak_current_folder */
+ FOLDER_NAME_2, /* tweak_filename */
+ GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+ FOLDER_NAME, /* final_current_folder */
+ NULL /* final_filename */
+ },
+ {
+ "select-folder-dialog-close-8",
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ FOLDER_NAME, /* initial_current_folder */
+ NULL, /* initial_filename */
+ TRUE, /* open_dialog */
+ NULL, /* tweak_current_folder */
+ FOLDER_NAME_2, /* tweak_filename */
+ GTK_RESPONSE_DELETE_EVENT,/* dialog_response */
+ NULL, /* final_current_folder */
+ FOLDER_NAME /* final_filename */
+ },
+
/* OPEN tests with dialog */
{
return FALSE;
}
-static const char *
-get_action_name (GtkFileChooserAction action)
-{
- switch (action)
- {
- case GTK_FILE_CHOOSER_ACTION_OPEN: return "OPEN";
- case GTK_FILE_CHOOSER_ACTION_SAVE: return "SAVE";
- case GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER: return "SELECT_FOLDER";
- case GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER: return "CREATE_FOLDER";
-
- default:
- g_assert_not_reached ();
- return NULL;
- }
-}
-
static GtkFileChooserDefault *
get_impl_from_dialog (GtkWidget *dialog)
{