[gtk+] gtktreeselection: Fix an abort on selecting an invalid range
- From: Philip Withnall <pwithnall src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] gtktreeselection: Fix an abort on selecting an invalid range
- Date: Wed, 11 Mar 2015 11:24:44 +0000 (UTC)
commit 52858f709c79e4e8ff351240d724d1eafa2f4605
Author: Philip Withnall <philip withnall collabora co uk>
Date: Tue Mar 10 08:26:34 2015 +0000
gtktreeselection: Fix an abort on selecting an invalid range
gtk_tree_selection_real_modify_range() has a g_return_if_fail() if the
start or end paths passed to it do not correspond to real tree nodes.
However, GtkTreePaths inherently do not have to be valid, so it should
be acceptable to call gtk_tree_selection_select_range() with
non-existent paths. Replace the g_return_if_fail() by a silent return,
and add a unit test.
https://bugzilla.gnome.org/show_bug.cgi?id=712760
gtk/gtktreeselection.c | 5 ++-
testsuite/gtk/treeview.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 58 insertions(+), 2 deletions(-)
---
diff --git a/gtk/gtktreeselection.c b/gtk/gtktreeselection.c
index 1f6ae9b..b04bcc3 100644
--- a/gtk/gtktreeselection.c
+++ b/gtk/gtktreeselection.c
@@ -1337,8 +1337,9 @@ gtk_tree_selection_real_modify_range (GtkTreeSelection *selection,
break;
}
- g_return_val_if_fail (start_node != NULL, FALSE);
- g_return_val_if_fail (end_node != NULL, FALSE);
+ /* Invalid start or end node? */
+ if (start_node == NULL || end_node == NULL)
+ return dirty;
if (anchor_path)
_gtk_tree_view_set_anchor_path (priv->tree_view, anchor_path);
diff --git a/testsuite/gtk/treeview.c b/testsuite/gtk/treeview.c
index 499376e..758b52c 100644
--- a/testsuite/gtk/treeview.c
+++ b/testsuite/gtk/treeview.c
@@ -289,6 +289,60 @@ test_selection_count (void)
gtk_widget_destroy (view);
}
+static void
+abort_cb (GtkTreeModel *model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ gpointer data)
+{
+ g_assert_not_reached ();
+}
+
+static void
+test_selection_empty (void)
+{
+ GtkTreePath *path;
+ GtkListStore *list_store;
+ GtkTreeSelection *selection;
+ GtkWidget *view;
+ GtkTreeIter iter;
+
+ g_test_bug ("712760");
+
+ list_store = gtk_list_store_new (1, G_TYPE_STRING);
+ view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
+
+ g_assert_false (gtk_tree_selection_get_selected (selection, NULL, &iter));
+ gtk_tree_selection_selected_foreach (selection, abort_cb, NULL);
+ g_assert_null (gtk_tree_selection_get_selected_rows (selection, NULL));
+ g_assert_cmpint (gtk_tree_selection_count_selected_rows (selection), ==, 0);
+
+ path = gtk_tree_path_new_from_indices (0, -1);
+
+ gtk_tree_selection_select_path (selection, path);
+ gtk_tree_selection_unselect_path (selection, path);
+ g_assert_false (gtk_tree_selection_path_is_selected (selection, path));
+
+ gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
+
+ gtk_tree_selection_select_all (selection);
+ g_assert_cmpint (gtk_tree_selection_count_selected_rows (selection), ==, 0);
+
+ gtk_tree_selection_unselect_all (selection);
+ g_assert_cmpint (gtk_tree_selection_count_selected_rows (selection), ==, 0);
+
+ gtk_tree_selection_select_range (selection, path, path);
+ g_assert_cmpint (gtk_tree_selection_count_selected_rows (selection), ==, 0);
+
+ gtk_tree_selection_unselect_range (selection, path, path);
+ g_assert_cmpint (gtk_tree_selection_count_selected_rows (selection), ==, 0);
+
+ gtk_tree_path_free (path);
+
+ gtk_widget_destroy (view);
+}
+
int
main (int argc,
char **argv)
@@ -303,6 +357,7 @@ main (int argc,
g_test_add_func ("/TreeView/sizing/row-separator-height",
test_row_separator_height);
g_test_add_func ("/TreeView/selection/count", test_selection_count);
+ g_test_add_func ("/TreeView/selection/empty", test_selection_empty);
return g_test_run ();
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]