0

sync: Add GetAllSyncData to sync/api

This allows datatype SyncableServices to request a fresh copy of the data
that was previously only passed over in batch form during
MergeDataAndStartSyncing. Since it can be slow, it should be used
sparingly.

Though currently unused, Sessions will soon need this behavior to deal with
cases where (e.g) the local session is deleted by a foreign client, thereby
corrupting TabNodePool tracking and requiring a full re-association.

TBR=zea@chromium.org
^Many function signature touchups under browser/

BUG=98892

Review URL: https://codereview.chromium.org/23129007

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@221540 0039d316-1c4b-4281-b951-d872f2087c98
This commit is contained in:
tim@chromium.org
2013-09-05 23:30:01 +00:00
parent 3bbc01727c
commit fe4b4ca1cb
30 changed files with 204 additions and 66 deletions

@ -65,6 +65,11 @@ class NoopSyncChangeProcessor : public syncer::SyncChangeProcessor {
return syncer::SyncError();
}
virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const
OVERRIDE {
return syncer::SyncDataList();
}
virtual ~NoopSyncChangeProcessor() {};
};
@ -83,6 +88,11 @@ class SyncChangeProcessorDelegate : public syncer::SyncChangeProcessor {
return recipient_->ProcessSyncChanges(from_here, change_list);
}
virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const
OVERRIDE {
return recipient_->GetAllSyncData(type);
}
private:
// The recipient of all sync changes.
syncer::SyncChangeProcessor* recipient_;

@ -108,6 +108,11 @@ class MockSyncChangeProcessor : public syncer::SyncChangeProcessor {
return syncer::SyncError();
}
virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const
OVERRIDE {
return syncer::SyncDataList();
}
// Mock methods.
const SettingSyncDataList& changes() { return changes_; }
@ -166,6 +171,11 @@ class SyncChangeProcessorDelegate : public syncer::SyncChangeProcessor {
return recipient_->ProcessSyncChanges(from_here, change_list);
}
virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const
OVERRIDE {
return recipient_->GetAllSyncData(type);
}
private:
// The recipient of all sync changes.
syncer::SyncChangeProcessor* recipient_;

@ -5082,6 +5082,11 @@ namespace {
const syncer::SyncChangeList& change_list) OVERRIDE {
return syncer::SyncError();
}
virtual syncer::SyncDataList GetAllSyncData(
syncer::ModelType type) const OVERRIDE {
return syncer::SyncDataList();
}
};
}

@ -1553,6 +1553,11 @@ class TestChangeProcessor : public syncer::SyncChangeProcessor {
return syncer::SyncError();
}
virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const
OVERRIDE {
return syncer::SyncDataList();
}
const syncer::SyncChangeList& GetChanges() const {
return changes_;
}
@ -1584,6 +1589,11 @@ class SyncChangeProcessorDelegate : public syncer::SyncChangeProcessor {
return recipient_->ProcessSyncChanges(from_here, change_list);
}
virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const
OVERRIDE {
return recipient_->GetAllSyncData(type);
}
private:
// The recipient of all sync changes.
syncer::SyncChangeProcessor* const recipient_;

