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_factory.h" 97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/sync/glue/chrome_report_unrecoverable_error.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_components_factory.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h" 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_model.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace browser_sync { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BookmarkDataTypeController::BookmarkDataTypeController( 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileSyncComponentsFactory* profile_sync_factory, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileSyncService* sync_service) 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : FrontendDataTypeController( 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI), 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&ChromeReportUnrecoverableError), 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profile_sync_factory, 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) profile, 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) sync_service), 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bookmark_model_(NULL), 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) installed_bookmark_observer_(false) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::ModelType BookmarkDataTypeController::type() const { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return syncer::BOOKMARKS; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BookmarkDataTypeController::Observe( 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(state_, MODEL_STARTING); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(chrome::NOTIFICATION_HISTORY_LOADED, type); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!DependentsLoaded()) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bookmark_model_->RemoveObserver(this); 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) installed_bookmark_observer_ = false; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.RemoveAll(); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnModelLoaded(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)BookmarkDataTypeController::~BookmarkDataTypeController() { 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (installed_bookmark_observer_ && bookmark_model_) { 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(profile_); 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bookmark_model_->RemoveObserver(this); 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BookmarkDataTypeController::StartModels() { 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bookmark_model_ = BookmarkModelFactory::GetForProfile(profile_); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!DependentsLoaded()) { 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bookmark_model_->AddObserver(this); 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) installed_bookmark_observer_ = true; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_HISTORY_LOADED, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile>(sync_service_->profile())); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cleanup for our extra registrar usage. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BookmarkDataTypeController::CleanUpState() { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.RemoveAll(); 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (bookmark_model_ && installed_bookmark_observer_) { 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bookmark_model_->RemoveObserver(this); 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) installed_bookmark_observer_ = false; 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BookmarkDataTypeController::CreateSyncComponents() { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileSyncComponentsFactory::SyncComponents sync_components = 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_sync_factory_->CreateBookmarkSyncComponents(sync_service_, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_model_associator(sync_components.model_associator); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_change_processor(sync_components.change_processor); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BookmarkDataTypeController::BookmarkModelChanged() { 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BookmarkDataTypeController::BookmarkModelLoaded(BookmarkModel* model, 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool ids_reassigned) { 103b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(model->loaded()); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model->RemoveObserver(this); 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) installed_bookmark_observer_ = false; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!DependentsLoaded()) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registrar_.RemoveAll(); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnModelLoaded(); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void BookmarkDataTypeController::BookmarkModelBeingDeleted( 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BookmarkModel* model) { 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) installed_bookmark_observer_ = false; 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that both the bookmark model and the history service (for favicons) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are loaded. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BookmarkDataTypeController::DependentsLoaded() { 122b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (!bookmark_model_ || !bookmark_model_->loaded()) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryService* history = HistoryServiceFactory::GetForProfile( 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_, Profile::EXPLICIT_ACCESS); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!history || !history->BackendLoaded()) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All necessary services are loaded. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace browser_sync 135