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

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

Issue 492163002: Fix Profile* lifetime issues in Chrome's AppListViewDelegate (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add constructor comment Created 6 years, 4 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 | Annotate | Revision Log
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 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 } 150 }
151 urls->push_back(extension->GetResourceURL(launcher_page_page)); 151 urls->push_back(extension->GetResourceURL(launcher_page_page));
152 } 152 }
153 } 153 }
154 154
155 } // namespace 155 } // namespace
156 156
157 AppListViewDelegate::AppListViewDelegate(Profile* profile, 157 AppListViewDelegate::AppListViewDelegate(Profile* profile,
158 AppListControllerDelegate* controller) 158 AppListControllerDelegate* controller)
159 : controller_(controller), 159 : controller_(controller),
160 profile_(profile), 160 profile_(NULL),
161 model_(NULL), 161 model_(NULL),
162 scoped_observer_(this) { 162 scoped_observer_(this) {
163 CHECK(controller_); 163 CHECK(controller_);
164 // The SigninManagerFactor and the SigninManagers are observed to keep the 164 // The SigninManagerFactor and the SigninManagers are observed to keep the
165 // profile switcher menu up to date, with the correct list of profiles and the 165 // profile switcher menu up to date, with the correct list of profiles and the
166 // correct email address (or none for signed out users) for each. 166 // correct email address (or none for signed out users) for each.
167 SigninManagerFactory::GetInstance()->AddObserver(this); 167 SigninManagerFactory::GetInstance()->AddObserver(this);
168 168
169 // Start observing all already-created SigninManagers. 169 // Start observing all already-created SigninManagers.
170 ProfileManager* profile_manager = g_browser_process->profile_manager(); 170 ProfileManager* profile_manager = g_browser_process->profile_manager();
171 std::vector<Profile*> profiles = profile_manager->GetLoadedProfiles(); 171 std::vector<Profile*> profiles = profile_manager->GetLoadedProfiles();
172 for (std::vector<Profile*>::iterator i = profiles.begin(); 172 for (std::vector<Profile*>::iterator i = profiles.begin();
173 i != profiles.end(); 173 i != profiles.end();
174 ++i) { 174 ++i) {
175 SigninManagerBase* manager = 175 SigninManagerBase* manager =
176 SigninManagerFactory::GetForProfileIfExists(*i); 176 SigninManagerFactory::GetForProfileIfExists(*i);
177 if (manager) { 177 if (manager) {
178 DCHECK(!scoped_observer_.IsObserving(manager)); 178 DCHECK(!scoped_observer_.IsObserving(manager));
179 scoped_observer_.Add(manager); 179 scoped_observer_.Add(manager);
180 } 180 }
181 } 181 }
182 182
183 profile_manager->GetProfileInfoCache().AddObserver(this); 183 profile_manager->GetProfileInfoCache().AddObserver(this);
184 SetProfile(profile);
185 }
184 186
185 app_list::StartPageService* service = 187 AppListViewDelegate::~AppListViewDelegate() {
188 SetProfile(NULL);
189 g_browser_process->profile_manager()->GetProfileInfoCache().RemoveObserver(
190 this);
191
192 SigninManagerFactory* factory = SigninManagerFactory::GetInstance();
193 if (factory)
194 factory->RemoveObserver(this);
195 }
196
197 void AppListViewDelegate::SetProfile(Profile* new_profile) {
198 if (profile_) {
199 // Note: |search_controller_| has a reference to |speech_ui_| so must be
200 // destroyed first.
201 search_controller_.reset();
202 speech_ui_.reset();
203 custom_page_contents_.clear();
204 app_list::StartPageService* start_page_service =
205 app_list::StartPageService::Get(profile_);
206 if (start_page_service)
207 start_page_service->RemoveObserver(this);
208 #if defined(USE_ASH)
209 app_sync_ui_state_watcher_.reset();
210 #endif
211 model_ = NULL;
212 }
213
214 profile_ = new_profile;
215 if (!profile_)
216 return;
217
218 model_ =
219 app_list::AppListSyncableServiceFactory::GetForProfile(profile_)->model();
220
221 #if defined(USE_ASH)
222 app_sync_ui_state_watcher_.reset(new AppSyncUIStateWatcher(profile_, model_));
223 #endif
224
225 SetUpSearchUI();
226 SetUpProfileSwitcher();
227 SetUpCustomLauncherPages();
228
229 // Clear search query.
230 model_->search_box()->SetText(base::string16());
231 }
232
233 void AppListViewDelegate::SetUpSearchUI() {
234 app_list::StartPageService* start_page_service =
186 app_list::StartPageService::Get(profile_); 235 app_list::StartPageService::Get(profile_);
236 if (start_page_service)
237 start_page_service->AddObserver(this);
238
187 speech_ui_.reset(new app_list::SpeechUIModel( 239 speech_ui_.reset(new app_list::SpeechUIModel(
188 service ? service->state() : app_list::SPEECH_RECOGNITION_OFF)); 240 start_page_service ? start_page_service->state()
241 : app_list::SPEECH_RECOGNITION_OFF));
189 242
190 #if defined(GOOGLE_CHROME_BUILD) 243 #if defined(GOOGLE_CHROME_BUILD)
191 speech_ui_->set_logo( 244 speech_ui_->set_logo(
192 *ui::ResourceBundle::GetSharedInstance(). 245 *ui::ResourceBundle::GetSharedInstance().
193 GetImageSkiaNamed(IDR_APP_LIST_GOOGLE_LOGO_VOICE_SEARCH)); 246 GetImageSkiaNamed(IDR_APP_LIST_GOOGLE_LOGO_VOICE_SEARCH));
194 #endif 247 #endif
195 248
196 OnProfileChanged(); // sets model_ 249 search_controller_.reset(new app_list::SearchController(profile_,
197 if (service) 250 model_->search_box(),
198 service->AddObserver(this); 251 model_->results(),
252 speech_ui_.get(),
253 controller_));
254 }
199 255
200 // Set up the custom launcher pages. 256 void AppListViewDelegate::SetUpProfileSwitcher() {
257 // Don't populate the app list users if we are on the ash desktop.
258 chrome::HostDesktopType desktop = chrome::GetHostDesktopTypeForNativeWindow(
259 controller_->GetAppListWindow());
260 if (desktop == chrome::HOST_DESKTOP_TYPE_ASH)
261 return;
262
263 // Populate the app list users.
264 PopulateUsers(g_browser_process->profile_manager()->GetProfileInfoCache(),
265 profile_->GetPath(),
266 &users_);
267
268 FOR_EACH_OBSERVER(
269 app_list::AppListViewDelegateObserver, observers_, OnProfilesChanged());
270 }
271
272 void AppListViewDelegate::SetUpCustomLauncherPages() {
201 std::vector<GURL> custom_launcher_page_urls; 273 std::vector<GURL> custom_launcher_page_urls;
202 GetCustomLauncherPageUrls(profile, &custom_launcher_page_urls); 274 GetCustomLauncherPageUrls(profile_, &custom_launcher_page_urls);
203 for (std::vector<GURL>::const_iterator it = custom_launcher_page_urls.begin(); 275 for (std::vector<GURL>::const_iterator it = custom_launcher_page_urls.begin();
204 it != custom_launcher_page_urls.end(); 276 it != custom_launcher_page_urls.end();
205 ++it) { 277 ++it) {
206 std::string extension_id = it->host(); 278 std::string extension_id = it->host();
207 apps::CustomLauncherPageContents* page_contents = 279 apps::CustomLauncherPageContents* page_contents =
208 new apps::CustomLauncherPageContents( 280 new apps::CustomLauncherPageContents(
209 scoped_ptr<extensions::AppDelegate>(new ChromeAppDelegate), 281 scoped_ptr<extensions::AppDelegate>(new ChromeAppDelegate),
210 extension_id); 282 extension_id);
211 page_contents->Initialize(profile, *it); 283 page_contents->Initialize(profile_, *it);
212 custom_page_contents_.push_back(page_contents); 284 custom_page_contents_.push_back(page_contents);
213 } 285 }
214 } 286 }
215 287
216 AppListViewDelegate::~AppListViewDelegate() {
217 app_list::StartPageService* service =
218 app_list::StartPageService::Get(profile_);
219 if (service)
220 service->RemoveObserver(this);
221 g_browser_process->
222 profile_manager()->GetProfileInfoCache().RemoveObserver(this);
223
224 SigninManagerFactory* factory = SigninManagerFactory::GetInstance();
225 if (factory)
226 factory->RemoveObserver(this);
227
228 // Ensure search controller is released prior to speech_ui_.
229 search_controller_.reset();
230 }
231
232 void AppListViewDelegate::OnHotwordStateChanged(bool started) { 288 void AppListViewDelegate::OnHotwordStateChanged(bool started) {
233 if (started) { 289 if (started) {
234 if (speech_ui_->state() == app_list::SPEECH_RECOGNITION_READY) { 290 if (speech_ui_->state() == app_list::SPEECH_RECOGNITION_READY) {
235 OnSpeechRecognitionStateChanged( 291 OnSpeechRecognitionStateChanged(
236 app_list::SPEECH_RECOGNITION_HOTWORD_LISTENING); 292 app_list::SPEECH_RECOGNITION_HOTWORD_LISTENING);
237 } 293 }
238 } else { 294 } else {
239 if (speech_ui_->state() == app_list::SPEECH_RECOGNITION_HOTWORD_LISTENING) 295 if (speech_ui_->state() == app_list::SPEECH_RECOGNITION_HOTWORD_LISTENING)
240 OnSpeechRecognitionStateChanged(app_list::SPEECH_RECOGNITION_READY); 296 OnSpeechRecognitionStateChanged(app_list::SPEECH_RECOGNITION_READY);
241 } 297 }
242 } 298 }
243 299
244 void AppListViewDelegate::OnHotwordRecognized() { 300 void AppListViewDelegate::OnHotwordRecognized() {
245 DCHECK_EQ(app_list::SPEECH_RECOGNITION_HOTWORD_LISTENING, 301 DCHECK_EQ(app_list::SPEECH_RECOGNITION_HOTWORD_LISTENING,
246 speech_ui_->state()); 302 speech_ui_->state());
247 ToggleSpeechRecognition(); 303 ToggleSpeechRecognition();
248 } 304 }
249 305
250 void AppListViewDelegate::SigninManagerCreated(SigninManagerBase* manager) { 306 void AppListViewDelegate::SigninManagerCreated(SigninManagerBase* manager) {
251 scoped_observer_.Add(manager); 307 scoped_observer_.Add(manager);
252 } 308 }
253 309
254 void AppListViewDelegate::SigninManagerShutdown(SigninManagerBase* manager) { 310 void AppListViewDelegate::SigninManagerShutdown(SigninManagerBase* manager) {
255 if (scoped_observer_.IsObserving(manager)) 311 if (scoped_observer_.IsObserving(manager))
256 scoped_observer_.Remove(manager); 312 scoped_observer_.Remove(manager);
257 } 313 }
258 314
259 void AppListViewDelegate::GoogleSigninFailed( 315 void AppListViewDelegate::GoogleSigninFailed(
260 const GoogleServiceAuthError& error) { 316 const GoogleServiceAuthError& error) {
261 OnProfileChanged(); 317 SetUpProfileSwitcher();
262 } 318 }
263 319
264 void AppListViewDelegate::GoogleSigninSucceeded(const std::string& username, 320 void AppListViewDelegate::GoogleSigninSucceeded(const std::string& username,
265 const std::string& password) { 321 const std::string& password) {
266 OnProfileChanged(); 322 SetUpProfileSwitcher();
267 } 323 }
268 324
269 void AppListViewDelegate::GoogleSignedOut(const std::string& username) { 325 void AppListViewDelegate::GoogleSignedOut(const std::string& username) {
270 OnProfileChanged(); 326 SetUpProfileSwitcher();
271 } 327 }
272 328
273 void AppListViewDelegate::OnProfileChanged() { 329 void AppListViewDelegate::OnProfileAdded(const base::FilePath& profile_path) {
274 model_ = app_list::AppListSyncableServiceFactory::GetForProfile( 330 SetUpProfileSwitcher();
275 profile_)->model(); 331 }
276 332
277 search_controller_.reset(new app_list::SearchController( 333 void AppListViewDelegate::OnProfileWasRemoved(
278 profile_, model_->search_box(), model_->results(), 334 const base::FilePath& profile_path,
279 speech_ui_.get(), controller_)); 335 const base::string16& profile_name) {
336 SetUpProfileSwitcher();
337 }
280 338
281 #if defined(USE_ASH) 339 void AppListViewDelegate::OnProfileNameChanged(
282 app_sync_ui_state_watcher_.reset(new AppSyncUIStateWatcher(profile_, model_)); 340 const base::FilePath& profile_path,
283 #endif 341 const base::string16& old_profile_name) {
284 342 SetUpProfileSwitcher();
285 // Don't populate the app list users if we are on the ash desktop.
286 chrome::HostDesktopType desktop = chrome::GetHostDesktopTypeForNativeWindow(
287 controller_->GetAppListWindow());
288 if (desktop == chrome::HOST_DESKTOP_TYPE_ASH)
289 return;
290
291 // Populate the app list users.
292 PopulateUsers(g_browser_process->profile_manager()->GetProfileInfoCache(),
293 profile_->GetPath(), &users_);
294
295 FOR_EACH_OBSERVER(app_list::AppListViewDelegateObserver,
296 observers_,
297 OnProfilesChanged());
298 } 343 }
299 344
300 bool AppListViewDelegate::ForceNativeDesktop() const { 345 bool AppListViewDelegate::ForceNativeDesktop() const {
301 return controller_->ForceNativeDesktop(); 346 return controller_->ForceNativeDesktop();
302 } 347 }
303 348
304 void AppListViewDelegate::SetProfileByPath(const base::FilePath& profile_path) { 349 void AppListViewDelegate::SetProfileByPath(const base::FilePath& profile_path) {
305 DCHECK(model_); 350 DCHECK(model_);
306
307 // The profile must be loaded before this is called. 351 // The profile must be loaded before this is called.
308 profile_ = 352 SetProfile(
309 g_browser_process->profile_manager()->GetProfileByPath(profile_path); 353 g_browser_process->profile_manager()->GetProfileByPath(profile_path));
310 DCHECK(profile_);
311
312 OnProfileChanged();
313
314 // Clear search query.
315 model_->search_box()->SetText(base::string16());
316 } 354 }
317 355
318 app_list::AppListModel* AppListViewDelegate::GetModel() { 356 app_list::AppListModel* AppListViewDelegate::GetModel() {
319 return model_; 357 return model_;
320 } 358 }
321 359
322 app_list::SpeechUIModel* AppListViewDelegate::GetSpeechUI() { 360 app_list::SpeechUIModel* AppListViewDelegate::GetSpeechUI() {
323 return speech_ui_.get(); 361 return speech_ui_.get();
324 } 362 }
325 363
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
492 HotwordService::IsExperimentalHotwordingEnabled() && 530 HotwordService::IsExperimentalHotwordingEnabled() &&
493 service && service->HotwordEnabled()) { 531 service && service->HotwordEnabled()) {
494 HotwordService* hotword_service = 532 HotwordService* hotword_service =
495 HotwordServiceFactory::GetForProfile(profile_); 533 HotwordServiceFactory::GetForProfile(profile_);
496 if (hotword_service) { 534 if (hotword_service) {
497 hotword_service->RequestHotwordSession(this); 535 hotword_service->RequestHotwordSession(this);
498 } 536 }
499 } 537 }
500 } 538 }
501 539
502 void AppListViewDelegate::OnProfileAdded(const base::FilePath& profile_path) {
503 OnProfileChanged();
504 }
505
506 void AppListViewDelegate::OnProfileWasRemoved(
507 const base::FilePath& profile_path, const base::string16& profile_name) {
508 OnProfileChanged();
509 }
510
511 void AppListViewDelegate::OnProfileNameChanged(
512 const base::FilePath& profile_path,
513 const base::string16& old_profile_name) {
514 OnProfileChanged();
515 }
516
517 #if defined(TOOLKIT_VIEWS) 540 #if defined(TOOLKIT_VIEWS)
518 views::View* AppListViewDelegate::CreateStartPageWebView( 541 views::View* AppListViewDelegate::CreateStartPageWebView(
519 const gfx::Size& size) { 542 const gfx::Size& size) {
520 app_list::StartPageService* service = 543 app_list::StartPageService* service =
521 app_list::StartPageService::Get(profile_); 544 app_list::StartPageService::Get(profile_);
522 if (!service) 545 if (!service)
523 return NULL; 546 return NULL;
524 547
525 content::WebContents* web_contents = service->GetStartPageContents(); 548 content::WebContents* web_contents = service->GetStartPageContents();
526 if (!web_contents) 549 if (!web_contents)
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 620
598 void AppListViewDelegate::AddObserver( 621 void AppListViewDelegate::AddObserver(
599 app_list::AppListViewDelegateObserver* observer) { 622 app_list::AppListViewDelegateObserver* observer) {
600 observers_.AddObserver(observer); 623 observers_.AddObserver(observer);
601 } 624 }
602 625
603 void AppListViewDelegate::RemoveObserver( 626 void AppListViewDelegate::RemoveObserver(
604 app_list::AppListViewDelegateObserver* observer) { 627 app_list::AppListViewDelegateObserver* observer) {
605 observers_.RemoveObserver(observer); 628 observers_.RemoveObserver(observer);
606 } 629 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/app_list/app_list_view_delegate.h ('k') | chrome/browser/ui/ash/app_list/app_list_service_ash.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698