Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(312)

Side by Side Diff: chrome/browser/ui/app_list/app_list_view_delegate.cc

Issue 559823002: Observe chrome::NOTIFICATION_APP_TERMINATING in Chrome's AppListViewDelegate (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: clear scoped observer too Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/ui/app_list/app_list_view_delegate.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/app_list/app_list_view_delegate.h" 5 #include "chrome/browser/ui/app_list/app_list_view_delegate.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "apps/custom_launcher_page_contents.h" 9 #include "apps/custom_launcher_page_contents.h"
10 #include "base/callback.h" 10 #include "base/callback.h"
(...skipping 17 matching lines...) Expand all
28 #include "chrome/browser/ui/browser_finder.h" 28 #include "chrome/browser/ui/browser_finder.h"
29 #include "chrome/browser/ui/chrome_pages.h" 29 #include "chrome/browser/ui/chrome_pages.h"
30 #include "chrome/browser/ui/host_desktop.h" 30 #include "chrome/browser/ui/host_desktop.h"
31 #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h" 31 #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
32 #include "chrome/browser/web_applications/web_app.h" 32 #include "chrome/browser/web_applications/web_app.h"
33 #include "chrome/common/chrome_switches.h" 33 #include "chrome/common/chrome_switches.h"
34 #include "chrome/common/extensions/extension_constants.h" 34 #include "chrome/common/extensions/extension_constants.h"
35 #include "chrome/common/url_constants.h" 35 #include "chrome/common/url_constants.h"
36 #include "components/signin/core/browser/signin_manager.h" 36 #include "components/signin/core/browser/signin_manager.h"
37 #include "content/public/browser/browser_thread.h" 37 #include "content/public/browser/browser_thread.h"
38 #include "content/public/browser/notification_service.h"
38 #include "content/public/browser/page_navigator.h" 39 #include "content/public/browser/page_navigator.h"
39 #include "content/public/browser/user_metrics.h" 40 #include "content/public/browser/user_metrics.h"
40 #include "content/public/browser/web_contents.h" 41 #include "content/public/browser/web_contents.h"
41 #include "extensions/browser/extension_registry.h" 42 #include "extensions/browser/extension_registry.h"
42 #include "extensions/common/constants.h" 43 #include "extensions/common/constants.h"
43 #include "extensions/common/extension_set.h" 44 #include "extensions/common/extension_set.h"
44 #include "extensions/common/manifest_constants.h" 45 #include "extensions/common/manifest_constants.h"
45 #include "extensions/common/manifest_handlers/launcher_page_info.h" 46 #include "extensions/common/manifest_handlers/launcher_page_info.h"
46 #include "grit/theme_resources.h" 47 #include "grit/theme_resources.h"
47 #include "ui/app_list/app_list_switches.h" 48 #include "ui/app_list/app_list_switches.h"
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
174 175
175 profile_manager->GetProfileInfoCache().AddObserver(this); 176 profile_manager->GetProfileInfoCache().AddObserver(this);
176 speech_ui_.reset(new app_list::SpeechUIModel); 177 speech_ui_.reset(new app_list::SpeechUIModel);
177 178
178 #if defined(GOOGLE_CHROME_BUILD) 179 #if defined(GOOGLE_CHROME_BUILD)
179 speech_ui_->set_logo( 180 speech_ui_->set_logo(
180 *ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed( 181 *ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
181 IDR_APP_LIST_GOOGLE_LOGO_VOICE_SEARCH)); 182 IDR_APP_LIST_GOOGLE_LOGO_VOICE_SEARCH));
182 #endif 183 #endif
183 SetProfile(profile); 184 SetProfile(profile);
185
186 registrar_.Add(this,
187 chrome::NOTIFICATION_APP_TERMINATING,
188 content::NotificationService::AllSources());
184 } 189 }
185 190
186 AppListViewDelegate::~AppListViewDelegate() { 191 AppListViewDelegate::~AppListViewDelegate() {
192 // Note that the destructor is not always called. E.g. on Mac, this is owned
193 // by a leaky singleton. Essential shutdown work must be done by observing
194 // chrome::NOTIFICATION_APP_TERMINATING.
187 SetProfile(NULL); 195 SetProfile(NULL);
188 g_browser_process->profile_manager()->GetProfileInfoCache().RemoveObserver( 196 g_browser_process->profile_manager()->GetProfileInfoCache().RemoveObserver(
189 this); 197 this);
190 198
191 SigninManagerFactory* factory = SigninManagerFactory::GetInstance(); 199 SigninManagerFactory* factory = SigninManagerFactory::GetInstance();
192 if (factory) 200 if (factory)
193 factory->RemoveObserver(this); 201 factory->RemoveObserver(this);
194 } 202 }
195 203
196 void AppListViewDelegate::SetProfile(Profile* new_profile) { 204 void AppListViewDelegate::SetProfile(Profile* new_profile) {
205 if (profile_ == new_profile)
Matt Giuca 2014/09/11 03:50:37 Are these profile checks (this one, and the next t
tapted 2014/09/11 04:57:45 They're needed, but only due to this change. Previ
Matt Giuca 2014/09/11 08:17:58 Acknowledged.
206 return;
207
197 if (profile_) { 208 if (profile_) {
198 // Note: |search_controller_| has a reference to |speech_ui_| so must be 209 // Note: |search_controller_| has a reference to |speech_ui_| so must be
199 // destroyed first. 210 // destroyed first.
200 search_controller_.reset(); 211 search_controller_.reset();
201 custom_page_contents_.clear(); 212 custom_page_contents_.clear();
202 app_list::StartPageService* start_page_service = 213 app_list::StartPageService* start_page_service =
203 app_list::StartPageService::Get(profile_); 214 app_list::StartPageService::Get(profile_);
204 if (start_page_service) 215 if (start_page_service)
205 start_page_service->RemoveObserver(this); 216 start_page_service->RemoveObserver(this);
206 #if defined(USE_ASH) 217 #if defined(USE_ASH)
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 : app_list::SPEECH_RECOGNITION_OFF); 252 : app_list::SPEECH_RECOGNITION_OFF);
242 253
243 search_controller_.reset(new app_list::SearchController(profile_, 254 search_controller_.reset(new app_list::SearchController(profile_,
244 model_->search_box(), 255 model_->search_box(),
245 model_->results(), 256 model_->results(),
246 speech_ui_.get(), 257 speech_ui_.get(),
247 controller_)); 258 controller_));
248 } 259 }
249 260
250 void AppListViewDelegate::SetUpProfileSwitcher() { 261 void AppListViewDelegate::SetUpProfileSwitcher() {
262 // If a profile change is observed when there is no app list, there is nothing
263 // to update until SetProfile() calls this function again.
264 if (!profile_)
265 return;
266
251 // Don't populate the app list users if we are on the ash desktop. 267 // Don't populate the app list users if we are on the ash desktop.
252 chrome::HostDesktopType desktop = chrome::GetHostDesktopTypeForNativeWindow( 268 chrome::HostDesktopType desktop = chrome::GetHostDesktopTypeForNativeWindow(
253 controller_->GetAppListWindow()); 269 controller_->GetAppListWindow());
254 if (desktop == chrome::HOST_DESKTOP_TYPE_ASH) 270 if (desktop == chrome::HOST_DESKTOP_TYPE_ASH)
255 return; 271 return;
256 272
257 // Populate the app list users. 273 // Populate the app list users.
258 PopulateUsers(g_browser_process->profile_manager()->GetProfileInfoCache(), 274 PopulateUsers(g_browser_process->profile_manager()->GetProfileInfoCache(),
259 profile_->GetPath(), 275 profile_->GetPath(),
260 &users_); 276 &users_);
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
432 } 448 }
433 } 449 }
434 450
435 void AppListViewDelegate::Dismiss() { 451 void AppListViewDelegate::Dismiss() {
436 controller_->DismissView(); 452 controller_->DismissView();
437 } 453 }
438 454
439 void AppListViewDelegate::ViewClosing() { 455 void AppListViewDelegate::ViewClosing() {
440 controller_->ViewClosing(); 456 controller_->ViewClosing();
441 457
458 if (!profile_)
459 return;
460
442 app_list::StartPageService* service = 461 app_list::StartPageService* service =
443 app_list::StartPageService::Get(profile_); 462 app_list::StartPageService::Get(profile_);
444 if (service) { 463 if (service) {
445 service->AppListHidden(); 464 service->AppListHidden();
446 if (service->HotwordEnabled()) { 465 if (service->HotwordEnabled()) {
447 HotwordService* hotword_service = 466 HotwordService* hotword_service =
448 HotwordServiceFactory::GetForProfile(profile_); 467 HotwordServiceFactory::GetForProfile(profile_);
449 if (hotword_service) 468 if (hotword_service)
450 hotword_service->StopHotwordSession(this); 469 hotword_service->StopHotwordSession(this);
451 } 470 }
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
616 635
617 void AppListViewDelegate::AddObserver( 636 void AppListViewDelegate::AddObserver(
618 app_list::AppListViewDelegateObserver* observer) { 637 app_list::AppListViewDelegateObserver* observer) {
619 observers_.AddObserver(observer); 638 observers_.AddObserver(observer);
620 } 639 }
621 640
622 void AppListViewDelegate::RemoveObserver( 641 void AppListViewDelegate::RemoveObserver(
623 app_list::AppListViewDelegateObserver* observer) { 642 app_list::AppListViewDelegateObserver* observer) {
624 observers_.RemoveObserver(observer); 643 observers_.RemoveObserver(observer);
625 } 644 }
645
646 void AppListViewDelegate::Observe(int type,
647 const content::NotificationSource& source,
648 const content::NotificationDetails& details) {
649 switch (type) {
650 case chrome::NOTIFICATION_APP_TERMINATING:
651 SetProfile(NULL); // Ensures launcher page web contents are torn down.
652
653 // Stop observing SigninManagers. SigninManagerFactory is not a leaky
654 // singleton like this, so will get offended without the following.
Matt Giuca 2014/09/11 03:50:37 Cute :) But can you be clear instead of saying "ge
tapted 2014/09/11 04:57:45 Done.
655 scoped_observer_.RemoveAll();
656 SigninManagerFactory::GetInstance()->RemoveObserver(this);
657 break;
658 default:
659 NOTREACHED();
660 }
661 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/app_list/app_list_view_delegate.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698