| Index: chrome/browser/automation/testing_automation_provider.cc
|
| diff --git a/chrome/browser/automation/testing_automation_provider.cc b/chrome/browser/automation/testing_automation_provider.cc
|
| index c3c8f14ca071d1ba567d0134e4a03a75d0da7194..6fc58d3c094b9f57ee7a6dc0b60db35954f01ad0 100644
|
| --- a/chrome/browser/automation/testing_automation_provider.cc
|
| +++ b/chrome/browser/automation/testing_automation_provider.cc
|
| @@ -10,6 +10,7 @@
|
| #include "base/json/json_writer.h"
|
| #include "base/json/string_escape.h"
|
| #include "base/path_service.h"
|
| +#include "base/stringprintf.h"
|
| #include "base/time.h"
|
| #include "base/utf_string_conversions.h"
|
| #include "chrome/app/chrome_dll_resource.h"
|
| @@ -2113,6 +2114,15 @@ void TestingAutomationProvider::SendJSONRequest(int handle,
|
| handler_map["WaitForNotificationCount"] =
|
| &TestingAutomationProvider::WaitForNotificationCount;
|
|
|
| + handler_map["SignInToSync"] = &TestingAutomationProvider::SignInToSync;
|
| + handler_map["GetSyncInfo"] = &TestingAutomationProvider::GetSyncInfo;
|
| + handler_map["AwaitSyncCycleCompletion"] =
|
| + &TestingAutomationProvider::AwaitSyncCycleCompletion;
|
| + handler_map["EnableSyncForDatatypes"] =
|
| + &TestingAutomationProvider::EnableSyncForDatatypes;
|
| + handler_map["DisableSyncForDatatypes"] =
|
| + &TestingAutomationProvider::DisableSyncForDatatypes;
|
| +
|
| if (handler_map.find(std::string(command)) != handler_map.end()) {
|
| (this->*handler_map[command])(browser, dict_value, reply_message);
|
| } else {
|
| @@ -3830,6 +3840,219 @@ void TestingAutomationProvider::FillAutoFillProfile(
|
| reply.SendSuccess(NULL);
|
| }
|
|
|
| +// Sample json output: { "success": true }
|
| +void TestingAutomationProvider::SignInToSync(Browser* browser,
|
| + DictionaryValue* args,
|
| + IPC::Message* reply_message) {
|
| + AutomationJSONReply reply(this, reply_message);
|
| + std::string username;
|
| + std::string password;
|
| + if (!args->GetString("username", &username) ||
|
| + !args->GetString("password", &password)) {
|
| + reply.SendError("Invalid or missing args");
|
| + return;
|
| + }
|
| + if (sync_waiter_.get() == NULL) {
|
| + sync_waiter_.reset(new ProfileSyncServiceHarness(
|
| + browser->profile(), username, password, 0));
|
| + } else {
|
| + sync_waiter_->SetCredentials(username, password);
|
| + }
|
| + if (sync_waiter_->SetupSync()) {
|
| + DictionaryValue* return_value = new DictionaryValue;
|
| + return_value->SetBoolean("success", true);
|
| + reply.SendSuccess(return_value);
|
| + } else {
|
| + reply.SendError("Signing in to sync was unsuccessful");
|
| + }
|
| +}
|
| +
|
| +// Sample json output:
|
| +// {u'summary': u'SYNC DISABLED'}
|
| +//
|
| +// { u'authenticated': True,
|
| +// u'last synced': u'Just now',
|
| +// u'summary': u'READY',
|
| +// u'sync url': u'clients4.google.com',
|
| +// u'synced datatypes': [ u'Bookmarks',
|
| +// u'Preferences',
|
| +// u'Passwords',
|
| +// u'Autofill',
|
| +// u'Themes',
|
| +// u'Extensions',
|
| +// u'Apps']}
|
| +void TestingAutomationProvider::GetSyncInfo(Browser* browser,
|
| + DictionaryValue* args,
|
| + IPC::Message* reply_message) {
|
| + AutomationJSONReply reply(this, reply_message);
|
| + DictionaryValue* sync_info = new DictionaryValue;
|
| + DictionaryValue* return_value = new DictionaryValue;
|
| + if (sync_waiter_.get() == NULL) {
|
| + sync_waiter_.reset(
|
| + ProfileSyncServiceHarness::CreateAndAttach(browser->profile()));
|
| + }
|
| + if (!sync_waiter_->IsSyncAlreadySetup()) {
|
| + sync_info->SetString("summary", "SYNC DISABLED");
|
| + } else {
|
| + ProfileSyncService* service = sync_waiter_->service();
|
| + ProfileSyncService::Status status = sync_waiter_->GetStatus();
|
| + sync_info->SetString("summary",
|
| + ProfileSyncService::BuildSyncStatusSummaryText(status.summary));
|
| + sync_info->SetString("sync url", service->sync_service_url().host());
|
| + sync_info->SetBoolean("authenticated", status.authenticated);
|
| + sync_info->SetString("last synced", service->GetLastSyncedTimeString());
|
| + ListValue* synced_datatype_list = new ListValue;
|
| + syncable::ModelTypeSet synced_datatypes;
|
| + service->GetPreferredDataTypes(&synced_datatypes);
|
| + for (syncable::ModelTypeSet::iterator it = synced_datatypes.begin();
|
| + it != synced_datatypes.end(); ++it) {
|
| + synced_datatype_list->Append(
|
| + new StringValue(syncable::ModelTypeToString(*it)));
|
| + }
|
| + sync_info->Set("synced datatypes", synced_datatype_list);
|
| + }
|
| + return_value->Set("sync_info", sync_info);
|
| + reply.SendSuccess(return_value);
|
| +}
|
| +
|
| +// Sample json output: { "success": true }
|
| +void TestingAutomationProvider::AwaitSyncCycleCompletion(
|
| + Browser* browser,
|
| + DictionaryValue* args,
|
| + IPC::Message* reply_message) {
|
| + AutomationJSONReply reply(this, reply_message);
|
| + if (sync_waiter_.get() == NULL) {
|
| + sync_waiter_.reset(
|
| + ProfileSyncServiceHarness::CreateAndAttach(browser->profile()));
|
| + }
|
| + if (!sync_waiter_->IsSyncAlreadySetup()) {
|
| + reply.SendError("Not signed in to sync");
|
| + return;
|
| + }
|
| + sync_waiter_->AwaitSyncCycleCompletion("Waiting for sync cycle");
|
| + ProfileSyncService::Status status = sync_waiter_->GetStatus();
|
| + if (status.summary == ProfileSyncService::Status::READY) {
|
| + scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
|
| + return_value->SetBoolean("success", true);
|
| + reply.SendSuccess(return_value.get());
|
| + } else {
|
| + reply.SendError("Wait for sync cycle was unsuccessful");
|
| + }
|
| +}
|
| +
|
| +// Refer to EnableSyncForDatatypes() in chrome/test/pyautolib/pyauto.py for
|
| +// sample json input. Sample json output: { "success": true }
|
| +void TestingAutomationProvider::EnableSyncForDatatypes(
|
| + Browser* browser,
|
| + DictionaryValue* args,
|
| + IPC::Message* reply_message) {
|
| + AutomationJSONReply reply(this, reply_message);
|
| + if (sync_waiter_.get() == NULL) {
|
| + sync_waiter_.reset(
|
| + ProfileSyncServiceHarness::CreateAndAttach(browser->profile()));
|
| + }
|
| + if (!sync_waiter_->IsSyncAlreadySetup()) {
|
| + reply.SendError("Not signed in to sync");
|
| + return;
|
| + }
|
| + ListValue* datatypes = NULL;
|
| + if (!args->GetList("datatypes", &datatypes)) {
|
| + reply.SendError("Invalid or missing args");
|
| + return;
|
| + }
|
| + std::string first_datatype;
|
| + datatypes->GetString(0, &first_datatype);
|
| + if (first_datatype == "All") {
|
| + sync_waiter_->EnableSyncForAllDatatypes();
|
| + } else {
|
| + int num_datatypes = datatypes->GetSize();
|
| + for (int i = 0; i < num_datatypes; ++i) {
|
| + std::string datatype_string;
|
| + datatypes->GetString(i, &datatype_string);
|
| + syncable::ModelType datatype =
|
| + syncable::ModelTypeFromString(datatype_string);
|
| + if (datatype == syncable::UNSPECIFIED) {
|
| + AutomationJSONReply(this, reply_message).SendError(StringPrintf(
|
| + "Invalid datatype string: %s.", datatype_string.c_str()));
|
| + return;
|
| + }
|
| + sync_waiter_->EnableSyncForDatatype(datatype);
|
| + sync_waiter_->AwaitSyncCycleCompletion(StringPrintf(
|
| + "Enabling datatype: %s", datatype_string.c_str()));
|
| + }
|
| + }
|
| + ProfileSyncService::Status status = sync_waiter_->GetStatus();
|
| + if (status.summary == ProfileSyncService::Status::READY ||
|
| + status.summary == ProfileSyncService::Status::SYNCING) {
|
| + DictionaryValue* return_value = new DictionaryValue;
|
| + return_value->SetBoolean("success", true);
|
| + reply.SendSuccess(return_value);
|
| + } else {
|
| + reply.SendError("Enabling sync for given datatypes was unsuccessful");
|
| + }
|
| +}
|
| +
|
| +// Refer to DisableSyncForDatatypes() in chrome/test/pyautolib/pyauto.py for
|
| +// sample json input. Sample json output: { "success": true }
|
| +void TestingAutomationProvider::DisableSyncForDatatypes(
|
| + Browser* browser,
|
| + DictionaryValue* args,
|
| + IPC::Message* reply_message) {
|
| + AutomationJSONReply reply(this, reply_message);
|
| + if (sync_waiter_.get() == NULL) {
|
| + sync_waiter_.reset(
|
| + ProfileSyncServiceHarness::CreateAndAttach(browser->profile()));
|
| + }
|
| + if (!sync_waiter_->IsSyncAlreadySetup()) {
|
| + reply.SendError("Not signed in to sync");
|
| + return;
|
| + }
|
| + ListValue* datatypes = NULL;
|
| + if (!args->GetList("datatypes", &datatypes)) {
|
| + reply.SendError("Invalid or missing args");
|
| + return;
|
| + }
|
| + std::string first_datatype;
|
| + datatypes->GetString(0, &first_datatype);
|
| + if (first_datatype == "All") {
|
| + sync_waiter_->DisableSyncForAllDatatypes();
|
| + ProfileSyncService::Status status = sync_waiter_->GetStatus();
|
| + if (status.summary != ProfileSyncService::Status::READY &&
|
| + status.summary != ProfileSyncService::Status::SYNCING) {
|
| + DictionaryValue* return_value = new DictionaryValue;
|
| + return_value->SetBoolean("success", true);
|
| + reply.SendSuccess(return_value);
|
| + } else {
|
| + reply.SendError("Disabling all sync datatypes was unsuccessful");
|
| + }
|
| + } else {
|
| + int num_datatypes = datatypes->GetSize();
|
| + for (int i = 0; i < num_datatypes; i++) {
|
| + std::string datatype_string;
|
| + datatypes->GetString(i, &datatype_string);
|
| + syncable::ModelType datatype =
|
| + syncable::ModelTypeFromString(datatype_string);
|
| + if (datatype == syncable::UNSPECIFIED) {
|
| + AutomationJSONReply(this, reply_message).SendError(StringPrintf(
|
| + "Invalid datatype string: %s.", datatype_string.c_str()));
|
| + return;
|
| + }
|
| + sync_waiter_->DisableSyncForDatatype(datatype);
|
| + sync_waiter_->AwaitSyncCycleCompletion(StringPrintf(
|
| + "Disabling datatype: %s", datatype_string.c_str()));
|
| + }
|
| + ProfileSyncService::Status status = sync_waiter_->GetStatus();
|
| + if (status.summary == ProfileSyncService::Status::READY ||
|
| + status.summary == ProfileSyncService::Status::SYNCING) {
|
| + DictionaryValue* return_value = new DictionaryValue;
|
| + return_value->SetBoolean("success", true);
|
| + reply.SendSuccess(return_value);
|
| + } else {
|
| + reply.SendError("Disabling sync for given datatypes was unsuccessful");
|
| + }
|
| + }
|
| +}
|
| +
|
| /* static */
|
| ListValue* TestingAutomationProvider::GetListFromAutoFillProfiles(
|
| const std::vector<AutoFillProfile*>& autofill_profiles) {
|
|
|