diff options
author | asargent@chromium.org <asargent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-16 18:34:28 +0000 |
---|---|---|
committer | asargent@chromium.org <asargent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-16 18:34:28 +0000 |
commit | 43919ac90f426c807da507d52c163972634c771e (patch) | |
tree | 29d4053f433b61e587fa532428cb3dc4b11823de /chrome/common | |
parent | 29f192ded5a521a42ff1f93880e0787f2500d5a0 (diff) | |
download | chromium_src-43919ac90f426c807da507d52c163972634c771e.zip chromium_src-43919ac90f426c807da507d52c163972634c771e.tar.gz chromium_src-43919ac90f426c807da507d52c163972634c771e.tar.bz2 |
Add concept of an options page to Extensions.
BUG=23801
TEST=Create an extension with an "options_page" entry in its manifest with a value the name of a html file in the extension dir.
Load that extension and go to chrome://extensions, there should be an "Options" button that takes you to the page specified in the manifest.
Review URL: http://codereview.chromium.org/271114
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@29297 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/common')
-rw-r--r-- | chrome/common/extensions/extension.cc | 10 | ||||
-rw-r--r-- | chrome/common/extensions/extension.h | 4 | ||||
-rw-r--r-- | chrome/common/extensions/extension_constants.cc | 5 | ||||
-rw-r--r-- | chrome/common/extensions/extension_constants.h | 2 | ||||
-rw-r--r-- | chrome/common/extensions/extension_unittest.cc | 13 |
5 files changed, 33 insertions, 1 deletions
diff --git a/chrome/common/extensions/extension.cc b/chrome/common/extensions/extension.cc index 506c390..fee0e89 100644 --- a/chrome/common/extensions/extension.cc +++ b/chrome/common/extensions/extension.cc @@ -830,6 +830,16 @@ bool Extension::InitFromValue(const DictionaryValue& source, bool require_id, background_url_ = GetResourceURL(background_str); } + // Initialize options page url (optional). + if (source.HasKey(keys::kOptionsPage)) { + std::string options_str; + if (!source.GetString(keys::kOptionsPage, &options_str)) { + *error = errors::kInvalidOptionsPage; + return false; + } + options_url_ = GetResourceURL(options_str); + } + // Initialize toolstrips (optional). if (source.HasKey(keys::kToolstrips)) { ListValue* list_value; diff --git a/chrome/common/extensions/extension.h b/chrome/common/extensions/extension.h index 0cb120b..c96ec0a 100644 --- a/chrome/common/extensions/extension.h +++ b/chrome/common/extensions/extension.h @@ -195,6 +195,7 @@ class Extension { } const std::vector<PluginInfo>& plugins() const { return plugins_; } const GURL& background_url() const { return background_url_; } + const GURL& options_url() const { return options_url_; } const std::vector<ToolstripInfo>& toolstrips() const { return toolstrips_; } const std::vector<std::string>& api_permissions() const { return api_permissions_; @@ -334,6 +335,9 @@ class Extension { // loaded in the background. GURL background_url_; + // Optional URL to a page for setting options/preferences. + GURL options_url_; + // Optional list of toolstrips_ and associated properties. std::vector<ToolstripInfo> toolstrips_; diff --git a/chrome/common/extensions/extension_constants.cc b/chrome/common/extensions/extension_constants.cc index 13d0547..db7c8b7 100644 --- a/chrome/common/extensions/extension_constants.cc +++ b/chrome/common/extensions/extension_constants.cc @@ -46,6 +46,7 @@ const wchar_t* kToolstrips = L"toolstrips"; const wchar_t* kType = L"type"; const wchar_t* kVersion = L"version"; const wchar_t* kUpdateURL = L"update_url"; +const wchar_t* kOptionsPage = L"options_page"; } // namespace extension_manifest_keys namespace extension_manifest_values { @@ -133,7 +134,7 @@ const char* kInvalidPrivacyBlacklists = const char* kInvalidPrivacyBlacklistsPath = "Invalid value for 'privacy_blacklists[*]'."; const char* kInvalidBackground = - "Invalid value for 'background'."; + "Invalid value for 'background_page'."; const char* kInvalidRunAt = "Invalid value for 'content_scripts[*].run_at'."; const char* kInvalidSignature = @@ -175,4 +176,6 @@ const char* kLocalesNoDefaultLocaleSpecified = "Localization used, but default_locale wasn't specified in the manifest."; const char* kLocalesNoValidLocaleNamesListed = "No valid locale name could be found in _locales directory."; +const char* kInvalidOptionsPage = + "Invalid value for 'options_page'."; } // namespace extension_manifest_errors diff --git a/chrome/common/extensions/extension_constants.h b/chrome/common/extensions/extension_constants.h index ec8dbe4..5c8a087 100644 --- a/chrome/common/extensions/extension_constants.h +++ b/chrome/common/extensions/extension_constants.h @@ -47,6 +47,7 @@ namespace extension_manifest_keys { extern const wchar_t* kType; extern const wchar_t* kVersion; extern const wchar_t* kUpdateURL; + extern const wchar_t* kOptionsPage; } // namespace extension_manifest_keys // Some values expected in manifests. @@ -116,6 +117,7 @@ namespace extension_manifest_errors { extern const char* kInvalidDefaultLocale; extern const char* kLocalesNoDefaultLocaleSpecified; extern const char* kLocalesNoValidLocaleNamesListed; + extern const char* kInvalidOptionsPage; } // namespace extension_manifest_errors #endif // CHROME_COMMON_EXTENSIONS_EXTENSION_CONSTANTS_H_ diff --git a/chrome/common/extensions/extension_unittest.cc b/chrome/common/extensions/extension_unittest.cc index 104ce7a..eeb4499 100644 --- a/chrome/common/extensions/extension_unittest.cc +++ b/chrome/common/extensions/extension_unittest.cc @@ -231,6 +231,12 @@ TEST(ExtensionTest, InitFromValueInvalid) { input_value->Set(keys::kBrowserAction, action); EXPECT_FALSE(extension.InitFromValue(*input_value, true, &error)); EXPECT_STREQ(error.c_str(), errors::kOneUISurfaceOnly); + + // Test invalid options page url. + input_value.reset(static_cast<DictionaryValue*>(valid_value->DeepCopy())); + input_value->Set(keys::kOptionsPage, Value::CreateNullValue()); + EXPECT_FALSE(extension.InitFromValue(*input_value, true, &error)); + EXPECT_TRUE(MatchPattern(error, errors::kInvalidOptionsPage)); } TEST(ExtensionTest, InitFromValueValid) { @@ -254,6 +260,13 @@ TEST(ExtensionTest, InitFromValueValid) { EXPECT_EQ("my extension", extension.name()); EXPECT_EQ(extension.id(), extension.url().host()); EXPECT_EQ(path.value(), extension.path().value()); + + // Test with an options page. + input_value.SetString(keys::kOptionsPage, "options.html"); + EXPECT_TRUE(extension.InitFromValue(input_value, false, &error)); + EXPECT_EQ("", error); + EXPECT_EQ("chrome-extension", extension.options_url().scheme()); + EXPECT_EQ("/options.html", extension.options_url().path()); } TEST(ExtensionTest, GetResourceURLAndPath) { |