diff options
author | akalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-06 09:32:50 +0000 |
---|---|---|
committer | akalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-06 09:32:50 +0000 |
commit | 3c921389b75b82f6377775c7afc2f4af1b5b2c38 (patch) | |
tree | 8edf2a793e38b42aa7e348543cb5768297cc2ed1 | |
parent | 1df57a559a81831936cf531976f7ad4609840e23 (diff) | |
download | chromium_src-3c921389b75b82f6377775c7afc2f4af1b5b2c38.zip chromium_src-3c921389b75b82f6377775c7afc2f4af1b5b2c38.tar.gz chromium_src-3c921389b75b82f6377775c7afc2f4af1b5b2c38.tar.bz2 |
[Sync] Refactor JsArgList a bit.
Make JsArgList take over the data of its constructor argument, saving
a copy.
BUG=None
TEST=None
R=atwilson@chromium.org
Review URL: http://codereview.chromium.org/6933040
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@84423 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/sync/engine/syncapi.cc | 18 | ||||
-rw-r--r-- | chrome/browser/sync/engine/syncapi_unittest.cc | 14 | ||||
-rw-r--r-- | chrome/browser/sync/js_arg_list.cc | 21 | ||||
-rw-r--r-- | chrome/browser/sync/js_arg_list.h | 20 | ||||
-rw-r--r-- | chrome/browser/sync/js_arg_list_unittest.cc | 34 | ||||
-rw-r--r-- | chrome/browser/sync/js_event_handler_list_unittest.cc | 4 | ||||
-rw-r--r-- | chrome/browser/sync/js_sync_manager_observer.cc | 19 | ||||
-rw-r--r-- | chrome/browser/sync/js_test_util.cc | 4 | ||||
-rw-r--r-- | chrome/browser/sync/profile_sync_service_unittest.cc | 12 | ||||
-rw-r--r-- | chrome/browser/ui/webui/sync_internals_ui.cc | 5 | ||||
-rw-r--r-- | chrome/browser/ui/webui/sync_internals_ui_unittest.cc | 8 |
11 files changed, 63 insertions, 96 deletions
diff --git a/chrome/browser/sync/engine/syncapi.cc b/chrome/browser/sync/engine/syncapi.cc index f7df069..1efdb26 100644 --- a/chrome/browser/sync/engine/syncapi.cc +++ b/chrome/browser/sync/engine/syncapi.cc @@ -2631,7 +2631,7 @@ void SyncManager::SyncInternal::ProcessMessage( ListValue return_args; return_args.Append(Value::CreateBooleanValue(notifications_enabled)); parent_router_->RouteJsMessageReply( - name, browser_sync::JsArgList(return_args), sender); + name, browser_sync::JsArgList(&return_args), sender); } else if (name == "getNotificationInfo") { if (!parent_router_) { LogNoRouter(name, args); @@ -2641,7 +2641,7 @@ void SyncManager::SyncInternal::ProcessMessage( ListValue return_args; return_args.Append(NotificationInfoToValue(notification_info_map_)); parent_router_->RouteJsMessageReply( - name, browser_sync::JsArgList(return_args), sender); + name, browser_sync::JsArgList(&return_args), sender); } else if (name == "getRootNode") { if (!parent_router_) { LogNoRouter(name, args); @@ -2653,7 +2653,7 @@ void SyncManager::SyncInternal::ProcessMessage( ListValue return_args; return_args.Append(root.ToValue()); parent_router_->RouteJsMessageReply( - name, browser_sync::JsArgList(return_args), sender); + name, browser_sync::JsArgList(&return_args), sender); } else if (name == "getNodeById") { if (!parent_router_) { LogNoRouter(name, args); @@ -2678,7 +2678,7 @@ browser_sync::JsArgList SyncManager::SyncInternal::ProcessGetNodeByIdMessage( const browser_sync::JsArgList& args) { ListValue null_return_args_list; null_return_args_list.Append(Value::CreateNullValue()); - browser_sync::JsArgList null_return_args(null_return_args_list); + browser_sync::JsArgList null_return_args(&null_return_args_list); std::string id_str; if (!args.Get().GetString(0, &id_str)) { return null_return_args; @@ -2697,7 +2697,7 @@ browser_sync::JsArgList SyncManager::SyncInternal::ProcessGetNodeByIdMessage( } ListValue return_args; return_args.Append(node.ToValue()); - return browser_sync::JsArgList(return_args); + return browser_sync::JsArgList(&return_args); } browser_sync::JsArgList SyncManager::SyncInternal:: @@ -2707,12 +2707,12 @@ browser_sync::JsArgList SyncManager::SyncInternal:: ListValue return_args; if (!args.Get().GetString(0, &query)) { return_args.Append(new ListValue()); - return browser_sync::JsArgList(return_args); + return browser_sync::JsArgList(&return_args); } ListValue* result = FindNodesContainingString(query); return_args.Append(result); - return browser_sync::JsArgList(return_args); + return browser_sync::JsArgList(&return_args); } void SyncManager::SyncInternal::OnNotificationStateChange( @@ -2728,7 +2728,7 @@ void SyncManager::SyncInternal::OnNotificationStateChange( args.Append(Value::CreateBooleanValue(notifications_enabled)); // TODO(akalin): Tidy up grammar in event names. parent_router_->RouteJsEvent("onSyncNotificationStateChange", - browser_sync::JsArgList(args)); + browser_sync::JsArgList(&args)); } } @@ -2769,7 +2769,7 @@ void SyncManager::SyncInternal::OnIncomingNotification( changed_types->Append(Value::CreateStringValue(model_type_str)); } parent_router_->RouteJsEvent("onSyncIncomingNotification", - browser_sync::JsArgList(args)); + browser_sync::JsArgList(&args)); } } diff --git a/chrome/browser/sync/engine/syncapi_unittest.cc b/chrome/browser/sync/engine/syncapi_unittest.cc index 6ccf8f0..c923d5a 100644 --- a/chrome/browser/sync/engine/syncapi_unittest.cc +++ b/chrome/browser/sync/engine/syncapi_unittest.cc @@ -906,7 +906,7 @@ TEST_F(SyncManagerTest, ProcessMessageGetNodeById) { { ListValue args; args.Append(Value::CreateStringValue("1")); - js_backend->ProcessMessage("getNodeById", JsArgList(args), &event_handler); + js_backend->ProcessMessage("getNodeById", JsArgList(&args), &event_handler); } CheckGetNodeByIdReturnArgs(sync_manager_, return_args, 1); @@ -915,7 +915,7 @@ TEST_F(SyncManagerTest, ProcessMessageGetNodeById) { { ListValue args; args.Append(Value::CreateStringValue(base::Int64ToString(child_id))); - js_backend->ProcessMessage("getNodeById", JsArgList(args), &event_handler); + js_backend->ProcessMessage("getNodeById", JsArgList(&args), &event_handler); } CheckGetNodeByIdReturnArgs(sync_manager_, return_args, child_id); @@ -941,31 +941,31 @@ TEST_F(SyncManagerTest, ProcessMessageGetNodeByIdFailure) { { ListValue args; - js_backend->ProcessMessage("getNodeById", JsArgList(args), &event_handler); + js_backend->ProcessMessage("getNodeById", JsArgList(&args), &event_handler); } { ListValue args; args.Append(Value::CreateStringValue("")); - js_backend->ProcessMessage("getNodeById", JsArgList(args), &event_handler); + js_backend->ProcessMessage("getNodeById", JsArgList(&args), &event_handler); } { ListValue args; args.Append(Value::CreateStringValue("nonsense")); - js_backend->ProcessMessage("getNodeById", JsArgList(args), &event_handler); + js_backend->ProcessMessage("getNodeById", JsArgList(&args), &event_handler); } { ListValue args; args.Append(Value::CreateStringValue("nonsense")); - js_backend->ProcessMessage("getNodeById", JsArgList(args), &event_handler); + js_backend->ProcessMessage("getNodeById", JsArgList(&args), &event_handler); } { ListValue args; args.Append(Value::CreateStringValue("0")); - js_backend->ProcessMessage("getNodeById", JsArgList(args), &event_handler); + js_backend->ProcessMessage("getNodeById", JsArgList(&args), &event_handler); } // TODO(akalin): Figure out how to test InitByIdLookup() failure. diff --git a/chrome/browser/sync/js_arg_list.cc b/chrome/browser/sync/js_arg_list.cc index a3e4e33..3695968 100644 --- a/chrome/browser/sync/js_arg_list.cc +++ b/chrome/browser/sync/js_arg_list.cc @@ -5,16 +5,12 @@ #include "chrome/browser/sync/js_arg_list.h" #include "base/json/json_writer.h" -#include "base/memory/scoped_ptr.h" namespace browser_sync { JsArgList::JsArgList() : args_(new SharedListValue()) {} -JsArgList::JsArgList(const ListValue& args) - : args_(new SharedListValue(args)) {} - -JsArgList::JsArgList(const std::vector<const Value*>& args) +JsArgList::JsArgList(ListValue* args) : args_(new SharedListValue(args)) {} JsArgList::~JsArgList() {} @@ -31,19 +27,8 @@ std::string JsArgList::ToString() const { JsArgList::SharedListValue::SharedListValue() {} -JsArgList::SharedListValue::SharedListValue(const ListValue& list_value) { - // Go through contortions to copy the list since ListValues are not - // copyable. - scoped_ptr<ListValue> list_value_copy(list_value.DeepCopy()); - list_value_.Swap(list_value_copy.get()); -} - -JsArgList::SharedListValue::SharedListValue( - const std::vector<const Value*>& value_list) { - for (std::vector<const Value*>::const_iterator it = value_list.begin(); - it != value_list.end(); ++it) { - list_value_.Append((*it)->DeepCopy()); - } +JsArgList::SharedListValue::SharedListValue(ListValue* list_value) { + list_value_.Swap(list_value); } const ListValue& JsArgList::SharedListValue::Get() const { diff --git a/chrome/browser/sync/js_arg_list.h b/chrome/browser/sync/js_arg_list.h index 90c1f0f..878ec39 100644 --- a/chrome/browser/sync/js_arg_list.h +++ b/chrome/browser/sync/js_arg_list.h @@ -16,38 +16,40 @@ namespace browser_sync { -// A thread-safe ref-counted wrapper around an immutable ListValue. -// Used for passing around argument lists to different threads. +// A thread-safe wrapper around an immutable ListValue. Used for +// passing around argument lists to different threads. class JsArgList { public: + // Uses an empty argument list. JsArgList(); - explicit JsArgList(const ListValue& args); - explicit JsArgList(const std::vector<const Value*>& args); + + // Takes over the data in |args|, leaving |args| empty. + explicit JsArgList(ListValue* args); + ~JsArgList(); const ListValue& Get() const; std::string ToString() const; + // Copy constructor and assignment operator welcome. + private: class SharedListValue : public base::RefCountedThreadSafe<SharedListValue> { public: SharedListValue(); - explicit SharedListValue(const ListValue& list_value); - explicit SharedListValue(const std::vector<const Value*>& value_list); + explicit SharedListValue(ListValue* list_value); const ListValue& Get() const; private: - virtual ~SharedListValue(); + ~SharedListValue(); friend class base::RefCountedThreadSafe<SharedListValue>; ListValue list_value_; }; scoped_refptr<const SharedListValue> args_; - - // Copy constructor and assignment operator welcome. }; } // namespace browser_sync diff --git a/chrome/browser/sync/js_arg_list_unittest.cc b/chrome/browser/sync/js_arg_list_unittest.cc index beed519..5d327c1 100644 --- a/chrome/browser/sync/js_arg_list_unittest.cc +++ b/chrome/browser/sync/js_arg_list_unittest.cc @@ -26,37 +26,13 @@ TEST_F(JsArgListTest, FromList) { dict->SetString("foo", "bar"); dict->Set("baz", new ListValue()); - JsArgList arg_list(*list); - - // Make sure arg_list takes a deep copy. scoped_ptr<ListValue> list_copy(list->DeepCopy()); - list.reset(); - EXPECT_TRUE(arg_list.Get().Equals(list_copy.get())); -} -TEST_F(JsArgListTest, FromVector) { - FundamentalValue bool_value(false); - FundamentalValue int_value(5); - DictionaryValue dict; - dict.SetString("foo", "bar"); - dict.Set("baz", new ListValue()); - - std::vector<const Value*> vec; - vec.push_back(&bool_value); - vec.push_back(&int_value); - vec.push_back(&dict); - - JsArgList arg_list(vec); - - ListValue list; - list.Append(bool_value.DeepCopy()); - list.Append(int_value.DeepCopy()); - list.Append(dict.DeepCopy()); - - // Make sure arg_list takes a deep copy. - vec.clear(); - dict.SetString("baz", "foo"); - EXPECT_TRUE(arg_list.Get().Equals(&list)); + JsArgList arg_list(list.get()); + + // |arg_list| should take over |list|'s data. + EXPECT_TRUE(list->empty()); + EXPECT_TRUE(arg_list.Get().Equals(list_copy.get())); } } // namespace diff --git a/chrome/browser/sync/js_event_handler_list_unittest.cc b/chrome/browser/sync/js_event_handler_list_unittest.cc index fee0dc3..52f0265 100644 --- a/chrome/browser/sync/js_event_handler_list_unittest.cc +++ b/chrome/browser/sync/js_event_handler_list_unittest.cc @@ -26,7 +26,7 @@ TEST_F(JsEventHandlerListTest, Basic) { ListValue arg_list1, arg_list2; arg_list1.Append(Value::CreateBooleanValue(false)); arg_list2.Append(Value::CreateIntegerValue(5)); - JsArgList args1(arg_list1), args2(arg_list2); + JsArgList args1(&arg_list1), args2(&arg_list2); StrictMock<MockJsEventHandler> handler1, handler2; @@ -84,7 +84,7 @@ TEST_F(JsEventHandlerListTest, QueuedMessages) { ListValue arg_list1, arg_list2; arg_list1.Append(Value::CreateBooleanValue(false)); arg_list2.Append(Value::CreateIntegerValue(5)); - JsArgList args1(arg_list1), args2(arg_list2); + JsArgList args1(&arg_list1), args2(&arg_list2); StrictMock<MockJsEventHandler> handler1, handler2; diff --git a/chrome/browser/sync/js_sync_manager_observer.cc b/chrome/browser/sync/js_sync_manager_observer.cc index a58c586..39bf4eb 100644 --- a/chrome/browser/sync/js_sync_manager_observer.cc +++ b/chrome/browser/sync/js_sync_manager_observer.cc @@ -35,7 +35,7 @@ void JsSyncManagerObserver::OnChangesApplied( for (int i = 0; i < change_count; ++i) { change_values->Append(changes[i].ToValue(trans)); } - parent_router_->RouteJsEvent("onChangesApplied", JsArgList(return_args)); + parent_router_->RouteJsEvent("onChangesApplied", JsArgList(&return_args)); } void JsSyncManagerObserver::OnChangesComplete( @@ -43,27 +43,28 @@ void JsSyncManagerObserver::OnChangesComplete( ListValue return_args; return_args.Append(Value::CreateStringValue( syncable::ModelTypeToString(model_type))); - parent_router_->RouteJsEvent("onChangesComplete", JsArgList(return_args)); + parent_router_->RouteJsEvent("onChangesComplete", JsArgList(&return_args)); } void JsSyncManagerObserver::OnSyncCycleCompleted( const sessions::SyncSessionSnapshot* snapshot) { ListValue return_args; return_args.Append(snapshot->ToValue()); - parent_router_->RouteJsEvent("onSyncCycleCompleted", JsArgList(return_args)); + parent_router_->RouteJsEvent("onSyncCycleCompleted", + JsArgList(&return_args)); } void JsSyncManagerObserver::OnAuthError( const GoogleServiceAuthError& auth_error) { ListValue return_args; return_args.Append(auth_error.ToValue()); - parent_router_->RouteJsEvent("onAuthError", JsArgList(return_args)); + parent_router_->RouteJsEvent("onAuthError", JsArgList(&return_args)); } void JsSyncManagerObserver::OnUpdatedToken(const std::string& token) { ListValue return_args; return_args.Append(Value::CreateStringValue("<redacted>")); - parent_router_->RouteJsEvent("onUpdatedToken", JsArgList(return_args)); + parent_router_->RouteJsEvent("onUpdatedToken", JsArgList(&return_args)); } void JsSyncManagerObserver::OnPassphraseRequired( @@ -73,7 +74,7 @@ void JsSyncManagerObserver::OnPassphraseRequired( return_args.Append(Value::CreateStringValue( sync_api::PassphraseRequiredReasonToString(reason))); parent_router_->RouteJsEvent("onPassphraseRequired", - JsArgList(return_args)); + JsArgList(&return_args)); } void JsSyncManagerObserver::OnPassphraseAccepted( @@ -81,7 +82,7 @@ void JsSyncManagerObserver::OnPassphraseAccepted( ListValue return_args; return_args.Append(Value::CreateStringValue("<redacted>")); parent_router_->RouteJsEvent("onPassphraseAccepted", - JsArgList(return_args)); + JsArgList(&return_args)); } void JsSyncManagerObserver::OnEncryptionComplete( @@ -89,7 +90,7 @@ void JsSyncManagerObserver::OnEncryptionComplete( ListValue return_args; return_args.Append(syncable::ModelTypeSetToValue(encrypted_types)); parent_router_->RouteJsEvent("onEncryptionComplete", - JsArgList(return_args)); + JsArgList(&return_args)); } void JsSyncManagerObserver::OnMigrationNeededForTypes( @@ -97,7 +98,7 @@ void JsSyncManagerObserver::OnMigrationNeededForTypes( ListValue return_args; return_args.Append(syncable::ModelTypeSetToValue(types)); parent_router_->RouteJsEvent("onMigrationNeededForTypes", - JsArgList(return_args)); + JsArgList(&return_args)); } void JsSyncManagerObserver::OnInitializationComplete() { diff --git a/chrome/browser/sync/js_test_util.cc b/chrome/browser/sync/js_test_util.cc index bd4f9c0..1d8d329 100644 --- a/chrome/browser/sync/js_test_util.cc +++ b/chrome/browser/sync/js_test_util.cc @@ -5,6 +5,7 @@ #include "chrome/browser/sync/js_test_util.h" #include "base/basictypes.h" +#include "base/memory/scoped_ptr.h" #include "chrome/browser/sync/js_arg_list.h" namespace browser_sync { @@ -53,7 +54,8 @@ class HasArgsMatcher ::testing::Matcher<const JsArgList&> HasArgsAsList( const ListValue& expected_args) { - return HasArgs(JsArgList(expected_args)); + scoped_ptr<ListValue> expected_args_copy(expected_args.DeepCopy()); + return HasArgs(JsArgList(expected_args_copy.get())); } MockJsBackend::MockJsBackend() {} diff --git a/chrome/browser/sync/profile_sync_service_unittest.cc b/chrome/browser/sync/profile_sync_service_unittest.cc index 69502a7..80ac89a 100644 --- a/chrome/browser/sync/profile_sync_service_unittest.cc +++ b/chrome/browser/sync/profile_sync_service_unittest.cc @@ -221,21 +221,21 @@ TEST_F(ProfileSyncServiceTest, JsFrontendProcessMessageBasic) { ListValue arg_list1; arg_list1.Append(Value::CreateBooleanValue(true)); arg_list1.Append(Value::CreateIntegerValue(5)); - JsArgList args1(arg_list1); + JsArgList args1(&arg_list1); EXPECT_CALL(event_handler, HandleJsMessageReply("testMessage1", HasArgs(args1))); ListValue arg_list2; arg_list2.Append(Value::CreateStringValue("test")); arg_list2.Append(arg_list1.DeepCopy()); - JsArgList args2(arg_list2); + JsArgList args2(&arg_list2); EXPECT_CALL(event_handler, HandleJsMessageReply("delayTestMessage2", HasArgs(args2))); ListValue arg_list3; arg_list3.Append(arg_list1.DeepCopy()); arg_list3.Append(arg_list2.DeepCopy()); - JsArgList args3(arg_list3); + JsArgList args3(&arg_list3); JsFrontend* js_backend = service_->GetJsFrontend(); @@ -280,21 +280,21 @@ TEST_F(ProfileSyncServiceTest, ListValue arg_list1; arg_list1.Append(Value::CreateBooleanValue(true)); arg_list1.Append(Value::CreateIntegerValue(5)); - JsArgList args1(arg_list1); + JsArgList args1(&arg_list1); EXPECT_CALL(event_handler, HandleJsMessageReply("testMessage1", HasArgs(args1))); ListValue arg_list2; arg_list2.Append(Value::CreateStringValue("test")); arg_list2.Append(arg_list1.DeepCopy()); - JsArgList args2(arg_list2); + JsArgList args2(&arg_list2); EXPECT_CALL(event_handler, HandleJsMessageReply("testMessage2", HasArgs(args2))); ListValue arg_list3; arg_list3.Append(arg_list1.DeepCopy()); arg_list3.Append(arg_list2.DeepCopy()); - JsArgList args3(arg_list3); + JsArgList args3(&arg_list3); EXPECT_CALL(event_handler, HandleJsMessageReply("delayTestMessage3", HasArgs(args3))); diff --git a/chrome/browser/ui/webui/sync_internals_ui.cc b/chrome/browser/ui/webui/sync_internals_ui.cc index e1f88af..10102be 100644 --- a/chrome/browser/ui/webui/sync_internals_ui.cc +++ b/chrome/browser/ui/webui/sync_internals_ui.cc @@ -45,7 +45,8 @@ SyncInternalsUI::~SyncInternalsUI() { void SyncInternalsUI::OnWebUISend(const GURL& source_url, const std::string& name, const ListValue& content) { - browser_sync::JsArgList args(content); + scoped_ptr<ListValue> content_copy(content.DeepCopy()); + browser_sync::JsArgList args(content_copy.get()); VLOG(1) << "Received message: " << name << " with args " << args.ToString(); // We handle this case directly because it needs to work even if @@ -56,7 +57,7 @@ void SyncInternalsUI::OnWebUISend(const GURL& source_url, args.Append(about_info); ProfileSyncService* service = GetProfile()->GetProfileSyncService(); sync_ui_util::ConstructAboutInformation(service, about_info); - HandleJsMessageReply(name, browser_sync::JsArgList(args)); + HandleJsMessageReply(name, browser_sync::JsArgList(&args)); } else { browser_sync::JsFrontend* backend = GetJsFrontend(); if (backend) { diff --git a/chrome/browser/ui/webui/sync_internals_ui_unittest.cc b/chrome/browser/ui/webui/sync_internals_ui_unittest.cc index 0ae2436..dab0b3e 100644 --- a/chrome/browser/ui/webui/sync_internals_ui_unittest.cc +++ b/chrome/browser/ui/webui/sync_internals_ui_unittest.cc @@ -144,7 +144,7 @@ TEST_F(SyncInternalsUITest, HandleJsEvent) { ListValue args; args.Append(Value::CreateIntegerValue(5)); args.Append(Value::CreateBooleanValue(true)); - GetTestSyncInternalsUI()->HandleJsEvent("testMessage", JsArgList(args)); + GetTestSyncInternalsUI()->HandleJsEvent("testMessage", JsArgList(&args)); } TEST_F(SyncInternalsUITest, HandleJsEventNullService) { @@ -159,7 +159,7 @@ TEST_F(SyncInternalsUITest, HandleJsEventNullService) { ListValue args; args.Append(Value::CreateIntegerValue(5)); args.Append(Value::CreateBooleanValue(true)); - GetTestSyncInternalsUI()->HandleJsEvent("testMessage", JsArgList(args)); + GetTestSyncInternalsUI()->HandleJsEvent("testMessage", JsArgList(&args)); } TEST_F(SyncInternalsUITest, HandleJsMessageReply) { @@ -176,7 +176,7 @@ TEST_F(SyncInternalsUITest, HandleJsMessageReply) { args.Append(Value::CreateIntegerValue(5)); args.Append(Value::CreateBooleanValue(true)); GetTestSyncInternalsUI()->HandleJsMessageReply( - "testMessage", JsArgList(args)); + "testMessage", JsArgList(&args)); } TEST_F(SyncInternalsUITest, HandleJsMessageReplyNullService) { @@ -193,7 +193,7 @@ TEST_F(SyncInternalsUITest, HandleJsMessageReplyNullService) { args.Append(Value::CreateIntegerValue(5)); args.Append(Value::CreateBooleanValue(true)); GetTestSyncInternalsUI()->HandleJsMessageReply( - "testMessage", JsArgList(args)); + "testMessage", JsArgList(&args)); } TEST_F(SyncInternalsUITest, OnWebUISendBasic) { |