| Index: chrome/common/extensions/extension.cc
|
| ===================================================================
|
| --- chrome/common/extensions/extension.cc (revision 71703)
|
| +++ chrome/common/extensions/extension.cc (working copy)
|
| @@ -18,6 +18,7 @@
|
| #include "base/singleton.h"
|
| #include "base/stl_util-inl.h"
|
| #include "base/third_party/nss/blapi.h"
|
| +#include "base/string16.h"
|
| #include "base/string_number_conversions.h"
|
| #include "base/utf_string_conversions.h"
|
| #include "base/values.h"
|
| @@ -30,6 +31,8 @@
|
| #include "chrome/common/extensions/extension_error_utils.h"
|
| #include "chrome/common/extensions/extension_l10n_util.h"
|
| #include "chrome/common/extensions/extension_resource.h"
|
| +#include "chrome/common/extensions/extension_sidebar_defaults.h"
|
| +#include "chrome/common/extensions/extension_sidebar_utils.h"
|
| #include "chrome/common/extensions/user_script.h"
|
| #include "chrome/common/url_constants.h"
|
| #include "googleurl/src/url_util.h"
|
| @@ -194,6 +197,7 @@
|
|
|
| const int Extension::kPageActionIconMaxSize = 19;
|
| const int Extension::kBrowserActionIconMaxSize = 19;
|
| +const int Extension::kSidebarIconMaxSize = 16;
|
|
|
| // Explicit permissions -- permission declaration required.
|
| const char Extension::kBackgroundPermission[] = "background";
|
| @@ -804,6 +808,51 @@
|
| return result.release();
|
| }
|
|
|
| +ExtensionSidebarDefaults* Extension::LoadExtensionSidebarDefaults(
|
| + const DictionaryValue* extension_sidebar, std::string* error) {
|
| + scoped_ptr<ExtensionSidebarDefaults> result(new ExtensionSidebarDefaults());
|
| +
|
| + std::string default_icon;
|
| + // Read sidebar's |default_icon| (optional).
|
| + if (extension_sidebar->HasKey(keys::kSidebarDefaultIcon)) {
|
| + if (!extension_sidebar->GetString(keys::kSidebarDefaultIcon,
|
| + &default_icon) ||
|
| + default_icon.empty()) {
|
| + *error = errors::kInvalidSidebarDefaultIconPath;
|
| + return NULL;
|
| + }
|
| + result->set_default_icon_path(default_icon);
|
| + }
|
| +
|
| + // Read sidebar's |default_title| (optional).
|
| + string16 default_title;
|
| + if (extension_sidebar->HasKey(keys::kSidebarDefaultTitle)) {
|
| + if (!extension_sidebar->GetString(keys::kSidebarDefaultTitle,
|
| + &default_title)) {
|
| + *error = errors::kInvalidSidebarDefaultTitle;
|
| + return NULL;
|
| + }
|
| + }
|
| + result->set_default_title(default_title);
|
| +
|
| + // Read sidebar's |default_url| (optional).
|
| + std::string default_url;
|
| + if (extension_sidebar->HasKey(keys::kSidebarDefaultUrl)) {
|
| + if (!extension_sidebar->GetString(keys::kSidebarDefaultUrl, &default_url) ||
|
| + default_url.empty()) {
|
| + *error = errors::kInvalidSidebarDefaultUrl;
|
| + return NULL;
|
| + }
|
| + GURL resolved_url = extension_sidebar_utils::ResolveAndVerifyUrl(
|
| + default_url, this, error);
|
| + if (!resolved_url.is_valid())
|
| + return NULL;
|
| + result->set_default_url(resolved_url);
|
| + }
|
| +
|
| + return result.release();
|
| +}
|
| +
|
| bool Extension::ContainsNonThemeKeys(const DictionaryValue& source) const {
|
| for (DictionaryValue::key_iterator key = source.begin_keys();
|
| key != source.end_keys(); ++key) {
|
| @@ -1927,6 +1976,23 @@
|
|
|
| InitEffectiveHostPermissions();
|
|
|
| + // Initialize sidebar action (optional). It has to be done after host
|
| + // permissions are initialized to verify default sidebar url.
|
| + if (source.HasKey(keys::kSidebar)) {
|
| + DictionaryValue* sidebar_value;
|
| + if (!source.GetDictionary(keys::kSidebar, &sidebar_value)) {
|
| + *error = errors::kInvalidSidebar;
|
| + return false;
|
| + }
|
| + if (!HasApiPermission(Extension::kExperimentalPermission)) {
|
| + *error = errors::kSidebarExperimental;
|
| + return false;
|
| + }
|
| + sidebar_defaults_.reset(LoadExtensionSidebarDefaults(sidebar_value, error));
|
| + if (!sidebar_defaults_.get())
|
| + return false; // Failed to parse sidebar definition.
|
| + }
|
| +
|
| // Although |source| is passed in as a const, it's still possible to modify
|
| // it. This is dangerous since the utility process re-uses |source| after
|
| // it calls InitFromValue, passing it up to the browser process which calls
|
|
|