Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5769)

Unified Diff: chrome/common/extensions/extension.cc

Issue 15239002: Move Extension and PermissionsData to extensions/common. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/common/extensions/extension.h ('k') | chrome/common/extensions/extension_file_util.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/common/extensions/extension.cc
diff --git a/chrome/common/extensions/extension.cc b/chrome/common/extensions/extension.cc
deleted file mode 100644
index 71018ccd2b0605a11fadea93f17237574c6d3557..0000000000000000000000000000000000000000
--- a/chrome/common/extensions/extension.cc
+++ /dev/null
@@ -1,794 +0,0 @@
-// 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/extension.h"
-
-#include "base/base64.h"
-#include "base/basictypes.h"
-#include "base/command_line.h"
-#include "base/files/file_path.h"
-#include "base/i18n/rtl.h"
-#include "base/logging.h"
-#include "base/memory/singleton.h"
-#include "base/stl_util.h"
-#include "base/strings/string16.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/values.h"
-#include "base/version.h"
-#include "chrome/common/extensions/extension_constants.h"
-#include "chrome/common/extensions/permissions/permissions_data.h"
-#include "content/public/common/url_constants.h"
-#include "extensions/common/constants.h"
-#include "extensions/common/error_utils.h"
-#include "extensions/common/id_util.h"
-#include "extensions/common/manifest.h"
-#include "extensions/common/manifest_constants.h"
-#include "extensions/common/manifest_handler.h"
-#include "extensions/common/permissions/api_permission_set.h"
-#include "extensions/common/permissions/permission_set.h"
-#include "extensions/common/permissions/permissions_info.h"
-#include "extensions/common/switches.h"
-#include "extensions/common/url_pattern_set.h"
-#include "grit/chromium_strings.h"
-#include "grit/theme_resources.h"
-#include "net/base/net_util.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-#include "url/url_util.h"
-
-#if defined(OS_WIN)
-#include "grit/generated_resources.h"
-#endif
-
-namespace extensions {
-
-namespace keys = manifest_keys;
-namespace values = manifest_values;
-namespace errors = manifest_errors;
-
-namespace {
-
-const int kModernManifestVersion = 2;
-const int kPEMOutputColumns = 65;
-
-// KEY MARKERS
-const char kKeyBeginHeaderMarker[] = "-----BEGIN";
-const char kKeyBeginFooterMarker[] = "-----END";
-const char kKeyInfoEndMarker[] = "KEY-----";
-const char kPublic[] = "PUBLIC";
-const char kPrivate[] = "PRIVATE";
-
-bool ContainsReservedCharacters(const base::FilePath& path) {
- // We should disallow backslash '\\' as file path separator even on Windows,
- // because the backslash is not regarded as file path separator on Linux/Mac.
- // Extensions are cross-platform.
- // Since FilePath uses backslash '\\' as file path separator on Windows, so we
- // need to check manually.
- if (path.value().find('\\') != path.value().npos)
- return true;
- return !net::IsSafePortableRelativePath(path);
-}
-
-} // namespace
-
-const char Extension::kMimeType[] = "application/x-chrome-extension";
-
-const int Extension::kValidWebExtentSchemes =
- URLPattern::SCHEME_HTTP | URLPattern::SCHEME_HTTPS;
-
-const int Extension::kValidHostPermissionSchemes = URLPattern::SCHEME_CHROMEUI |
- URLPattern::SCHEME_HTTP |
- URLPattern::SCHEME_HTTPS |
- URLPattern::SCHEME_FILE |
- URLPattern::SCHEME_FTP;
-
-//
-// Extension
-//
-
-// static
-scoped_refptr<Extension> Extension::Create(const base::FilePath& path,
- Manifest::Location location,
- const base::DictionaryValue& value,
- int flags,
- std::string* utf8_error) {
- return Extension::Create(path,
- location,
- value,
- flags,
- std::string(), // ID is ignored if empty.
- utf8_error);
-}
-
-// TODO(sungguk): Continue removing std::string errors and replacing
-// with string16. See http://crbug.com/71980.
-scoped_refptr<Extension> Extension::Create(const base::FilePath& path,
- Manifest::Location location,
- const base::DictionaryValue& value,
- int flags,
- const std::string& explicit_id,
- std::string* utf8_error) {
- DCHECK(utf8_error);
- string16 error;
- scoped_ptr<extensions::Manifest> manifest(
- new extensions::Manifest(
- location, scoped_ptr<base::DictionaryValue>(value.DeepCopy())));
-
- if (!InitExtensionID(manifest.get(), path, explicit_id, flags, &error)) {
- *utf8_error = UTF16ToUTF8(error);
- return NULL;
- }
-
- std::vector<InstallWarning> install_warnings;
- if (!manifest->ValidateManifest(utf8_error, &install_warnings)) {
- return NULL;
- }
-
- scoped_refptr<Extension> extension = new Extension(path, manifest.Pass());
- extension->install_warnings_.swap(install_warnings);
-
- if (!extension->InitFromValue(flags, &error)) {
- *utf8_error = UTF16ToUTF8(error);
- return NULL;
- }
-
- return extension;
-}
-
-// static
-bool Extension::IdIsValid(const std::string& id) {
- // Verify that the id is legal.
- if (id.size() != (id_util::kIdSize * 2))
- return false;
-
- // We only support lowercase IDs, because IDs can be used as URL components
- // (where GURL will lowercase it).
- std::string temp = StringToLowerASCII(id);
- for (size_t i = 0; i < temp.size(); i++)
- if (temp[i] < 'a' || temp[i] > 'p')
- return false;
-
- return true;
-}
-
-Manifest::Type Extension::GetType() const {
- return converted_from_user_script() ?
- Manifest::TYPE_USER_SCRIPT : manifest_->type();
-}
-
-// static
-GURL Extension::GetResourceURL(const GURL& extension_url,
- const std::string& relative_path) {
- DCHECK(extension_url.SchemeIs(extensions::kExtensionScheme));
- DCHECK_EQ("/", extension_url.path());
-
- std::string path = relative_path;
-
- // If the relative path starts with "/", it is "absolute" relative to the
- // extension base directory, but extension_url is already specified to refer
- // to that base directory, so strip the leading "/" if present.
- if (relative_path.size() > 0 && relative_path[0] == '/')
- path = relative_path.substr(1);
-
- GURL ret_val = GURL(extension_url.spec() + path);
- DCHECK(StartsWithASCII(ret_val.spec(), extension_url.spec(), false));
-
- return ret_val;
-}
-
-bool Extension::ResourceMatches(const URLPatternSet& pattern_set,
- const std::string& resource) const {
- return pattern_set.MatchesURL(extension_url_.Resolve(resource));
-}
-
-ExtensionResource Extension::GetResource(
- const std::string& relative_path) const {
- std::string new_path = relative_path;
- // We have some legacy data where resources have leading slashes.
- // See: http://crbug.com/121164
- if (!new_path.empty() && new_path.at(0) == '/')
- new_path.erase(0, 1);
- base::FilePath relative_file_path = base::FilePath::FromUTF8Unsafe(new_path);
- if (ContainsReservedCharacters(relative_file_path))
- return ExtensionResource();
- ExtensionResource r(id(), path(), relative_file_path);
- if ((creation_flags() & Extension::FOLLOW_SYMLINKS_ANYWHERE)) {
- r.set_follow_symlinks_anywhere();
- }
- return r;
-}
-
-ExtensionResource Extension::GetResource(
- const base::FilePath& relative_file_path) const {
- if (ContainsReservedCharacters(relative_file_path))
- return ExtensionResource();
- ExtensionResource r(id(), path(), relative_file_path);
- if ((creation_flags() & Extension::FOLLOW_SYMLINKS_ANYWHERE)) {
- r.set_follow_symlinks_anywhere();
- }
- return r;
-}
-
-// TODO(rafaelw): Move ParsePEMKeyBytes, ProducePEM & FormatPEMForOutput to a
-// util class in base:
-// http://code.google.com/p/chromium/issues/detail?id=13572
-// static
-bool Extension::ParsePEMKeyBytes(const std::string& input,
- std::string* output) {
- DCHECK(output);
- if (!output)
- return false;
- if (input.length() == 0)
- return false;
-
- std::string working = input;
- if (StartsWithASCII(working, kKeyBeginHeaderMarker, true)) {
- working = CollapseWhitespaceASCII(working, true);
- size_t header_pos = working.find(kKeyInfoEndMarker,
- sizeof(kKeyBeginHeaderMarker) - 1);
- if (header_pos == std::string::npos)
- return false;
- size_t start_pos = header_pos + sizeof(kKeyInfoEndMarker) - 1;
- size_t end_pos = working.rfind(kKeyBeginFooterMarker);
- if (end_pos == std::string::npos)
- return false;
- if (start_pos >= end_pos)
- return false;
-
- working = working.substr(start_pos, end_pos - start_pos);
- if (working.length() == 0)
- return false;
- }
-
- return base::Base64Decode(working, output);
-}
-
-// static
-bool Extension::ProducePEM(const std::string& input, std::string* output) {
- DCHECK(output);
- return (input.length() == 0) ? false : base::Base64Encode(input, output);
-}
-
-// static
-bool Extension::FormatPEMForFileOutput(const std::string& input,
- std::string* output,
- bool is_public) {
- DCHECK(output);
- if (input.length() == 0)
- return false;
- *output = "";
- output->append(kKeyBeginHeaderMarker);
- output->append(" ");
- output->append(is_public ? kPublic : kPrivate);
- output->append(" ");
- output->append(kKeyInfoEndMarker);
- output->append("\n");
- for (size_t i = 0; i < input.length(); ) {
- int slice = std::min<int>(input.length() - i, kPEMOutputColumns);
- output->append(input.substr(i, slice));
- output->append("\n");
- i += slice;
- }
- output->append(kKeyBeginFooterMarker);
- output->append(" ");
- output->append(is_public ? kPublic : kPrivate);
- output->append(" ");
- output->append(kKeyInfoEndMarker);
- output->append("\n");
-
- return true;
-}
-
-// static
-GURL Extension::GetBaseURLFromExtensionId(const std::string& extension_id) {
- return GURL(std::string(extensions::kExtensionScheme) +
- content::kStandardSchemeSeparator + extension_id + "/");
-}
-
-bool Extension::HasAPIPermission(APIPermission::ID permission) const {
- return PermissionsData::HasAPIPermission(this, permission);
-}
-
-bool Extension::HasAPIPermission(const std::string& permission_name) const {
- return PermissionsData::HasAPIPermission(this, permission_name);
-}
-
-scoped_refptr<const PermissionSet> Extension::GetActivePermissions() const {
- return PermissionsData::GetActivePermissions(this);
-}
-
-bool Extension::ShowConfigureContextMenus() const {
- // Don't show context menu for component extensions. We might want to show
- // options for component extension button but now there is no component
- // extension with options. All other menu items like uninstall have
- // no sense for component extensions.
- return location() != Manifest::COMPONENT;
-}
-
-bool Extension::OverlapsWithOrigin(const GURL& origin) const {
- if (url() == origin)
- return true;
-
- if (web_extent().is_empty())
- return false;
-
- // Note: patterns and extents ignore port numbers.
- URLPattern origin_only_pattern(kValidWebExtentSchemes);
- if (!origin_only_pattern.SetScheme(origin.scheme()))
- return false;
- origin_only_pattern.SetHost(origin.host());
- origin_only_pattern.SetPath("/*");
-
- URLPatternSet origin_only_pattern_list;
- origin_only_pattern_list.AddPattern(origin_only_pattern);
-
- return web_extent().OverlapsWith(origin_only_pattern_list);
-}
-
-bool Extension::RequiresSortOrdinal() const {
- return is_app() && (display_in_launcher_ || display_in_new_tab_page_);
-}
-
-bool Extension::ShouldDisplayInAppLauncher() const {
- // Only apps should be displayed in the launcher.
- return is_app() && display_in_launcher_;
-}
-
-bool Extension::ShouldDisplayInNewTabPage() const {
- // Only apps should be displayed on the NTP.
- return is_app() && display_in_new_tab_page_;
-}
-
-bool Extension::ShouldDisplayInExtensionSettings() const {
- // Don't show for themes since the settings UI isn't really useful for them.
- if (is_theme())
- return false;
-
- // Don't show component extensions and invisible apps.
- if (ShouldNotBeVisible())
- return false;
-
- // Always show unpacked extensions and apps.
- if (Manifest::IsUnpackedLocation(location()))
- return true;
-
- // Unless they are unpacked, never show hosted apps. Note: We intentionally
- // show packaged apps and platform apps because there are some pieces of
- // functionality that are only available in chrome://extensions/ but which
- // are needed for packaged and platform apps. For example, inspecting
- // background pages. See http://crbug.com/116134.
- if (is_hosted_app())
- return false;
-
- return true;
-}
-
-bool Extension::ShouldNotBeVisible() const {
- // Don't show component extensions because they are only extensions as an
- // implementation detail of Chrome.
- if (location() == Manifest::COMPONENT &&
- !CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kShowComponentExtensionOptions)) {
- return true;
- }
-
- // Always show unpacked extensions and apps.
- if (Manifest::IsUnpackedLocation(location()))
- return false;
-
- // Don't show apps that aren't visible in either launcher or ntp.
- if (is_app() && !ShouldDisplayInAppLauncher() && !ShouldDisplayInNewTabPage())
- return true;
-
- return false;
-}
-
-Extension::ManifestData* Extension::GetManifestData(const std::string& key)
- const {
- DCHECK(finished_parsing_manifest_ || thread_checker_.CalledOnValidThread());
- ManifestDataMap::const_iterator iter = manifest_data_.find(key);
- if (iter != manifest_data_.end())
- return iter->second.get();
- return NULL;
-}
-
-void Extension::SetManifestData(const std::string& key,
- Extension::ManifestData* data) {
- DCHECK(!finished_parsing_manifest_ && thread_checker_.CalledOnValidThread());
- manifest_data_[key] = linked_ptr<ManifestData>(data);
-}
-
-Manifest::Location Extension::location() const {
- return manifest_->location();
-}
-
-const std::string& Extension::id() const {
- return manifest_->extension_id();
-}
-
-const std::string Extension::VersionString() const {
- return version()->GetString();
-}
-
-void Extension::AddInstallWarning(const InstallWarning& new_warning) {
- install_warnings_.push_back(new_warning);
-}
-
-void Extension::AddInstallWarnings(
- const std::vector<InstallWarning>& new_warnings) {
- install_warnings_.insert(install_warnings_.end(),
- new_warnings.begin(), new_warnings.end());
-}
-
-bool Extension::is_app() const {
- return manifest_->is_app();
-}
-
-bool Extension::is_platform_app() const {
- return manifest_->is_platform_app();
-}
-
-bool Extension::is_hosted_app() const {
- return manifest()->is_hosted_app();
-}
-
-bool Extension::is_legacy_packaged_app() const {
- return manifest()->is_legacy_packaged_app();
-}
-
-bool Extension::is_extension() const {
- return manifest()->is_extension();
-}
-
-bool Extension::can_be_incognito_enabled() const {
- // Only component platform apps are supported in incognito.
- return !is_platform_app() || location() == Manifest::COMPONENT;
-}
-
-bool Extension::force_incognito_enabled() const {
- return PermissionsData::HasAPIPermission(this, APIPermission::kProxy);
-}
-
-void Extension::AddWebExtentPattern(const URLPattern& pattern) {
- extent_.AddPattern(pattern);
-}
-
-bool Extension::is_theme() const {
- return manifest()->is_theme();
-}
-
-// static
-bool Extension::InitExtensionID(extensions::Manifest* manifest,
- const base::FilePath& path,
- const std::string& explicit_id,
- int creation_flags,
- string16* error) {
- if (!explicit_id.empty()) {
- manifest->set_extension_id(explicit_id);
- return true;
- }
-
- if (manifest->HasKey(keys::kPublicKey)) {
- std::string public_key;
- std::string public_key_bytes;
- if (!manifest->GetString(keys::kPublicKey, &public_key) ||
- !ParsePEMKeyBytes(public_key, &public_key_bytes)) {
- *error = ASCIIToUTF16(errors::kInvalidKey);
- return false;
- }
- std::string extension_id = id_util::GenerateId(public_key_bytes);
- manifest->set_extension_id(extension_id);
- return true;
- }
-
- if (creation_flags & REQUIRE_KEY) {
- *error = ASCIIToUTF16(errors::kInvalidKey);
- return false;
- } else {
- // If there is a path, we generate the ID from it. This is useful for
- // development mode, because it keeps the ID stable across restarts and
- // reloading the extension.
- std::string extension_id = id_util::GenerateIdForPath(path);
- if (extension_id.empty()) {
- NOTREACHED() << "Could not create ID from path.";
- return false;
- }
- manifest->set_extension_id(extension_id);
- return true;
- }
-}
-
-Extension::Extension(const base::FilePath& path,
- scoped_ptr<extensions::Manifest> manifest)
- : manifest_version_(0),
- converted_from_user_script_(false),
- manifest_(manifest.release()),
- finished_parsing_manifest_(false),
- display_in_launcher_(true),
- display_in_new_tab_page_(true),
- wants_file_access_(false),
- creation_flags_(0) {
- DCHECK(path.empty() || path.IsAbsolute());
- path_ = id_util::MaybeNormalizePath(path);
-}
-
-Extension::~Extension() {
-}
-
-bool Extension::InitFromValue(int flags, string16* error) {
- DCHECK(error);
-
- creation_flags_ = flags;
-
- // Important to load manifest version first because many other features
- // depend on its value.
- if (!LoadManifestVersion(error))
- return false;
-
- if (!LoadRequiredFeatures(error))
- return false;
-
- // We don't need to validate because InitExtensionID already did that.
- manifest_->GetString(keys::kPublicKey, &public_key_);
-
- extension_url_ = Extension::GetBaseURLFromExtensionId(id());
-
- // 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 (is_app() && !LoadAppFeatures(error))
- return false;
-
- permissions_data_.reset(new PermissionsData);
- if (!permissions_data_->ParsePermissions(this, error))
- return false;
-
- if (manifest_->HasKey(keys::kConvertedFromUserScript)) {
- manifest_->GetBoolean(keys::kConvertedFromUserScript,
- &converted_from_user_script_);
- }
-
- if (!LoadSharedFeatures(error))
- return false;
-
- finished_parsing_manifest_ = true;
-
- permissions_data_->InitializeManifestPermissions(this);
- permissions_data_->FinalizePermissions(this);
-
- return true;
-}
-
-bool Extension::LoadRequiredFeatures(string16* error) {
- if (!LoadName(error) ||
- !LoadVersion(error))
- return false;
- return true;
-}
-
-bool Extension::LoadName(string16* error) {
- string16 localized_name;
- if (!manifest_->GetString(keys::kName, &localized_name)) {
- *error = ASCIIToUTF16(errors::kInvalidName);
- return false;
- }
- non_localized_name_ = UTF16ToUTF8(localized_name);
- base::i18n::AdjustStringForLocaleDirection(&localized_name);
- name_ = UTF16ToUTF8(localized_name);
- return true;
-}
-
-bool Extension::LoadVersion(string16* error) {
- std::string version_str;
- if (!manifest_->GetString(keys::kVersion, &version_str)) {
- *error = ASCIIToUTF16(errors::kInvalidVersion);
- return false;
- }
- version_.reset(new Version(version_str));
- if (!version_->IsValid() || version_->components().size() > 4) {
- *error = ASCIIToUTF16(errors::kInvalidVersion);
- return false;
- }
- return true;
-}
-
-bool Extension::LoadAppFeatures(string16* error) {
- if (!LoadExtent(keys::kWebURLs, &extent_,
- errors::kInvalidWebURLs, errors::kInvalidWebURL, error)) {
- return false;
- }
- if (manifest_->HasKey(keys::kDisplayInLauncher) &&
- !manifest_->GetBoolean(keys::kDisplayInLauncher, &display_in_launcher_)) {
- *error = ASCIIToUTF16(errors::kInvalidDisplayInLauncher);
- return false;
- }
- if (manifest_->HasKey(keys::kDisplayInNewTabPage)) {
- if (!manifest_->GetBoolean(keys::kDisplayInNewTabPage,
- &display_in_new_tab_page_)) {
- *error = ASCIIToUTF16(errors::kInvalidDisplayInNewTabPage);
- return false;
- }
- } else {
- // Inherit default from display_in_launcher property.
- display_in_new_tab_page_ = display_in_launcher_;
- }
- return true;
-}
-
-bool Extension::LoadExtent(const char* key,
- URLPatternSet* extent,
- const char* list_error,
- const char* value_error,
- string16* error) {
- const base::Value* temp_pattern_value = NULL;
- if (!manifest_->Get(key, &temp_pattern_value))
- return true;
-
- const base::ListValue* pattern_list = NULL;
- if (!temp_pattern_value->GetAsList(&pattern_list)) {
- *error = ASCIIToUTF16(list_error);
- return false;
- }
-
- for (size_t i = 0; i < pattern_list->GetSize(); ++i) {
- std::string pattern_string;
- if (!pattern_list->GetString(i, &pattern_string)) {
- *error = ErrorUtils::FormatErrorMessageUTF16(value_error,
- base::UintToString(i),
- errors::kExpectString);
- return false;
- }
-
- URLPattern pattern(kValidWebExtentSchemes);
- URLPattern::ParseResult parse_result = pattern.Parse(pattern_string);
- if (parse_result == URLPattern::PARSE_ERROR_EMPTY_PATH) {
- pattern_string += "/";
- parse_result = pattern.Parse(pattern_string);
- }
-
- if (parse_result != URLPattern::PARSE_SUCCESS) {
- *error = ErrorUtils::FormatErrorMessageUTF16(
- value_error,
- base::UintToString(i),
- URLPattern::GetParseResultString(parse_result));
- return false;
- }
-
- // Do not allow authors to claim "<all_urls>".
- if (pattern.match_all_urls()) {
- *error = ErrorUtils::FormatErrorMessageUTF16(
- value_error,
- base::UintToString(i),
- errors::kCannotClaimAllURLsInExtent);
- return false;
- }
-
- // Do not allow authors to claim "*" for host.
- if (pattern.host().empty()) {
- *error = ErrorUtils::FormatErrorMessageUTF16(
- value_error,
- base::UintToString(i),
- errors::kCannotClaimAllHostsInExtent);
- return false;
- }
-
- // We do not allow authors to put wildcards in their paths. Instead, we
- // imply one at the end.
- if (pattern.path().find('*') != std::string::npos) {
- *error = ErrorUtils::FormatErrorMessageUTF16(
- value_error,
- base::UintToString(i),
- errors::kNoWildCardsInPaths);
- return false;
- }
- pattern.SetPath(pattern.path() + '*');
-
- extent->AddPattern(pattern);
- }
-
- return true;
-}
-
-bool Extension::LoadSharedFeatures(string16* error) {
- if (!LoadDescription(error) ||
- !ManifestHandler::ParseExtension(this, error) ||
- !LoadShortName(error))
- return false;
-
- return true;
-}
-
-bool Extension::LoadDescription(string16* error) {
- if (manifest_->HasKey(keys::kDescription) &&
- !manifest_->GetString(keys::kDescription, &description_)) {
- *error = ASCIIToUTF16(errors::kInvalidDescription);
- return false;
- }
- return true;
-}
-
-bool Extension::LoadManifestVersion(string16* error) {
- // Get the original value out of the dictionary so that we can validate it
- // more strictly.
- if (manifest_->value()->HasKey(keys::kManifestVersion)) {
- int manifest_version = 1;
- if (!manifest_->GetInteger(keys::kManifestVersion, &manifest_version) ||
- manifest_version < 1) {
- *error = ASCIIToUTF16(errors::kInvalidManifestVersion);
- return false;
- }
- }
-
- manifest_version_ = manifest_->GetManifestVersion();
- if (manifest_version_ < kModernManifestVersion &&
- ((creation_flags_ & REQUIRE_MODERN_MANIFEST_VERSION &&
- !CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kAllowLegacyExtensionManifests)) ||
- GetType() == Manifest::TYPE_PLATFORM_APP)) {
- *error = ErrorUtils::FormatErrorMessageUTF16(
- errors::kInvalidManifestVersionOld,
- base::IntToString(kModernManifestVersion),
- is_platform_app() ? "apps" : "extensions");
- return false;
- }
-
- return true;
-}
-
-bool Extension::LoadShortName(string16* error) {
- if (manifest_->HasKey(keys::kShortName)) {
- string16 localized_short_name;
- if (!manifest_->GetString(keys::kShortName, &localized_short_name) ||
- localized_short_name.empty()) {
- *error = ASCIIToUTF16(errors::kInvalidShortName);
- return false;
- }
-
- base::i18n::AdjustStringForLocaleDirection(&localized_short_name);
- short_name_ = UTF16ToUTF8(localized_short_name);
- } else {
- short_name_ = name_;
- }
- return true;
-}
-
-ExtensionInfo::ExtensionInfo(const base::DictionaryValue* manifest,
- const std::string& id,
- const base::FilePath& path,
- Manifest::Location location)
- : extension_id(id),
- extension_path(path),
- extension_location(location) {
- if (manifest)
- extension_manifest.reset(manifest->DeepCopy());
-}
-
-ExtensionInfo::~ExtensionInfo() {}
-
-InstalledExtensionInfo::InstalledExtensionInfo(
- const Extension* extension,
- bool is_update,
- const std::string& old_name)
- : extension(extension),
- is_update(is_update),
- old_name(old_name) {}
-
-UnloadedExtensionInfo::UnloadedExtensionInfo(
- const Extension* extension,
- UnloadedExtensionInfo::Reason reason)
- : reason(reason),
- extension(extension) {}
-
-UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo(
- const Extension* extension,
- const PermissionSet* permissions,
- Reason reason)
- : reason(reason),
- extension(extension),
- permissions(permissions) {}
-
-} // namespace extensions
« no previous file with comments | « chrome/common/extensions/extension.h ('k') | chrome/common/extensions/extension_file_util.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698