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