1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/sync/glue/bookmark_data_type_controller.h"
6
7 #include "base/metrics/histogram.h"
8 #include "chrome/browser/bookmarks/bookmark_model.h"
9 #include "chrome/browser/profiles/profile.h"
10 #include "chrome/browser/sync/profile_sync_factory.h"
11 #include "chrome/browser/sync/profile_sync_service.h"
12 #include "content/browser/browser_thread.h"
13 #include "content/common/notification_details.h"
14 #include "content/common/notification_source.h"
15 #include "content/common/notification_type.h"
16
17 namespace browser_sync {
18
BookmarkDataTypeController(ProfileSyncFactory * profile_sync_factory,Profile * profile,ProfileSyncService * sync_service)19 BookmarkDataTypeController::BookmarkDataTypeController(
20 ProfileSyncFactory* profile_sync_factory,
21 Profile* profile,
22 ProfileSyncService* sync_service)
23 : FrontendDataTypeController(profile_sync_factory,
24 profile,
25 sync_service) {
26 }
27
~BookmarkDataTypeController()28 BookmarkDataTypeController::~BookmarkDataTypeController() {
29 }
30
31 // We want to start the bookmark model before we begin associating.
StartModels()32 bool BookmarkDataTypeController::StartModels() {
33 // If the bookmarks model is loaded, continue with association.
34 BookmarkModel* bookmark_model = profile_->GetBookmarkModel();
35 if (bookmark_model && bookmark_model->IsLoaded()) {
36 return true; // Continue to Associate().
37 }
38
39 // Add an observer and continue when the bookmarks model is loaded.
40 registrar_.Add(this, NotificationType::BOOKMARK_MODEL_LOADED,
41 Source<Profile>(sync_service_->profile()));
42 return false; // Don't continue Start.
43 }
44
45 // Cleanup for our extra registrar usage.
CleanupState()46 void BookmarkDataTypeController::CleanupState() {
47 registrar_.RemoveAll();
48 }
49
Observe(NotificationType type,const NotificationSource & source,const NotificationDetails & details)50 void BookmarkDataTypeController::Observe(NotificationType type,
51 const NotificationSource& source,
52 const NotificationDetails& details) {
53 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
54 DCHECK_EQ(NotificationType::BOOKMARK_MODEL_LOADED, type.value);
55 registrar_.RemoveAll();
56 DCHECK_EQ(state_, MODEL_STARTING);
57 state_ = ASSOCIATING;
58 Associate();
59 }
60
type() const61 syncable::ModelType BookmarkDataTypeController::type() const {
62 return syncable::BOOKMARKS;
63 }
64
CreateSyncComponents()65 void BookmarkDataTypeController::CreateSyncComponents() {
66 ProfileSyncFactory::SyncComponents sync_components = profile_sync_factory_->
67 CreateBookmarkSyncComponents(sync_service_, this);
68 model_associator_.reset(sync_components.model_associator);
69 change_processor_.reset(sync_components.change_processor);
70 }
71
RecordUnrecoverableError(const tracked_objects::Location & from_here,const std::string & message)72 void BookmarkDataTypeController::RecordUnrecoverableError(
73 const tracked_objects::Location& from_here,
74 const std::string& message) {
75 UMA_HISTOGRAM_COUNTS("Sync.BookmarkRunFailures", 1);
76 }
77
RecordAssociationTime(base::TimeDelta time)78 void BookmarkDataTypeController::RecordAssociationTime(base::TimeDelta time) {
79 UMA_HISTOGRAM_TIMES("Sync.BookmarkAssociationTime", time);
80 }
81
RecordStartFailure(StartResult result)82 void BookmarkDataTypeController::RecordStartFailure(StartResult result) {
83 UMA_HISTOGRAM_ENUMERATION("Sync.BookmarkStartFailures",
84 result,
85 MAX_START_RESULT);
86 }
87
88 } // namespace browser_sync
89