@ -48,6 +48,11 @@ class TestChangeProcessor : public syncer::SyncChangeProcessor {
return syncer::SyncError();
}
virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const
OVERRIDE {
return syncer::SyncDataList();
}
// Set pointer location to write SyncChanges to in ProcessSyncChanges.
void SetChangeOutput(syncer::SyncChangeList *change_output) {
change_output_ = change_output;

@ -47,6 +47,11 @@ class MockChangeProcessor : public SyncChangeProcessor {
const tracked_objects::Location& from_here,
const SyncChangeList& change_list) OVERRIDE;
virtual SyncDataList GetAllSyncData(syncer::ModelType type) const
OVERRIDE {
return SyncDataList();
}
const SyncChangeList& changes() const { return change_list_; }
private:

@ -41,6 +41,11 @@ class MockChangeProcessor : public SyncChangeProcessor {
const tracked_objects::Location& from_here,
const SyncChangeList& change_list) OVERRIDE;
virtual SyncDataList GetAllSyncData(syncer::ModelType type) const
OVERRIDE {
return SyncDataList();
}
const SyncChangeList& changes() const { return change_list_; }
SyncChange GetChange(const std::string& id) const;

@ -154,6 +154,11 @@ class TestChangeProcessor : public syncer::SyncChangeProcessor {
return syncer::SyncError();
}
virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const
OVERRIDE {
return syncer::SyncDataList();
}
size_t change_list_size() { return change_map_.size(); }
bool ContainsId(const std::string& id) {
@ -187,6 +192,11 @@ class SyncChangeProcessorDelegate : public syncer::SyncChangeProcessor {
return recipient_->ProcessSyncChanges(from_here, change_list);
}
virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const
OVERRIDE {
return recipient_->GetAllSyncData(type);
}
private:
// The recipient of all sync changes.
SyncChangeProcessor* recipient_;

@ -32,6 +32,11 @@ class MockChangeProcessor : public syncer::SyncChangeProcessor {
const syncer::SyncChangeList& changes() const { return change_list_; }
virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const
OVERRIDE {
return syncer::SyncDataList();
}
private:
syncer::SyncChangeList change_list_;

@ -37,6 +37,11 @@ class TestSyncProcessorStub : public syncer::SyncChangeProcessor {
const syncer::SyncChangeList& change_list) OVERRIDE {
return syncer::SyncError();
}
virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const
OVERRIDE {
return syncer::SyncDataList();
}
};
class SyncedPrefChangeRegistrarTest : public InProcessBrowserTest {

@ -93,6 +93,11 @@ class TestChangeProcessor : public syncer::SyncChangeProcessor {
const tracked_objects::Location& from_here,
const syncer::SyncChangeList& change_list) OVERRIDE;
virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const
OVERRIDE {
return syncer::SyncDataList();
}
bool contains_guid(const std::string& guid) const {
return change_map_.count(guid) != 0;
}
@ -150,6 +155,11 @@ class SyncChangeProcessorDelegate : public syncer::SyncChangeProcessor {
const tracked_objects::Location& from_here,
const syncer::SyncChangeList& change_list) OVERRIDE;
virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const
OVERRIDE {
return recipient_->GetAllSyncData(type);
}
private:
// The recipient of all sync changes.
syncer::SyncChangeProcessor* recipient_;

@ -127,6 +127,11 @@ class SyncChangeProcessorDelegate : public syncer::SyncChangeProcessor {
return dictionary_->ProcessSyncChanges(from_here, change_list);
}
virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const
OVERRIDE {
return syncer::SyncDataList();
}
private:
SpellcheckCustomDictionary* dictionary_;
DISALLOW_COPY_AND_ASSIGN(SyncChangeProcessorDelegate);

@ -18,8 +18,7 @@ FakeGenericChangeProcessor::FakeGenericChangeProcessor()
NULL),
sync_model_has_user_created_nodes_(true),
sync_model_has_user_created_nodes_success_(true),
crypto_ready_if_necessary_(true),
type_(syncer::UNSPECIFIED) {}
crypto_ready_if_necessary_(true) {}
FakeGenericChangeProcessor::~FakeGenericChangeProcessor() {}
@ -50,9 +49,8 @@ syncer::SyncError FakeGenericChangeProcessor::ProcessSyncChanges(
return process_sync_changes_error_;
}
syncer::SyncError FakeGenericChangeProcessor::GetSyncDataForType(
syncer::ModelType type, syncer::SyncDataList* current_sync_data) {
type_ = type;
syncer::SyncError FakeGenericChangeProcessor::GetAllSyncDataReturnError(
syncer::ModelType type, syncer::SyncDataList* current_sync_data) const {
return get_sync_data_for_type_error_;
}
@ -62,14 +60,12 @@ int FakeGenericChangeProcessor::GetSyncCountForType(syncer::ModelType type) {
bool FakeGenericChangeProcessor::SyncModelHasUserCreatedNodes(
syncer::ModelType type, bool* has_nodes) {
type_ = type;
*has_nodes = sync_model_has_user_created_nodes_;
return sync_model_has_user_created_nodes_success_;
}
bool FakeGenericChangeProcessor::CryptoReadyIfNecessary(
syncer::ModelType type) {
type_ = type;
return crypto_ready_if_necessary_;
}

@ -28,9 +28,9 @@ class FakeGenericChangeProcessor : public GenericChangeProcessor {
virtual syncer::SyncError ProcessSyncChanges(
const tracked_objects::Location& from_here,
const syncer::SyncChangeList& change_list) OVERRIDE;
virtual syncer::SyncError GetSyncDataForType(
virtual syncer::SyncError GetAllSyncDataReturnError(
syncer::ModelType type,
syncer::SyncDataList* current_sync_data) OVERRIDE;
syncer::SyncDataList* data) const OVERRIDE;
virtual int GetSyncCountForType(syncer::ModelType type) OVERRIDE;
virtual bool SyncModelHasUserCreatedNodes(syncer::ModelType type,
bool* has_nodes) OVERRIDE;
@ -42,7 +42,6 @@ class FakeGenericChangeProcessor : public GenericChangeProcessor {
bool sync_model_has_user_created_nodes_;
bool sync_model_has_user_created_nodes_success_;
bool crypto_ready_if_necessary_;
syncer::ModelType type_;
};
} // namespace browser_sync

@ -41,6 +41,11 @@ class TestChangeProcessor : public syncer::SyncChangeProcessor {
const tracked_objects::Location& from_here,
const syncer::SyncChangeList& change_list) OVERRIDE;
virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const
OVERRIDE {
return syncer::SyncDataList();
}
bool contains_guid(const std::string& guid) const {
return change_map_.count(guid) != 0;
}
@ -109,6 +114,11 @@ class SyncChangeProcessorDelegate : public syncer::SyncChangeProcessor {
const tracked_objects::Location& from_here,
const syncer::SyncChangeList& change_list) OVERRIDE;
virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const
OVERRIDE {
return recipient_->GetAllSyncData(type);
}
private:
// The recipient of all sync changes.
syncer::SyncChangeProcessor* recipient_;

@ -136,9 +136,17 @@ void GenericChangeProcessor::CommitChangesFromSyncModel() {
}
}
syncer::SyncError GenericChangeProcessor::GetSyncDataForType(
syncer::SyncDataList GenericChangeProcessor::GetAllSyncData(
syncer::ModelType type) const {
// This is slow / memory intensive. Should be used sparingly by datatypes.
syncer::SyncDataList data;
GetAllSyncDataReturnError(type, &data);
return data;
}
syncer::SyncError GenericChangeProcessor::GetAllSyncDataReturnError(
syncer::ModelType type,
syncer::SyncDataList* current_sync_data) {
syncer::SyncDataList* current_sync_data) const {
DCHECK(CalledOnValidThread());
std::string type_name = syncer::ModelTypeToString(type);
syncer::ReadTransaction trans(FROM_HERE, share_handle());

@ -62,10 +62,17 @@ class GenericChangeProcessor : public ChangeProcessor,
const tracked_objects::Location& from_here,
const syncer::SyncChangeList& change_list) OVERRIDE;
// Fills |current_sync_data| with all the syncer data for the specified type.
virtual syncer::SyncError GetSyncDataForType(
// Fills a list of SyncData. This should create an up to date representation
// of all the data known to the ChangeProcessor for |datatype|, and
// should match/be a subset of the server's view of that datatype.
virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type)
const OVERRIDE;
// Similar to above, but returns a SyncError for use by direct clients
// of GenericChangeProcessor that may need more error visibility.
virtual syncer::SyncError GetAllSyncDataReturnError(
syncer::ModelType type,
syncer::SyncDataList* current_sync_data);
syncer::SyncDataList* data) const;
// Returns the number of items for this type.
virtual int GetSyncCountForType(syncer::ModelType type);

@ -93,18 +93,17 @@ class SyncGenericChangeProcessorTest : public testing::Test {
scoped_ptr<GenericChangeProcessor> change_processor_;
};
// This test exercises GenericChangeProcessor's GetSyncDataForType function.
// It's not a great test, but, by modifying some of the parameters, you could
// turn it into a micro-benchmark for model association.
TEST_F(SyncGenericChangeProcessorTest, StressGetSyncDataForType) {
// Similar to above, but focused on the method that implements sync/api
// interfaces and is hence exposed to datatypes directly.
TEST_F(SyncGenericChangeProcessorTest, StressGetAllSyncData) {
const int kNumChildNodes = 1000;
const int kRepeatCount = 1;
ASSERT_NO_FATAL_FAILURE(BuildChildNodes(kNumChildNodes));
for (int i = 0; i < kRepeatCount; ++i) {
syncer::SyncDataList sync_data;
change_processor()->GetSyncDataForType(kType, &sync_data);
syncer::SyncDataList sync_data =
change_processor()->GetAllSyncData(kType);
// Start with a simple test. We can add more in-depth testing later.
EXPECT_EQ(static_cast<size_t>(kNumChildNodes), sync_data.size());
@ -136,10 +135,8 @@ TEST_F(SyncGenericChangeProcessorTest, SetGetPasswords) {
ASSERT_FALSE(
change_processor()->ProcessSyncChanges(FROM_HERE, change_list).IsSet());
syncer::SyncDataList password_list;
ASSERT_FALSE(
change_processor()->GetSyncDataForType(syncer::PASSWORDS, &password_list).
IsSet());
syncer::SyncDataList password_list(
change_processor()->GetAllSyncData(syncer::PASSWORDS));
ASSERT_EQ(password_list.size(), change_list.size());
for (int i = 0; i < kNumPasswords; ++i) {
@ -209,10 +206,8 @@ TEST_F(SyncGenericChangeProcessorTest, UpdatePasswords) {
ASSERT_FALSE(
change_processor()->ProcessSyncChanges(FROM_HERE, change_list2).IsSet());
syncer::SyncDataList password_list;
ASSERT_FALSE(
change_processor()->GetSyncDataForType(syncer::PASSWORDS, &password_list).
IsSet());
syncer::SyncDataList password_list(
change_processor()->GetAllSyncData(syncer::PASSWORDS));
ASSERT_EQ(password_list.size(), change_list2.size());
for (int i = 0; i < kNumPasswords; ++i) {

@ -364,7 +364,8 @@ void NonUIDataTypeController::
base::TimeTicks start_time = base::TimeTicks::Now();
syncer::SyncDataList initial_sync_data;
syncer::SyncError error =
shared_change_processor->GetSyncData(&initial_sync_data);
shared_change_processor->GetAllSyncDataReturnError(
type(), &initial_sync_data);
if (error.IsSet()) {
local_merge_result.set_error(error);
StartDone(ASSOCIATION_FAILED,

@ -204,7 +204,7 @@ class SyncNonUIDataTypeControllerTest : public testing::Test {
EXPECT_CALL(*change_processor_.get(), ActivateDataType(_));
EXPECT_CALL(*change_processor_.get(), SyncModelHasUserCreatedNodes(_))
.WillOnce(DoAll(SetArgumentPointee<0>(true), Return(true)));
EXPECT_CALL(*change_processor_.get(), GetSyncData(_))
EXPECT_CALL(*change_processor_.get(), GetAllSyncDataReturnError(_,_))
.WillOnce(Return(syncer::SyncError()));
EXPECT_CALL(*change_processor_.get(), GetSyncCount()).WillOnce(Return(0));
EXPECT_CALL(*dtc_mock_.get(), RecordAssociationTime(_));
@ -275,7 +275,7 @@ TEST_F(SyncNonUIDataTypeControllerTest, StartFirstRun) {
.WillOnce(Return(true));
EXPECT_CALL(*change_processor_.get(), SyncModelHasUserCreatedNodes(_))
.WillOnce(DoAll(SetArgumentPointee<0>(false), Return(true)));
EXPECT_CALL(*change_processor_.get(), GetSyncData(_))
EXPECT_CALL(*change_processor_.get(), GetAllSyncDataReturnError(_,_))
.WillOnce(Return(syncer::SyncError()));
EXPECT_CALL(*dtc_mock_.get(), RecordAssociationTime(_));
SetActivateExpectations(DataTypeController::OK_FIRST_RUN);
@ -315,7 +315,7 @@ TEST_F(SyncNonUIDataTypeControllerTest, StartAssociationFailed) {
.WillOnce(Return(true));
EXPECT_CALL(*change_processor_.get(), SyncModelHasUserCreatedNodes(_))
.WillOnce(DoAll(SetArgumentPointee<0>(true), Return(true)));
EXPECT_CALL(*change_processor_.get(), GetSyncData(_))
EXPECT_CALL(*change_processor_.get(), GetAllSyncDataReturnError(_,_))
.WillOnce(Return(syncer::SyncError()));
EXPECT_CALL(*dtc_mock_.get(), RecordAssociationTime(_));
SetStartFailExpectations(DataTypeController::ASSOCIATION_FAILED);
@ -382,11 +382,12 @@ TEST_F(SyncNonUIDataTypeControllerTest, AbortDuringAssociation) {
WaitOnEvent(&pause_db_thread),
SetArgumentPointee<0>(true),
Return(true)));
EXPECT_CALL(*change_processor_.get(), GetSyncData(_)).WillOnce(
Return(syncer::SyncError(FROM_HERE,
syncer::SyncError::DATATYPE_ERROR,
"Disconnected.",
AUTOFILL_PROFILE)));
EXPECT_CALL(*change_processor_.get(), GetAllSyncDataReturnError(_,_))
.WillOnce(
Return(syncer::SyncError(FROM_HERE,
syncer::SyncError::DATATYPE_ERROR,
"Disconnected.",
AUTOFILL_PROFILE)));
EXPECT_CALL(*change_processor_.get(), Disconnect())
.WillOnce(DoAll(SignalEvent(&pause_db_thread), Return(true)));
EXPECT_CALL(service_, DeactivateDataType(_));

@ -89,22 +89,6 @@ bool SharedChangeProcessor::Disconnect() {
return was_connected;
}
syncer::SyncError SharedChangeProcessor::GetSyncData(
syncer::SyncDataList* current_sync_data) {
DCHECK(backend_loop_.get());
DCHECK(backend_loop_->BelongsToCurrentThread());
AutoLock lock(monitor_lock_);
if (disconnected_) {
syncer::SyncError error(FROM_HERE,
syncer::SyncError::DATATYPE_ERROR,
"Change processor disconnected.",
type_);
return error;
}
return generic_change_processor_->GetSyncDataForType(type_,
current_sync_data);
}
int SharedChangeProcessor::GetSyncCount() {
DCHECK(backend_loop_.get());
DCHECK(backend_loop_->BelongsToCurrentThread());
@ -135,6 +119,29 @@ syncer::SyncError SharedChangeProcessor::ProcessSyncChanges(
from_here, list_of_changes);
}
syncer::SyncDataList SharedChangeProcessor::GetAllSyncData(
syncer::ModelType type) const {
syncer::SyncDataList data;
GetAllSyncDataReturnError(type, &data); // Handles the disconnect case.
return data;
}
syncer::SyncError SharedChangeProcessor::GetAllSyncDataReturnError(
syncer::ModelType type,
syncer::SyncDataList* data) const {
DCHECK(backend_loop_.get());
DCHECK(backend_loop_->BelongsToCurrentThread());
AutoLock lock(monitor_lock_);
if (disconnected_) {
syncer::SyncError error(FROM_HERE,
syncer::SyncError::DATATYPE_ERROR,
"Change processor disconnected.",
type_);
return error;
}
return generic_change_processor_->GetAllSyncDataReturnError(type, data);
}
bool SharedChangeProcessor::SyncModelHasUserCreatedNodes(bool* has_nodes) {
DCHECK(backend_loop_.get());
DCHECK(backend_loop_->BelongsToCurrentThread());

@ -25,7 +25,7 @@ class SyncData;
class SyncableService;
typedef std::vector<syncer::SyncData> SyncDataList;
} // namespace
} // namespace syncer
namespace browser_sync {
@ -79,12 +79,14 @@ class SharedChangeProcessor
// GenericChangeProcessor stubs (with disconnect support).
// Should only be called on the same thread the datatype resides.
virtual syncer::SyncError GetSyncData(
syncer::SyncDataList* current_sync_data);
virtual int GetSyncCount();
virtual syncer::SyncError ProcessSyncChanges(
const tracked_objects::Location& from_here,
const syncer::SyncChangeList& change_list);
virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const;
virtual syncer::SyncError GetAllSyncDataReturnError(
syncer::ModelType type,
syncer::SyncDataList* data) const;
virtual bool SyncModelHasUserCreatedNodes(bool* has_nodes);
virtual bool CryptoReadyIfNecessary();

@ -7,6 +7,7 @@
#include "chrome/browser/sync/glue/shared_change_processor.h"
#include "sync/api/sync_change.h"
#include "sync/api/sync_data.h"
#include "sync/internal_api/public/util/unrecoverable_error_handler.h"
#include "testing/gmock/include/gmock/gmock.h"
@ -26,8 +27,9 @@ class SharedChangeProcessorMock : public SharedChangeProcessor {
MOCK_METHOD2(ProcessSyncChanges,
syncer::SyncError(const tracked_objects::Location&,
const syncer::SyncChangeList&));
MOCK_METHOD1(GetSyncData,
syncer::SyncError(syncer::SyncDataList*));
MOCK_CONST_METHOD2(GetAllSyncDataReturnError,
syncer::SyncError(syncer::ModelType,
syncer::SyncDataList*));
MOCK_METHOD0(GetSyncCount, int());
MOCK_METHOD1(SyncModelHasUserCreatedNodes,
bool(bool*));

@ -20,6 +20,11 @@ syncer::SyncError SharedChangeProcessorRef::ProcessSyncChanges(
return change_processor_->ProcessSyncChanges(from_here, change_list);
}
syncer::SyncDataList SharedChangeProcessorRef::GetAllSyncData(
syncer::ModelType type) const {
return change_processor_->GetAllSyncData(type);
}
syncer::SyncError SharedChangeProcessorRef::CreateAndUploadError(
const tracked_objects::Location& from_here,
const std::string& message) {

@ -27,6 +27,8 @@ class SharedChangeProcessorRef : public syncer::SyncChangeProcessor,
virtual syncer::SyncError ProcessSyncChanges(
const tracked_objects::Location& from_here,
const syncer::SyncChangeList& change_list) OVERRIDE;
virtual syncer::SyncDataList GetAllSyncData(
syncer::ModelType type) const OVERRIDE;
// syncer::SyncErrorFactory implementation.
virtual syncer::SyncError CreateAndUploadError(

@ -166,9 +166,10 @@ void UIDataTypeController::Associate() {
}
base::TimeTicks start_time = base::TimeTicks::Now();
syncer::SyncError error;
syncer::SyncDataList initial_sync_data;
error = shared_change_processor_->GetSyncData(&initial_sync_data);
syncer::SyncError error =
shared_change_processor_->GetAllSyncDataReturnError(
type(), &initial_sync_data);
if (error.IsSet()) {
local_merge_result.set_error(error);
StartDone(ASSOCIATION_FAILED,

@ -61,6 +61,11 @@ class FakeSyncChangeProcessor : public syncer::SyncChangeProcessor {
return syncer::SyncError();
}
virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const
OVERRIDE {
return syncer::SyncDataList();
}
void SetChangeOutput(syncer::SyncChangeList *change_output) {
change_output_ = change_output;
}

@ -99,6 +99,8 @@ class MockSyncChangeProcessor : public syncer::SyncChangeProcessor {
MOCK_METHOD2(ProcessSyncChanges,
syncer::SyncError(const tracked_objects::Location&,
const syncer::SyncChangeList&));
virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type)
const OVERRIDE { return syncer::SyncDataList(); }
};
class TestSyncChangeProcessor : public syncer::SyncChangeProcessor {
@ -113,6 +115,11 @@ class TestSyncChangeProcessor : public syncer::SyncChangeProcessor {
return syncer::SyncError();
}
virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const
OVERRIDE {
return syncer::SyncDataList();
}
const syncer::SyncChangeList& changes() { return changes_; }
private:

@ -7,8 +7,10 @@
#include <vector>
#include "sync/api/sync_data.h"
#include "sync/api/sync_error.h"
#include "sync/base/sync_export.h"
#include "sync/internal_api/public/base/model_type.h"
namespace tracked_objects {
class Location;
@ -36,6 +38,14 @@ class SYNC_EXPORT SyncChangeProcessor {
virtual SyncError ProcessSyncChanges(
const tracked_objects::Location& from_here,
const SyncChangeList& change_list) = 0;
// Fills a list of SyncData. This should create an up to date representation
// of all the data known to the ChangeProcessor for |datatype|, and
// should match/be a subset of the server's view of that datatype.
//
// WARNING: This can be a potentially slow & memory intensive operation and
// should only be used when absolutely necessary / sparingly.
virtual SyncDataList GetAllSyncData(ModelType type) const = 0;
};
} // namespace syncer

@ -56,11 +56,6 @@ class SYNC_EXPORT SyncableService
// Stop syncing the specified type and reset state.
virtual void StopSyncing(ModelType type) = 0;
// Fills a list of SyncData from the local data. This should create an up
// to date representation of the SyncableService's view of that datatype, and
// should match/be a subset of the server's view of that datatype.
virtual SyncDataList GetAllSyncData(ModelType type) const = 0;
// SyncChangeProcessor interface.
// Process a list of new SyncChanges and update the local data as necessary.
// Returns: A default SyncError (IsSet() == false) if no errors were