| Index: chrome/browser/extensions/extension_settings_apitest.cc
|
| diff --git a/chrome/browser/extensions/extension_settings_apitest.cc b/chrome/browser/extensions/extension_settings_apitest.cc
|
| index 213d921961b82e5897d41c88cec4bb6710f0a68a..6783a95c627f6814b58cb2d55d62829186575cc1 100644
|
| --- a/chrome/browser/extensions/extension_settings_apitest.cc
|
| +++ b/chrome/browser/extensions/extension_settings_apitest.cc
|
| @@ -2,15 +2,36 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| +#include "base/bind.h"
|
| #include "base/command_line.h"
|
| #include "base/json/json_writer.h"
|
| #include "chrome/browser/extensions/extension_apitest.h"
|
| +#include "chrome/browser/extensions/extension_service.h"
|
| +#include "chrome/browser/extensions/extension_settings_backend.h"
|
| +#include "chrome/browser/extensions/extension_settings_sync_util.h"
|
| #include "chrome/browser/extensions/extension_test_message_listener.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| +#include "chrome/browser/sync/api/sync_change.h"
|
| +#include "chrome/browser/sync/api/sync_change_processor.h"
|
| #include "chrome/browser/ui/browser.h"
|
| #include "chrome/common/chrome_switches.h"
|
| #include "chrome/test/base/ui_test_utils.h"
|
|
|
| +namespace {
|
| +
|
| +class NoopSyncChangeProcessor : public SyncChangeProcessor {
|
| + public:
|
| + virtual SyncError ProcessSyncChanges(
|
| + const tracked_objects::Location& from_here,
|
| + const SyncChangeList& change_list) OVERRIDE {
|
| + return SyncError();
|
| + }
|
| +
|
| + virtual ~NoopSyncChangeProcessor() {};
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| class ExtensionSettingsApiTest : public ExtensionApiTest {
|
| protected:
|
| void ReplyWhenSatisfied(
|
| @@ -20,11 +41,11 @@ class ExtensionSettingsApiTest : public ExtensionApiTest {
|
| normal_action, incognito_action, NULL, false);
|
| }
|
|
|
| - void LoadAndReplyWhenSatisfied(
|
| + const Extension* LoadAndReplyWhenSatisfied(
|
| const std::string& normal_action,
|
| const std::string& incognito_action,
|
| const std::string& extension_dir) {
|
| - MaybeLoadAndReplyWhenSatisfied(
|
| + return MaybeLoadAndReplyWhenSatisfied(
|
| normal_action, incognito_action, &extension_dir, false);
|
| }
|
|
|
| @@ -34,8 +55,26 @@ class ExtensionSettingsApiTest : public ExtensionApiTest {
|
| MaybeLoadAndReplyWhenSatisfied(normal_action, incognito_action, NULL, true);
|
| }
|
|
|
| + void InitSync(SyncChangeProcessor* sync_processor) {
|
| + browser()->profile()->GetExtensionService()->
|
| + extension_settings_frontend()->RunWithBackend(base::Bind(
|
| + &ExtensionSettingsApiTest::InitSyncWithBackend,
|
| + this,
|
| + sync_processor));
|
| + MessageLoop::current()->RunAllPending();
|
| + }
|
| +
|
| + void SendChanges(const SyncChangeList& change_list) {
|
| + browser()->profile()->GetExtensionService()->
|
| + extension_settings_frontend()->RunWithBackend(base::Bind(
|
| + &ExtensionSettingsApiTest::SendChangesToBackend,
|
| + this,
|
| + change_list));
|
| + MessageLoop::current()->RunAllPending();
|
| + }
|
| +
|
| private:
|
| - void MaybeLoadAndReplyWhenSatisfied(
|
| + const Extension* MaybeLoadAndReplyWhenSatisfied(
|
| const std::string& normal_action,
|
| const std::string& incognito_action,
|
| // May be NULL to imply not loading the extension.
|
| @@ -46,9 +85,11 @@ class ExtensionSettingsApiTest : public ExtensionApiTest {
|
|
|
| // Only load the extension after the listeners have been set up, to avoid
|
| // initialisation race conditions.
|
| + const Extension* extension = NULL;
|
| if (extension_dir) {
|
| - ASSERT_TRUE(LoadExtensionIncognito(test_data_dir_
|
| - .AppendASCII("settings").AppendASCII(*extension_dir)));
|
| + extension = LoadExtensionIncognito(
|
| + test_data_dir_.AppendASCII("settings").AppendASCII(*extension_dir));
|
| + EXPECT_TRUE(extension);
|
| }
|
|
|
| EXPECT_TRUE(listener.WaitUntilSatisfied());
|
| @@ -56,6 +97,7 @@ class ExtensionSettingsApiTest : public ExtensionApiTest {
|
|
|
| listener.Reply(CreateMessage(normal_action, is_final_action));
|
| listener_incognito.Reply(CreateMessage(incognito_action, is_final_action));
|
| + return extension;
|
| }
|
|
|
| std::string CreateMessage(const std::string& action, bool is_final_action) {
|
| @@ -66,6 +108,19 @@ class ExtensionSettingsApiTest : public ExtensionApiTest {
|
| base::JSONWriter::Write(message.get(), false, &message_json);
|
| return message_json;
|
| }
|
| +
|
| + void InitSyncWithBackend(
|
| + SyncChangeProcessor* sync_processor, ExtensionSettingsBackend* backend) {
|
| + EXPECT_FALSE(backend->MergeDataAndStartSyncing(
|
| + syncable::EXTENSION_SETTINGS,
|
| + SyncDataList(),
|
| + sync_processor).IsSet());
|
| + }
|
| +
|
| + void SendChangesToBackend(
|
| + const SyncChangeList& change_list, ExtensionSettingsBackend* backend) {
|
| + EXPECT_FALSE(backend->ProcessSyncChanges(FROM_HERE, change_list).IsSet());
|
| + }
|
| };
|
|
|
| IN_PROC_BROWSER_TEST_F(ExtensionSettingsApiTest, SimpleTest) {
|
| @@ -90,15 +145,83 @@ IN_PROC_BROWSER_TEST_F(ExtensionSettingsApiTest, SplitModeIncognito) {
|
| browser()->profile()->GetOffTheRecordProfile());
|
|
|
| LoadAndReplyWhenSatisfied("assertEmpty", "assertEmpty", "split_incognito");
|
| - ReplyWhenSatisfied("noop", "setFoobar");
|
| - ReplyWhenSatisfied("assertFoobar", "assertFoobar");
|
| + ReplyWhenSatisfied("noop", "setFoo");
|
| + ReplyWhenSatisfied("assertFoo", "assertFoo");
|
| ReplyWhenSatisfied("clear", "noop");
|
| ReplyWhenSatisfied("assertEmpty", "assertEmpty");
|
| - ReplyWhenSatisfied("setFoobar", "noop");
|
| - ReplyWhenSatisfied("assertFoobar", "assertFoobar");
|
| + ReplyWhenSatisfied("setFoo", "noop");
|
| + ReplyWhenSatisfied("assertFoo", "assertFoo");
|
| ReplyWhenSatisfied("noop", "removeFoo");
|
| FinalReplyWhenSatisfied("assertEmpty", "assertEmpty");
|
|
|
| EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
|
| EXPECT_TRUE(catcher_incognito.GetNextResult()) << catcher.message();
|
| }
|
| +
|
| +IN_PROC_BROWSER_TEST_F(ExtensionSettingsApiTest,
|
| + OnChangedNotificationsBetweenBackgroundPages) {
|
| + CommandLine::ForCurrentProcess()->AppendSwitch(
|
| + switches::kEnableExperimentalExtensionApis);
|
| +
|
| + // We need 2 ResultCatchers because we'll be running the same test in both
|
| + // regular and incognito mode.
|
| + ResultCatcher catcher, catcher_incognito;
|
| + catcher.RestrictToProfile(browser()->profile());
|
| + catcher_incognito.RestrictToProfile(
|
| + browser()->profile()->GetOffTheRecordProfile());
|
| +
|
| + LoadAndReplyWhenSatisfied(
|
| + "assertNoNotifications", "assertNoNotifications", "split_incognito");
|
| + ReplyWhenSatisfied("noop", "setFoo");
|
| + ReplyWhenSatisfied("assertAddFooNotification", "assertNoNotifications");
|
| + ReplyWhenSatisfied("clearNotifications", "noop");
|
| + ReplyWhenSatisfied("removeFoo", "noop");
|
| + FinalReplyWhenSatisfied(
|
| + "assertNoNotifications", "assertDeleteFooNotification");
|
| +
|
| + EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
|
| + EXPECT_TRUE(catcher_incognito.GetNextResult()) << catcher.message();
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(ExtensionSettingsApiTest,
|
| + OnChangedNotificationsFromSync) {
|
| + CommandLine::ForCurrentProcess()->AppendSwitch(
|
| + switches::kEnableExperimentalExtensionApis);
|
| +
|
| + // We need 2 ResultCatchers because we'll be running the same test in both
|
| + // regular and incognito mode.
|
| + ResultCatcher catcher, catcher_incognito;
|
| + catcher.RestrictToProfile(browser()->profile());
|
| + catcher_incognito.RestrictToProfile(
|
| + browser()->profile()->GetOffTheRecordProfile());
|
| +
|
| + const Extension* extension =
|
| + LoadAndReplyWhenSatisfied(
|
| + "assertNoNotifications", "assertNoNotifications", "split_incognito");
|
| + const std::string& extension_id = extension->id();
|
| +
|
| + NoopSyncChangeProcessor sync_processor;
|
| + InitSync(&sync_processor);
|
| +
|
| + // Set "foo" to "bar" via sync.
|
| + SyncChangeList sync_changes;
|
| + StringValue bar("bar");
|
| + sync_changes.push_back(extension_settings_sync_util::CreateAdd(
|
| + extension_id, "foo", bar));
|
| + SendChanges(sync_changes);
|
| +
|
| + ReplyWhenSatisfied("assertAddFooNotification", "assertAddFooNotification");
|
| + ReplyWhenSatisfied("clearNotifications", "clearNotifications");
|
| +
|
| + // Remove "foo" via sync.
|
| + sync_changes.clear();
|
| + sync_changes.push_back(extension_settings_sync_util::CreateDelete(
|
| + extension_id, "foo"));
|
| + SendChanges(sync_changes);
|
| +
|
| + FinalReplyWhenSatisfied(
|
| + "assertDeleteFooNotification", "assertDeleteFooNotification");
|
| +
|
| + EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
|
| + EXPECT_TRUE(catcher_incognito.GetNextResult()) << catcher.message();
|
| +}
|
|
|