| Index: components/sync/driver/model_type_controller.cc
|
| diff --git a/components/sync/driver/model_type_controller.cc b/components/sync/driver/model_type_controller.cc
|
| index 6efaeef218d34e457b3cd5be97249cd5d9cc5437..5b4329f178abcf6fc46fdb9002586c0512aa3881 100644
|
| --- a/components/sync/driver/model_type_controller.cc
|
| +++ b/components/sync/driver/model_type_controller.cc
|
| @@ -7,7 +7,6 @@
|
| #include <utility>
|
|
|
| #include "base/bind.h"
|
| -#include "base/bind_helpers.h"
|
| #include "base/location.h"
|
| #include "base/memory/ptr_util.h"
|
| #include "base/threading/thread_task_runner_handle.h"
|
| @@ -24,47 +23,16 @@
|
|
|
| namespace syncer {
|
|
|
| +using BridgeProvider = ModelTypeController::BridgeProvider;
|
| +using BridgeTask = ModelTypeController::BridgeTask;
|
| +
|
| namespace {
|
|
|
| -void CallOnSyncStartingHelper(
|
| - SyncClient* sync_client,
|
| - ModelType type,
|
| +void OnSyncStartingHelper(
|
| const ModelErrorHandler& error_handler,
|
| - ModelTypeChangeProcessor::StartCallback callback) {
|
| - base::WeakPtr<ModelTypeSyncBridge> bridge =
|
| - sync_client->GetSyncBridgeForModelType(type);
|
| - if (bridge) {
|
| - bridge->OnSyncStarting(std::move(error_handler), callback);
|
| - }
|
| -}
|
| -
|
| -void CallGetAllNodesHelper(SyncClient* sync_client,
|
| - ModelType type,
|
| - DataTypeController::AllNodesCallback callback) {
|
| - base::WeakPtr<ModelTypeSyncBridge> bridge =
|
| - sync_client->GetSyncBridgeForModelType(type);
|
| - if (bridge) {
|
| - ModelTypeDebugInfo::GetAllNodes(bridge, callback);
|
| - }
|
| -}
|
| -
|
| -void CallGetStatusCountersHelper(
|
| - SyncClient* sync_client,
|
| - ModelType type,
|
| - const DataTypeController::StatusCountersCallback& callback) {
|
| - base::WeakPtr<ModelTypeSyncBridge> bridge =
|
| - sync_client->GetSyncBridgeForModelType(type);
|
| - if (bridge) {
|
| - ModelTypeDebugInfo::GetStatusCounters(bridge, callback);
|
| - }
|
| -}
|
| -
|
| -void CallDisableSyncHelper(SyncClient* sync_client, ModelType type) {
|
| - base::WeakPtr<ModelTypeSyncBridge> bridge =
|
| - sync_client->GetSyncBridgeForModelType(type);
|
| - if (bridge) {
|
| - bridge->DisableSync();
|
| - }
|
| + const ModelTypeChangeProcessor::StartCallback& callback,
|
| + ModelTypeSyncBridge* bridge) {
|
| + bridge->OnSyncStarting(std::move(error_handler), std::move(callback));
|
| }
|
|
|
| void ReportError(ModelType model_type,
|
| @@ -77,6 +45,20 @@ void ReportError(ModelType model_type,
|
| ui_thread->PostTask(error.location(), base::Bind(error_handler, error));
|
| }
|
|
|
| +// This function allows us to return a Callback using Bind that returns the
|
| +// given |arg|. This function itself does nothing.
|
| +base::WeakPtr<ModelTypeSyncBridge> ReturnCapturedBridge(
|
| + base::WeakPtr<ModelTypeSyncBridge> arg) {
|
| + return arg;
|
| +}
|
| +
|
| +void RunBridgeTask(const BridgeProvider& bridge_provider,
|
| + const BridgeTask& task) {
|
| + if (base::WeakPtr<ModelTypeSyncBridge> bridge = bridge_provider.Run()) {
|
| + task.Run(bridge.get());
|
| + }
|
| +}
|
| +
|
| } // namespace
|
|
|
| ModelTypeController::ModelTypeController(
|
| @@ -125,9 +107,9 @@ void ModelTypeController::LoadModels(
|
| base::AsWeakPtr(this)));
|
|
|
| // Start the type processor on the model thread.
|
| - model_thread_->PostTask(
|
| - FROM_HERE, base::Bind(&CallOnSyncStartingHelper, sync_client_, type(),
|
| - std::move(error_handler), std::move(callback)));
|
| + PostBridgeTask(FROM_HERE,
|
| + base::Bind(&OnSyncStartingHelper, std::move(error_handler),
|
| + std::move(callback)));
|
| }
|
|
|
| void ModelTypeController::BeforeLoadModels(ModelTypeConfigurer* configurer) {}
|
| @@ -228,8 +210,7 @@ void ModelTypeController::Stop() {
|
| sync_prefs_.GetPreferredDataTypes(ModelTypeSet(type()));
|
| if ((state() == MODEL_LOADED || state() == RUNNING) &&
|
| (!sync_prefs_.IsFirstSetupComplete() || !preferred_types.Has(type()))) {
|
| - model_thread_->PostTask(
|
| - FROM_HERE, base::Bind(&CallDisableSyncHelper, sync_client_, type()));
|
| + PostBridgeTask(FROM_HERE, base::Bind(&ModelTypeSyncBridge::DisableSync));
|
| }
|
|
|
| state_ = NOT_RUNNING;
|
| @@ -245,16 +226,14 @@ DataTypeController::State ModelTypeController::state() const {
|
| }
|
|
|
| void ModelTypeController::GetAllNodes(const AllNodesCallback& callback) {
|
| - model_thread_->PostTask(
|
| - FROM_HERE, base::Bind(&CallGetAllNodesHelper, sync_client_, type(),
|
| - BindToCurrentThread(callback)));
|
| + PostBridgeTask(FROM_HERE,
|
| + base::Bind(&ModelTypeDebugInfo::GetAllNodes, callback));
|
| }
|
|
|
| void ModelTypeController::GetStatusCounters(
|
| const StatusCountersCallback& callback) {
|
| - model_thread_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&CallGetStatusCountersHelper, sync_client_, type(), callback));
|
| + PostBridgeTask(FROM_HERE,
|
| + base::Bind(&ModelTypeDebugInfo::GetStatusCounters, callback));
|
| }
|
|
|
| void ModelTypeController::ReportModelError(const ModelError& error) {
|
| @@ -275,4 +254,17 @@ void ModelTypeController::RecordStartFailure(ConfigureResult result) const {
|
| #undef PER_DATA_TYPE_MACRO
|
| }
|
|
|
| +BridgeProvider ModelTypeController::GetBridgeProvider() {
|
| + // Get the bridge eagerly, and capture the weak pointer.
|
| + base::WeakPtr<ModelTypeSyncBridge> bridge =
|
| + sync_client_->GetSyncBridgeForModelType(type());
|
| + return base::Bind(&ReturnCapturedBridge, bridge);
|
| +}
|
| +
|
| +void ModelTypeController::PostBridgeTask(
|
| + const tracked_objects::Location& location,
|
| + const BridgeTask& task) {
|
| + model_thread_->PostTask(
|
| + location, base::Bind(&RunBridgeTask, GetBridgeProvider(), task));
|
| +}
|
| } // namespace syncer
|
|
|