summaryrefslogtreecommitdiffstats
path: root/ash/shell.cc
diff options
context:
space:
mode:
authoroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-06 18:39:03 +0000
committeroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-06 18:39:03 +0000
commit8c9d12af0a7fd82661a2302a2a1c9624bf959ee4 (patch)
treeb8bb502866cb797d66809354af0c095b4e4a2767 /ash/shell.cc
parent0bc3e5925378c743b240e8957adf262ae6692a5d (diff)
downloadchromium_src-8c9d12af0a7fd82661a2302a2a1c9624bf959ee4.zip
chromium_src-8c9d12af0a7fd82661a2302a2a1c9624bf959ee4.tar.gz
chromium_src-8c9d12af0a7fd82661a2302a2a1c9624bf959ee4.tar.bz2
Make sure WindowObservers are removed from window before destruction
* Check if the window observer is empty upon destruction. * remove the all observers in ~WindowObserver() * Remove RemoveObserver that are no longer necessary * Fix shell shutdown order so that observers are removed correctly before deleting all windows. BUG=324018 R=skuhne@chromium.org, sky@chromium.org Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=239232 Review URL: https://codereview.chromium.org/101013002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@239246 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash/shell.cc')
-rw-r--r--ash/shell.cc39
1 files changed, 26 insertions, 13 deletions
diff --git a/ash/shell.cc b/ash/shell.cc
index cf11a46..738eeac 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -632,44 +632,57 @@ Shell::~Shell() {
// Drag-and-drop must be canceled prior to close all windows.
drag_drop_controller_.reset();
+ // Controllers who have WindowObserver added must be deleted
+ // before |display_controller_| is deleted.
+
+#if defined(OS_CHROMEOS)
+ // VideoActivityNotifier must be deleted before |video_detector_| is
+ // deleted because it's observing video activity through
+ // VideoDetectorObserver interface.
+ video_activity_notifier_.reset();
+#endif // defined(OS_CHROMEOS)
+ video_detector_.reset();
+
+ shadow_controller_.reset();
+ resize_shadow_controller_.reset();
+
+ window_cycle_controller_.reset();
+ mru_window_tracker_.reset();
+
+ // |shelf_window_watcher_| has a weak pointer to |shelf_Model_|
+ // and has window observers.
+ shelf_window_watcher_.reset();
+
// Destroy all child windows including widgets.
display_controller_->CloseChildWindows();
display_controller_->CloseNonDesktopDisplay();
+ // Chrome implementation of launcher delegate depends on FocusClient,
+ // so must be deleted before |focus_client_|.
+ launcher_delegate_.reset();
+ focus_client_.reset();
+
// Destroy SystemTrayNotifier after destroying SystemTray as TrayItems
// needs to remove observers from it.
system_tray_notifier_.reset();
-#if defined(OS_CHROMEOS)
- // Destroy VideoActivityNotifier before destroying VideoDetector.
- video_activity_notifier_.reset();
-#endif // defined(OS_CHROMEOS)
-
// These need a valid Shell instance to clean up properly, so explicitly
// delete them before invalidating the instance.
// Alphabetical. TODO(oshima): sort.
magnification_controller_.reset();
partial_magnification_controller_.reset();
- resize_shadow_controller_.reset();
- shadow_controller_.reset();
tooltip_controller_.reset();
event_client_.reset();
- window_cycle_controller_.reset();
nested_dispatcher_controller_.reset();
user_action_client_.reset();
visibility_controller_.reset();
- launcher_delegate_.reset();
// |shelf_item_delegate_manager_| observes |shelf_model_|. It must be
// destroyed before |shelf_model_| is destroyed.
shelf_item_delegate_manager_.reset();
- // |shelf_window_watcher_| has a weak pointer to |shelf_Model_|.
- shelf_window_watcher_.reset();
shelf_model_.reset();
- video_detector_.reset();
power_button_controller_.reset();
lock_state_controller_.reset();
- mru_window_tracker_.reset();
resolution_notification_controller_.reset();
desktop_background_controller_.reset();