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

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

Issue 13971005: Basic multi-module support (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 8 months 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
Index: chrome/common/extensions/extension.cc
diff --git a/chrome/common/extensions/extension.cc b/chrome/common/extensions/extension.cc
index c4c1d9a2914762c2dfff9c6ff2a10224d6c1403f..ca3432484ac7d44a50df81c8062b4fba72189fed 100644
--- a/chrome/common/extensions/extension.cc
+++ b/chrome/common/extensions/extension.cc
@@ -318,6 +318,7 @@ ExtensionResource Extension::GetResource(
base::FilePath relative_file_path(UTF8ToWide(new_path));
#endif
ExtensionResource r(id(), path(), relative_file_path);
+
if ((creation_flags() & Extension::FOLLOW_SYMLINKS_ANYWHERE)) {
r.set_follow_symlinks_anywhere();
}
@@ -1172,6 +1173,9 @@ bool Extension::InitFromValue(int flags, string16* error) {
if (!LoadSharedFeatures(error))
return false;
+ if (!LoadSharedModuleFeatures(error))
+ return false;
+
if (manifest_->HasKey(keys::kConvertedFromUserScript))
manifest_->GetBoolean(keys::kConvertedFromUserScript,
&converted_from_user_script_);
@@ -1193,6 +1197,16 @@ bool Extension::InitFromValue(int flags, string16* error) {
optional_api_permissions, optional_host_permissions, URLPatternSet());
initial_api_permissions_.reset();
+ // Extensions that export resources should not have any permissions of their
+ // own, instead they rely on the permissions of the extensions which import
+ // them.
+ if (exported_set_.size() > 0 &&
+ (!required_permission_set_->IsEmpty() ||
+ !optional_permission_set_->IsEmpty())) {
+ *error = ASCIIToUTF16(errors::kInvalidExportPermissions);
+ return false;
+ }
+
return true;
}
@@ -1494,6 +1508,127 @@ bool Extension::LoadSharedFeatures(string16* error) {
return true;
}
+// static
+void Extension::ParseImportedPath(const std::string& path,
+ std::string* import_id,
+ std::string* import_relative_path) {
+ std::vector<std::string> tokens;
+ Tokenize(path, std::string("/"), &tokens);
+ if (tokens.size() > 2 && tokens[0] == extension_filenames::kModulesDir &&
+ IdIsValid(tokens[1])) {
+ *import_id = tokens[1];
+ *import_relative_path = tokens[2];
+ for (size_t i = 3; i < tokens.size(); ++i)
+ *import_relative_path += "/" + tokens[i];
+ }
+}
+
+// static
+bool Extension::IsImportedPath(const std::string& path) {
+ std::vector<std::string> tokens;
+ Tokenize(path, std::string("/"), &tokens);
+ if (tokens.size() > 2 && tokens[0] == extension_filenames::kModulesDir &&
+ IdIsValid(tokens[1])) {
+ return true;
+ }
+ return false;
+}
+
+bool Extension::Imports(const std::string& other_id) const {
+ for (size_t i = 0; i < imports_.size(); i++) {
+ if (imports_[i].extension_id == other_id)
+ return true;
+ }
+ return false;
+}
+
+bool Extension::IsExportAllowed(const std::string& relative_path) const {
+ return exported_set_.MatchesURL(extension_url_.Resolve(relative_path));
+}
+
+bool Extension::LoadSharedModuleFeatures(string16* error) {
+ bool has_import = manifest_->HasKey(keys::kImport);
+ bool has_export = manifest_->HasKey(keys::kExport);
+ if (!has_import && !has_export)
+ return true;
+
+ if (has_import && has_export) {
+ *error = ASCIIToUTF16(errors::kInvalidImportAndExport);
+ return false;
+ }
+
+ if (has_export) {
+ const DictionaryValue* export_value = NULL;
+ if (!manifest_->GetDictionary(keys::kExport, &export_value)) {
+ *error = ASCIIToUTF16(errors::kInvalidExport);
+ return false;
+ }
+ const ListValue* resources_list = NULL;
+ if (!export_value->GetList(keys::kResources, &resources_list)) {
+ *error = ASCIIToUTF16(errors::kInvalidExportResources);
+ return false;
+ }
+ for (size_t i = 0; i < resources_list->GetSize(); ++i) {
+ std::string resource_path;
+ if (!resources_list->GetString(i, &resource_path)) {
+ *error = ErrorUtils::FormatErrorMessageUTF16(
+ errors::kInvalidExportResourcesString, base::IntToString(i));
+ return false;
+ }
+ const GURL& resolved_path = extension_url_.Resolve(resource_path);
+ if (!resolved_path.is_valid()) {
+ *error = ErrorUtils::FormatErrorMessageUTF16(
+ errors::kInvalidExportResourcesString, base::IntToString(i));
+ return false;
+ }
+ exported_set_.AddPattern(
+ URLPattern(URLPattern::SCHEME_EXTENSION, resolved_path.spec()));
+ }
+ }
+
+ if (has_import) {
+ const ListValue* import_list = NULL;
+ if (!manifest_->GetList(keys::kImport, &import_list)) {
+ *error = ASCIIToUTF16(errors::kInvalidImport);
+ return false;
+ }
+ for (size_t i = 0; i < import_list->GetSize(); ++i) {
+ const DictionaryValue* import_entry = NULL;
+ if (!import_list->GetDictionary(i, &import_entry)) {
+ *error = ASCIIToUTF16(errors::kInvalidImport);
+ return false;
+ }
+ std::string extension_id;
+ imports_.push_back(ImportInfo());
+ if (!import_entry->GetString(keys::kId, &extension_id) ||
+ !IdIsValid(extension_id)) {
+ *error = ErrorUtils::FormatErrorMessageUTF16(
+ errors::kInvalidImportId, base::IntToString(i));
+ return false;
+ }
+ imports_.back().extension_id = extension_id;
+ if (import_entry->HasKey(keys::kMinimumVersion)) {
+ std::string min_version;
+ if (!import_entry->GetString(keys::kMinimumVersion, &min_version)) {
+ *error = ErrorUtils::FormatErrorMessageUTF16(
+ errors::kInvalidImportVersion, base::IntToString(i));
+ return false;
+ }
+ imports_.back().min_version = min_version;
+ Version v(min_version);
+ /*imports_.back().min_version.reset(new Version(min_version));
+ if (!imports_.back().min_version->IsValid()) {*/
Matt Perry 2013/04/24 21:22:11 rm this dead code
+ if (!v.IsValid()) {
+ *error = ErrorUtils::FormatErrorMessageUTF16(
+ errors::kInvalidImportVersion, base::IntToString(i));
+ return false;
+ }
+ }
+ }
+ }
+ return true;
+}
+
bool Extension::LoadDescription(string16* error) {
if (manifest_->HasKey(keys::kDescription) &&
!manifest_->GetString(keys::kDescription, &description_)) {

Powered by Google App Engine
This is Rietveld 408576698