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

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

Issue 550883002: Fix SpeechUIModel lifetime issue in Chrome's AppListViewDelegate when switching profiles (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: clear state for SetProfile(NULL) 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 | « athena/home/app_list_view_delegate.cc ('k') | ui/app_list/speech_ui_model.h » ('j') | 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 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 ++i) { 166 ++i) {
167 SigninManagerBase* manager = 167 SigninManagerBase* manager =
168 SigninManagerFactory::GetForProfileIfExists(*i); 168 SigninManagerFactory::GetForProfileIfExists(*i);
169 if (manager) { 169 if (manager) {
170 DCHECK(!scoped_observer_.IsObserving(manager)); 170 DCHECK(!scoped_observer_.IsObserving(manager));
171 scoped_observer_.Add(manager); 171 scoped_observer_.Add(manager);
172 } 172 }
173 } 173 }
174 174
175 profile_manager->GetProfileInfoCache().AddObserver(this); 175 profile_manager->GetProfileInfoCache().AddObserver(this);
176 speech_ui_.reset(new app_list::SpeechUIModel);
177
178 #if defined(GOOGLE_CHROME_BUILD)
179 speech_ui_->set_logo(
180 *ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
181 IDR_APP_LIST_GOOGLE_LOGO_VOICE_SEARCH));
182 #endif
176 SetProfile(profile); 183 SetProfile(profile);
177 } 184 }
178 185
179 AppListViewDelegate::~AppListViewDelegate() { 186 AppListViewDelegate::~AppListViewDelegate() {
180 SetProfile(NULL); 187 SetProfile(NULL);
181 g_browser_process->profile_manager()->GetProfileInfoCache().RemoveObserver( 188 g_browser_process->profile_manager()->GetProfileInfoCache().RemoveObserver(
182 this); 189 this);
183 190
184 SigninManagerFactory* factory = SigninManagerFactory::GetInstance(); 191 SigninManagerFactory* factory = SigninManagerFactory::GetInstance();
185 if (factory) 192 if (factory)
186 factory->RemoveObserver(this); 193 factory->RemoveObserver(this);
187 } 194 }
188 195
189 void AppListViewDelegate::SetProfile(Profile* new_profile) { 196 void AppListViewDelegate::SetProfile(Profile* new_profile) {
190 if (profile_) { 197 if (profile_) {
191 // Note: |search_controller_| has a reference to |speech_ui_| so must be 198 // Note: |search_controller_| has a reference to |speech_ui_| so must be
192 // destroyed first. 199 // destroyed first.
193 search_controller_.reset(); 200 search_controller_.reset();
194 speech_ui_.reset();
195 custom_page_contents_.clear(); 201 custom_page_contents_.clear();
196 app_list::StartPageService* start_page_service = 202 app_list::StartPageService* start_page_service =
197 app_list::StartPageService::Get(profile_); 203 app_list::StartPageService::Get(profile_);
198 if (start_page_service) 204 if (start_page_service)
199 start_page_service->RemoveObserver(this); 205 start_page_service->RemoveObserver(this);
200 #if defined(USE_ASH) 206 #if defined(USE_ASH)
201 app_sync_ui_state_watcher_.reset(); 207 app_sync_ui_state_watcher_.reset();
202 #endif 208 #endif
203 model_ = NULL; 209 model_ = NULL;
204 } 210 }
205 211
206 profile_ = new_profile; 212 profile_ = new_profile;
207 if (!profile_) 213 if (!profile_) {
214 speech_ui_->SetSpeechRecognitionState(app_list::SPEECH_RECOGNITION_OFF);
208 return; 215 return;
216 }
209 217
210 model_ = 218 model_ =
211 app_list::AppListSyncableServiceFactory::GetForProfile(profile_)->model(); 219 app_list::AppListSyncableServiceFactory::GetForProfile(profile_)->model();
212 220
213 #if defined(USE_ASH) 221 #if defined(USE_ASH)
214 app_sync_ui_state_watcher_.reset(new AppSyncUIStateWatcher(profile_, model_)); 222 app_sync_ui_state_watcher_.reset(new AppSyncUIStateWatcher(profile_, model_));
215 #endif 223 #endif
216 224
217 SetUpSearchUI(); 225 SetUpSearchUI();
218 SetUpProfileSwitcher(); 226 SetUpProfileSwitcher();
219 SetUpCustomLauncherPages(); 227 SetUpCustomLauncherPages();
220 228
221 // Clear search query. 229 // Clear search query.
222 model_->search_box()->SetText(base::string16()); 230 model_->search_box()->SetText(base::string16());
223 } 231 }
224 232
225 void AppListViewDelegate::SetUpSearchUI() { 233 void AppListViewDelegate::SetUpSearchUI() {
226 app_list::StartPageService* start_page_service = 234 app_list::StartPageService* start_page_service =
227 app_list::StartPageService::Get(profile_); 235 app_list::StartPageService::Get(profile_);
228 if (start_page_service) 236 if (start_page_service)
229 start_page_service->AddObserver(this); 237 start_page_service->AddObserver(this);
230 238
231 speech_ui_.reset(new app_list::SpeechUIModel( 239 speech_ui_->SetSpeechRecognitionState(start_page_service
232 start_page_service ? start_page_service->state() 240 ? start_page_service->state()
233 : app_list::SPEECH_RECOGNITION_OFF)); 241 : app_list::SPEECH_RECOGNITION_OFF);
234
235 #if defined(GOOGLE_CHROME_BUILD)
236 speech_ui_->set_logo(
237 *ui::ResourceBundle::GetSharedInstance().
238 GetImageSkiaNamed(IDR_APP_LIST_GOOGLE_LOGO_VOICE_SEARCH));
239 #endif
240 242
241 search_controller_.reset(new app_list::SearchController(profile_, 243 search_controller_.reset(new app_list::SearchController(profile_,
242 model_->search_box(), 244 model_->search_box(),
243 model_->results(), 245 model_->results(),
244 speech_ui_.get(), 246 speech_ui_.get(),
245 controller_)); 247 controller_));
246 } 248 }
247 249
248 void AppListViewDelegate::SetUpProfileSwitcher() { 250 void AppListViewDelegate::SetUpProfileSwitcher() {
249 // Don't populate the app list users if we are on the ash desktop. 251 // Don't populate the app list users if we are on the ash desktop.
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after
614 616
615 void AppListViewDelegate::AddObserver( 617 void AppListViewDelegate::AddObserver(
616 app_list::AppListViewDelegateObserver* observer) { 618 app_list::AppListViewDelegateObserver* observer) {
617 observers_.AddObserver(observer); 619 observers_.AddObserver(observer);
618 } 620 }
619 621
620 void AppListViewDelegate::RemoveObserver( 622 void AppListViewDelegate::RemoveObserver(
621 app_list::AppListViewDelegateObserver* observer) { 623 app_list::AppListViewDelegateObserver* observer) {
622 observers_.RemoveObserver(observer); 624 observers_.RemoveObserver(observer);
623 } 625 }
OLDNEW
« no previous file with comments | « athena/home/app_list_view_delegate.cc ('k') | ui/app_list/speech_ui_model.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698