1 // Copyright 2018 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 "components/sync_user_events/user_event_model_type_controller.h"
6 
7 #include <utility>
8 
9 #include "base/bind.h"
10 #include "components/sync/driver/sync_auth_util.h"
11 #include "components/sync/driver/sync_service.h"
12 #include "components/sync/driver/sync_user_settings.h"
13 #include "google_apis/gaia/google_service_auth_error.h"
14 
15 namespace syncer {
16 
UserEventModelTypeController(SyncService * sync_service,std::unique_ptr<ModelTypeControllerDelegate> delegate_for_full_sync_mode)17 UserEventModelTypeController::UserEventModelTypeController(
18     SyncService* sync_service,
19     std::unique_ptr<ModelTypeControllerDelegate> delegate_for_full_sync_mode)
20     : ModelTypeController(syncer::USER_EVENTS,
21                           std::move(delegate_for_full_sync_mode)),
22       sync_service_(sync_service) {
23   DCHECK(sync_service_);
24   sync_service_->AddObserver(this);
25 }
26 
~UserEventModelTypeController()27 UserEventModelTypeController::~UserEventModelTypeController() {
28   sync_service_->RemoveObserver(this);
29 }
30 
Stop(syncer::ShutdownReason shutdown_reason,StopCallback callback)31 void UserEventModelTypeController::Stop(syncer::ShutdownReason shutdown_reason,
32                                         StopCallback callback) {
33   DCHECK(CalledOnValidThread());
34   switch (shutdown_reason) {
35     case syncer::STOP_SYNC:
36       // Special case: For USER_EVENT, we want to clear all data even when Sync
37       // is stopped temporarily.
38       shutdown_reason = syncer::DISABLE_SYNC;
39       break;
40     case syncer::DISABLE_SYNC:
41     case syncer::BROWSER_SHUTDOWN:
42       break;
43   }
44   ModelTypeController::Stop(shutdown_reason, std::move(callback));
45 }
46 
47 DataTypeController::PreconditionState
GetPreconditionState() const48 UserEventModelTypeController::GetPreconditionState() const {
49   if (sync_service_->GetUserSettings()->IsUsingSecondaryPassphrase()) {
50     return PreconditionState::kMustStopAndClearData;
51   }
52   // TODO(crbug.com/938819): Remove the syncer::IsWebSignout() check once we
53   // stop sync in this state. Also remove the "+google_apis/gaia" include
54   // dependency and the "//google_apis" build dependency of sync_user_events.
55   if (syncer::IsWebSignout(sync_service_->GetAuthError())) {
56     return PreconditionState::kMustStopAndClearData;
57   }
58   return PreconditionState::kPreconditionsMet;
59 }
60 
OnStateChanged(syncer::SyncService * sync)61 void UserEventModelTypeController::OnStateChanged(syncer::SyncService* sync) {
62   sync->DataTypePreconditionChanged(type());
63 }
64 
65 }  // namespace syncer
66