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

Side by Side Diff: chrome/browser/win/jumplist.cc

Issue 2323603002: Convert JumpList to a KeyedService. (Closed)
Patch Set: Clang fixes Created 4 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/win/jumplist.h ('k') | chrome/browser/win/jumplist_factory.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 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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/win/jumplist.h" 5 #include "chrome/browser/win/jumplist.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/files/file_util.h" 10 #include "base/files/file_util.h"
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
254 incognito_availability); 254 incognito_availability);
255 } 255 }
256 256
257 } // namespace 257 } // namespace
258 258
259 JumpList::JumpListData::JumpListData() {} 259 JumpList::JumpListData::JumpListData() {}
260 260
261 JumpList::JumpListData::~JumpListData() {} 261 JumpList::JumpListData::~JumpListData() {}
262 262
263 JumpList::JumpList(Profile* profile) 263 JumpList::JumpList(Profile* profile)
264 : profile_(profile), 264 : RefcountedKeyedService(content::BrowserThread::GetTaskRunnerForThread(
265 content::BrowserThread::UI)),
266 profile_(profile),
265 jumplist_data_(new base::RefCountedData<JumpListData>), 267 jumplist_data_(new base::RefCountedData<JumpListData>),
266 task_id_(base::CancelableTaskTracker::kBadTaskId), 268 task_id_(base::CancelableTaskTracker::kBadTaskId),
267 weak_ptr_factory_(this) { 269 weak_ptr_factory_(this) {
268 DCHECK(Enabled()); 270 DCHECK(Enabled());
269 // To update JumpList when a tab is added or removed, we add this object to 271 // To update JumpList when a tab is added or removed, we add this object to
270 // the observer list of the TabRestoreService class. 272 // the observer list of the TabRestoreService class.
271 // When we add this object to the observer list, we save the pointer to this 273 // When we add this object to the observer list, we save the pointer to this
272 // TabRestoreService object. This pointer is used when we remove this object 274 // TabRestoreService object. This pointer is used when we remove this object
273 // from the observer list. 275 // from the observer list.
274 sessions::TabRestoreService* tab_restore_service = 276 sessions::TabRestoreService* tab_restore_service =
275 TabRestoreServiceFactory::GetForProfile(profile_); 277 TabRestoreServiceFactory::GetForProfile(profile_);
276 if (!tab_restore_service) 278 if (!tab_restore_service)
277 return; 279 return;
278 280
279 app_id_ = 281 app_id_ =
280 shell_integration::win::GetChromiumModelIdForProfile(profile_->GetPath()); 282 shell_integration::win::GetChromiumModelIdForProfile(profile_->GetPath());
281 icon_dir_ = profile_->GetPath().Append(chrome::kJumpListIconDirname); 283 icon_dir_ = profile_->GetPath().Append(chrome::kJumpListIconDirname);
282 284
283 scoped_refptr<history::TopSites> top_sites = 285 scoped_refptr<history::TopSites> top_sites =
284 TopSitesFactory::GetForProfile(profile_); 286 TopSitesFactory::GetForProfile(profile_);
285 if (top_sites) { 287 if (top_sites) {
286 // TopSites updates itself after a delay. This is especially noticable when 288 // TopSites updates itself after a delay. This is especially noticable when
287 // your profile is empty. Ask TopSites to update itself when jumplist is 289 // your profile is empty. Ask TopSites to update itself when jumplist is
288 // initialized. 290 // initialized.
289 top_sites->SyncWithHistory(); 291 top_sites->SyncWithHistory();
290 registrar_.reset(new content::NotificationRegistrar);
291 // Register as TopSitesObserver so that we can update ourselves when the 292 // Register as TopSitesObserver so that we can update ourselves when the
292 // TopSites changes. 293 // TopSites changes.
293 top_sites->AddObserver(this); 294 top_sites->AddObserver(this);
294 // Register for notification when profile is destroyed to ensure that all
295 // observers are detatched at that time.
296 registrar_->Add(this, chrome::NOTIFICATION_PROFILE_DESTROYED,
297 content::Source<Profile>(profile_));
298 } 295 }
299 tab_restore_service->AddObserver(this); 296 tab_restore_service->AddObserver(this);
300 pref_change_registrar_.reset(new PrefChangeRegistrar); 297 pref_change_registrar_.reset(new PrefChangeRegistrar);
301 pref_change_registrar_->Init(profile_->GetPrefs()); 298 pref_change_registrar_->Init(profile_->GetPrefs());
302 pref_change_registrar_->Add( 299 pref_change_registrar_->Add(
303 prefs::kIncognitoModeAvailability, 300 prefs::kIncognitoModeAvailability,
304 base::Bind(&JumpList::OnIncognitoAvailabilityChanged, this)); 301 base::Bind(&JumpList::OnIncognitoAvailabilityChanged, this));
305 } 302 }
306 303
307 JumpList::~JumpList() { 304 JumpList::~JumpList() {
308 DCHECK(CalledOnValidThread()); 305 DCHECK(CalledOnValidThread());
309 Terminate(); 306 Terminate();
310 } 307 }
311 308
312 // static 309 // static
313 bool JumpList::Enabled() { 310 bool JumpList::Enabled() {
314 return JumpListUpdater::IsEnabled(); 311 return JumpListUpdater::IsEnabled();
315 } 312 }
316 313
317 void JumpList::Observe(int type,
318 const content::NotificationSource& source,
319 const content::NotificationDetails& details) {
320 DCHECK(CalledOnValidThread());
321 DCHECK_EQ(chrome::NOTIFICATION_PROFILE_DESTROYED, type);
322 // Profile was destroyed, do clean-up.
323 Terminate();
324 }
325
326 void JumpList::CancelPendingUpdate() { 314 void JumpList::CancelPendingUpdate() {
327 DCHECK(CalledOnValidThread()); 315 DCHECK(CalledOnValidThread());
328 if (task_id_ != base::CancelableTaskTracker::kBadTaskId) { 316 if (task_id_ != base::CancelableTaskTracker::kBadTaskId) {
329 cancelable_task_tracker_.TryCancel(task_id_); 317 cancelable_task_tracker_.TryCancel(task_id_);
330 task_id_ = base::CancelableTaskTracker::kBadTaskId; 318 task_id_ = base::CancelableTaskTracker::kBadTaskId;
331 } 319 }
332 } 320 }
333 321
334 void JumpList::Terminate() { 322 void JumpList::Terminate() {
335 DCHECK(CalledOnValidThread()); 323 DCHECK(CalledOnValidThread());
336 CancelPendingUpdate(); 324 CancelPendingUpdate();
337 if (profile_) { 325 if (profile_) {
338 sessions::TabRestoreService* tab_restore_service = 326 sessions::TabRestoreService* tab_restore_service =
339 TabRestoreServiceFactory::GetForProfile(profile_); 327 TabRestoreServiceFactory::GetForProfile(profile_);
340 if (tab_restore_service) 328 if (tab_restore_service)
341 tab_restore_service->RemoveObserver(this); 329 tab_restore_service->RemoveObserver(this);
342 scoped_refptr<history::TopSites> top_sites = 330 scoped_refptr<history::TopSites> top_sites =
343 TopSitesFactory::GetForProfile(profile_); 331 TopSitesFactory::GetForProfile(profile_);
344 if (top_sites) 332 if (top_sites)
345 top_sites->RemoveObserver(this); 333 top_sites->RemoveObserver(this);
346 registrar_.reset();
347 pref_change_registrar_.reset(); 334 pref_change_registrar_.reset();
348 } 335 }
349 profile_ = NULL; 336 profile_ = NULL;
350 } 337 }
351 338
339 void JumpList::ShutdownOnUIThread() {
340 DCHECK(CalledOnValidThread());
341 Terminate();
342 }
343
352 void JumpList::OnMostVisitedURLsAvailable( 344 void JumpList::OnMostVisitedURLsAvailable(
353 const history::MostVisitedURLList& urls) { 345 const history::MostVisitedURLList& urls) {
354 DCHECK(CalledOnValidThread()); 346 DCHECK(CalledOnValidThread());
355 // If we have a pending favicon request, cancel it here (it is out of date). 347 // If we have a pending favicon request, cancel it here (it is out of date).
356 CancelPendingUpdate(); 348 CancelPendingUpdate();
357 349
358 { 350 {
359 JumpListData* data = &jumplist_data_->data; 351 JumpListData* data = &jumplist_data_->data;
360 base::AutoLock auto_lock(data->list_lock_); 352 base::AutoLock auto_lock(data->list_lock_);
361 data->most_visited_pages_.clear(); 353 data->most_visited_pages_.clear();
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
580 void JumpList::TopSitesLoaded(history::TopSites* top_sites) { 572 void JumpList::TopSitesLoaded(history::TopSites* top_sites) {
581 } 573 }
582 574
583 void JumpList::TopSitesChanged(history::TopSites* top_sites, 575 void JumpList::TopSitesChanged(history::TopSites* top_sites,
584 ChangeReason change_reason) { 576 ChangeReason change_reason) {
585 top_sites->GetMostVisitedURLs( 577 top_sites->GetMostVisitedURLs(
586 base::Bind(&JumpList::OnMostVisitedURLsAvailable, 578 base::Bind(&JumpList::OnMostVisitedURLsAvailable,
587 weak_ptr_factory_.GetWeakPtr()), 579 weak_ptr_factory_.GetWeakPtr()),
588 false); 580 false);
589 } 581 }
OLDNEW
« no previous file with comments | « chrome/browser/win/jumplist.h ('k') | chrome/browser/win/jumplist_factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698