diff options
author | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-02 23:22:45 +0000 |
---|---|---|
committer | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-02 23:22:45 +0000 |
commit | 3c57af58878702020d3ee89de0f62fd0a4d0f131 (patch) | |
tree | 9339aaa651abd54d9978fe2ab59c7c9b2e4a21ef /chrome/browser/gtk | |
parent | 2a875da49dcb15e862b420f9ba559c135191f084 (diff) | |
download | chromium_src-3c57af58878702020d3ee89de0f62fd0a4d0f131.zip chromium_src-3c57af58878702020d3ee89de0f62fd0a4d0f131.tar.gz chromium_src-3c57af58878702020d3ee89de0f62fd0a4d0f131.tar.bz2 |
GTK: fix a task manager crasher.
When OnItemsRemoved() is called, we remove the items one by one. If there is more than one item being removed, we may ask the model about items that no longer exist.
This fix is speculative in the sense that I couldn't repro the crash.
BUG=37115
TEST=none
Review URL: http://codereview.chromium.org/660351
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@40455 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/gtk')
-rw-r--r-- | chrome/browser/gtk/task_manager_gtk.cc | 12 | ||||
-rw-r--r-- | chrome/browser/gtk/task_manager_gtk.h | 2 |
2 files changed, 9 insertions, 5 deletions
diff --git a/chrome/browser/gtk/task_manager_gtk.cc b/chrome/browser/gtk/task_manager_gtk.cc index acddba5..e0f78d9 100644 --- a/chrome/browser/gtk/task_manager_gtk.cc +++ b/chrome/browser/gtk/task_manager_gtk.cc @@ -275,7 +275,7 @@ TaskManagerGtk::TaskManagerGtk() treeview_(NULL), process_list_(NULL), process_count_(0), - handling_selection_changed_(false) { + ignore_selection_changed_(false) { Init(); } @@ -283,8 +283,8 @@ TaskManagerGtk::TaskManagerGtk() TaskManagerGtk* TaskManagerGtk::instance_ = NULL; TaskManagerGtk::~TaskManagerGtk() { - task_manager_->OnWindowClosed(); model_->RemoveObserver(this); + task_manager_->OnWindowClosed(); gtk_accel_group_disconnect_key(accel_group_, GDK_w, GDK_CONTROL_MASK); gtk_window_remove_accel_group(GTK_WINDOW(dialog_), accel_group_); @@ -315,6 +315,8 @@ void TaskManagerGtk::OnItemsChanged(int start, int length) { } void TaskManagerGtk::OnItemsAdded(int start, int length) { + AutoReset autoreset(&ignore_selection_changed_, true); + GtkTreeIter iter; if (start == 0) { gtk_list_store_prepend(process_list_, &iter); @@ -338,6 +340,8 @@ void TaskManagerGtk::OnItemsAdded(int start, int length) { } void TaskManagerGtk::OnItemsRemoved(int start, int length) { + AutoReset autoreset(&ignore_selection_changed_, true); + GtkTreeIter iter; gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(process_list_), &iter, NULL, start); @@ -830,9 +834,9 @@ void TaskManagerGtk::OnTreeViewRealize(GtkTreeView* treeview, } void TaskManagerGtk::OnSelectionChanged(GtkTreeSelection* selection) { - if (handling_selection_changed_) + if (ignore_selection_changed_) return; - AutoReset autoreset(&handling_selection_changed_, true); + AutoReset autoreset(&ignore_selection_changed_, true); // The set of groups that should be selected. std::set<std::pair<int, int> > ranges; diff --git a/chrome/browser/gtk/task_manager_gtk.h b/chrome/browser/gtk/task_manager_gtk.h index 2a887fa..40e4036 100644 --- a/chrome/browser/gtk/task_manager_gtk.h +++ b/chrome/browser/gtk/task_manager_gtk.h @@ -215,7 +215,7 @@ class TaskManagerGtk : public TaskManagerModelObserver { // We edit the selection in the OnSelectionChanged handler, and we use this // variable to prevent ourselves from handling further changes that we // ourselves caused. - bool handling_selection_changed_; + bool ignore_selection_changed_; DISALLOW_COPY_AND_ASSIGN(TaskManagerGtk); }; |