summaryrefslogtreecommitdiffstats
path: root/chrome/common
diff options
context:
space:
mode:
authorasargent@chromium.org <asargent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-16 18:34:28 +0000
committerasargent@chromium.org <asargent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-16 18:34:28 +0000
commit43919ac90f426c807da507d52c163972634c771e (patch)
tree29d4053f433b61e587fa532428cb3dc4b11823de /chrome/common
parent29f192ded5a521a42ff1f93880e0787f2500d5a0 (diff)
downloadchromium_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.cc10
-rw-r--r--chrome/common/extensions/extension.h4
-rw-r--r--chrome/common/extensions/extension_constants.cc5
-rw-r--r--chrome/common/extensions/extension_constants.h2
-rw-r--r--chrome/common/extensions/extension_unittest.cc13
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) {