 Chromium Code Reviews
 Chromium Code Reviews Issue 13971005:
  Basic multi-module support  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master
    
  
    Issue 13971005:
  Basic multi-module support  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master| 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_)) { |