bookmark_data_type_controller.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/bookmark_data_type_controller.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h" 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_components_factory.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace browser_sync { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BookmarkDataTypeController::BookmarkDataTypeController( 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileSyncComponentsFactory* profile_sync_factory, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileSyncService* sync_service) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : FrontendDataTypeController(profile_sync_factory, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile, 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sync_service), 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bookmark_model_(NULL), 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) installed_bookmark_observer_(false) { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::ModelType BookmarkDataTypeController::type() const { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return syncer::BOOKMARKS; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BookmarkDataTypeController::Observe( 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(state_, MODEL_STARTING); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(chrome::NOTIFICATION_HISTORY_LOADED, type); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!DependentsLoaded()) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bookmark_model_->RemoveObserver(this); 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) installed_bookmark_observer_ = false; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.RemoveAll(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnModelLoaded(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)BookmarkDataTypeController::~BookmarkDataTypeController() { 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (installed_bookmark_observer_ && bookmark_model_) { 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(profile_); 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bookmark_model_->RemoveObserver(this); 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BookmarkDataTypeController::StartModels() { 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bookmark_model_ = BookmarkModelFactory::GetForProfile(profile_); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!DependentsLoaded()) { 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bookmark_model_->AddObserver(this); 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) installed_bookmark_observer_ = true; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_HISTORY_LOADED, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile>(sync_service_->profile())); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cleanup for our extra registrar usage. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BookmarkDataTypeController::CleanUpState() { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.RemoveAll(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BookmarkDataTypeController::CreateSyncComponents() { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileSyncComponentsFactory::SyncComponents sync_components = 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_sync_factory_->CreateBookmarkSyncComponents(sync_service_, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_model_associator(sync_components.model_associator); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_change_processor(sync_components.change_processor); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BookmarkDataTypeController::BookmarkModelChanged() { 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BookmarkDataTypeController::Loaded(BookmarkModel* model, 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool ids_reassigned) { 95b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(model->loaded()); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model->RemoveObserver(this); 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) installed_bookmark_observer_ = false; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!DependentsLoaded()) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registrar_.RemoveAll(); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnModelLoaded(); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BookmarkDataTypeController::BookmarkModelBeingDeleted( 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BookmarkModel* model) { 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) installed_bookmark_observer_ = false; 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that both the bookmark model and the history service (for favicons) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are loaded. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BookmarkDataTypeController::DependentsLoaded() { 114b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (!bookmark_model_ || !bookmark_model_->loaded()) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryService* history = HistoryServiceFactory::GetForProfile( 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_, Profile::EXPLICIT_ACCESS); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!history || !history->BackendLoaded()) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All necessary services are loaded. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace browser_sync 127