blob: 57baaa0035ff719303faf00c354bebb90a4e3e6a [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/sync/driver/non_ui_syncable_service_based_model_type_controller.h"
#include <utility>
#include "components/sync/model_impl/client_tag_based_model_type_processor.h"
#include "components/sync/model_impl/proxy_model_type_controller_delegate.h"
#include "components/sync/model_impl/syncable_service_based_bridge.h"
namespace syncer {
namespace {
// Helper object that allows constructing and destructing the
// SyncableServiceBasedBridge lazily and on the model thread.
class LazyBridgeBuilder {
public:
LazyBridgeBuilder(
ModelType type,
OnceModelTypeStoreFactory store_factory,
NonUiSyncableServiceBasedModelTypeController::SyncableServiceProvider
syncable_service_provider,
const base::RepeatingClosure& dump_stack,
scoped_refptr<base::SequencedTaskRunner> task_runner,
scoped_refptr<SyncableServiceBasedBridge::ModelCryptographer>
cryptographer)
: type_(type),
cryptographer_(std::move(cryptographer)),
store_factory_(std::move(store_factory)),
syncable_service_provider_(std::move(syncable_service_provider)),
dump_stack_(dump_stack),
bridge_(nullptr, base::OnTaskRunnerDeleter(std::move(task_runner))) {
DCHECK(store_factory_);
DCHECK(syncable_service_provider_);
}
base::WeakPtr<ModelTypeControllerDelegate> BuildOrGetBridgeDelegate() {
if (!bridge_) {
base::WeakPtr<SyncableService> syncable_service =
std::move(syncable_service_provider_).Run();
DCHECK(syncable_service);
// std::make_unique() avoided here due to custom deleter.
bridge_.reset(new SyncableServiceBasedBridge(
type_, std::move(store_factory_),
std::make_unique<ClientTagBasedModelTypeProcessor>(type_,
dump_stack_),
syncable_service.get(), cryptographer_));
}
return bridge_->change_processor()->GetControllerDelegate();
}
private:
const ModelType type_;
const scoped_refptr<SyncableServiceBasedBridge::ModelCryptographer>
cryptographer_;
OnceModelTypeStoreFactory store_factory_;
NonUiSyncableServiceBasedModelTypeController::SyncableServiceProvider
syncable_service_provider_;
const base::RepeatingClosure dump_stack_;
std::unique_ptr<ModelTypeSyncBridge, base::OnTaskRunnerDeleter> bridge_;
DISALLOW_COPY_AND_ASSIGN(LazyBridgeBuilder);
};
} // namespace
NonUiSyncableServiceBasedModelTypeController::
NonUiSyncableServiceBasedModelTypeController(
ModelType type,
OnceModelTypeStoreFactory store_factory,
SyncableServiceProvider syncable_service_provider,
const base::RepeatingClosure& dump_stack,
scoped_refptr<base::SequencedTaskRunner> task_runner,
scoped_refptr<SyncableServiceBasedBridge::ModelCryptographer>
cryptographer)
: ModelTypeController(
type,
std::make_unique<ProxyModelTypeControllerDelegate>(
task_runner,
base::BindRepeating(&LazyBridgeBuilder::BuildOrGetBridgeDelegate,
std::make_unique<LazyBridgeBuilder>(
type,
std::move(store_factory),
std::move(syncable_service_provider),
dump_stack,
task_runner,
std::move(cryptographer))))) {}
NonUiSyncableServiceBasedModelTypeController::
~NonUiSyncableServiceBasedModelTypeController() {}
} // namespace syncer