1 // Copyright 2019 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/chromeos/sync/apps_model_type_controller.h"
6 
7 #include <utility>
8 
9 #include "base/check.h"
10 #include "base/memory/ptr_util.h"
11 #include "chrome/browser/chromeos/sync/os_sync_model_type_controller.h"
12 #include "chrome/browser/profiles/profile.h"
13 #include "chromeos/constants/chromeos_features.h"
14 #include "components/sync/base/model_type.h"
15 #include "components/sync/model_impl/client_tag_based_model_type_processor.h"
16 #include "components/sync/model_impl/forwarding_model_type_controller_delegate.h"
17 #include "components/sync/model_impl/syncable_service_based_bridge.h"
18 #include "extensions/browser/extension_system.h"
19 
20 using syncer::ClientTagBasedModelTypeProcessor;
21 using syncer::ForwardingModelTypeControllerDelegate;
22 using syncer::ModelTypeController;
23 using syncer::ModelTypeControllerDelegate;
24 using syncer::SyncableServiceBasedBridge;
25 
26 // static
Create(syncer::OnceModelTypeStoreFactory store_factory,base::WeakPtr<syncer::SyncableService> syncable_service,const base::RepeatingClosure & dump_stack,syncer::SyncService * sync_service,Profile * profile)27 std::unique_ptr<AppsModelTypeController> AppsModelTypeController::Create(
28     syncer::OnceModelTypeStoreFactory store_factory,
29     base::WeakPtr<syncer::SyncableService> syncable_service,
30     const base::RepeatingClosure& dump_stack,
31     syncer::SyncService* sync_service,
32     Profile* profile) {
33   DCHECK(chromeos::features::IsSplitSettingsSyncEnabled());
34   // Create the bridge here so it can be used to construct forwarding delegates
35   // passed to the superclass constructor.
36   auto bridge = std::make_unique<SyncableServiceBasedBridge>(
37       syncer::APPS, std::move(store_factory),
38       std::make_unique<ClientTagBasedModelTypeProcessor>(syncer::APPS,
39                                                          dump_stack),
40       syncable_service.get());
41   ModelTypeControllerDelegate* delegate =
42       bridge->change_processor()->GetControllerDelegate().get();
43   // Runs in transport-mode and full-sync mode, sharing the bridge's delegate.
44   return base::WrapUnique(new AppsModelTypeController(
45       std::move(bridge), /*delegate_for_full_sync_mode=*/
46       std::make_unique<ForwardingModelTypeControllerDelegate>(delegate),
47       /*delegate_for_transport_mode=*/
48       std::make_unique<ForwardingModelTypeControllerDelegate>(delegate),
49       sync_service, profile));
50 }
51 
52 AppsModelTypeController::~AppsModelTypeController() = default;
53 
AppsModelTypeController(std::unique_ptr<syncer::ModelTypeSyncBridge> bridge,std::unique_ptr<syncer::ModelTypeControllerDelegate> delegate_for_full_sync_mode,std::unique_ptr<syncer::ModelTypeControllerDelegate> delegate_for_transport_mode,syncer::SyncService * sync_service,Profile * profile)54 AppsModelTypeController::AppsModelTypeController(
55     std::unique_ptr<syncer::ModelTypeSyncBridge> bridge,
56     std::unique_ptr<syncer::ModelTypeControllerDelegate>
57         delegate_for_full_sync_mode,
58     std::unique_ptr<syncer::ModelTypeControllerDelegate>
59         delegate_for_transport_mode,
60     syncer::SyncService* sync_service,
61     Profile* profile)
62     : OsSyncModelTypeController(syncer::APPS,
63                                 std::move(delegate_for_full_sync_mode),
64                                 std::move(delegate_for_transport_mode),
65                                 profile->GetPrefs(),
66                                 sync_service),
67       bridge_(std::move(bridge)),
68       profile_(profile) {
69   DCHECK(profile_);
70 }
71 
LoadModels(const syncer::ConfigureContext & configure_context,const ModelLoadCallback & model_load_callback)72 void AppsModelTypeController::LoadModels(
73     const syncer::ConfigureContext& configure_context,
74     const ModelLoadCallback& model_load_callback) {
75   DCHECK(CalledOnValidThread());
76   extensions::ExtensionSystem::Get(profile_)->InitForRegularProfile(
77       /*extensions_enabled=*/true);
78   OsSyncModelTypeController::LoadModels(configure_context, model_load_callback);
79 }
80