diff options
author | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-06 18:39:03 +0000 |
---|---|---|
committer | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-06 18:39:03 +0000 |
commit | 8c9d12af0a7fd82661a2302a2a1c9624bf959ee4 (patch) | |
tree | b8bb502866cb797d66809354af0c095b4e4a2767 /ash/shell.cc | |
parent | 0bc3e5925378c743b240e8957adf262ae6692a5d (diff) | |
download | chromium_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.cc | 39 |
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(); |