Chromium Code Reviews| 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 3d3c46ee60d8e510abe4e7aaf4df14fa1b0c8f00..5bd179bf5e8a7cfcaa7748c9ccededadaf3b4219 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,24 @@ 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)); |
| + } |
| + |
| + void SendChanges(const SyncChangeList& change_list) { |
| + browser()->profile()->GetExtensionService()-> |
| + extension_settings_frontend()->RunWithBackend(base::Bind( |
| + &ExtensionSettingsApiTest::SendChangesToBackend, |
| + this, |
| + change_list)); |
| + } |
| + |
| 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 +83,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 +95,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 +106,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) { |
| @@ -93,15 +146,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"); |
|
not at google - send to devlin
2011/10/11 03:58:48
Hmmm, assertAddFooNotification here and below fail
not at google - send to devlin
2011/10/12 05:43:30
Not to jinx myself, but I think this is fixed now.
|
| + 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(); |
| +} |