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