Index: chrome/common/extensions/extension.cc |
diff --git a/chrome/common/extensions/extension.cc b/chrome/common/extensions/extension.cc |
index 1ea3041df5e8058805c7fa94ca67b851288751d1..1bbbbac3b3f4f1153b40a1eee718d5ef4d589e92 100644 |
--- a/chrome/common/extensions/extension.cc |
+++ b/chrome/common/extensions/extension.cc |
@@ -33,6 +33,7 @@ |
#include "chrome/common/extensions/extension_sidebar_defaults.h" |
#include "chrome/common/extensions/extension_sidebar_utils.h" |
#include "chrome/common/extensions/file_browser_handler.h" |
+#include "chrome/common/extensions/manifest.h" |
#include "chrome/common/extensions/user_script.h" |
#include "chrome/common/url_constants.h" |
#include "googleurl/src/url_util.h" |
@@ -80,28 +81,6 @@ static void ConvertHexadecimalToIDAlphabet(std::string* id) { |
} |
} |
-// These keys are allowed by all crx files (apps, extensions, themes, etc). |
-static const char* kBaseCrxKeys[] = { |
- keys::kCurrentLocale, |
- keys::kDefaultLocale, |
- keys::kDescription, |
- keys::kIcons, |
- keys::kName, |
- keys::kPublicKey, |
- keys::kSignature, |
- keys::kVersion, |
- keys::kUpdateURL |
-}; |
- |
-bool IsBaseCrxKey(const std::string& key) { |
- for (size_t i = 0; i < arraysize(kBaseCrxKeys); ++i) { |
- if (key == kBaseCrxKeys[i]) |
- return true; |
- } |
- |
- return false; |
-} |
- |
// A singleton object containing global data needed by the extension objects. |
class ExtensionConfig { |
public: |
@@ -247,7 +226,8 @@ scoped_refptr<Extension> Extension::Create(const FilePath& path, |
DCHECK(error); |
scoped_refptr<Extension> extension = new Extension(path, location); |
- if (!extension->InitFromValue(value, flags, error)) |
+ if (!extension->InitFromValue(new extensions::Manifest(value.DeepCopy()), |
+ flags, error)) |
return NULL; |
return extension; |
} |
@@ -892,30 +872,7 @@ ExtensionSidebarDefaults* Extension::LoadExtensionSidebarDefaults( |
return result.release(); |
} |
-bool Extension::ContainsNonThemeKeys(const DictionaryValue& source) const { |
- for (DictionaryValue::key_iterator key = source.begin_keys(); |
- key != source.end_keys(); ++key) { |
- if (!IsBaseCrxKey(*key) && *key != keys::kTheme) |
- return true; |
- } |
- return false; |
-} |
- |
-bool Extension::LoadIsApp(const DictionaryValue* manifest, |
- std::string* error) { |
- if (manifest->HasKey(keys::kApp)) |
- is_app_ = true; |
- |
- if (CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kEnablePlatformApps)) { |
- if (manifest->HasKey(keys::kPlatformApp)) |
- is_platform_app_ = true; |
- } |
- |
- return true; |
-} |
- |
-bool Extension::LoadExtent(const DictionaryValue* manifest, |
+bool Extension::LoadExtent(const extensions::Manifest* manifest, |
const char* key, |
URLPatternSet* extent, |
const char* list_error, |
@@ -992,7 +949,7 @@ bool Extension::LoadExtent(const DictionaryValue* manifest, |
return true; |
} |
-bool Extension::LoadLaunchURL(const DictionaryValue* manifest, |
+bool Extension::LoadLaunchURL(const extensions::Manifest* manifest, |
std::string* error) { |
Value* temp = NULL; |
@@ -1090,7 +1047,7 @@ bool Extension::LoadLaunchURL(const DictionaryValue* manifest, |
return true; |
} |
-bool Extension::LoadLaunchContainer(const DictionaryValue* manifest, |
+bool Extension::LoadLaunchContainer(const extensions::Manifest* manifest, |
std::string* error) { |
Value* temp = NULL; |
if (!manifest->Get(keys::kLaunchContainer, &temp)) |
@@ -1143,7 +1100,7 @@ bool Extension::LoadLaunchContainer(const DictionaryValue* manifest, |
return true; |
} |
-bool Extension::LoadAppIsolation(const DictionaryValue* manifest, |
+bool Extension::LoadAppIsolation(const extensions::Manifest* manifest, |
std::string* error) { |
Value* temp = NULL; |
if (!manifest->Get(keys::kIsolation, &temp)) |
@@ -1175,18 +1132,18 @@ bool Extension::LoadAppIsolation(const DictionaryValue* manifest, |
return true; |
} |
-bool Extension::LoadWebIntentServices(const base::DictionaryValue& manifest, |
+bool Extension::LoadWebIntentServices(const extensions::Manifest* manifest, |
std::string* error) { |
DCHECK(error); |
if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableWebIntents)) |
return true; |
- if (!manifest.HasKey(keys::kIntents)) |
+ if (!manifest->HasKey(keys::kIntents)) |
return true; |
DictionaryValue* all_services = NULL; |
- if (!manifest.GetDictionary(keys::kIntents, &all_services)) { |
+ if (!manifest->GetDictionary(keys::kIntents, &all_services)) { |
*error = errors::kInvalidIntents; |
return false; |
} |
@@ -1245,32 +1202,6 @@ bool Extension::LoadWebIntentServices(const base::DictionaryValue& manifest, |
return true; |
} |
- |
-bool Extension::EnsureNotHybridApp(const DictionaryValue* manifest, |
- std::string* error) { |
- if (web_extent().is_empty()) |
- return true; |
- |
- for (DictionaryValue::key_iterator key = manifest->begin_keys(); |
- key != manifest->end_keys(); ++key) { |
- if (!IsBaseCrxKey(*key) && |
- *key != keys::kApp && |
- *key != keys::kPermissions && |
- *key != keys::kOptionalPermissions && |
- *key != keys::kOptionsPage && |
- *key != keys::kBackground && |
- *key != keys::kOfflineEnabled && |
- *key != keys::kMinimumChromeVersion && |
- *key != keys::kRequirements) { |
- *error = ExtensionErrorUtils::FormatErrorMessage( |
- errors::kHostedAppsCannotIncludeExtensionFeatures, *key); |
- return false; |
- } |
- } |
- |
- return true; |
-} |
- |
// static |
bool Extension::IsTrustedId(const std::string& id) { |
// See http://b/4946060 for more details. |
@@ -1283,9 +1214,6 @@ Extension::Extension(const FilePath& path, Location location) |
offline_enabled_(false), |
location_(location), |
converted_from_user_script_(false), |
- is_theme_(false), |
- is_app_(false), |
- is_platform_app_(false), |
is_storage_isolated_(false), |
launch_container_(extension_misc::LAUNCH_TAB), |
launch_width_(0), |
@@ -1444,10 +1372,14 @@ GURL Extension::GetBaseURLFromExtensionId(const std::string& extension_id) { |
chrome::kStandardSchemeSeparator + extension_id + "/"); |
} |
-bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
+bool Extension::InitFromValue(extensions::Manifest* manifest, int flags, |
std::string* error) { |
DCHECK(error); |
base::AutoLock auto_lock(runtime_data_lock_); |
+ |
+ if (!manifest->ValidateManifest(error)) |
+ return false; |
+ |
// When strict error checks are enabled, make URL pattern parsing strict. |
URLPattern::ParseOption parse_strictness = |
(flags & STRICT_ERROR_CHECKS ? URLPattern::ERROR_ON_PORTS |
@@ -1458,9 +1390,9 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
optional_permission_set_ = new ExtensionPermissionSet(); |
required_permission_set_ = new ExtensionPermissionSet(); |
- if (source.HasKey(keys::kManifestVersion)) { |
+ if (manifest->HasKey(keys::kManifestVersion)) { |
int manifest_version = 0; |
- if (!source.GetInteger(keys::kManifestVersion, &manifest_version) || |
+ if (!manifest->GetInteger(keys::kManifestVersion, &manifest_version) || |
manifest_version < 1) { |
*error = errors::kInvalidManifestVersion; |
return false; |
@@ -1471,10 +1403,10 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
manifest_version_ = 1; |
} |
- if (source.HasKey(keys::kPublicKey)) { |
+ if (manifest->HasKey(keys::kPublicKey)) { |
std::string public_key_bytes; |
- if (!source.GetString(keys::kPublicKey, |
- &public_key_) || |
+ if (!manifest->GetString(keys::kPublicKey, |
+ &public_key_) || |
!ParsePEMKeyBytes(public_key_, |
&public_key_bytes) || |
!GenerateId(public_key_bytes, &id_)) { |
@@ -1497,15 +1429,14 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
creation_flags_ = flags; |
- // Make a copy of the manifest so we can store it in prefs. |
- manifest_value_.reset(source.DeepCopy()); |
+ manifest_.reset(manifest); |
// Initialize the URL. |
extension_url_ = Extension::GetBaseURLFromExtensionId(id()); |
// Initialize version. |
std::string version_str; |
- if (!source.GetString(keys::kVersion, &version_str)) { |
+ if (!manifest->GetString(keys::kVersion, &version_str)) { |
*error = errors::kInvalidVersion; |
return false; |
} |
@@ -1518,7 +1449,7 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
// Initialize name. |
string16 localized_name; |
- if (!source.GetString(keys::kName, &localized_name)) { |
+ if (!manifest->GetString(keys::kName, &localized_name)) { |
*error = errors::kInvalidName; |
return false; |
} |
@@ -1528,18 +1459,17 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
// Load App settings. LoadExtent at least has to be done before |
// ParsePermissions(), because the valid permissions depend on what type of |
// package this is. |
- if (!LoadIsApp(manifest_value_.get(), error) || |
- !LoadExtent(manifest_value_.get(), keys::kWebURLs, |
- &extent_, |
- errors::kInvalidWebURLs, errors::kInvalidWebURL, |
- parse_strictness, error) || |
- !EnsureNotHybridApp(manifest_value_.get(), error) || |
- !LoadLaunchURL(manifest_value_.get(), error) || |
- !LoadLaunchContainer(manifest_value_.get(), error)) { |
+ if (is_app() && |
+ (!LoadExtent(manifest_.get(), keys::kWebURLs, |
+ &extent_, |
+ errors::kInvalidWebURLs, errors::kInvalidWebURL, |
+ parse_strictness, error) || |
+ !LoadLaunchURL(manifest_.get(), error) || |
+ !LoadLaunchContainer(manifest_.get(), error))) { |
return false; |
} |
- if (is_platform_app_) { |
+ if (is_platform_app()) { |
if (launch_container() != extension_misc::LAUNCH_PANEL) { |
*error = errors::kInvalidLaunchContainerForPlatform; |
return false; |
@@ -1549,7 +1479,7 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
// Initialize the permissions (optional). |
ExtensionAPIPermissionSet api_permissions; |
URLPatternSet host_permissions; |
- if (!ParsePermissions(&source, |
+ if (!ParsePermissions(manifest_.get(), |
keys::kPermissions, |
flags, |
error, |
@@ -1561,7 +1491,7 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
// Initialize the optional permissions (optional). |
ExtensionAPIPermissionSet optional_api_permissions; |
URLPatternSet optional_host_permissions; |
- if (!ParsePermissions(&source, |
+ if (!ParsePermissions(manifest_.get(), |
keys::kOptionalPermissions, |
flags, |
error, |
@@ -1571,8 +1501,8 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
} |
// Initialize description (if present). |
- if (source.HasKey(keys::kDescription)) { |
- if (!source.GetString(keys::kDescription, |
+ if (manifest->HasKey(keys::kDescription)) { |
+ if (!manifest->GetString(keys::kDescription, |
&description_)) { |
*error = errors::kInvalidDescription; |
return false; |
@@ -1580,9 +1510,9 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
} |
// Initialize homepage url (if present). |
- if (source.HasKey(keys::kHomepageURL)) { |
+ if (manifest->HasKey(keys::kHomepageURL)) { |
std::string tmp; |
- if (!source.GetString(keys::kHomepageURL, &tmp)) { |
+ if (!manifest->GetString(keys::kHomepageURL, &tmp)) { |
*error = ExtensionErrorUtils::FormatErrorMessage( |
errors::kInvalidHomepageURL, ""); |
return false; |
@@ -1598,9 +1528,9 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
} |
// Initialize update url (if present). |
- if (source.HasKey(keys::kUpdateURL)) { |
+ if (manifest->HasKey(keys::kUpdateURL)) { |
std::string tmp; |
- if (!source.GetString(keys::kUpdateURL, &tmp)) { |
+ if (!manifest->GetString(keys::kUpdateURL, &tmp)) { |
*error = ExtensionErrorUtils::FormatErrorMessage( |
errors::kInvalidUpdateURL, ""); |
return false; |
@@ -1616,9 +1546,9 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
// Validate minimum Chrome version (if present). We don't need to store this, |
// since the extension is not valid if it is incorrect. |
- if (source.HasKey(keys::kMinimumChromeVersion)) { |
+ if (manifest->HasKey(keys::kMinimumChromeVersion)) { |
std::string minimum_version_string; |
- if (!source.GetString(keys::kMinimumChromeVersion, |
+ if (!manifest->GetString(keys::kMinimumChromeVersion, |
&minimum_version_string)) { |
*error = errors::kInvalidMinimumChromeVersion; |
return false; |
@@ -1654,13 +1584,14 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
} |
// Initialize converted_from_user_script (if present) |
- source.GetBoolean(keys::kConvertedFromUserScript, |
- &converted_from_user_script_); |
+ if (manifest->HasKey(keys::kConvertedFromUserScript)) |
+ manifest->GetBoolean(keys::kConvertedFromUserScript, |
+ &converted_from_user_script_); |
// Initialize icons (if present). |
- if (source.HasKey(keys::kIcons)) { |
+ if (manifest->HasKey(keys::kIcons)) { |
DictionaryValue* icons_value = NULL; |
- if (!source.GetDictionary(keys::kIcons, &icons_value)) { |
+ if (!manifest->GetDictionary(keys::kIcons, &icons_value)) { |
*error = errors::kInvalidIcons; |
return false; |
} |
@@ -1690,20 +1621,12 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
} |
// Initialize themes (if present). |
- is_theme_ = false; |
- if (source.HasKey(keys::kTheme)) { |
- // Themes cannot contain extension keys. |
- if (ContainsNonThemeKeys(source)) { |
- *error = errors::kThemesCannotContainExtensions; |
- return false; |
- } |
- |
+ if (manifest->HasKey(keys::kTheme)) { |
DictionaryValue* theme_value = NULL; |
- if (!source.GetDictionary(keys::kTheme, &theme_value)) { |
+ if (!manifest->GetDictionary(keys::kTheme, &theme_value)) { |
*error = errors::kInvalidTheme; |
return false; |
} |
- is_theme_ = true; |
DictionaryValue* images_value = NULL; |
if (theme_value->GetDictionary(keys::kThemeImages, &images_value)) { |
@@ -1776,9 +1699,9 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
} |
// Initialize plugins (optional). |
- if (source.HasKey(keys::kPlugins)) { |
+ if (manifest->HasKey(keys::kPlugins)) { |
ListValue* list_value = NULL; |
- if (!source.GetList(keys::kPlugins, &list_value)) { |
+ if (!manifest->GetList(keys::kPlugins, &list_value)) { |
*error = errors::kInvalidPlugins; |
return false; |
} |
@@ -1820,9 +1743,9 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
} |
} |
- if (source.HasKey(keys::kNaClModules)) { |
+ if (manifest->HasKey(keys::kNaClModules)) { |
ListValue* list_value = NULL; |
- if (!source.GetList(keys::kNaClModules, &list_value)) { |
+ if (!manifest->GetList(keys::kNaClModules, &list_value)) { |
*error = errors::kInvalidNaClModules; |
return false; |
} |
@@ -1858,9 +1781,9 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
} |
// Initialize content scripts (optional). |
- if (source.HasKey(keys::kContentScripts)) { |
+ if (manifest->HasKey(keys::kContentScripts)) { |
ListValue* list_value; |
- if (!source.GetList(keys::kContentScripts, &list_value)) { |
+ if (!manifest->GetList(keys::kContentScripts, &list_value)) { |
*error = errors::kInvalidContentScriptsList; |
return false; |
} |
@@ -1888,9 +1811,9 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
// Initialize page action (optional). |
DictionaryValue* page_action_value = NULL; |
- if (source.HasKey(keys::kPageActions)) { |
+ if (manifest->HasKey(keys::kPageActions)) { |
ListValue* list_value = NULL; |
- if (!source.GetList(keys::kPageActions, &list_value)) { |
+ if (!manifest->GetList(keys::kPageActions, &list_value)) { |
*error = errors::kInvalidPageActionsList; |
return false; |
} |
@@ -1909,8 +1832,8 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
*error = errors::kInvalidPageActionsListSize; |
return false; |
} |
- } else if (source.HasKey(keys::kPageAction)) { |
- if (!source.GetDictionary(keys::kPageAction, &page_action_value)) { |
+ } else if (manifest->HasKey(keys::kPageAction)) { |
+ if (!manifest->GetDictionary(keys::kPageAction, &page_action_value)) { |
*error = errors::kInvalidPageAction; |
return false; |
} |
@@ -1925,9 +1848,9 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
} |
// Initialize browser action (optional). |
- if (source.HasKey(keys::kBrowserAction)) { |
+ if (manifest->HasKey(keys::kBrowserAction)) { |
DictionaryValue* browser_action_value = NULL; |
- if (!source.GetDictionary(keys::kBrowserAction, &browser_action_value)) { |
+ if (!manifest->GetDictionary(keys::kBrowserAction, &browser_action_value)) { |
*error = errors::kInvalidBrowserAction; |
return false; |
} |
@@ -1939,9 +1862,9 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
} |
// Initialize file browser actions (optional). |
- if (source.HasKey(keys::kFileBrowserHandlers)) { |
+ if (manifest->HasKey(keys::kFileBrowserHandlers)) { |
ListValue* file_browser_handlers_value = NULL; |
- if (!source.GetList(keys::kFileBrowserHandlers, |
+ if (!manifest->GetList(keys::kFileBrowserHandlers, |
&file_browser_handlers_value)) { |
*error = errors::kInvalidFileBrowserHandler; |
return false; |
@@ -1955,15 +1878,14 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
// App isolation. |
if (api_permissions.count(ExtensionAPIPermission::kExperimental)) { |
- if (!LoadAppIsolation(manifest_value_.get(), error)) |
+ if (is_app() && !LoadAppIsolation(manifest_.get(), error)) |
return false; |
} |
// Initialize options page url (optional). |
- // Function LoadIsApp() set is_app_ above. |
- if (source.HasKey(keys::kOptionsPage)) { |
+ if (manifest->HasKey(keys::kOptionsPage)) { |
std::string options_str; |
- if (!source.GetString(keys::kOptionsPage, &options_str)) { |
+ if (!manifest->GetString(keys::kOptionsPage, &options_str)) { |
*error = errors::kInvalidOptionsPage; |
return false; |
} |
@@ -1992,9 +1914,9 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
} |
// Initialize background url (optional). |
- if (source.HasKey(keys::kBackground)) { |
+ if (manifest->HasKey(keys::kBackground)) { |
std::string background_str; |
- if (!source.GetString(keys::kBackground, &background_str)) { |
+ if (!manifest->GetString(keys::kBackground, &background_str)) { |
*error = errors::kInvalidBackground; |
return false; |
} |
@@ -2025,8 +1947,8 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
} |
} |
- if (source.HasKey(keys::kDefaultLocale)) { |
- if (!source.GetString(keys::kDefaultLocale, &default_locale_) || |
+ if (manifest->HasKey(keys::kDefaultLocale)) { |
+ if (!manifest->GetString(keys::kDefaultLocale, &default_locale_) || |
!l10n_util::IsValidLocaleSyntax(default_locale_)) { |
*error = errors::kInvalidDefaultLocale; |
return false; |
@@ -2034,9 +1956,9 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
} |
// Chrome URL overrides (optional) |
- if (source.HasKey(keys::kChromeURLOverrides)) { |
+ if (manifest->HasKey(keys::kChromeURLOverrides)) { |
DictionaryValue* overrides = NULL; |
- if (!source.GetDictionary(keys::kChromeURLOverrides, &overrides)) { |
+ if (!manifest->GetDictionary(keys::kChromeURLOverrides, &overrides)) { |
*error = errors::kInvalidChromeURLOverrides; |
return false; |
} |
@@ -2078,9 +2000,9 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
} |
if (api_permissions.count(ExtensionAPIPermission::kExperimental) && |
- source.HasKey(keys::kInputComponents)) { |
+ manifest->HasKey(keys::kInputComponents)) { |
ListValue* list_value = NULL; |
- if (!source.GetList(keys::kInputComponents, &list_value)) { |
+ if (!manifest->GetList(keys::kInputComponents, &list_value)) { |
*error = errors::kInvalidInputComponents; |
return false; |
} |
@@ -2209,17 +2131,17 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
} |
} |
- if (source.HasKey(keys::kOmnibox)) { |
- if (!source.GetString(keys::kOmniboxKeyword, &omnibox_keyword_) || |
+ if (manifest->HasKey(keys::kOmnibox)) { |
+ if (!manifest->GetString(keys::kOmniboxKeyword, &omnibox_keyword_) || |
omnibox_keyword_.empty()) { |
*error = errors::kInvalidOmniboxKeyword; |
return false; |
} |
} |
- if (source.HasKey(keys::kContentSecurityPolicy)) { |
+ if (manifest->HasKey(keys::kContentSecurityPolicy)) { |
std::string content_security_policy; |
- if (!source.GetString(keys::kContentSecurityPolicy, |
+ if (!manifest->GetString(keys::kContentSecurityPolicy, |
&content_security_policy)) { |
*error = errors::kInvalidContentSecurityPolicy; |
return false; |
@@ -2242,9 +2164,9 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
} |
// Initialize devtools page url (optional). |
- if (source.HasKey(keys::kDevToolsPage)) { |
+ if (manifest->HasKey(keys::kDevToolsPage)) { |
std::string devtools_str; |
- if (!source.GetString(keys::kDevToolsPage, &devtools_str)) { |
+ if (!manifest->GetString(keys::kDevToolsPage, &devtools_str)) { |
*error = errors::kInvalidDevToolsPage; |
return false; |
} |
@@ -2256,9 +2178,9 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
} |
// Initialize sidebar action (optional). |
- if (source.HasKey(keys::kSidebar)) { |
+ if (manifest->HasKey(keys::kSidebar)) { |
DictionaryValue* sidebar_value = NULL; |
- if (!source.GetDictionary(keys::kSidebar, &sidebar_value)) { |
+ if (!manifest->GetDictionary(keys::kSidebar, &sidebar_value)) { |
*error = errors::kInvalidSidebar; |
return false; |
} |
@@ -2272,9 +2194,9 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
} |
// Initialize text-to-speech voices (optional). |
- if (source.HasKey(keys::kTtsEngine)) { |
+ if (manifest->HasKey(keys::kTtsEngine)) { |
DictionaryValue* tts_dict = NULL; |
- if (!source.GetDictionary(keys::kTtsEngine, &tts_dict)) { |
+ if (!manifest->GetDictionary(keys::kTtsEngine, &tts_dict)) { |
*error = errors::kInvalidTts; |
return false; |
} |
@@ -2355,15 +2277,15 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
} |
// Initialize web intents (optional). |
- if (!LoadWebIntentServices(source, error)) |
+ if (!LoadWebIntentServices(manifest, error)) |
return false; |
// Initialize incognito behavior. Apps default to split mode, extensions |
// default to spanning. |
incognito_split_mode_ = is_app(); |
- if (source.HasKey(keys::kIncognito)) { |
+ if (manifest->HasKey(keys::kIncognito)) { |
std::string value; |
- if (!source.GetString(keys::kIncognito, &value)) { |
+ if (!manifest->GetString(keys::kIncognito, &value)) { |
*error = errors::kInvalidIncognitoBehavior; |
return false; |
} |
@@ -2378,8 +2300,8 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
} |
// Initialize offline-enabled status. Defaults to false. |
- if (source.HasKey(keys::kOfflineEnabled)) { |
- if (!source.GetBoolean(keys::kOfflineEnabled, &offline_enabled_)) { |
+ if (manifest->HasKey(keys::kOfflineEnabled)) { |
+ if (!manifest->GetBoolean(keys::kOfflineEnabled, &offline_enabled_)) { |
*error = errors::kInvalidOfflineEnabled; |
return false; |
} |
@@ -2387,9 +2309,9 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
// Initialize requirements (optional). Not actually persisted (they're only |
// used by the store), but still validated. |
- if (source.HasKey(keys::kRequirements)) { |
+ if (manifest->HasKey(keys::kRequirements)) { |
DictionaryValue* requirements_value = NULL; |
- if (!source.GetDictionary(keys::kRequirements, &requirements_value)) { |
+ if (!manifest->GetDictionary(keys::kRequirements, &requirements_value)) { |
*error = errors::kInvalidRequirements; |
return false; |
} |
@@ -2418,13 +2340,6 @@ bool Extension::InitFromValue(const DictionaryValue& source, int flags, |
optional_permission_set_ = new ExtensionPermissionSet( |
optional_api_permissions, optional_host_permissions, URLPatternSet()); |
- // 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 |
- // InitFromValue again. As a result, we need to make sure that nobody |
- // accidentally modifies it. |
- DCHECK(source.Equals(manifest_value_.get())); |
- |
return true; |
} |
@@ -2580,7 +2495,7 @@ GURL Extension::GetIconURL(int size, |
return GetResourceURL(path); |
} |
-bool Extension::ParsePermissions(const DictionaryValue* source, |
+bool Extension::ParsePermissions(const extensions::Manifest* source, |
const char* key, |
int flags, |
std::string* error, |