summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryoz@chromium.org <yoz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-04 09:04:37 +0000
committeryoz@chromium.org <yoz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-04 09:04:37 +0000
commite676f8f0050863331707210c9457162e03563ce3 (patch)
tree604fb9098821831debfe19c5044c2f19106e53c6
parent56b7e39f89c80273f23b4a0fe5aaa14431d16745 (diff)
downloadchromium_src-e676f8f0050863331707210c9457162e03563ce3.zip
chromium_src-e676f8f0050863331707210c9457162e03563ce3.tar.gz
chromium_src-e676f8f0050863331707210c9457162e03563ce3.tar.bz2
Refactor APIPermission to separate out specific permission registration.
Adds a delegate to the PermissionsInfo global to do the specific registration; adds a ScopedTestingPermissionsInfo for unit tests. Preparation for moving permissions to top-level extensions. Also adds a base class for unittests, ExtensionTest, to deal with manifest handler / permission setup. BUG=162530,172712 Review URL: https://chromiumcodereview.appspot.com/13370002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@192252 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/browser_process_impl.cc5
-rw-r--r--chrome/browser/extensions/active_tab_unittest.cc7
-rw-r--r--chrome/browser/extensions/api/permissions/permissions_api_helpers_unittest.cc18
-rw-r--r--chrome/browser/extensions/api/storage/settings_frontend_unittest.cc7
-rw-r--r--chrome/browser/extensions/component_loader_unittest.cc18
-rw-r--r--chrome/browser/extensions/convert_web_app_unittest.cc12
-rw-r--r--chrome/browser/extensions/extension_info_map_unittest.cc3
-rw-r--r--chrome/browser/extensions/extension_prefs_unittest.cc3
-rw-r--r--chrome/browser/extensions/extension_prefs_unittest.h3
-rw-r--r--chrome/browser/extensions/extension_service_unittest.cc7
-rw-r--r--chrome/browser/extensions/extension_service_unittest.h5
-rw-r--r--chrome/browser/extensions/extension_special_storage_policy_unittest.cc7
-rw-r--r--chrome/browser/extensions/extension_ui_unittest.cc11
-rw-r--r--chrome/browser/extensions/script_bubble_controller_unittest.cc6
-rw-r--r--chrome/browser/extensions/startup_helper.cc3
-rw-r--r--chrome/browser/extensions/user_script_listener_unittest.cc1
-rw-r--r--chrome/browser/media_galleries/media_file_system_registry_unittest.cc6
-rw-r--r--chrome/browser/media_galleries/media_galleries_preferences_unittest.cc12
-rw-r--r--chrome/browser/ui/cocoa/location_bar/action_box_menu_bubble_controller_unittest.mm9
-rw-r--r--chrome/chrome_common.gypi2
-rw-r--r--chrome/chrome_tests_unit.gypi7
-rw-r--r--chrome/common/extensions/api/commands/commands_manifest_unittest.cc13
-rw-r--r--chrome/common/extensions/api/extension_api_unittest.cc28
-rw-r--r--chrome/common/extensions/extension_sync_type_unittest.cc249
-rw-r--r--chrome/common/extensions/extension_unittest.cc277
-rw-r--r--chrome/common/extensions/extension_unittest.h30
-rw-r--r--chrome/common/extensions/features/base_feature_provider_unittest.cc26
-rw-r--r--chrome/common/extensions/manifest_tests/extension_manifest_test.cc15
-rw-r--r--chrome/common/extensions/manifest_tests/extension_manifest_test.h6
-rw-r--r--chrome/common/extensions/permissions/api_permission.cc231
-rw-r--r--chrome/common/extensions/permissions/api_permission.h15
-rw-r--r--chrome/common/extensions/permissions/api_permission_set.cc26
-rw-r--r--chrome/common/extensions/permissions/api_permission_set_unittest.cc14
-rw-r--r--chrome/common/extensions/permissions/chrome_api_permissions.cc279
-rw-r--r--chrome/common/extensions/permissions/chrome_api_permissions.h24
-rw-r--r--chrome/common/extensions/permissions/media_galleries_permission_unittest.cc12
-rw-r--r--chrome/common/extensions/permissions/permission_set_unittest.cc13
-rw-r--r--chrome/common/extensions/permissions/permissions_info.cc72
-rw-r--r--chrome/common/extensions/permissions/permissions_info.h54
-rw-r--r--chrome/common/extensions/permissions/scoped_testing_permissions_info.cc27
-rw-r--r--chrome/common/extensions/permissions/scoped_testing_permissions_info.h29
-rw-r--r--chrome/common/extensions/permissions/socket_permission_unittest.cc14
-rw-r--r--chrome/renderer/chrome_content_renderer_client.cc4
-rw-r--r--chrome/test/data/extensions/manifest_tests/browser_action_synthesizes_command.json (renamed from chrome/test/data/extensions/api_test/browser_action/synthesized/manifest.json)0
-rw-r--r--chrome/utility/chrome_content_utility_client.cc4
45 files changed, 926 insertions, 688 deletions
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
index 0f6b4c0..c86d034 100644
--- a/chrome/browser/browser_process_impl.cc
+++ b/chrome/browser/browser_process_impl.cc
@@ -72,6 +72,8 @@
#include "chrome/common/chrome_paths.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/extensions/extension_l10n_util.h"
+#include "chrome/common/extensions/permissions/chrome_api_permissions.h"
+#include "chrome/common/extensions/permissions/permissions_info.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/switch_utils.h"
#include "chrome/common/url_constants.h"
@@ -187,8 +189,9 @@ BrowserProcessImpl::BrowserProcessImpl(
InitIdleMonitor();
#endif
+ extensions::PermissionsInfo::GetInstance()->InitializeWithDelegate(
+ extensions::ChromeAPIPermissions());
extension_event_router_forwarder_ = new extensions::EventRouterForwarder;
-
ExtensionRendererState::GetInstance()->Init();
#if defined(ENABLE_MESSAGE_CENTER)
diff --git a/chrome/browser/extensions/active_tab_unittest.cc b/chrome/browser/extensions/active_tab_unittest.cc
index de7dfa7..e3afb37 100644
--- a/chrome/browser/extensions/active_tab_unittest.cc
+++ b/chrome/browser/extensions/active_tab_unittest.cc
@@ -16,6 +16,8 @@
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_builder.h"
#include "chrome/common/extensions/features/feature.h"
+#include "chrome/common/extensions/permissions/chrome_api_permissions.h"
+#include "chrome/common/extensions/permissions/scoped_testing_permissions_info.h"
#include "chrome/common/extensions/value_builder.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "content/public/browser/browser_thread.h"
@@ -55,7 +57,8 @@ scoped_refptr<const Extension> CreateTestExtension(
class ActiveTabTest : public ChromeRenderViewHostTestHarness {
public:
ActiveTabTest()
- : extension(CreateTestExtension("deadbeef", true)),
+ : permissions_info_(ChromeAPIPermissions()),
+ extension(CreateTestExtension("deadbeef", true)),
another_extension(CreateTestExtension("feedbeef", true)),
extension_without_active_tab(CreateTestExtension("badbeef", false)),
ui_thread_(BrowserThread::UI, MessageLoop::current()) {}
@@ -110,6 +113,8 @@ class ActiveTabTest : public ChromeRenderViewHostTestHarness {
return extension->HasAPIPermissionForTab(tab_id, APIPermission::kTab);
}
+ ScopedTestingPermissionsInfo permissions_info_;
+
// An extension with the activeTab permission.
scoped_refptr<const Extension> extension;
diff --git a/chrome/browser/extensions/api/permissions/permissions_api_helpers_unittest.cc b/chrome/browser/extensions/api/permissions/permissions_api_helpers_unittest.cc
index 7169743..2cfc545 100644
--- a/chrome/browser/extensions/api/permissions/permissions_api_helpers_unittest.cc
+++ b/chrome/browser/extensions/api/permissions/permissions_api_helpers_unittest.cc
@@ -6,18 +6,17 @@
#include "base/values.h"
#include "chrome/browser/extensions/api/permissions/permissions_api_helpers.h"
#include "chrome/common/extensions/api/permissions.h"
+#include "chrome/common/extensions/extension_unittest.h"
#include "chrome/common/extensions/permissions/permission_set.h"
#include "extensions/common/url_pattern_set.h"
#include "googleurl/src/gurl.h"
#include "testing/gtest/include/gtest/gtest.h"
+using extensions::api::permissions::Permissions;
using extensions::permissions_api_helpers::PackPermissionSet;
using extensions::permissions_api_helpers::UnpackPermissionSet;
-using extensions::api::permissions::Permissions;
-using extensions::APIPermission;
-using extensions::APIPermissionSet;
-using extensions::PermissionSet;
-using extensions::URLPatternSet;
+
+namespace extensions {
namespace {
@@ -28,8 +27,11 @@ static void AddPattern(URLPatternSet* extent, const std::string& pattern) {
} // namespace
+class ExtensionPermissionsAPIHelpers : public ExtensionTest {
+};
+
// Tests that we can convert PermissionSets to and from values.
-TEST(ExtensionPermissionsAPIHelpers, Pack) {
+TEST_F(ExtensionPermissionsAPIHelpers, Pack) {
APIPermissionSet apis;
apis.insert(APIPermission::kTab);
apis.insert(APIPermission::kWebRequest);
@@ -78,7 +80,7 @@ TEST(ExtensionPermissionsAPIHelpers, Pack) {
// Tests various error conditions and edge cases when unpacking values
// into PermissionSets.
-TEST(ExtensionPermissionsAPIHelpers, Unpack) {
+TEST_F(ExtensionPermissionsAPIHelpers, Unpack) {
scoped_ptr<ListValue> apis(new ListValue());
apis->Append(Value::CreateStringValue("tabs"));
scoped_ptr<ListValue> origins(new ListValue());
@@ -173,3 +175,5 @@ TEST(ExtensionPermissionsAPIHelpers, Unpack) {
EXPECT_EQ(error, "'unknown_permission' is not a recognized permission.");
}
}
+
+} // namespace extensions
diff --git a/chrome/browser/extensions/api/storage/settings_frontend_unittest.cc b/chrome/browser/extensions/api/storage/settings_frontend_unittest.cc
index d572711..08f3986 100644
--- a/chrome/browser/extensions/api/storage/settings_frontend_unittest.cc
+++ b/chrome/browser/extensions/api/storage/settings_frontend_unittest.cc
@@ -14,6 +14,7 @@
#include "chrome/browser/extensions/api/storage/settings_test_util.h"
#include "chrome/browser/value_store/value_store.h"
#include "chrome/common/chrome_notification_types.h"
+#include "chrome/common/extensions/extension_unittest.h"
#include "content/public/test/test_browser_thread.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -49,14 +50,15 @@ scoped_ptr<Value> CreateMegabyte() {
}
-class ExtensionSettingsFrontendTest : public testing::Test {
+class ExtensionSettingsFrontendTest : public ExtensionTest {
public:
- ExtensionSettingsFrontendTest()
+ ExtensionSettingsFrontendTest()
: storage_factory_(new util::ScopedSettingsStorageFactory()),
ui_thread_(BrowserThread::UI, MessageLoop::current()),
file_thread_(BrowserThread::FILE, MessageLoop::current()) {}
virtual void SetUp() OVERRIDE {
+ ExtensionTest::SetUp();
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
profile_.reset(new util::MockProfile(temp_dir_.path()));
ResetFrontend();
@@ -67,6 +69,7 @@ class ExtensionSettingsFrontendTest : public testing::Test {
profile_.reset();
// Execute any pending deletion tasks.
message_loop_.RunUntilIdle();
+ ExtensionTest::TearDown();
}
protected:
diff --git a/chrome/browser/extensions/component_loader_unittest.cc b/chrome/browser/extensions/component_loader_unittest.cc
index 9b2b980..bedcfee 100644
--- a/chrome/browser/extensions/component_loader_unittest.cc
+++ b/chrome/browser/extensions/component_loader_unittest.cc
@@ -14,8 +14,7 @@
#include "chrome/common/extensions/background_info.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_set.h"
-#include "chrome/common/extensions/incognito_handler.h"
-#include "chrome/common/extensions/manifest_handler.h"
+#include "chrome/common/extensions/extension_unittest.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/testing_pref_service_syncable.h"
#include "components/user_prefs/pref_registry_syncable.h"
@@ -74,18 +73,16 @@ class MockExtensionService : public TestExtensionService {
} // namespace
-class ComponentLoaderTest : public testing::Test {
+class ComponentLoaderTest : public ExtensionTest {
public:
- ComponentLoaderTest() :
+ ComponentLoaderTest()
// Note: we pass the same pref service here, to stand in for both
// user prefs and local state.
- component_loader_(&extension_service_, &prefs_, &local_state_) {
+ : component_loader_(&extension_service_, &prefs_, &local_state_) {
}
virtual void SetUp() OVERRIDE {
- (new BackgroundManifestHandler)->Register();
- (new IncognitoHandler)->Register();
-
+ ExtensionTest::SetUp();
extension_path_ =
GetBasePath().AppendASCII("good")
.AppendASCII("Extensions")
@@ -114,11 +111,6 @@ class ComponentLoaderTest : public testing::Test {
#endif
}
- virtual void TearDown() OVERRIDE {
- ManifestHandler::ClearRegistryForTesting();
- testing::Test::TearDown();
- }
-
protected:
MockExtensionService extension_service_;
TestingPrefServiceSyncable prefs_;
diff --git a/chrome/browser/extensions/convert_web_app_unittest.cc b/chrome/browser/extensions/convert_web_app_unittest.cc
index fbb5128..6ba83b6 100644
--- a/chrome/browser/extensions/convert_web_app_unittest.cc
+++ b/chrome/browser/extensions/convert_web_app_unittest.cc
@@ -19,6 +19,7 @@
#include "chrome/common/extensions/api/icons/icons_handler.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_icon_set.h"
+#include "chrome/common/extensions/extension_unittest.h"
#include "chrome/common/extensions/permissions/permission_set.h"
#include "chrome/common/web_apps.h"
#include "extensions/common/extension_resource.h"
@@ -80,17 +81,12 @@ base::Time GetTestTime(int year, int month, int day, int hour, int minute,
} // namespace
-class ExtensionFromWebApp : public ::testing::Test {
- public:
+class ExtensionFromWebApp : public ExtensionTest {
+ protected:
virtual void SetUp() OVERRIDE {
- testing::Test::SetUp();
+ ExtensionTest::SetUp();
(new IconsHandler)->Register();
}
-
- virtual void TearDown() OVERRIDE {
- ManifestHandler::ClearRegistryForTesting();
- testing::Test::TearDown();
- }
};
TEST_F(ExtensionFromWebApp, GenerateVersion) {
diff --git a/chrome/browser/extensions/extension_info_map_unittest.cc b/chrome/browser/extensions/extension_info_map_unittest.cc
index d88f32a..8c6e545 100644
--- a/chrome/browser/extensions/extension_info_map_unittest.cc
+++ b/chrome/browser/extensions/extension_info_map_unittest.cc
@@ -9,6 +9,7 @@
#include "chrome/common/chrome_paths.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_manifest_constants.h"
+#include "chrome/common/extensions/extension_unittest.h"
#include "content/public/test/test_browser_thread.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/WebKit/Source/Platform/chromium/public/WebString.h"
@@ -25,7 +26,7 @@ namespace keys = extension_manifest_keys;
namespace {
-class ExtensionInfoMapTest : public testing::Test {
+class ExtensionInfoMapTest : public extensions::ExtensionTest {
public:
ExtensionInfoMapTest()
: ui_thread_(BrowserThread::UI, &message_loop_),
diff --git a/chrome/browser/extensions/extension_prefs_unittest.cc b/chrome/browser/extensions/extension_prefs_unittest.cc
index 37639c6..173f8f4 100644
--- a/chrome/browser/extensions/extension_prefs_unittest.cc
+++ b/chrome/browser/extensions/extension_prefs_unittest.cc
@@ -20,7 +20,6 @@
#include "chrome/common/chrome_paths.h"
#include "chrome/common/extensions/extension_manifest_constants.h"
#include "chrome/common/extensions/permissions/permission_set.h"
-#include "chrome/common/extensions/permissions/permissions_info.h"
#include "components/user_prefs/pref_registry_syncable.h"
#include "content/public/browser/notification_details.h"
#include "content/public/browser/notification_source.h"
@@ -64,6 +63,7 @@ ExtensionPrefsTest::~ExtensionPrefsTest() {
void ExtensionPrefsTest::RegisterPreferences(PrefRegistrySyncable* registry) {}
void ExtensionPrefsTest::SetUp() {
+ ExtensionTest::SetUp();
RegisterPreferences(prefs_.pref_registry());
Initialize();
}
@@ -78,6 +78,7 @@ void ExtensionPrefsTest::TearDown() {
Verify();
prefs_.pref_service()->CommitPendingWrite();
message_loop_.RunUntilIdle();
+ ExtensionTest::TearDown();
}
// Tests the LastPingDay/SetLastPingDay functions.
diff --git a/chrome/browser/extensions/extension_prefs_unittest.h b/chrome/browser/extensions/extension_prefs_unittest.h
index c199d19..86b622b 100644
--- a/chrome/browser/extensions/extension_prefs_unittest.h
+++ b/chrome/browser/extensions/extension_prefs_unittest.h
@@ -7,6 +7,7 @@
#include "base/message_loop.h"
#include "chrome/browser/extensions/test_extension_prefs.h"
+#include "chrome/common/extensions/extension_unittest.h"
#include "content/public/test/test_browser_thread.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -20,7 +21,7 @@ namespace extensions {
class Extension;
// Base class for extension preference-related unit tests.
-class ExtensionPrefsTest : public testing::Test {
+class ExtensionPrefsTest : public ExtensionTest {
public:
ExtensionPrefsTest();
virtual ~ExtensionPrefsTest();
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc
index b1253eb..a6068b5 100644
--- a/chrome/browser/extensions/extension_service_unittest.cc
+++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -68,7 +68,6 @@
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_l10n_util.h"
#include "chrome/common/extensions/extension_manifest_constants.h"
-#include "chrome/common/extensions/manifest_handler.h"
#include "chrome/common/extensions/manifest_handlers/content_scripts_handler.h"
#include "chrome/common/extensions/manifest_handlers/requirements_handler.h"
#include "chrome/common/extensions/manifest_url_handler.h"
@@ -548,7 +547,7 @@ void ExtensionServiceTestBase::SetUpTestCase() {
}
void ExtensionServiceTestBase::SetUp() {
- testing::Test::SetUp();
+ ExtensionTest::SetUp();
ExtensionErrorReporter::GetInstance()->ClearErrors();
(new extensions::BackgroundManifestHandler)->Register();
(new extensions::ContentScriptsHandler)->Register();
@@ -557,10 +556,6 @@ void ExtensionServiceTestBase::SetUp() {
(new extensions::RequirementsHandler)->Register();
}
-void ExtensionServiceTestBase::TearDown() {
- extensions::ManifestHandler::ClearRegistryForTesting();
-}
-
class ExtensionServiceTest
: public ExtensionServiceTestBase, public content::NotificationObserver {
public:
diff --git a/chrome/browser/extensions/extension_service_unittest.h b/chrome/browser/extensions/extension_service_unittest.h
index f5bd434..6f46f77 100644
--- a/chrome/browser/extensions/extension_service_unittest.h
+++ b/chrome/browser/extensions/extension_service_unittest.h
@@ -12,6 +12,7 @@
#include "base/memory/scoped_ptr.h"
#include "base/message_loop.h"
#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/common/extensions/extension_unittest.h"
#include "chrome/common/extensions/feature_switch.h"
#include "content/public/test/test_browser_thread.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -22,7 +23,7 @@ namespace extensions {
class ManagementPolicy;
}
-class ExtensionServiceTestBase : public testing::Test {
+class ExtensionServiceTestBase : public extensions::ExtensionTest {
public:
ExtensionServiceTestBase();
virtual ~ExtensionServiceTestBase();
@@ -48,8 +49,6 @@ class ExtensionServiceTestBase : public testing::Test {
virtual void SetUp() OVERRIDE;
- virtual void TearDown() OVERRIDE;
-
void set_extensions_enabled(bool enabled) {
service_->set_extensions_enabled(enabled);
}
diff --git a/chrome/browser/extensions/extension_special_storage_policy_unittest.cc b/chrome/browser/extensions/extension_special_storage_policy_unittest.cc
index 62cd4f1..e61f8d0 100644
--- a/chrome/browser/extensions/extension_special_storage_policy_unittest.cc
+++ b/chrome/browser/extensions/extension_special_storage_policy_unittest.cc
@@ -10,6 +10,7 @@
#include "chrome/common/content_settings_types.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_manifest_constants.h"
+#include "chrome/common/extensions/extension_unittest.h"
#include "chrome/common/extensions/manifest.h"
#include "chrome/common/extensions/manifest_handler.h"
#include "chrome/test/base/testing_profile.h"
@@ -22,13 +23,13 @@ using extensions::Manifest;
namespace keys = extension_manifest_keys;
-class ExtensionSpecialStoragePolicyTest : public testing::Test {
- public:
+class ExtensionSpecialStoragePolicyTest : public extensions::ExtensionTest {
+ protected:
virtual void SetUp() {
+ extensions::ExtensionTest::SetUp();
policy_ = new ExtensionSpecialStoragePolicy(NULL);
}
- protected:
scoped_refptr<Extension> CreateProtectedApp() {
#if defined(OS_WIN)
base::FilePath path(FILE_PATH_LITERAL("c:\\foo"));
diff --git a/chrome/browser/extensions/extension_ui_unittest.cc b/chrome/browser/extensions/extension_ui_unittest.cc
index a623506..b91cc7f 100644
--- a/chrome/browser/extensions/extension_ui_unittest.cc
+++ b/chrome/browser/extensions/extension_ui_unittest.cc
@@ -13,7 +13,7 @@
#include "chrome/browser/ui/webui/extensions/extension_settings_handler.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/extensions/extension.h"
-#include "chrome/common/extensions/manifest_handler.h"
+#include "chrome/common/extensions/extension_unittest.h"
#include "chrome/common/extensions/manifest_handlers/content_scripts_handler.h"
#include "chrome/test/base/testing_profile.h"
#include "content/public/test/test_browser_thread.h"
@@ -23,15 +23,15 @@
using extensions::Extension;
using extensions::Manifest;
-class ExtensionUITest : public testing::Test {
+class ExtensionUITest : public extensions::ExtensionTest {
public:
ExtensionUITest()
: ui_thread_(content::BrowserThread::UI, &message_loop_),
- file_thread_(content::BrowserThread::FILE, &message_loop_) {}
+ file_thread_(content::BrowserThread::FILE, &message_loop_) {}
protected:
virtual void SetUp() OVERRIDE {
- testing::Test::SetUp();
+ ExtensionTest::SetUp();
// Create an ExtensionService and ManagementPolicy to inject into the
// ExtensionSettingsHandler.
@@ -54,8 +54,7 @@ class ExtensionUITest : public testing::Test {
profile_.reset();
// Execute any pending deletion tasks.
message_loop_.RunUntilIdle();
- extensions::ManifestHandler::ClearRegistryForTesting();
- testing::Test::TearDown();
+ ExtensionTest::TearDown();
}
static DictionaryValue* DeserializeJSONTestData(const base::FilePath& path,
diff --git a/chrome/browser/extensions/script_bubble_controller_unittest.cc b/chrome/browser/extensions/script_bubble_controller_unittest.cc
index 12bc49d..4843209 100644
--- a/chrome/browser/extensions/script_bubble_controller_unittest.cc
+++ b/chrome/browser/extensions/script_bubble_controller_unittest.cc
@@ -18,6 +18,8 @@
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_builder.h"
#include "chrome/common/extensions/feature_switch.h"
+#include "chrome/common/extensions/permissions/chrome_api_permissions.h"
+#include "chrome/common/extensions/permissions/scoped_testing_permissions_info.h"
#include "chrome/common/extensions/value_builder.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "chrome/test/base/testing_profile.h"
@@ -35,7 +37,8 @@ class ScriptBubbleControllerTest : public ChromeRenderViewHostTestHarness {
ScriptBubbleControllerTest()
: ui_thread_(BrowserThread::UI, MessageLoop::current()),
file_thread_(BrowserThread::FILE, MessageLoop::current()),
- enable_script_bubble_(FeatureSwitch::script_bubble(), true) {
+ enable_script_bubble_(FeatureSwitch::script_bubble(), true),
+ permissions_info_(ChromeAPIPermissions()) {
}
virtual void SetUp() OVERRIDE {
@@ -66,6 +69,7 @@ class ScriptBubbleControllerTest : public ChromeRenderViewHostTestHarness {
content::TestBrowserThread ui_thread_;
content::TestBrowserThread file_thread_;
FeatureSwitch::ScopedOverride enable_script_bubble_;
+ ScopedTestingPermissionsInfo permissions_info_;
};
TEST_F(ScriptBubbleControllerTest, Basics) {
diff --git a/chrome/browser/extensions/startup_helper.cc b/chrome/browser/extensions/startup_helper.cc
index 42a51b4..5ef51ec 100644
--- a/chrome/browser/extensions/startup_helper.cc
+++ b/chrome/browser/extensions/startup_helper.cc
@@ -22,6 +22,7 @@
#include "chrome/common/extensions/background_info.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/incognito_handler.h"
+#include "chrome/common/extensions/permissions/chrome_api_permissions.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/web_contents.h"
#include "ipc/ipc_message.h"
@@ -39,6 +40,8 @@ void PrintPackExtensionMessage(const std::string& message) {
namespace extensions {
StartupHelper::StartupHelper() : pack_job_succeeded_(false) {
+ PermissionsInfo::GetInstance()->InitializeWithDelegate(
+ ChromeAPIPermissions());
(new DefaultLocaleHandler)->Register();
(new BackgroundManifestHandler)->Register();
(new IncognitoHandler)->Register();
diff --git a/chrome/browser/extensions/user_script_listener_unittest.cc b/chrome/browser/extensions/user_script_listener_unittest.cc
index b446646..06d46f49 100644
--- a/chrome/browser/extensions/user_script_listener_unittest.cc
+++ b/chrome/browser/extensions/user_script_listener_unittest.cc
@@ -151,6 +151,7 @@ class UserScriptListenerTest : public ExtensionServiceTestBase {
virtual void TearDown() OVERRIDE {
listener_ = NULL;
MessageLoop::current()->RunUntilIdle();
+ ExtensionServiceTestBase::TearDown();
}
protected:
diff --git a/chrome/browser/media_galleries/media_file_system_registry_unittest.cc b/chrome/browser/media_galleries/media_file_system_registry_unittest.cc
index 3ea9db9..2ea255d 100644
--- a/chrome/browser/media_galleries/media_file_system_registry_unittest.cc
+++ b/chrome/browser/media_galleries/media_file_system_registry_unittest.cc
@@ -34,6 +34,8 @@
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/incognito_handler.h"
#include "chrome/common/extensions/manifest_handler.h"
+#include "chrome/common/extensions/permissions/chrome_api_permissions.h"
+#include "chrome/common/extensions/permissions/scoped_testing_permissions_info.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile.h"
@@ -372,6 +374,7 @@ class MediaFileSystemRegistryTest : public ChromeRenderViewHostTestHarness {
// Needed for extension service & friends to work.
content::TestBrowserThread ui_thread_;
content::TestBrowserThread file_thread_;
+ extensions::ScopedTestingPermissionsInfo permissions_info_;
// TODO(gbillock): Eliminate windows-specific code from this test.
#if defined(OS_WIN)
@@ -574,7 +577,8 @@ int ProfileState::GetAndClearComparisonCount() {
MediaFileSystemRegistryTest::MediaFileSystemRegistryTest()
: ui_thread_(content::BrowserThread::UI, MessageLoop::current()),
- file_thread_(content::BrowserThread::FILE, MessageLoop::current()) {
+ file_thread_(content::BrowserThread::FILE, MessageLoop::current()),
+ permissions_info_(extensions::ChromeAPIPermissions()) {
}
void MediaFileSystemRegistryTest::CreateProfileState(size_t profile_count) {
diff --git a/chrome/browser/media_galleries/media_galleries_preferences_unittest.cc b/chrome/browser/media_galleries/media_galleries_preferences_unittest.cc
index 5a3a4ff..8f010b0 100644
--- a/chrome/browser/media_galleries/media_galleries_preferences_unittest.cc
+++ b/chrome/browser/media_galleries/media_galleries_preferences_unittest.cc
@@ -22,8 +22,7 @@
#include "chrome/browser/storage_monitor/test_storage_monitor.h"
#include "chrome/common/extensions/background_info.h"
#include "chrome/common/extensions/extension.h"
-#include "chrome/common/extensions/incognito_handler.h"
-#include "chrome/common/extensions/manifest_handler.h"
+#include "chrome/common/extensions/extension_unittest.h"
#include "chrome/test/base/testing_profile.h"
#include "content/public/test/test_browser_thread.h"
#include "sync/api/string_ordinal.h"
@@ -59,7 +58,7 @@ class MockGalleryChangeObserver
} // namespace
-class MediaGalleriesPreferencesTest : public testing::Test {
+class MediaGalleriesPreferencesTest : public extensions::ExtensionTest {
public:
typedef std::map<std::string /*device id*/, MediaGalleryPrefIdSet>
DeviceIdPrefIdsMap;
@@ -79,15 +78,13 @@ class MediaGalleriesPreferencesTest : public testing::Test {
}
virtual void SetUp() OVERRIDE {
- testing::Test::SetUp();
+ extensions::ExtensionTest::SetUp();
extensions::TestExtensionSystem* extension_system(
static_cast<extensions::TestExtensionSystem*>(
extensions::ExtensionSystem::Get(profile_.get())));
extension_system->CreateExtensionService(
CommandLine::ForCurrentProcess(), base::FilePath(), false);
- (new extensions::BackgroundManifestHandler)->Register();
- (new extensions::IncognitoHandler)->Register();
gallery_prefs_.reset(new MediaGalleriesPreferences(profile_.get()));
@@ -121,8 +118,7 @@ class MediaGalleriesPreferencesTest : public testing::Test {
virtual void TearDown() OVERRIDE {
Verify();
- extensions::ManifestHandler::ClearRegistryForTesting();
- testing::Test::TearDown();
+ extensions::ExtensionTest::TearDown();
}
void Verify() {
diff --git a/chrome/browser/ui/cocoa/location_bar/action_box_menu_bubble_controller_unittest.mm b/chrome/browser/ui/cocoa/location_bar/action_box_menu_bubble_controller_unittest.mm
index f24ca1b..158480e 100644
--- a/chrome/browser/ui/cocoa/location_bar/action_box_menu_bubble_controller_unittest.mm
+++ b/chrome/browser/ui/cocoa/location_bar/action_box_menu_bubble_controller_unittest.mm
@@ -16,6 +16,8 @@
#include "chrome/common/extensions/extension_builder.h"
#include "chrome/common/extensions/incognito_handler.h"
#include "chrome/common/extensions/manifest_handler.h"
+#include "chrome/common/extensions/permissions/chrome_api_permissions.h"
+#include "chrome/common/extensions/permissions/scoped_testing_permissions_info.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
@@ -47,6 +49,10 @@ class MenuDelegate : public ui::SimpleMenuModel::Delegate {
class ActionBoxMenuBubbleControllerTest : public CocoaProfileTest {
public:
+ ActionBoxMenuBubbleControllerTest()
+ : permissions_info_(extensions::ChromeAPIPermissions()) {
+ }
+
virtual void SetUp() OVERRIDE {
CocoaProfileTest::SetUp();
ASSERT_TRUE(browser());
@@ -121,9 +127,10 @@ class ActionBoxMenuBubbleControllerTest : public CocoaProfileTest {
ASSERT_TRUE(found);
}
- public:
+ protected:
ActionBoxMenuBubbleController* controller_;
MenuDelegate menu_delegate_;
+ extensions::ScopedTestingPermissionsInfo permissions_info_;
ExtensionService* service_;
};
diff --git a/chrome/chrome_common.gypi b/chrome/chrome_common.gypi
index a0b0eb9..9e0744d 100644
--- a/chrome/chrome_common.gypi
+++ b/chrome/chrome_common.gypi
@@ -278,6 +278,8 @@
'common/extensions/permissions/bluetooth_device_permission.h',
'common/extensions/permissions/bluetooth_device_permission_data.cc',
'common/extensions/permissions/bluetooth_device_permission_data.h',
+ 'common/extensions/permissions/chrome_api_permissions.cc',
+ 'common/extensions/permissions/chrome_api_permissions.h',
'common/extensions/permissions/media_galleries_permission.cc',
'common/extensions/permissions/media_galleries_permission.h',
'common/extensions/permissions/media_galleries_permission_data.cc',
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi
index 1f92e10..0529d09 100644
--- a/chrome/chrome_tests_unit.gypi
+++ b/chrome/chrome_tests_unit.gypi
@@ -186,6 +186,8 @@
'common/extensions/extension_builder.h',
'common/extensions/extension_test_util.cc',
'common/extensions/extension_test_util.h',
+ 'common/extensions/permissions/scoped_testing_permissions_info.cc',
+ 'common/extensions/permissions/scoped_testing_permissions_info.h',
'common/extensions/value_builder.cc',
'common/extensions/value_builder.h',
'renderer/chrome_mock_render_thread.cc',
@@ -1508,7 +1510,9 @@
'common/extensions/extension_l10n_util_unittest.cc',
'common/extensions/extension_localization_peer_unittest.cc',
'common/extensions/extension_set_unittest.cc',
+ 'common/extensions/extension_sync_type_unittest.cc',
'common/extensions/extension_unittest.cc',
+ 'common/extensions/extension_unittest.h',
'common/extensions/feature_switch_unittest.cc',
'common/extensions/features/base_feature_provider_unittest.cc',
'common/extensions/features/complex_feature_unittest.cc',
@@ -1822,11 +1826,10 @@
['exclude', '^browser/sync/glue/chrome_extensions_activity_monitor_unittest.cc'],
['exclude', '^common/extensions/api/'],
],
- 'sources!':[
+ 'sources!': [
'browser/extensions/extension_context_menu_model_unittest.cc',
'browser/extensions/extension_ui_unittest.cc',
'browser/extensions/permissions_updater_unittest.cc',
- 'common/extensions/extension_unittest.cc',
],
}],
['use_ash==1', {
diff --git a/chrome/common/extensions/api/commands/commands_manifest_unittest.cc b/chrome/common/extensions/api/commands/commands_manifest_unittest.cc
index f6eb432..c642ebc 100644
--- a/chrome/common/extensions/api/commands/commands_manifest_unittest.cc
+++ b/chrome/common/extensions/api/commands/commands_manifest_unittest.cc
@@ -8,6 +8,7 @@
#include "base/string_util.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/extensions/api/commands/commands_handler.h"
+#include "chrome/common/extensions/api/extension_action/browser_action_handler.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace errors = extension_manifest_errors;
@@ -84,4 +85,16 @@ TEST_F(CommandsManifestTest, CommandManifestRejectJustShift) {
errors::kInvalidKeyBinding);
}
+TEST_F(CommandsManifestTest, BrowserActionSynthesizesCommand) {
+ (new BrowserActionHandler)->Register();
+ scoped_refptr<Extension> extension =
+ LoadAndExpectSuccess("browser_action_synthesizes_command.json");
+ // An extension with a browser action but no extension command specified
+ // should get a command assigned to it.
+ const extensions::Command* command =
+ CommandsInfo::GetBrowserActionCommand(extension);
+ ASSERT_TRUE(command != NULL);
+ ASSERT_EQ(ui::VKEY_UNKNOWN, command->accelerator().key_code());
+}
+
} // namespace extensions
diff --git a/chrome/common/extensions/api/extension_api_unittest.cc b/chrome/common/extensions/api/extension_api_unittest.cc
index 72db57d4..98830ea 100644
--- a/chrome/common/extensions/api/extension_api_unittest.cc
+++ b/chrome/common/extensions/api/extension_api_unittest.cc
@@ -18,6 +18,7 @@
#include "base/values.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/extensions/extension.h"
+#include "chrome/common/extensions/extension_unittest.h"
#include "chrome/common/extensions/features/api_feature.h"
#include "chrome/common/extensions/features/base_feature_provider.h"
#include "chrome/common/extensions/features/simple_feature.h"
@@ -31,7 +32,10 @@ SimpleFeature* CreateAPIFeature() {
return new APIFeature();
}
-TEST(ExtensionAPI, Creation) {
+class ExtensionAPITest : public ExtensionTest {
+};
+
+TEST_F(ExtensionAPITest, Creation) {
ExtensionAPI* shared_instance = ExtensionAPI::GetSharedInstance();
EXPECT_EQ(shared_instance, ExtensionAPI::GetSharedInstance());
@@ -58,7 +62,7 @@ TEST(ExtensionAPI, Creation) {
}
}
-TEST(ExtensionAPI, SplitDependencyName) {
+TEST_F(ExtensionAPITest, SplitDependencyName) {
struct {
std::string input;
std::string expected_feature_type;
@@ -82,7 +86,7 @@ TEST(ExtensionAPI, SplitDependencyName) {
}
}
-TEST(ExtensionAPI, IsPrivileged) {
+TEST_F(ExtensionAPITest, IsPrivileged) {
scoped_ptr<ExtensionAPI> extension_api(
ExtensionAPI::CreateWithDefaultConfiguration());
@@ -111,7 +115,7 @@ TEST(ExtensionAPI, IsPrivileged) {
EXPECT_FALSE(extension_api->IsPrivileged("storage.set"));
}
-TEST(ExtensionAPI, IsPrivilegedFeatures) {
+TEST_F(ExtensionAPITest, IsPrivilegedFeatures) {
struct {
std::string api_full_name;
bool expect_is_privilged;
@@ -217,7 +221,7 @@ TEST(ExtensionAPI, APIFeatures) {
}
}
-TEST(ExtensionAPI, LazyGetSchema) {
+TEST_F(ExtensionAPITest, LazyGetSchema) {
scoped_ptr<ExtensionAPI> apis(ExtensionAPI::CreateWithDefaultConfiguration());
EXPECT_EQ(NULL, apis->GetSchema(""));
@@ -271,7 +275,7 @@ scoped_refptr<Extension> CreateExtensionWithPermission(
return CreateExtensionWithPermissions(permissions);
}
-TEST(ExtensionAPI, ExtensionWithUnprivilegedAPIs) {
+TEST_F(ExtensionAPITest, ExtensionWithUnprivilegedAPIs) {
scoped_refptr<Extension> extension;
{
std::set<std::string> permissions;
@@ -326,7 +330,7 @@ TEST(ExtensionAPI, ExtensionWithUnprivilegedAPIs) {
GURL()).is_available());
}
-TEST(ExtensionAPI, ExtensionWithDependencies) {
+TEST_F(ExtensionAPITest, ExtensionWithDependencies) {
// Extension with the "ttsEngine" permission but not the "tts" permission; it
// should not automatically get "tts" permission.
{
@@ -368,7 +372,7 @@ bool MatchesURL(
api_name, NULL, Feature::WEB_PAGE_CONTEXT, GURL(url)).is_available();
}
-TEST(ExtensionAPI, URLMatching) {
+TEST_F(ExtensionAPITest, URLMatching) {
scoped_ptr<ExtensionAPI> api(ExtensionAPI::CreateWithDefaultConfiguration());
// "app" API is available to all URLs that content scripts can be injected.
@@ -394,7 +398,7 @@ TEST(ExtensionAPI, URLMatching) {
"chrome-extension://fakeextension"));
}
-TEST(ExtensionAPI, GetAPINameFromFullName) {
+TEST_F(ExtensionAPITest, GetAPINameFromFullName) {
struct {
std::string input;
std::string api_name;
@@ -422,7 +426,7 @@ TEST(ExtensionAPI, GetAPINameFromFullName) {
}
}
-TEST(ExtensionAPI, DefaultConfigurationFeatures) {
+TEST_F(ExtensionAPITest, DefaultConfigurationFeatures) {
scoped_ptr<ExtensionAPI> api(ExtensionAPI::CreateWithDefaultConfiguration());
SimpleFeature* bookmarks = static_cast<SimpleFeature*>(
@@ -456,7 +460,7 @@ TEST(ExtensionAPI, DefaultConfigurationFeatures) {
}
}
-TEST(ExtensionAPI, FeaturesRequireContexts) {
+TEST_F(ExtensionAPITest, FeaturesRequireContexts) {
// TODO(cduvall): Make this check API featues.
scoped_ptr<base::DictionaryValue> api_features1(new base::DictionaryValue());
scoped_ptr<base::DictionaryValue> api_features2(new base::DictionaryValue());
@@ -494,7 +498,7 @@ static void GetDictionaryFromList(const base::DictionaryValue* schema,
EXPECT_TRUE(list->GetDictionary(list_index, out));
}
-TEST(ExtensionAPI, TypesHaveNamespace) {
+TEST_F(ExtensionAPITest, TypesHaveNamespace) {
base::FilePath manifest_path;
PathService::Get(chrome::DIR_TEST_DATA, &manifest_path);
manifest_path = manifest_path.AppendASCII("extensions")
diff --git a/chrome/common/extensions/extension_sync_type_unittest.cc b/chrome/common/extensions/extension_sync_type_unittest.cc
new file mode 100644
index 0000000..3256c8d
--- /dev/null
+++ b/chrome/common/extensions/extension_sync_type_unittest.cc
@@ -0,0 +1,249 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/files/file_path.h"
+#include "chrome/common/extensions/api/plugins/plugins_handler.h"
+#include "chrome/common/extensions/extension_manifest_constants.h"
+#include "chrome/common/extensions/extension_unittest.h"
+#include "chrome/common/extensions/manifest.h"
+#include "chrome/common/extensions/manifest_url_handler.h"
+#include "googleurl/src/gurl.h"
+
+namespace keys = extension_manifest_keys;
+namespace errors = extension_manifest_errors;
+
+namespace extensions {
+
+class ExtensionSyncTypeTest : public ExtensionTest {
+ protected:
+ virtual void SetUp() OVERRIDE {
+ ExtensionTest::SetUp();
+ (new UpdateURLHandler)->Register();
+ (new PluginsHandler)->Register();
+ }
+
+ enum SyncTestExtensionType {
+ EXTENSION,
+ APP,
+ USER_SCRIPT,
+ THEME
+ };
+
+ static scoped_refptr<Extension> MakeSyncTestExtension(
+ SyncTestExtensionType type,
+ const GURL& update_url,
+ const GURL& launch_url,
+ Manifest::Location location,
+ int num_plugins,
+ const base::FilePath& extension_path,
+ int creation_flags) {
+ DictionaryValue source;
+ source.SetString(keys::kName, "PossiblySyncableExtension");
+ source.SetString(keys::kVersion, "0.0.0.0");
+ if (type == APP)
+ source.SetString(keys::kApp, "true");
+ if (type == THEME)
+ source.Set(keys::kTheme, new DictionaryValue());
+ if (!update_url.is_empty()) {
+ source.SetString(keys::kUpdateURL, update_url.spec());
+ }
+ if (!launch_url.is_empty()) {
+ source.SetString(keys::kLaunchWebURL, launch_url.spec());
+ }
+ if (type != THEME) {
+ source.SetBoolean(keys::kConvertedFromUserScript, type == USER_SCRIPT);
+ ListValue* plugins = new ListValue();
+ for (int i = 0; i < num_plugins; ++i) {
+ DictionaryValue* plugin = new DictionaryValue();
+ plugin->SetString(keys::kPluginsPath, "");
+ plugins->Set(i, plugin);
+ }
+ source.Set(keys::kPlugins, plugins);
+ }
+
+ std::string error;
+ scoped_refptr<Extension> extension = Extension::Create(
+ extension_path, location, source, creation_flags, &error);
+ EXPECT_TRUE(extension);
+ EXPECT_EQ("", error);
+ return extension;
+ }
+
+ static const char kValidUpdateUrl1[];
+ static const char kValidUpdateUrl2[];
+};
+
+const char ExtensionSyncTypeTest::kValidUpdateUrl1[] =
+ "http://clients2.google.com/service/update2/crx";
+const char ExtensionSyncTypeTest::kValidUpdateUrl2[] =
+ "https://clients2.google.com/service/update2/crx";
+
+TEST_F(ExtensionSyncTypeTest, NormalExtensionNoUpdateUrl) {
+ scoped_refptr<Extension> extension(
+ MakeSyncTestExtension(EXTENSION, GURL(), GURL(),
+ Manifest::INTERNAL, 0, base::FilePath(),
+ Extension::NO_FLAGS));
+ EXPECT_NE(extension->GetSyncType(), Extension::SYNC_TYPE_NONE);
+}
+
+TEST_F(ExtensionSyncTypeTest, GetSyncTypeUserScriptValidUpdateUrl) {
+ scoped_refptr<Extension> extension(
+ MakeSyncTestExtension(USER_SCRIPT, GURL(kValidUpdateUrl1), GURL(),
+ Manifest::INTERNAL, 0, base::FilePath(),
+ Extension::NO_FLAGS));
+ EXPECT_NE(extension->GetSyncType(), Extension::SYNC_TYPE_NONE);
+}
+
+TEST_F(ExtensionSyncTypeTest, UserScriptNoUpdateUrl) {
+ scoped_refptr<Extension> extension(
+ MakeSyncTestExtension(USER_SCRIPT, GURL(), GURL(),
+ Manifest::INTERNAL, 0, base::FilePath(),
+ Extension::NO_FLAGS));
+ EXPECT_EQ(extension->GetSyncType(), Extension::SYNC_TYPE_NONE);
+}
+
+TEST_F(ExtensionSyncTypeTest, ThemeNoUpdateUrl) {
+ scoped_refptr<Extension> extension(
+ MakeSyncTestExtension(THEME, GURL(), GURL(),
+ Manifest::INTERNAL, 0, base::FilePath(),
+ Extension::NO_FLAGS));
+ EXPECT_EQ(extension->GetSyncType(), Extension::SYNC_TYPE_NONE);
+}
+
+TEST_F(ExtensionSyncTypeTest, ExtensionWithLaunchUrl) {
+ scoped_refptr<Extension> extension(
+ MakeSyncTestExtension(EXTENSION, GURL(), GURL("http://www.google.com"),
+ Manifest::INTERNAL, 0, base::FilePath(),
+ Extension::NO_FLAGS));
+ EXPECT_NE(extension->GetSyncType(), Extension::SYNC_TYPE_NONE);
+}
+
+TEST_F(ExtensionSyncTypeTest, ExtensionExternal) {
+ scoped_refptr<Extension> extension(
+ MakeSyncTestExtension(EXTENSION, GURL(), GURL(),
+ Manifest::EXTERNAL_PREF, 0, base::FilePath(),
+ Extension::NO_FLAGS));
+
+ EXPECT_EQ(extension->GetSyncType(), Extension::SYNC_TYPE_NONE);
+}
+
+TEST_F(ExtensionSyncTypeTest, UserScriptThirdPartyUpdateUrl) {
+ scoped_refptr<Extension> extension(
+ MakeSyncTestExtension(
+ USER_SCRIPT, GURL("http://third-party.update_url.com"), GURL(),
+ Manifest::INTERNAL, 0, base::FilePath(), Extension::NO_FLAGS));
+ EXPECT_EQ(extension->GetSyncType(), Extension::SYNC_TYPE_NONE);
+}
+
+TEST_F(ExtensionSyncTypeTest, OnlyDisplayAppsInLauncher) {
+ scoped_refptr<Extension> extension(
+ MakeSyncTestExtension(EXTENSION, GURL(), GURL(),
+ Manifest::INTERNAL, 0, base::FilePath(),
+ Extension::NO_FLAGS));
+
+ EXPECT_FALSE(extension->ShouldDisplayInAppLauncher());
+ EXPECT_FALSE(extension->ShouldDisplayInNewTabPage());
+
+ scoped_refptr<Extension> app(
+ MakeSyncTestExtension(APP, GURL(), GURL("http://www.google.com"),
+ Manifest::INTERNAL, 0, base::FilePath(),
+ Extension::NO_FLAGS));
+ EXPECT_TRUE(app->ShouldDisplayInAppLauncher());
+ EXPECT_TRUE(app->ShouldDisplayInNewTabPage());
+}
+
+TEST_F(ExtensionSyncTypeTest, DisplayInXManifestProperties) {
+ DictionaryValue manifest;
+ manifest.SetString(keys::kName, "TestComponentApp");
+ manifest.SetString(keys::kVersion, "0.0.0.0");
+ manifest.SetString(keys::kApp, "true");
+ manifest.SetString(keys::kPlatformAppBackgroundPage, "");
+
+ std::string error;
+ scoped_refptr<Extension> app;
+
+ // Default to true.
+ app = Extension::Create(
+ base::FilePath(), Manifest::COMPONENT, manifest, 0, &error);
+ EXPECT_EQ(error, std::string());
+ EXPECT_TRUE(app->ShouldDisplayInAppLauncher());
+ EXPECT_TRUE(app->ShouldDisplayInNewTabPage());
+
+ // Value display_in_NTP defaults to display_in_launcher.
+ manifest.SetBoolean(keys::kDisplayInLauncher, false);
+ app = Extension::Create(
+ base::FilePath(), Manifest::COMPONENT, manifest, 0, &error);
+ EXPECT_EQ(error, std::string());
+ EXPECT_FALSE(app->ShouldDisplayInAppLauncher());
+ EXPECT_FALSE(app->ShouldDisplayInNewTabPage());
+
+ // Value display_in_NTP = true overriding display_in_launcher = false.
+ manifest.SetBoolean(keys::kDisplayInNewTabPage, true);
+ app = Extension::Create(
+ base::FilePath(), Manifest::COMPONENT, manifest, 0, &error);
+ EXPECT_EQ(error, std::string());
+ EXPECT_FALSE(app->ShouldDisplayInAppLauncher());
+ EXPECT_TRUE(app->ShouldDisplayInNewTabPage());
+
+ // Value display_in_NTP = false only, overrides default = true.
+ manifest.Remove(keys::kDisplayInLauncher, NULL);
+ manifest.SetBoolean(keys::kDisplayInNewTabPage, false);
+ app = Extension::Create(
+ base::FilePath(), Manifest::COMPONENT, manifest, 0, &error);
+ EXPECT_EQ(error, std::string());
+ EXPECT_TRUE(app->ShouldDisplayInAppLauncher());
+ EXPECT_FALSE(app->ShouldDisplayInNewTabPage());
+
+ // Error checking.
+ manifest.SetString(keys::kDisplayInNewTabPage, "invalid");
+ app = Extension::Create(
+ base::FilePath(), Manifest::COMPONENT, manifest, 0, &error);
+ EXPECT_EQ(error, std::string(errors::kInvalidDisplayInNewTabPage));
+}
+
+TEST_F(ExtensionSyncTypeTest, OnlySyncInternal) {
+ scoped_refptr<Extension> extension_internal(
+ MakeSyncTestExtension(EXTENSION, GURL(), GURL(),
+ Manifest::INTERNAL, 0, base::FilePath(),
+ Extension::NO_FLAGS));
+ EXPECT_TRUE(extension_internal->IsSyncable());
+
+ scoped_refptr<Extension> extension_noninternal(
+ MakeSyncTestExtension(EXTENSION, GURL(), GURL(),
+ Manifest::COMPONENT, 0, base::FilePath(),
+ Extension::NO_FLAGS));
+ EXPECT_FALSE(extension_noninternal->IsSyncable());
+}
+
+TEST_F(ExtensionSyncTypeTest, DontSyncDefault) {
+ scoped_refptr<Extension> extension_default(
+ MakeSyncTestExtension(EXTENSION, GURL(), GURL(),
+ Manifest::INTERNAL, 0, base::FilePath(),
+ Extension::WAS_INSTALLED_BY_DEFAULT));
+ EXPECT_FALSE(extension_default->IsSyncable());
+}
+
+// These last 2 tests don't make sense on Chrome OS, where extension plugins
+// are not allowed.
+#if !defined(OS_CHROMEOS)
+TEST_F(ExtensionSyncTypeTest, ExtensionWithPlugin) {
+ scoped_refptr<Extension> extension(
+ MakeSyncTestExtension(EXTENSION, GURL(), GURL(),
+ Manifest::INTERNAL, 1, base::FilePath(),
+ Extension::NO_FLAGS));
+ if (extension)
+ EXPECT_EQ(extension->GetSyncType(), Extension::SYNC_TYPE_NONE);
+}
+
+TEST_F(ExtensionSyncTypeTest, ExtensionWithTwoPlugins) {
+ scoped_refptr<Extension> extension(
+ MakeSyncTestExtension(EXTENSION, GURL(), GURL(),
+ Manifest::INTERNAL, 2, base::FilePath(),
+ Extension::NO_FLAGS));
+ if (extension)
+ EXPECT_EQ(extension->GetSyncType(), Extension::SYNC_TYPE_NONE);
+}
+#endif // !defined(OS_CHROMEOS)
+
+} // namespace extensions
diff --git a/chrome/common/extensions/extension_unittest.cc b/chrome/common/extensions/extension_unittest.cc
index b1cda14..6a3c80d 100644
--- a/chrome/common/extensions/extension_unittest.cc
+++ b/chrome/common/extensions/extension_unittest.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "chrome/common/extensions/extension.h"
+#include "chrome/common/extensions/extension_unittest.h"
#include "base/command_line.h"
#include "base/file_util.h"
@@ -15,10 +15,10 @@
#include "base/utf_string_conversions.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/chrome_switches.h"
-#include "chrome/common/extensions/api/commands/commands_handler.h"
#include "chrome/common/extensions/api/plugins/plugins_handler.h"
#include "chrome/common/extensions/background_info.h"
#include "chrome/common/extensions/command.h"
+#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_file_util.h"
#include "chrome/common/extensions/extension_manifest_constants.h"
#include "chrome/common/extensions/features/feature.h"
@@ -27,7 +27,9 @@
#include "chrome/common/extensions/manifest_handler.h"
#include "chrome/common/extensions/manifest_handlers/content_scripts_handler.h"
#include "chrome/common/extensions/permissions/api_permission.h"
+#include "chrome/common/extensions/permissions/chrome_api_permissions.h"
#include "chrome/common/extensions/permissions/permission_set.h"
+#include "chrome/common/extensions/permissions/scoped_testing_permissions_info.h"
#include "chrome/common/extensions/permissions/socket_permission.h"
#include "chrome/common/extensions/permissions/usb_device_permission.h"
#include "chrome/common/url_constants.h"
@@ -105,21 +107,21 @@ static scoped_refptr<Extension> LoadManifestStrict(
} // namespace
-class ExtensionTest : public testing::Test {
- protected:
- virtual void SetUp() OVERRIDE {
- testing::Test::SetUp();
- (new BackgroundManifestHandler)->Register();
- (new CommandsHandler)->Register();
- (new ContentScriptsHandler)->Register();
- (new PluginsHandler)->Register();
- (new IncognitoHandler)->Register();
- }
+ExtensionTest::ExtensionTest() : permissions_info_(ChromeAPIPermissions()) {}
- virtual void TearDown() OVERRIDE {
- ManifestHandler::ClearRegistryForTesting();
- }
-};
+void ExtensionTest::SetUp() {
+ testing::Test::SetUp();
+ (new BackgroundManifestHandler)->Register();
+ // We need the IncognitoHandler registered for all tests, since
+ // Extension uses it in Extension::CheckPlatformAppFeatures() as part of the
+ // creation process.
+ (new IncognitoHandler)->Register();
+}
+
+void ExtensionTest::TearDown() {
+ ManifestHandler::ClearRegistryForTesting();
+ testing::Test::TearDown();
+}
// We persist location values in the preferences, so this is a sanity test that
// someone doesn't accidentally change them.
@@ -245,6 +247,7 @@ TEST_F(ExtensionTest, MimeTypeSniffing) {
}
TEST_F(ExtensionTest, EffectiveHostPermissions) {
+ (new ContentScriptsHandler)->Register();
scoped_refptr<Extension> extension;
URLPatternSet hosts;
@@ -419,6 +422,7 @@ TEST_F(ExtensionTest, GetPermissionMessages_ManyApiPermissions) {
}
TEST_F(ExtensionTest, GetPermissionMessages_ManyHosts) {
+ (new ContentScriptsHandler)->Register();
scoped_refptr<Extension> extension;
extension = LoadManifest("permissions", "many-hosts.json");
std::vector<string16> warnings = extension->GetPermissionMessageStrings();
@@ -428,6 +432,7 @@ TEST_F(ExtensionTest, GetPermissionMessages_ManyHosts) {
}
TEST_F(ExtensionTest, GetPermissionMessages_Plugins) {
+ (new PluginsHandler)->Register();
scoped_refptr<Extension> extension;
extension = LoadManifest("permissions", "plugins.json");
std::vector<string16> warnings = extension->GetPermissionMessageStrings();
@@ -443,6 +448,7 @@ TEST_F(ExtensionTest, GetPermissionMessages_Plugins) {
}
TEST_F(ExtensionTest, WantsFileAccess) {
+ (new ContentScriptsHandler)->Register();
scoped_refptr<Extension> extension;
GURL file_url("file:///etc/passwd");
@@ -550,19 +556,6 @@ TEST_F(ExtensionTest, ExtraFlags) {
EXPECT_FALSE(extension->from_webstore());
}
-TEST_F(ExtensionTest, BrowserActionSynthesizesCommand) {
- scoped_refptr<Extension> extension;
-
- extension = LoadManifest("api_test/browser_action/synthesized",
- "manifest.json");
- // An extension with a browser action but no extension command specified
- // should get a command assigned to it.
- const extensions::Command* command =
- CommandsInfo::GetBrowserActionCommand(extension);
- ASSERT_TRUE(command != NULL);
- ASSERT_EQ(ui::VKEY_UNKNOWN, command->accelerator().key_code());
-}
-
// Base class for testing the CanExecuteScriptOnPage and CanCaptureVisiblePage
// methods of Extension for extensions with various permissions.
class ExtensionScriptAndCaptureVisibleTest : public testing::Test {
@@ -929,210 +922,6 @@ TEST_F(ExtensionScriptAndCaptureVisibleTest, TabSpecific) {
EXPECT_TRUE(AllowedExclusivelyOnTab(extension, no_urls, 2));
}
-namespace {
-enum SyncTestExtensionType {
- EXTENSION,
- APP,
- USER_SCRIPT,
- THEME
-};
-
-static scoped_refptr<Extension> MakeSyncTestExtension(
- SyncTestExtensionType type,
- const GURL& update_url,
- const GURL& launch_url,
- Manifest::Location location,
- int num_plugins,
- const base::FilePath& extension_path,
- int creation_flags) {
- DictionaryValue source;
- source.SetString(extension_manifest_keys::kName,
- "PossiblySyncableExtension");
- source.SetString(extension_manifest_keys::kVersion, "0.0.0.0");
- if (type == APP)
- source.SetString(extension_manifest_keys::kApp, "true");
- if (type == THEME)
- source.Set(extension_manifest_keys::kTheme, new DictionaryValue());
- if (!update_url.is_empty()) {
- source.SetString(extension_manifest_keys::kUpdateURL,
- update_url.spec());
- }
- if (!launch_url.is_empty()) {
- source.SetString(extension_manifest_keys::kLaunchWebURL,
- launch_url.spec());
- }
- if (type != THEME) {
- source.SetBoolean(extension_manifest_keys::kConvertedFromUserScript,
- type == USER_SCRIPT);
- ListValue* plugins = new ListValue();
- for (int i = 0; i < num_plugins; ++i) {
- DictionaryValue* plugin = new DictionaryValue();
- plugin->SetString(extension_manifest_keys::kPluginsPath, "");
- plugins->Set(i, plugin);
- }
- source.Set(extension_manifest_keys::kPlugins, plugins);
- }
-
- std::string error;
- scoped_refptr<Extension> extension = Extension::Create(
- extension_path, location, source, creation_flags, &error);
- EXPECT_TRUE(extension);
- EXPECT_EQ("", error);
- return extension;
-}
-
-static const char kValidUpdateUrl1[] =
- "http://clients2.google.com/service/update2/crx";
-static const char kValidUpdateUrl2[] =
- "https://clients2.google.com/service/update2/crx";
-}
-
-TEST_F(ExtensionTest, GetSyncTypeNormalExtensionNoUpdateUrl) {
- scoped_refptr<Extension> extension(
- MakeSyncTestExtension(EXTENSION, GURL(), GURL(),
- Manifest::INTERNAL, 0, base::FilePath(),
- Extension::NO_FLAGS));
- EXPECT_NE(extension->GetSyncType(), Extension::SYNC_TYPE_NONE);
-}
-
-// http://crbug.com/172712
-TEST_F(ExtensionTest, DISABLED_GetSyncTypeUserScriptValidUpdateUrl) {
- scoped_refptr<Extension> extension(
- MakeSyncTestExtension(USER_SCRIPT, GURL(kValidUpdateUrl1), GURL(),
- Manifest::INTERNAL, 0, base::FilePath(),
- Extension::NO_FLAGS));
- EXPECT_NE(extension->GetSyncType(), Extension::SYNC_TYPE_NONE);
-}
-
-TEST_F(ExtensionTest, GetSyncTypeUserScriptNoUpdateUrl) {
- scoped_refptr<Extension> extension(
- MakeSyncTestExtension(USER_SCRIPT, GURL(), GURL(),
- Manifest::INTERNAL, 0, base::FilePath(),
- Extension::NO_FLAGS));
- EXPECT_EQ(extension->GetSyncType(), Extension::SYNC_TYPE_NONE);
-}
-
-TEST_F(ExtensionTest, GetSyncTypeThemeNoUpdateUrl) {
- scoped_refptr<Extension> extension(
- MakeSyncTestExtension(THEME, GURL(), GURL(),
- Manifest::INTERNAL, 0, base::FilePath(),
- Extension::NO_FLAGS));
- EXPECT_EQ(extension->GetSyncType(), Extension::SYNC_TYPE_NONE);
-}
-
-TEST_F(ExtensionTest, GetSyncTypeExtensionWithLaunchUrl) {
- scoped_refptr<Extension> extension(
- MakeSyncTestExtension(EXTENSION, GURL(), GURL("http://www.google.com"),
- Manifest::INTERNAL, 0, base::FilePath(),
- Extension::NO_FLAGS));
- EXPECT_NE(extension->GetSyncType(), Extension::SYNC_TYPE_NONE);
-}
-
-TEST_F(ExtensionTest, GetSyncTypeExtensionExternal) {
- scoped_refptr<Extension> extension(
- MakeSyncTestExtension(EXTENSION, GURL(), GURL(),
- Manifest::EXTERNAL_PREF, 0, base::FilePath(),
- Extension::NO_FLAGS));
-
- EXPECT_EQ(extension->GetSyncType(), Extension::SYNC_TYPE_NONE);
-}
-
-TEST_F(ExtensionTest, GetSyncTypeUserScriptThirdPartyUpdateUrl) {
- scoped_refptr<Extension> extension(
- MakeSyncTestExtension(
- USER_SCRIPT, GURL("http://third-party.update_url.com"), GURL(),
- Manifest::INTERNAL, 0, base::FilePath(), Extension::NO_FLAGS));
- EXPECT_EQ(extension->GetSyncType(), Extension::SYNC_TYPE_NONE);
-}
-
-TEST_F(ExtensionTest, OnlyDisplayAppsInLauncher) {
- scoped_refptr<Extension> extension(
- MakeSyncTestExtension(EXTENSION, GURL(), GURL(),
- Manifest::INTERNAL, 0, base::FilePath(),
- Extension::NO_FLAGS));
-
- EXPECT_FALSE(extension->ShouldDisplayInAppLauncher());
- EXPECT_FALSE(extension->ShouldDisplayInNewTabPage());
-
- scoped_refptr<Extension> app(
- MakeSyncTestExtension(APP, GURL(), GURL("http://www.google.com"),
- Manifest::INTERNAL, 0, base::FilePath(),
- Extension::NO_FLAGS));
- EXPECT_TRUE(app->ShouldDisplayInAppLauncher());
- EXPECT_TRUE(app->ShouldDisplayInNewTabPage());
-}
-
-TEST_F(ExtensionTest, DisplayInXManifestProperties) {
- DictionaryValue manifest;
- manifest.SetString(keys::kName, "TestComponentApp");
- manifest.SetString(keys::kVersion, "0.0.0.0");
- manifest.SetString(keys::kApp, "true");
- manifest.SetString(keys::kPlatformAppBackgroundPage, "");
-
- std::string error;
- scoped_refptr<Extension> app;
-
- // Default to true.
- app = Extension::Create(
- base::FilePath(), Manifest::COMPONENT, manifest, 0, &error);
- EXPECT_EQ(error, std::string());
- EXPECT_TRUE(app->ShouldDisplayInAppLauncher());
- EXPECT_TRUE(app->ShouldDisplayInNewTabPage());
-
- // Value display_in_NTP defaults to display_in_launcher.
- manifest.SetBoolean(keys::kDisplayInLauncher, false);
- app = Extension::Create(
- base::FilePath(), Manifest::COMPONENT, manifest, 0, &error);
- EXPECT_EQ(error, std::string());
- EXPECT_FALSE(app->ShouldDisplayInAppLauncher());
- EXPECT_FALSE(app->ShouldDisplayInNewTabPage());
-
- // Value display_in_NTP = true overriding display_in_launcher = false.
- manifest.SetBoolean(keys::kDisplayInNewTabPage, true);
- app = Extension::Create(
- base::FilePath(), Manifest::COMPONENT, manifest, 0, &error);
- EXPECT_EQ(error, std::string());
- EXPECT_FALSE(app->ShouldDisplayInAppLauncher());
- EXPECT_TRUE(app->ShouldDisplayInNewTabPage());
-
- // Value display_in_NTP = false only, overrides default = true.
- manifest.Remove(keys::kDisplayInLauncher, NULL);
- manifest.SetBoolean(keys::kDisplayInNewTabPage, false);
- app = Extension::Create(
- base::FilePath(), Manifest::COMPONENT, manifest, 0, &error);
- EXPECT_EQ(error, std::string());
- EXPECT_TRUE(app->ShouldDisplayInAppLauncher());
- EXPECT_FALSE(app->ShouldDisplayInNewTabPage());
-
- // Error checking.
- manifest.SetString(keys::kDisplayInNewTabPage, "invalid");
- app = Extension::Create(
- base::FilePath(), Manifest::COMPONENT, manifest, 0, &error);
- EXPECT_EQ(error, std::string(errors::kInvalidDisplayInNewTabPage));
-}
-
-TEST_F(ExtensionTest, OnlySyncInternal) {
- scoped_refptr<Extension> extension_internal(
- MakeSyncTestExtension(EXTENSION, GURL(), GURL(),
- Manifest::INTERNAL, 0, base::FilePath(),
- Extension::NO_FLAGS));
- EXPECT_TRUE(extension_internal->IsSyncable());
-
- scoped_refptr<Extension> extension_noninternal(
- MakeSyncTestExtension(EXTENSION, GURL(), GURL(),
- Manifest::COMPONENT, 0, base::FilePath(),
- Extension::NO_FLAGS));
- EXPECT_FALSE(extension_noninternal->IsSyncable());
-}
-
-TEST_F(ExtensionTest, DontSyncDefault) {
- scoped_refptr<Extension> extension_default(
- MakeSyncTestExtension(EXTENSION, GURL(), GURL(),
- Manifest::INTERNAL, 0, base::FilePath(),
- Extension::WAS_INSTALLED_BY_DEFAULT));
- EXPECT_FALSE(extension_default->IsSyncable());
-}
-
TEST_F(ExtensionTest, OptionalOnlyPermission) {
// Set feature current channel to dev because the only permission that must
// be optional (usbDevices) is only available on dev channel.
@@ -1158,26 +947,4 @@ TEST_F(ExtensionTest, OptionalOnlyPermission) {
EXPECT_TRUE(error.empty());
}
-// These last 2 tests don't make sense on Chrome OS, where extension plugins
-// are not allowed.
-#if !defined(OS_CHROMEOS)
-TEST_F(ExtensionTest, GetSyncTypeExtensionWithPlugin) {
- scoped_refptr<Extension> extension(
- MakeSyncTestExtension(EXTENSION, GURL(), GURL(),
- Manifest::INTERNAL, 1, base::FilePath(),
- Extension::NO_FLAGS));
- if (extension)
- EXPECT_EQ(extension->GetSyncType(), Extension::SYNC_TYPE_NONE);
-}
-
-TEST_F(ExtensionTest, GetSyncTypeExtensionWithTwoPlugins) {
- scoped_refptr<Extension> extension(
- MakeSyncTestExtension(EXTENSION, GURL(), GURL(),
- Manifest::INTERNAL, 2, base::FilePath(),
- Extension::NO_FLAGS));
- if (extension)
- EXPECT_EQ(extension->GetSyncType(), Extension::SYNC_TYPE_NONE);
-}
-#endif // !defined(OS_CHROMEOS)
-
} // namespace extensions
diff --git a/chrome/common/extensions/extension_unittest.h b/chrome/common/extensions/extension_unittest.h
new file mode 100644
index 0000000..99a7509
--- /dev/null
+++ b/chrome/common/extensions/extension_unittest.h
@@ -0,0 +1,30 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_COMMON_EXTENSIONS_EXTENSION_UNITTEST_H_
+#define CHROME_COMMON_EXTENSIONS_EXTENSION_UNITTEST_H_
+
+#include "base/compiler_specific.h"
+#include "chrome/common/extensions/permissions/scoped_testing_permissions_info.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace extensions {
+
+// A base class for extension unit tests that sets up permissions and
+// universally useful manifest handlers.
+class ExtensionTest : public testing::Test {
+ public:
+ ExtensionTest();
+
+ protected:
+ virtual void SetUp() OVERRIDE;
+
+ virtual void TearDown() OVERRIDE;
+
+ ScopedTestingPermissionsInfo permissions_info_;
+};
+
+} // namespace extensions
+
+#endif // CHROME_COMMON_EXTENSIONS_EXTENSION_UNITTEST_H_
diff --git a/chrome/common/extensions/features/base_feature_provider_unittest.cc b/chrome/common/extensions/features/base_feature_provider_unittest.cc
index df876dc..ec6f208 100644
--- a/chrome/common/extensions/features/base_feature_provider_unittest.cc
+++ b/chrome/common/extensions/features/base_feature_provider_unittest.cc
@@ -4,21 +4,19 @@
#include "chrome/common/extensions/features/base_feature_provider.h"
+#include "chrome/common/extensions/extension_unittest.h"
#include "chrome/common/extensions/features/permission_feature.h"
#include "chrome/common/extensions/value_builder.h"
#include "testing/gtest/include/gtest/gtest.h"
using chrome::VersionInfo;
-using extensions::BaseFeatureProvider;
-using extensions::DictionaryBuilder;
-using extensions::Extension;
-using extensions::Feature;
-using extensions::ListBuilder;
-using extensions::Manifest;
-using extensions::PermissionFeature;
-using extensions::SimpleFeature;
-
-TEST(BaseFeatureProvider, ManifestFeatures) {
+
+namespace extensions {
+
+class BaseFeatureProviderTest : public ExtensionTest {
+};
+
+TEST_F(BaseFeatureProviderTest, ManifestFeatures) {
BaseFeatureProvider* provider =
BaseFeatureProvider::GetManifestFeatures();
SimpleFeature* feature =
@@ -60,7 +58,7 @@ TEST(BaseFeatureProvider, ManifestFeatures) {
extension.get(), Feature::UNSPECIFIED_CONTEXT).result());
}
-TEST(BaseFeatureProvider, PermissionFeatures) {
+TEST_F(BaseFeatureProviderTest, PermissionFeatures) {
BaseFeatureProvider* provider =
BaseFeatureProvider::GetPermissionFeatures();
SimpleFeature* feature =
@@ -106,7 +104,7 @@ SimpleFeature* CreatePermissionFeature() {
return new PermissionFeature();
}
-TEST(BaseFeatureProvider, Validation) {
+TEST_F(BaseFeatureProviderTest, Validation) {
scoped_ptr<base::DictionaryValue> value(new base::DictionaryValue());
base::DictionaryValue* feature1 = new base::DictionaryValue();
@@ -141,7 +139,7 @@ TEST(BaseFeatureProvider, Validation) {
EXPECT_TRUE(provider->GetFeature("feature2"));
}
-TEST(BaseFeatureProvider, ComplexFeatures) {
+TEST_F(BaseFeatureProviderTest, ComplexFeatures) {
scoped_ptr<base::DictionaryValue> rule(
DictionaryBuilder()
.Set("feature1",
@@ -189,3 +187,5 @@ TEST(BaseFeatureProvider, ComplexFeatures) {
Feature::UNSPECIFIED_PLATFORM).result());
}
}
+
+} // namespace extensions
diff --git a/chrome/common/extensions/manifest_tests/extension_manifest_test.cc b/chrome/common/extensions/manifest_tests/extension_manifest_test.cc
index feb8c0b..b61d5f7 100644
--- a/chrome/common/extensions/manifest_tests/extension_manifest_test.cc
+++ b/chrome/common/extensions/manifest_tests/extension_manifest_test.cc
@@ -11,9 +11,6 @@
#include "base/values.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/extensions/extension_l10n_util.h"
-#include "chrome/common/extensions/extension_manifest_constants.h"
-#include "chrome/common/extensions/incognito_handler.h"
-#include "chrome/common/extensions/manifest_handler.h"
#include "ui/base/l10n/l10n_util.h"
using extensions::Extension;
@@ -58,18 +55,6 @@ ExtensionManifestTest::ExtensionManifestTest()
// UNKNOWN == trunk.
current_channel_(chrome::VersionInfo::CHANNEL_UNKNOWN) {}
-void ExtensionManifestTest::SetUp() {
- testing::Test::SetUp();
- // We need the IncognitoHandler registered for all tests, since
- // Extension uses it in Extension::CheckPlatformAppFeatures() as part of the
- // creation process.
- (new extensions::IncognitoHandler)->Register();
-}
-
-void ExtensionManifestTest::TearDown() {
- extensions::ManifestHandler::ClearRegistryForTesting();
-}
-
// Helper class that simplifies creating methods that take either a filename
// to a manifest or the manifest itself.
ExtensionManifestTest::Manifest::Manifest(const char* name)
diff --git a/chrome/common/extensions/manifest_tests/extension_manifest_test.h b/chrome/common/extensions/manifest_tests/extension_manifest_test.h
index dbebb7b..2a063e4 100644
--- a/chrome/common/extensions/manifest_tests/extension_manifest_test.h
+++ b/chrome/common/extensions/manifest_tests/extension_manifest_test.h
@@ -10,18 +10,16 @@
#include "base/values.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_manifest_constants.h"
+#include "chrome/common/extensions/extension_unittest.h"
#include "chrome/common/extensions/features/feature.h"
#include "chrome/common/extensions/manifest.h"
#include "testing/gtest/include/gtest/gtest.h"
-class ExtensionManifestTest : public testing::Test {
+class ExtensionManifestTest : public extensions::ExtensionTest {
public:
ExtensionManifestTest();
protected:
- virtual void SetUp() OVERRIDE;
- virtual void TearDown() OVERRIDE;
-
// Helper class that simplifies creating methods that take either a filename
// to a manifest or the manifest itself.
class Manifest {
diff --git a/chrome/common/extensions/permissions/api_permission.cc b/chrome/common/extensions/permissions/api_permission.cc
index 9e8ac08..2943649 100644
--- a/chrome/common/extensions/permissions/api_permission.cc
+++ b/chrome/common/extensions/permissions/api_permission.cc
@@ -4,12 +4,6 @@
#include "chrome/common/extensions/permissions/api_permission.h"
-#include "chrome/common/extensions/permissions/bluetooth_device_permission.h"
-#include "chrome/common/extensions/permissions/media_galleries_permission.h"
-#include "chrome/common/extensions/permissions/permissions_info.h"
-#include "chrome/common/extensions/permissions/socket_permission.h"
-#include "chrome/common/extensions/permissions/usb_device_permission.h"
-#include "grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"
namespace {
@@ -19,9 +13,6 @@ using extensions::APIPermissionInfo;
using extensions::PermissionMessage;
using extensions::PermissionMessages;
-const char kOldUnlimitedStoragePermission[] = "unlimited_storage";
-const char kWindowsPermission[] = "windows";
-
class SimpleAPIPermission : public APIPermission {
public:
explicit SimpleAPIPermission(const APIPermissionInfo* permission)
@@ -95,11 +86,6 @@ class SimpleAPIPermission : public APIPermission {
virtual void Log(std::string* log) const OVERRIDE { }
};
-template<typename T>
-APIPermission* CreateAPIPermission(const APIPermissionInfo* permission) {
- return new T(permission);
-}
-
} // namespace
namespace extensions {
@@ -158,221 +144,4 @@ PermissionMessage APIPermissionInfo::GetMessage_() const {
message_id_, l10n_util::GetStringUTF16(l10n_message_id_));
}
-// static
-void APIPermissionInfo::RegisterAllPermissions(
- PermissionsInfo* info) {
-
- struct PermissionRegistration {
- APIPermission::ID id;
- const char* name;
- int flags;
- int l10n_message_id;
- PermissionMessage::ID message_id;
- APIPermissionConstructor constructor;
- } PermissionsToRegister[] = {
- // Register permissions for all extension types.
- { APIPermission::kBackground, "background" },
- { APIPermission::kClipboardRead, "clipboardRead", kFlagNone,
- IDS_EXTENSION_PROMPT_WARNING_CLIPBOARD,
- PermissionMessage::kClipboard },
- { APIPermission::kClipboardWrite, "clipboardWrite" },
- { APIPermission::kDeclarativeContent, "declarativeContent" },
- { APIPermission::kDeclarativeWebRequest, "declarativeWebRequest" },
- { APIPermission::kDownloads, "downloads", kFlagNone,
- IDS_EXTENSION_PROMPT_WARNING_DOWNLOADS,
- PermissionMessage::kDownloads },
- { APIPermission::kExperimental, "experimental", kFlagCannotBeOptional },
- { APIPermission::kGeolocation, "geolocation", kFlagCannotBeOptional,
- IDS_EXTENSION_PROMPT_WARNING_GEOLOCATION,
- PermissionMessage::kGeolocation },
- { APIPermission::kNotification, "notifications" },
- { APIPermission::kScreensaver, "screensaver" },
- { APIPermission::kUnlimitedStorage, "unlimitedStorage",
- kFlagCannotBeOptional },
-
- // Register extension permissions.
- { APIPermission::kActiveTab, "activeTab" },
- { APIPermission::kAdView, "adview" },
- { APIPermission::kAlarms, "alarms" },
- { APIPermission::kBookmark, "bookmarks", kFlagNone,
- IDS_EXTENSION_PROMPT_WARNING_BOOKMARKS,
- PermissionMessage::kBookmarks },
- { APIPermission::kBrowsingData, "browsingData" },
- { APIPermission::kContentSettings, "contentSettings", kFlagNone,
- IDS_EXTENSION_PROMPT_WARNING_CONTENT_SETTINGS,
- PermissionMessage::kContentSettings },
- { APIPermission::kContextMenus, "contextMenus" },
- { APIPermission::kCookie, "cookies" },
- { APIPermission::kFileBrowserHandler, "fileBrowserHandler",
- kFlagCannotBeOptional },
- { APIPermission::kFontSettings, "fontSettings", kFlagCannotBeOptional },
- { APIPermission::kHistory, "history", kFlagNone,
- IDS_EXTENSION_PROMPT_WARNING_BROWSING_HISTORY,
- PermissionMessage::kBrowsingHistory },
- { APIPermission::kIdle, "idle" },
- { APIPermission::kInput, "input", kFlagNone,
- IDS_EXTENSION_PROMPT_WARNING_INPUT,
- PermissionMessage::kInput },
- { APIPermission::kManagement, "management", kFlagNone,
- IDS_EXTENSION_PROMPT_WARNING_MANAGEMENT,
- PermissionMessage::kManagement },
- { APIPermission::kNativeMessaging, "nativeMessaging" },
- { APIPermission::kPower, "power", },
- { APIPermission::kPrivacy, "privacy", kFlagNone,
- IDS_EXTENSION_PROMPT_WARNING_PRIVACY,
- PermissionMessage::kPrivacy },
- { APIPermission::kSessionRestore, "sessionRestore" },
- { APIPermission::kStorage, "storage" },
- { APIPermission::kSyncFileSystem, "syncFileSystem", kFlagNone,
- IDS_EXTENSION_PROMPT_WARNING_SYNCFILESYSTEM,
- PermissionMessage::kSyncFileSystem },
- { APIPermission::kTab, "tabs", kFlagNone,
- IDS_EXTENSION_PROMPT_WARNING_TABS,
- PermissionMessage::kTabs },
- { APIPermission::kTopSites, "topSites", kFlagNone,
- IDS_EXTENSION_PROMPT_WARNING_BROWSING_HISTORY,
- PermissionMessage::kBrowsingHistory },
- { APIPermission::kTts, "tts", 0, kFlagCannotBeOptional },
- { APIPermission::kTtsEngine, "ttsEngine", kFlagCannotBeOptional,
- IDS_EXTENSION_PROMPT_WARNING_TTS_ENGINE,
- PermissionMessage::kTtsEngine },
- { APIPermission::kWebNavigation, "webNavigation", kFlagNone,
- IDS_EXTENSION_PROMPT_WARNING_TABS, PermissionMessage::kTabs },
- { APIPermission::kWebRequest, "webRequest" },
- { APIPermission::kWebRequestBlocking, "webRequestBlocking" },
- { APIPermission::kWebView, "webview", kFlagCannotBeOptional },
-
- // Register private permissions.
- { APIPermission::kAutoTestPrivate, "autotestPrivate",
- kFlagCannotBeOptional },
- { APIPermission::kBookmarkManagerPrivate, "bookmarkManagerPrivate",
- kFlagCannotBeOptional },
- { APIPermission::kChromeosInfoPrivate, "chromeosInfoPrivate",
- kFlagCannotBeOptional },
- { APIPermission::kDeveloperPrivate, "developerPrivate",
- kFlagCannotBeOptional },
- { APIPermission::kDial, "dial", kFlagCannotBeOptional },
- { APIPermission::kDownloadsInternal, "downloadsInternal" },
- { APIPermission::kFileBrowserHandlerInternal, "fileBrowserHandlerInternal",
- kFlagCannotBeOptional },
- { APIPermission::kFileBrowserPrivate, "fileBrowserPrivate",
- kFlagCannotBeOptional },
- { APIPermission::kNetworkingPrivate, "networkingPrivate",
- kFlagCannotBeOptional },
- { APIPermission::kManagedModePrivate, "managedModePrivate",
- kFlagCannotBeOptional },
- { APIPermission::kMediaPlayerPrivate, "mediaPlayerPrivate",
- kFlagCannotBeOptional },
- { APIPermission::kMetricsPrivate, "metricsPrivate",
- kFlagCannotBeOptional },
- { APIPermission::kSystemPrivate, "systemPrivate",
- kFlagCannotBeOptional },
- { APIPermission::kCloudPrintPrivate, "cloudPrintPrivate",
- kFlagCannotBeOptional },
- { APIPermission::kInputMethodPrivate, "inputMethodPrivate",
- kFlagCannotBeOptional },
- { APIPermission::kEchoPrivate, "echoPrivate", kFlagCannotBeOptional },
- { APIPermission::kRtcPrivate, "rtcPrivate", kFlagCannotBeOptional },
- { APIPermission::kTerminalPrivate, "terminalPrivate",
- kFlagCannotBeOptional },
- { APIPermission::kWallpaperPrivate, "wallpaperPrivate",
- kFlagCannotBeOptional },
- { APIPermission::kWebRequestInternal, "webRequestInternal" },
- { APIPermission::kWebSocketProxyPrivate, "webSocketProxyPrivate",
- kFlagCannotBeOptional },
- { APIPermission::kWebstorePrivate, "webstorePrivate",
- kFlagCannotBeOptional },
- { APIPermission::kMediaGalleriesPrivate, "mediaGalleriesPrivate",
- kFlagCannotBeOptional },
- { APIPermission::kStreamsPrivate, "streamsPrivate", kFlagCannotBeOptional },
-
- // Full url access permissions.
- { APIPermission::kDebugger, "debugger",
- kFlagImpliesFullURLAccess | kFlagCannotBeOptional,
- IDS_EXTENSION_PROMPT_WARNING_DEBUGGER,
- PermissionMessage::kDebugger },
- { APIPermission::kDevtools, "devtools",
- kFlagImpliesFullURLAccess | kFlagCannotBeOptional },
- { APIPermission::kPageCapture, "pageCapture",
- kFlagImpliesFullURLAccess },
- { APIPermission::kTabCapture, "tabCapture",
- kFlagImpliesFullURLAccess },
- { APIPermission::kPlugin, "plugin",
- kFlagImpliesFullURLAccess | kFlagImpliesFullAccess |
- kFlagCannotBeOptional,
- IDS_EXTENSION_PROMPT_WARNING_FULL_ACCESS,
- PermissionMessage::kFullAccess },
- { APIPermission::kProxy, "proxy",
- kFlagImpliesFullURLAccess | kFlagCannotBeOptional },
-
- // Platform-app permissions.
- { APIPermission::kSerial, "serial", kFlagNone,
- IDS_EXTENSION_PROMPT_WARNING_SERIAL,
- PermissionMessage::kSerial },
- // Because warning messages for the "socket" permission vary based on the
- // permissions parameters, no message ID or message text is specified here.
- // The message ID and text used will be determined at run-time in the
- // |SocketPermission| class.
- { APIPermission::kSocket, "socket", kFlagCannotBeOptional, 0,
- PermissionMessage::kNone, &::CreateAPIPermission<SocketPermission> },
- { APIPermission::kAppCurrentWindowInternal, "app.currentWindowInternal" },
- { APIPermission::kAppRuntime, "app.runtime" },
- { APIPermission::kAppWindow, "app.window" },
- { APIPermission::kAudioCapture, "audioCapture", kFlagNone,
- IDS_EXTENSION_PROMPT_WARNING_AUDIO_CAPTURE,
- PermissionMessage::kAudioCapture },
- { APIPermission::kVideoCapture, "videoCapture", kFlagNone,
- IDS_EXTENSION_PROMPT_WARNING_VIDEO_CAPTURE,
- PermissionMessage::kVideoCapture },
- // The permission string for "fileSystem" is only shown when "write" is
- // present. Read-only access is only granted after the user has been shown
- // a file chooser dialog and selected a file. Selecting the file is
- // considered consent to read it.
- { APIPermission::kFileSystem, "fileSystem" },
- { APIPermission::kFileSystemWrite, "fileSystem.write", kFlagNone,
- IDS_EXTENSION_PROMPT_WARNING_FILE_SYSTEM_WRITE,
- PermissionMessage::kFileSystemWrite },
- // Because warning messages for the "mediaGalleries" permission vary based
- // on the permissions parameters, no message ID or message text is
- // specified here.
- // The message ID and text used will be determined at run-time in the
- // |MediaGalleriesPermission| class.
- { APIPermission::kMediaGalleries, "mediaGalleries", kFlagNone, 0,
- PermissionMessage::kNone,
- &::CreateAPIPermission<MediaGalleriesPermission> },
- { APIPermission::kPushMessaging, "pushMessaging", kFlagCannotBeOptional },
- { APIPermission::kBluetooth, "bluetooth", kFlagNone,
- IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH,
- PermissionMessage::kBluetooth },
- { APIPermission::kBluetoothDevice, "bluetoothDevices",
- kFlagNone, 0, PermissionMessage::kNone,
- &::CreateAPIPermission<BluetoothDevicePermission> },
- { APIPermission::kUsb, "usb", kFlagNone,
- IDS_EXTENSION_PROMPT_WARNING_USB,
- PermissionMessage::kUsb },
- { APIPermission::kUsbDevice, "usbDevices",
- kFlagMustBeOptional, 0, PermissionMessage::kNone,
- &::CreateAPIPermission<UsbDevicePermission> },
- { APIPermission::kSystemIndicator, "systemIndicator", kFlagNone,
- IDS_EXTENSION_PROMPT_WARNING_SYSTEM_INDICATOR,
- PermissionMessage::kSystemIndicator },
- { APIPermission::kSystemInfoDisplay, "systemInfo.display" },
- { APIPermission::kPointerLock, "pointerLock" },
- { APIPermission::kFullscreen, "fullscreen" },
- };
-
- for (size_t i = 0; i < ARRAYSIZE_UNSAFE(PermissionsToRegister); ++i) {
- const PermissionRegistration& pr = PermissionsToRegister[i];
- info->RegisterPermission(
- pr.id, pr.name, pr.l10n_message_id,
- pr.message_id ? pr.message_id : PermissionMessage::kNone,
- pr.flags,
- pr.constructor);
- }
-
- // Register aliases.
- info->RegisterAlias("unlimitedStorage", kOldUnlimitedStoragePermission);
- info->RegisterAlias("tabs", kWindowsPermission);
-}
-
} // namespace extensions
diff --git a/chrome/common/extensions/permissions/api_permission.h b/chrome/common/extensions/permissions/api_permission.h
index a1e8582..f9719f3 100644
--- a/chrome/common/extensions/permissions/api_permission.h
+++ b/chrome/common/extensions/permissions/api_permission.h
@@ -12,12 +12,9 @@
#include "base/callback.h"
#include "base/memory/scoped_ptr.h"
#include "base/pickle.h"
+#include "base/values.h"
#include "chrome/common/extensions/permissions/permission_message.h"
-namespace base {
-class Value;
-}
-
namespace IPC {
class Message;
}
@@ -25,7 +22,7 @@ class Message;
namespace extensions {
class APIPermissionInfo;
-class PermissionsInfo;
+class ChromeAPIPermissions;
// APIPermission is for handling some complex permissions. Please refer to
// extensions::SocketPermission as an example.
@@ -269,8 +266,9 @@ class APIPermissionInfo {
}
private:
- // Instances should only be constructed from within PermissionsInfo.
- friend class PermissionsInfo;
+ // Instances should only be constructed from within a
+ // PermissionsInfo::Delegate.
+ friend class ChromeAPIPermissions;
// Implementations of APIPermission will want to get the permission message,
// but this class's implementation should be hidden from everyone else.
friend class APIPermission;
@@ -283,9 +281,6 @@ class APIPermissionInfo {
int flags,
APIPermissionConstructor api_permission_constructor);
- // Register ALL the permissions!
- static void RegisterAllPermissions(PermissionsInfo* info);
-
// Returns the localized permission message associated with this api.
// Use GetMessage_ to avoid name conflict with macro GetMessage on Windows.
PermissionMessage GetMessage_() const;
diff --git a/chrome/common/extensions/permissions/api_permission_set.cc b/chrome/common/extensions/permissions/api_permission_set.cc
index 62d76ae..3934b90 100644
--- a/chrome/common/extensions/permissions/api_permission_set.cc
+++ b/chrome/common/extensions/permissions/api_permission_set.cc
@@ -15,11 +15,11 @@ namespace errors = extension_manifest_errors;
namespace {
-using extensions::PermissionsInfo;
using extensions::APIPermission;
using extensions::APIPermissionInfo;
using extensions::APIPermissionSet;
using extensions::ErrorUtils;
+using extensions::PermissionsInfo;
bool CreateAPIPermission(
const std::string& permission_str,
@@ -27,9 +27,9 @@ bool CreateAPIPermission(
APIPermissionSet* api_permissions,
string16* error,
std::vector<std::string>* unhandled_permissions) {
- PermissionsInfo* info = PermissionsInfo::GetInstance();
- const APIPermissionInfo* permission_info = info->GetByName(permission_str);
+ const APIPermissionInfo* permission_info =
+ PermissionsInfo::GetInstance()->GetByName(permission_str);
if (permission_info) {
scoped_ptr<APIPermission> permission(
permission_info->CreateAPIPermission());
@@ -55,10 +55,10 @@ bool CreateAPIPermission(
}
bool ParseChildPermissions(const std::string& base_name,
- const Value* permission_value,
- APIPermissionSet* api_permissions,
- string16* error,
- std::vector<std::string>* unhandled_permissions) {
+ const Value* permission_value,
+ APIPermissionSet* api_permissions,
+ string16* error,
+ std::vector<std::string>* unhandled_permissions) {
if (permission_value) {
const ListValue* permissions;
if (!permission_value->GetAsList(&permissions)) {
@@ -88,7 +88,7 @@ bool ParseChildPermissions(const std::string& base_name,
}
if (!CreateAPIPermission(base_name + '.' + permission_str, NULL,
- api_permissions, error, unhandled_permissions))
+ api_permissions, error, unhandled_permissions))
return false;
}
}
@@ -147,12 +147,11 @@ bool APIPermissionSet::operator==(const APIPermissionSet& rhs) const {
void APIPermissionSet::insert(APIPermission::ID id) {
const APIPermissionInfo* permission_info =
- PermissionsInfo::GetInstance()->GetByID(id);
+ PermissionsInfo::GetInstance()->GetByID(id);
insert(permission_info->CreateAPIPermission());
}
-void APIPermissionSet::insert(
- APIPermission* permission) {
+void APIPermissionSet::insert(APIPermission* permission) {
map_[permission->id()].reset(permission);
}
@@ -285,7 +284,6 @@ bool APIPermissionSet::ParseFromJSON(
APIPermissionSet* api_permissions,
string16* error,
std::vector<std::string>* unhandled_permissions) {
- PermissionsInfo* info = PermissionsInfo::GetInstance();
for (size_t i = 0; i < permissions->GetSize(); ++i) {
std::string permission_str;
const base::Value* permission_value = NULL;
@@ -308,7 +306,7 @@ bool APIPermissionSet::ParseFromJSON(
// Check if this permission is a special case where its value should
// be treated as a list of child permissions.
- if (info->HasChildPermissions(permission_str)) {
+ if (PermissionsInfo::GetInstance()->HasChildPermissions(permission_str)) {
if (!ParseChildPermissions(permission_str, permission_value,
api_permissions, error, unhandled_permissions))
return false;
@@ -316,7 +314,7 @@ bool APIPermissionSet::ParseFromJSON(
}
if (!CreateAPIPermission(permission_str, permission_value,
- api_permissions, error, unhandled_permissions))
+ api_permissions, error, unhandled_permissions))
return false;
}
return true;
diff --git a/chrome/common/extensions/permissions/api_permission_set_unittest.cc b/chrome/common/extensions/permissions/api_permission_set_unittest.cc
index 182e5f8..1b8f6c7 100644
--- a/chrome/common/extensions/permissions/api_permission_set_unittest.cc
+++ b/chrome/common/extensions/permissions/api_permission_set_unittest.cc
@@ -5,17 +5,17 @@
#include "base/pickle.h"
#include "base/values.h"
#include "chrome/common/extensions/extension_messages.h"
+#include "chrome/common/extensions/extension_unittest.h"
#include "chrome/common/extensions/permissions/api_permission_set.h"
-#include "chrome/common/extensions/permissions/permissions_info.h"
#include "ipc/ipc_message.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace extensions {
-class APIPermissionSetTest : public testing::Test {
+class APIPermissionSetTest : public ExtensionTest {
};
-TEST(APIPermissionSetTest, General) {
+TEST_F(APIPermissionSetTest, General) {
APIPermissionSet apis;
apis.insert(APIPermission::kTab);
apis.insert(APIPermission::kBackground);
@@ -35,7 +35,7 @@ TEST(APIPermissionSetTest, General) {
EXPECT_EQ(apis.size(), 4u);
}
-TEST(APIPermissionSetTest, CreateUnion) {
+TEST_F(APIPermissionSetTest, CreateUnion) {
APIPermission* permission = NULL;
APIPermissionSet apis1;
@@ -123,7 +123,7 @@ TEST(APIPermissionSetTest, CreateUnion) {
EXPECT_EQ(expected_apis, result);
}
-TEST(APIPermissionSetTest, CreateIntersection) {
+TEST_F(APIPermissionSetTest, CreateIntersection) {
APIPermission* permission = NULL;
APIPermissionSet apis1;
@@ -201,7 +201,7 @@ TEST(APIPermissionSetTest, CreateIntersection) {
EXPECT_EQ(expected_apis, result);
}
-TEST(APIPermissionSetTest, CreateDifference) {
+TEST_F(APIPermissionSetTest, CreateDifference) {
APIPermission* permission = NULL;
APIPermissionSet apis1;
@@ -272,7 +272,7 @@ TEST(APIPermissionSetTest, CreateDifference) {
EXPECT_TRUE(result2.empty());
}
-TEST(APIPermissionSetTest, IPC) {
+TEST_F(APIPermissionSetTest, IPC) {
APIPermission* permission = NULL;
APIPermissionSet apis;
diff --git a/chrome/common/extensions/permissions/chrome_api_permissions.cc b/chrome/common/extensions/permissions/chrome_api_permissions.cc
new file mode 100644
index 0000000..531fc79
--- /dev/null
+++ b/chrome/common/extensions/permissions/chrome_api_permissions.cc
@@ -0,0 +1,279 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/common/extensions/permissions/chrome_api_permissions.h"
+
+#include "chrome/common/extensions/permissions/api_permission.h"
+#include "chrome/common/extensions/permissions/api_permission_set.h"
+#include "chrome/common/extensions/permissions/bluetooth_device_permission.h"
+#include "chrome/common/extensions/permissions/media_galleries_permission.h"
+#include "chrome/common/extensions/permissions/permission_message.h"
+#include "chrome/common/extensions/permissions/permissions_info.h"
+#include "chrome/common/extensions/permissions/socket_permission.h"
+#include "chrome/common/extensions/permissions/usb_device_permission.h"
+#include "grit/generated_resources.h"
+
+namespace extensions {
+
+namespace {
+
+const char kOldUnlimitedStoragePermission[] = "unlimited_storage";
+const char kWindowsPermission[] = "windows";
+
+template<typename T> APIPermission* CreateAPIPermission(
+ const APIPermissionInfo* permission) {
+ return new T(permission);
+}
+
+} // namespace
+
+std::vector<APIPermissionInfo*> ChromeAPIPermissions::GetAllPermissions()
+ const {
+ struct PermissionRegistration {
+ APIPermission::ID id;
+ const char* name;
+ int flags;
+ int l10n_message_id;
+ PermissionMessage::ID message_id;
+ APIPermissionInfo::APIPermissionConstructor constructor;
+ } PermissionsToRegister[] = {
+ // Register permissions for all extension types.
+ { APIPermission::kBackground, "background" },
+ { APIPermission::kClipboardRead, "clipboardRead",
+ APIPermissionInfo::kFlagNone,
+ IDS_EXTENSION_PROMPT_WARNING_CLIPBOARD,
+ PermissionMessage::kClipboard },
+ { APIPermission::kClipboardWrite, "clipboardWrite" },
+ { APIPermission::kDeclarativeContent, "declarativeContent" },
+ { APIPermission::kDeclarativeWebRequest, "declarativeWebRequest" },
+ { APIPermission::kDownloads, "downloads", APIPermissionInfo::kFlagNone,
+ IDS_EXTENSION_PROMPT_WARNING_DOWNLOADS,
+ PermissionMessage::kDownloads },
+ { APIPermission::kExperimental, "experimental",
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kGeolocation, "geolocation",
+ APIPermissionInfo::kFlagCannotBeOptional,
+ IDS_EXTENSION_PROMPT_WARNING_GEOLOCATION,
+ PermissionMessage::kGeolocation },
+ { APIPermission::kNotification, "notifications" },
+ { APIPermission::kScreensaver, "screensaver" },
+ { APIPermission::kUnlimitedStorage, "unlimitedStorage",
+ APIPermissionInfo::kFlagCannotBeOptional },
+
+ // Register extension permissions.
+ { APIPermission::kActiveTab, "activeTab" },
+ { APIPermission::kAdView, "adview" },
+ { APIPermission::kAlarms, "alarms" },
+ { APIPermission::kBookmark, "bookmarks", APIPermissionInfo::kFlagNone,
+ IDS_EXTENSION_PROMPT_WARNING_BOOKMARKS,
+ PermissionMessage::kBookmarks },
+ { APIPermission::kBrowsingData, "browsingData" },
+ { APIPermission::kContentSettings, "contentSettings",
+ APIPermissionInfo::kFlagNone,
+ IDS_EXTENSION_PROMPT_WARNING_CONTENT_SETTINGS,
+ PermissionMessage::kContentSettings },
+ { APIPermission::kContextMenus, "contextMenus" },
+ { APIPermission::kCookie, "cookies" },
+ { APIPermission::kFileBrowserHandler, "fileBrowserHandler",
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kFontSettings, "fontSettings",
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kHistory, "history", APIPermissionInfo::kFlagNone,
+ IDS_EXTENSION_PROMPT_WARNING_BROWSING_HISTORY,
+ PermissionMessage::kBrowsingHistory },
+ { APIPermission::kIdle, "idle" },
+ { APIPermission::kInput, "input", APIPermissionInfo::kFlagNone,
+ IDS_EXTENSION_PROMPT_WARNING_INPUT,
+ PermissionMessage::kInput },
+ { APIPermission::kManagement, "management", APIPermissionInfo::kFlagNone,
+ IDS_EXTENSION_PROMPT_WARNING_MANAGEMENT,
+ PermissionMessage::kManagement },
+ { APIPermission::kNativeMessaging, "nativeMessaging" },
+ { APIPermission::kPower, "power", },
+ { APIPermission::kPrivacy, "privacy", APIPermissionInfo::kFlagNone,
+ IDS_EXTENSION_PROMPT_WARNING_PRIVACY,
+ PermissionMessage::kPrivacy },
+ { APIPermission::kSessionRestore, "sessionRestore" },
+ { APIPermission::kStorage, "storage" },
+ { APIPermission::kSyncFileSystem, "syncFileSystem",
+ APIPermissionInfo::kFlagNone,
+ IDS_EXTENSION_PROMPT_WARNING_SYNCFILESYSTEM,
+ PermissionMessage::kSyncFileSystem },
+ { APIPermission::kTab, "tabs", APIPermissionInfo::kFlagNone,
+ IDS_EXTENSION_PROMPT_WARNING_TABS,
+ PermissionMessage::kTabs },
+ { APIPermission::kTopSites, "topSites", APIPermissionInfo::kFlagNone,
+ IDS_EXTENSION_PROMPT_WARNING_BROWSING_HISTORY,
+ PermissionMessage::kBrowsingHistory },
+ { APIPermission::kTts, "tts", 0, APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kTtsEngine, "ttsEngine",
+ APIPermissionInfo::kFlagCannotBeOptional,
+ IDS_EXTENSION_PROMPT_WARNING_TTS_ENGINE,
+ PermissionMessage::kTtsEngine },
+ { APIPermission::kWebNavigation, "webNavigation",
+ APIPermissionInfo::kFlagNone,
+ IDS_EXTENSION_PROMPT_WARNING_TABS, PermissionMessage::kTabs },
+ { APIPermission::kWebRequest, "webRequest" },
+ { APIPermission::kWebRequestBlocking, "webRequestBlocking" },
+ { APIPermission::kWebView, "webview",
+ APIPermissionInfo::kFlagCannotBeOptional },
+
+ // Register private permissions.
+ { APIPermission::kAutoTestPrivate, "autotestPrivate",
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kBookmarkManagerPrivate, "bookmarkManagerPrivate",
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kChromeosInfoPrivate, "chromeosInfoPrivate",
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kDeveloperPrivate, "developerPrivate",
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kDial, "dial", APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kDownloadsInternal, "downloadsInternal" },
+ { APIPermission::kFileBrowserHandlerInternal, "fileBrowserHandlerInternal",
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kFileBrowserPrivate, "fileBrowserPrivate",
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kNetworkingPrivate, "networkingPrivate",
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kManagedModePrivate, "managedModePrivate",
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kMediaPlayerPrivate, "mediaPlayerPrivate",
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kMetricsPrivate, "metricsPrivate",
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kSystemPrivate, "systemPrivate",
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kCloudPrintPrivate, "cloudPrintPrivate",
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kInputMethodPrivate, "inputMethodPrivate",
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kEchoPrivate, "echoPrivate",
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kRtcPrivate, "rtcPrivate",
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kTerminalPrivate, "terminalPrivate",
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kWallpaperPrivate, "wallpaperPrivate",
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kWebRequestInternal, "webRequestInternal" },
+ { APIPermission::kWebSocketProxyPrivate, "webSocketProxyPrivate",
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kWebstorePrivate, "webstorePrivate",
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kMediaGalleriesPrivate, "mediaGalleriesPrivate",
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kStreamsPrivate, "streamsPrivate",
+ APIPermissionInfo::kFlagCannotBeOptional },
+
+ // Full url access permissions.
+ { APIPermission::kDebugger, "debugger",
+ APIPermissionInfo::kFlagImpliesFullURLAccess |
+ APIPermissionInfo::kFlagCannotBeOptional,
+ IDS_EXTENSION_PROMPT_WARNING_DEBUGGER,
+ PermissionMessage::kDebugger },
+ { APIPermission::kDevtools, "devtools",
+ APIPermissionInfo::kFlagImpliesFullURLAccess |
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kPageCapture, "pageCapture",
+ APIPermissionInfo::kFlagImpliesFullURLAccess },
+ { APIPermission::kTabCapture, "tabCapture",
+ APIPermissionInfo::kFlagImpliesFullURLAccess },
+ { APIPermission::kPlugin, "plugin",
+ APIPermissionInfo::kFlagImpliesFullURLAccess |
+ APIPermissionInfo::kFlagImpliesFullAccess |
+ APIPermissionInfo::kFlagCannotBeOptional,
+ IDS_EXTENSION_PROMPT_WARNING_FULL_ACCESS,
+ PermissionMessage::kFullAccess },
+ { APIPermission::kProxy, "proxy",
+ APIPermissionInfo::kFlagImpliesFullURLAccess |
+ APIPermissionInfo::kFlagCannotBeOptional },
+
+ // Platform-app permissions.
+ { APIPermission::kSerial, "serial", APIPermissionInfo::kFlagNone,
+ IDS_EXTENSION_PROMPT_WARNING_SERIAL,
+ PermissionMessage::kSerial },
+ // Because warning messages for the "socket" permission vary based on the
+ // permissions parameters, no message ID or message text is specified here.
+ // The message ID and text used will be determined at run-time in the
+ // |SocketPermission| class.
+ { APIPermission::kSocket, "socket",
+ APIPermissionInfo::kFlagCannotBeOptional, 0,
+ PermissionMessage::kNone, &CreateAPIPermission<SocketPermission> },
+ { APIPermission::kAppCurrentWindowInternal, "app.currentWindowInternal" },
+ { APIPermission::kAppRuntime, "app.runtime" },
+ { APIPermission::kAppWindow, "app.window" },
+ { APIPermission::kAudioCapture, "audioCapture",
+ APIPermissionInfo::kFlagNone,
+ IDS_EXTENSION_PROMPT_WARNING_AUDIO_CAPTURE,
+ PermissionMessage::kAudioCapture },
+ { APIPermission::kVideoCapture, "videoCapture",
+ APIPermissionInfo::kFlagNone,
+ IDS_EXTENSION_PROMPT_WARNING_VIDEO_CAPTURE,
+ PermissionMessage::kVideoCapture },
+ // The permission string for "fileSystem" is only shown when "write" is
+ // present. Read-only access is only granted after the user has been shown
+ // a file chooser dialog and selected a file. Selecting the file is
+ // considered consent to read it.
+ { APIPermission::kFileSystem, "fileSystem" },
+ { APIPermission::kFileSystemWrite, "fileSystem.write",
+ APIPermissionInfo::kFlagNone,
+ IDS_EXTENSION_PROMPT_WARNING_FILE_SYSTEM_WRITE,
+ PermissionMessage::kFileSystemWrite },
+ // Because warning messages for the "mediaGalleries" permission vary based
+ // on the permissions parameters, no message ID or message text is
+ // specified here.
+ // The message ID and text used will be determined at run-time in the
+ // |MediaGalleriesPermission| class.
+ { APIPermission::kMediaGalleries, "mediaGalleries",
+ APIPermissionInfo::kFlagNone, 0,
+ PermissionMessage::kNone,
+ &CreateAPIPermission<MediaGalleriesPermission> },
+ { APIPermission::kPushMessaging, "pushMessaging",
+ APIPermissionInfo::kFlagCannotBeOptional },
+ { APIPermission::kBluetooth, "bluetooth", APIPermissionInfo::kFlagNone,
+ IDS_EXTENSION_PROMPT_WARNING_BLUETOOTH,
+ PermissionMessage::kBluetooth },
+ { APIPermission::kBluetoothDevice, "bluetoothDevices",
+ APIPermissionInfo::kFlagNone, 0, PermissionMessage::kNone,
+ &CreateAPIPermission<BluetoothDevicePermission> },
+ { APIPermission::kUsb, "usb", APIPermissionInfo::kFlagNone,
+ IDS_EXTENSION_PROMPT_WARNING_USB,
+ PermissionMessage::kUsb },
+ { APIPermission::kUsbDevice, "usbDevices",
+ APIPermissionInfo::kFlagMustBeOptional, 0, PermissionMessage::kNone,
+ &CreateAPIPermission<UsbDevicePermission> },
+ { APIPermission::kSystemIndicator, "systemIndicator",
+ APIPermissionInfo::kFlagNone,
+ IDS_EXTENSION_PROMPT_WARNING_SYSTEM_INDICATOR,
+ PermissionMessage::kSystemIndicator },
+ { APIPermission::kSystemInfoDisplay, "systemInfo.display" },
+ { APIPermission::kPointerLock, "pointerLock" },
+ { APIPermission::kFullscreen, "fullscreen" },
+ };
+
+ std::vector<APIPermissionInfo*> permissions;
+
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(PermissionsToRegister); ++i) {
+ const PermissionRegistration& pr = PermissionsToRegister[i];
+ permissions.push_back(new APIPermissionInfo(
+ pr.id, pr.name, pr.l10n_message_id,
+ pr.message_id ? pr.message_id : PermissionMessage::kNone,
+ pr.flags,
+ pr.constructor));
+ }
+ return permissions;
+}
+
+std::vector<PermissionsInfo::AliasInfo> ChromeAPIPermissions::GetAllAliases()
+ const {
+ // Register aliases.
+ std::vector<PermissionsInfo::AliasInfo> aliases;
+ aliases.push_back(PermissionsInfo::AliasInfo(
+ "unlimitedStorage", kOldUnlimitedStoragePermission));
+ aliases.push_back(PermissionsInfo::AliasInfo(
+ "tabs", kWindowsPermission));
+ return aliases;
+}
+
+} // namespace extensions
diff --git a/chrome/common/extensions/permissions/chrome_api_permissions.h b/chrome/common/extensions/permissions/chrome_api_permissions.h
new file mode 100644
index 0000000..ec5283c
--- /dev/null
+++ b/chrome/common/extensions/permissions/chrome_api_permissions.h
@@ -0,0 +1,24 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_COMMON_EXTENSIONS_PERMISSIONS_CHROME_API_PERMISSIONS_H_
+#define CHROME_COMMON_EXTENSIONS_PERMISSIONS_CHROME_API_PERMISSIONS_H_
+
+#include <vector>
+
+#include "chrome/common/extensions/permissions/permissions_info.h"
+
+namespace extensions {
+
+// Registers the permissions used in Chrome with the PermissionsInfo global.
+class ChromeAPIPermissions : public PermissionsInfo::Delegate {
+ public:
+ virtual std::vector<APIPermissionInfo*> GetAllPermissions() const OVERRIDE;
+ virtual std::vector<PermissionsInfo::AliasInfo> GetAllAliases() const
+ OVERRIDE;
+};
+
+} // namespace extensions
+
+#endif // CHROME_COMMON_EXTENSIONS_PERMISSIONS_CHROME_API_PERMISSIONS_H_
diff --git a/chrome/common/extensions/permissions/media_galleries_permission_unittest.cc b/chrome/common/extensions/permissions/media_galleries_permission_unittest.cc
index 365c042..27ba20c 100644
--- a/chrome/common/extensions/permissions/media_galleries_permission_unittest.cc
+++ b/chrome/common/extensions/permissions/media_galleries_permission_unittest.cc
@@ -5,9 +5,9 @@
// These tests make sure MediaGalleriesPermission values are parsed correctly.
#include "base/values.h"
+#include "chrome/common/extensions/extension_unittest.h"
#include "chrome/common/extensions/permissions/media_galleries_permission.h"
#include "chrome/common/extensions/permissions/media_galleries_permission_data.h"
-#include "chrome/common/extensions/permissions/permissions_info.h"
#include "testing/gtest/include/gtest/gtest.h"
using content::SocketPermissionRequest;
@@ -17,10 +17,10 @@ namespace extensions {
namespace {
-class MediaGalleriesPermissionTest : public testing::Test {
+class MediaGalleriesPermissionTest : public ExtensionTest {
};
-TEST(MediaGalleriesPermissionTest, GoodValues) {
+TEST_F(MediaGalleriesPermissionTest, GoodValues) {
const APIPermissionInfo* permission_info =
PermissionsInfo::GetInstance()->GetByID(APIPermission::kMediaGalleries);
@@ -50,7 +50,7 @@ TEST(MediaGalleriesPermissionTest, GoodValues) {
EXPECT_TRUE(permission->FromValue(value.get()));
}
-TEST(MediaGalleriesPermissionTest, BadValues) {
+TEST_F(MediaGalleriesPermissionTest, BadValues) {
const APIPermissionInfo* permission_info =
PermissionsInfo::GetInstance()->GetByID(APIPermission::kMediaGalleries);
@@ -62,7 +62,7 @@ TEST(MediaGalleriesPermissionTest, BadValues) {
EXPECT_FALSE(permission->FromValue(value.get()));
}
-TEST(MediaGalleriesPermissionTest, Equal) {
+TEST_F(MediaGalleriesPermissionTest, Equal) {
const APIPermissionInfo* permission_info =
PermissionsInfo::GetInstance()->GetByID(APIPermission::kMediaGalleries);
@@ -90,7 +90,7 @@ TEST(MediaGalleriesPermissionTest, Equal) {
EXPECT_TRUE(permission1->Equal(permission2.get()));
}
-TEST(MediaGalleriesPermissionTest, ToFromValue) {
+TEST_F(MediaGalleriesPermissionTest, ToFromValue) {
const APIPermissionInfo* permission_info =
PermissionsInfo::GetInstance()->GetByID(APIPermission::kMediaGalleries);
diff --git a/chrome/common/extensions/permissions/permission_set_unittest.cc b/chrome/common/extensions/permissions/permission_set_unittest.cc
index 896f342..4b23daf 100644
--- a/chrome/common/extensions/permissions/permission_set_unittest.cc
+++ b/chrome/common/extensions/permissions/permission_set_unittest.cc
@@ -10,11 +10,9 @@
#include "chrome/common/chrome_paths.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/extensions/api/plugins/plugins_handler.h"
-#include "chrome/common/extensions/background_info.h"
#include "chrome/common/extensions/extension.h"
+#include "chrome/common/extensions/extension_unittest.h"
#include "chrome/common/extensions/features/feature.h"
-#include "chrome/common/extensions/incognito_handler.h"
-#include "chrome/common/extensions/manifest_handler.h"
#include "chrome/common/extensions/manifest_handlers/content_scripts_handler.h"
#include "chrome/common/extensions/permissions/permission_set.h"
#include "chrome/common/extensions/permissions/permissions_info.h"
@@ -77,19 +75,16 @@ bool Contains(const std::vector<string16>& warnings,
} // namespace
-class PermissionsTest : public testing::Test {
+class PermissionsTest : public ExtensionTest {
protected:
virtual void SetUp() OVERRIDE {
- testing::Test::SetUp();
- (new BackgroundManifestHandler)->Register();
+ ExtensionTest::SetUp();
(new ContentScriptsHandler)->Register();
(new PluginsHandler)->Register();
- (new IncognitoHandler)->Register();
}
virtual void TearDown() OVERRIDE {
- ManifestHandler::ClearRegistryForTesting();
- testing::Test::TearDown();
+ ExtensionTest::TearDown();
}
};
diff --git a/chrome/common/extensions/permissions/permissions_info.cc b/chrome/common/extensions/permissions/permissions_info.cc
index a7be3e1..bea35d0 100644
--- a/chrome/common/extensions/permissions/permissions_info.cc
+++ b/chrome/common/extensions/permissions/permissions_info.cc
@@ -4,14 +4,50 @@
#include "chrome/common/extensions/permissions/permissions_info.h"
+#include "base/lazy_instance.h"
#include "base/logging.h"
+#include "base/stl_util.h"
#include "base/string_util.h"
+#include "chrome/common/extensions/permissions/chrome_api_permissions.h"
namespace extensions {
+static base::LazyInstance<PermissionsInfo> g_permissions_info =
+ LAZY_INSTANCE_INITIALIZER;
+// ScopedTestingPermissionsInfo can override the global instance for testing.
+static PermissionsInfo* g_permissions_info_override = NULL;
+
// static
PermissionsInfo* PermissionsInfo::GetInstance() {
- return Singleton<PermissionsInfo>::get();
+ if (!g_permissions_info_override)
+ g_permissions_info_override = g_permissions_info.Pointer();
+ return g_permissions_info_override;
+}
+
+// static
+void PermissionsInfo::SetForTesting(PermissionsInfo* info) {
+ g_permissions_info_override = info;
+}
+
+PermissionsInfo::~PermissionsInfo() {
+ STLDeleteContainerPairSecondPointers(id_map_.begin(), id_map_.end());
+}
+
+void PermissionsInfo::InitializeWithDelegate(
+ const PermissionsInfo::Delegate& delegate) {
+ // TODO(yoz): Change into a DCHECK once StartupHelper browser tests
+ // are changed to unit tests.
+ if (initialized_)
+ return;
+ std::vector<APIPermissionInfo*> permissions = delegate.GetAllPermissions();
+ std::vector<AliasInfo> aliases = delegate.GetAllAliases();
+
+ for (size_t i = 0; i < permissions.size(); ++i)
+ RegisterPermission(permissions[i]);
+ for (size_t i = 0; i < aliases.size(); ++i)
+ RegisterAlias(aliases[i].name, aliases[i].alias);
+
+ initialized_ = true;
}
const APIPermissionInfo* PermissionsInfo::GetByID(
@@ -51,44 +87,28 @@ bool PermissionsInfo::HasChildPermissions(const std::string& name) const {
return StartsWithASCII(i->first, name + '.', true);
}
-PermissionsInfo::~PermissionsInfo() {
- for (IDMap::iterator i = id_map_.begin(); i != id_map_.end(); ++i)
- delete i->second;
-}
-
PermissionsInfo::PermissionsInfo()
: hosted_app_permission_count_(0),
- permission_count_(0) {
- APIPermissionInfo::RegisterAllPermissions(this);
+ permission_count_(0),
+ initialized_(false) {
}
void PermissionsInfo::RegisterAlias(
const char* name,
const char* alias) {
- DCHECK(name_map_.find(name) != name_map_.end());
- DCHECK(name_map_.find(alias) == name_map_.end());
+ DCHECK(ContainsKey(name_map_, name));
+ DCHECK(!ContainsKey(name_map_, alias));
name_map_[alias] = name_map_[name];
}
-const APIPermissionInfo* PermissionsInfo::RegisterPermission(
- APIPermission::ID id,
- const char* name,
- int l10n_message_id,
- PermissionMessage::ID message_id,
- int flags,
- const APIPermissionInfo::APIPermissionConstructor constructor) {
- DCHECK(id_map_.find(id) == id_map_.end());
- DCHECK(name_map_.find(name) == name_map_.end());
-
- APIPermissionInfo* permission = new APIPermissionInfo(
- id, name, l10n_message_id, message_id, flags, constructor);
+void PermissionsInfo::RegisterPermission(APIPermissionInfo* permission) {
+ DCHECK(!ContainsKey(id_map_, permission->id()));
+ DCHECK(!ContainsKey(name_map_, permission->name()));
- id_map_[id] = permission;
- name_map_[name] = permission;
+ id_map_[permission->id()] = permission;
+ name_map_[permission->name()] = permission;
permission_count_++;
-
- return permission;
}
} // namespace extensions
diff --git a/chrome/common/extensions/permissions/permissions_info.h b/chrome/common/extensions/permissions/permissions_info.h
index e79abb4..a014511 100644
--- a/chrome/common/extensions/permissions/permissions_info.h
+++ b/chrome/common/extensions/permissions/permissions_info.h
@@ -10,20 +10,48 @@
#include <string>
#include "base/callback.h"
-#include "base/memory/singleton.h"
+#include "base/lazy_instance.h"
#include "chrome/common/extensions/permissions/api_permission.h"
#include "chrome/common/extensions/permissions/api_permission_set.h"
#include "chrome/common/extensions/permissions/permission_message.h"
namespace extensions {
-// Singleton that holds the extension permission instances and provides static
+class ChromeAPIPermissions;
+
+// A global object that holds the extension permission instances and provides
// methods for accessing them.
class PermissionsInfo {
public:
- // Returns a pointer to the singleton instance.
+ // An alias for a given permission |name|.
+ struct AliasInfo {
+ const char* name;
+ const char* alias;
+
+ AliasInfo(const char* name, const char* alias)
+ : name(name), alias(alias) {
+ }
+ };
+
+ // The delegate creates the APIPermissions instances. It is only
+ // needed at startup time.
+ class Delegate {
+ public:
+ // Returns all the known permissions. The caller, PermissionsInfo,
+ // takes ownership of the APIPermissionInfos.
+ virtual std::vector<APIPermissionInfo*> GetAllPermissions() const = 0;
+
+ // Returns all the known permission aliases.
+ virtual std::vector<AliasInfo> GetAllAliases() const = 0;
+ };
+
static PermissionsInfo* GetInstance();
+ virtual ~PermissionsInfo();
+
+ // Initializes the permissions from the delegate.
+ void InitializeWithDelegate(const Delegate& delegate);
+
// Returns the permission with the given |id|, and NULL if it doesn't exist.
const APIPermissionInfo* GetByID(APIPermission::ID id) const;
@@ -46,22 +74,20 @@ class PermissionsInfo {
size_t get_permission_count() const { return permission_count_; }
private:
- friend class APIPermissionInfo;
+ friend class ScopedTestingPermissionsInfo;
+ friend struct base::DefaultLazyInstanceTraits<PermissionsInfo>;
- ~PermissionsInfo();
PermissionsInfo();
+ // Overrides the global PermissionsInfo for unit tests. Should only be
+ // called from ScopedTestingPermissionsInfo.
+ static void SetForTesting(PermissionsInfo* info);
+
// Registers an |alias| for a given permission |name|.
void RegisterAlias(const char* name, const char* alias);
// Registers a permission with the specified attributes and flags.
- const APIPermissionInfo* RegisterPermission(
- APIPermission::ID id,
- const char* name,
- int l10n_message_id,
- PermissionMessage::ID message_id,
- int flags,
- const APIPermissionInfo::APIPermissionConstructor constructor);
+ void RegisterPermission(APIPermissionInfo* permission);
// Maps permission ids to permissions.
typedef std::map<APIPermission::ID, APIPermissionInfo*> IDMap;
@@ -75,7 +101,9 @@ class PermissionsInfo {
size_t hosted_app_permission_count_;
size_t permission_count_;
- friend struct DefaultSingletonTraits<PermissionsInfo>;
+ // Set to true after the delegate has created the known permissions.
+ bool initialized_;
+
DISALLOW_COPY_AND_ASSIGN(PermissionsInfo);
};
diff --git a/chrome/common/extensions/permissions/scoped_testing_permissions_info.cc b/chrome/common/extensions/permissions/scoped_testing_permissions_info.cc
new file mode 100644
index 0000000..81919e0
--- /dev/null
+++ b/chrome/common/extensions/permissions/scoped_testing_permissions_info.cc
@@ -0,0 +1,27 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/common/extensions/permissions/scoped_testing_permissions_info.h"
+
+namespace extensions {
+
+ScopedTestingPermissionsInfo::ScopedTestingPermissionsInfo()
+ : info_(new PermissionsInfo),
+ old_info_(PermissionsInfo::GetInstance()) {
+ PermissionsInfo::SetForTesting(info_.get());
+}
+
+ScopedTestingPermissionsInfo::ScopedTestingPermissionsInfo(
+ const PermissionsInfo::Delegate& delegate)
+ : info_(new PermissionsInfo),
+ old_info_(PermissionsInfo::GetInstance()) {
+ PermissionsInfo::SetForTesting(info_.get());
+ PermissionsInfo::GetInstance()->InitializeWithDelegate(delegate);
+}
+
+ScopedTestingPermissionsInfo::~ScopedTestingPermissionsInfo() {
+ PermissionsInfo::SetForTesting(old_info_);
+}
+
+} // namespace extensions
diff --git a/chrome/common/extensions/permissions/scoped_testing_permissions_info.h b/chrome/common/extensions/permissions/scoped_testing_permissions_info.h
new file mode 100644
index 0000000..a1d84cd
--- /dev/null
+++ b/chrome/common/extensions/permissions/scoped_testing_permissions_info.h
@@ -0,0 +1,29 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_COMMON_EXTENSIONS_PERMISSIONS_SCOPED_TESTING_PERMISSIONS_INFO_H_
+#define CHROME_COMMON_EXTENSIONS_PERMISSIONS_SCOPED_TESTING_PERMISSIONS_INFO_H_
+
+#include "base/memory/scoped_ptr.h"
+#include "chrome/common/extensions/permissions/permissions_info.h"
+
+namespace extensions {
+
+// Overrides the global PermissionsInfo on construction and restores it
+// on destruction.
+class ScopedTestingPermissionsInfo {
+ public:
+ ScopedTestingPermissionsInfo();
+ explicit ScopedTestingPermissionsInfo(
+ const PermissionsInfo::Delegate& delegate);
+ ~ScopedTestingPermissionsInfo();
+
+ private:
+ scoped_ptr<PermissionsInfo> info_;
+ PermissionsInfo* old_info_;
+};
+
+} // namespace extensions
+
+#endif // CHROME_COMMON_EXTENSIONS_PERMISSIONS_SCOPED_TESTING_PERMISSIONS_INFO_H_
diff --git a/chrome/common/extensions/permissions/socket_permission_unittest.cc b/chrome/common/extensions/permissions/socket_permission_unittest.cc
index 5232c87..6bb07be 100644
--- a/chrome/common/extensions/permissions/socket_permission_unittest.cc
+++ b/chrome/common/extensions/permissions/socket_permission_unittest.cc
@@ -6,7 +6,7 @@
#include "base/pickle.h"
#include "base/values.h"
-#include "chrome/common/extensions/permissions/permissions_info.h"
+#include "chrome/common/extensions/extension_unittest.h"
#include "chrome/common/extensions/permissions/socket_permission.h"
#include "chrome/common/extensions/permissions/socket_permission_data.h"
#include "ipc/ipc_message.h"
@@ -26,10 +26,10 @@ void ParseTest(const std::string& permission,
EXPECT_EQ(expected_result, data.GetAsStringForTest());
}
-class SocketPermissionTest : public testing::Test {
+class SocketPermissionTest : public ExtensionTest {
};
-TEST(SocketPermissionTest, General) {
+TEST_F(SocketPermissionTest, General) {
SocketPermissionData data1, data2;
CHECK(data1.ParseForTest("tcp-connect"));
@@ -45,7 +45,7 @@ TEST(SocketPermissionTest, General) {
EXPECT_TRUE(data1 < data2);
}
-TEST(SocketPermissionTest, Parse) {
+TEST_F(SocketPermissionTest, Parse) {
SocketPermissionData data;
EXPECT_FALSE(data.ParseForTest(""));
@@ -119,7 +119,7 @@ TEST(SocketPermissionTest, Parse) {
ParseTest("tcp-connect:*.example.com:99", "tcp-connect:*.example.com:99");
}
-TEST(SocketPermissionTest, Match) {
+TEST_F(SocketPermissionTest, Match) {
SocketPermissionData data;
scoped_ptr<SocketPermission::CheckParam> param;
@@ -200,7 +200,7 @@ TEST(SocketPermissionTest, Match) {
EXPECT_FALSE(data.Check(param.get()));
}
-TEST(SocketPermissionTest, IPC) {
+TEST_F(SocketPermissionTest, IPC) {
const APIPermissionInfo* permission_info =
PermissionsInfo::GetInstance()->GetByID(APIPermission::kSocket);
@@ -242,7 +242,7 @@ TEST(SocketPermissionTest, IPC) {
}
}
-TEST(SocketPermissionTest, Value) {
+TEST_F(SocketPermissionTest, Value) {
const APIPermissionInfo* permission_info =
PermissionsInfo::GetInstance()->GetByID(APIPermission::kSocket);
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc
index 1de8a7c..0cbd5d9 100644
--- a/chrome/renderer/chrome_content_renderer_client.cc
+++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -32,6 +32,7 @@
#include "chrome/common/extensions/manifest_handlers/app_isolation_info.h"
#include "chrome/common/extensions/manifest_handlers/sandboxed_page_info.h"
#include "chrome/common/extensions/manifest_url_handler.h"
+#include "chrome/common/extensions/permissions/chrome_api_permissions.h"
#include "chrome/common/extensions/web_accessible_resources_handler.h"
#include "chrome/common/external_ipc_fuzzer.h"
#include "chrome/common/localized_error.h"
@@ -338,6 +339,9 @@ void ChromeContentRendererClient::RenderThreadStarted() {
WebSecurityPolicy::registerURLSchemeAsBypassingContentSecurityPolicy(
extension_resource_scheme);
+ extensions::ChromeAPIPermissions permissions;
+ extensions::PermissionsInfo::GetInstance()->InitializeWithDelegate(
+ permissions);
RegisterExtensionManifestHandlers();
RegisterRequestOSFileHandleAllowedHosts(
diff --git a/chrome/test/data/extensions/api_test/browser_action/synthesized/manifest.json b/chrome/test/data/extensions/manifest_tests/browser_action_synthesizes_command.json
index 9f22ee3..9f22ee3 100644
--- a/chrome/test/data/extensions/api_test/browser_action/synthesized/manifest.json
+++ b/chrome/test/data/extensions/manifest_tests/browser_action_synthesizes_command.json
diff --git a/chrome/utility/chrome_content_utility_client.cc b/chrome/utility/chrome_content_utility_client.cc
index d260631..fcbd16a 100644
--- a/chrome/utility/chrome_content_utility_client.cc
+++ b/chrome/utility/chrome_content_utility_client.cc
@@ -28,6 +28,7 @@
#include "chrome/common/extensions/extension_l10n_util.h"
#include "chrome/common/extensions/incognito_handler.h"
#include "chrome/common/extensions/manifest.h"
+#include "chrome/common/extensions/permissions/chrome_api_permissions.h"
#include "chrome/common/extensions/unpacker.h"
#include "chrome/common/extensions/update_manifest.h"
#include "chrome/common/safe_browsing/zip_analyzer.h"
@@ -145,6 +146,9 @@ void ChromeContentUtilityClient::OnUnpackExtension(
int creation_flags) {
CHECK(location > extensions::Manifest::INVALID_LOCATION);
CHECK(location < extensions::Manifest::NUM_LOCATIONS);
+ extensions::ChromeAPIPermissions permissions;
+ extensions::PermissionsInfo::GetInstance()->InitializeWithDelegate(
+ permissions);
RegisterExtensionManifestHandlers();
extensions::Unpacker unpacker(
extension_path,