| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/common/extensions/extension.h" | 5 #include "chrome/common/extensions/extension.h" |
| 6 | 6 |
| 7 #include "base/base64.h" | 7 #include "base/base64.h" |
| 8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/file_path.h" | 10 #include "base/file_path.h" |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 scoped_ptr<extensions::Manifest> manifest( | 314 scoped_ptr<extensions::Manifest> manifest( |
| 315 new extensions::Manifest( | 315 new extensions::Manifest( |
| 316 location, | 316 location, |
| 317 scoped_ptr<DictionaryValue>(value.DeepCopy()))); | 317 scoped_ptr<DictionaryValue>(value.DeepCopy()))); |
| 318 | 318 |
| 319 if (!InitExtensionID(manifest.get(), path, explicit_id, flags, &error)) { | 319 if (!InitExtensionID(manifest.get(), path, explicit_id, flags, &error)) { |
| 320 *utf8_error = UTF16ToUTF8(error); | 320 *utf8_error = UTF16ToUTF8(error); |
| 321 return NULL; | 321 return NULL; |
| 322 } | 322 } |
| 323 | 323 |
| 324 std::vector<std::string> install_warnings; | 324 InstallWarningVector install_warnings; |
| 325 manifest->ValidateManifest(utf8_error, &install_warnings); | 325 manifest->ValidateManifest(utf8_error, &install_warnings); |
| 326 if (!utf8_error->empty()) | 326 if (!utf8_error->empty()) |
| 327 return NULL; | 327 return NULL; |
| 328 | 328 |
| 329 scoped_refptr<Extension> extension = new Extension(path, manifest.Pass()); | 329 scoped_refptr<Extension> extension = new Extension(path, manifest.Pass()); |
| 330 extension->install_warnings_.swap(install_warnings); | 330 extension->install_warnings_.swap(install_warnings); |
| 331 | 331 |
| 332 if (!extension->InitFromValue(flags, &error)) { | 332 if (!extension->InitFromValue(flags, &error)) { |
| 333 *utf8_error = UTF16ToUTF8(error); | 333 *utf8_error = UTF16ToUTF8(error); |
| 334 return NULL; | 334 return NULL; |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 403 | 403 |
| 404 const std::string& Extension::id() const { | 404 const std::string& Extension::id() const { |
| 405 return manifest_->extension_id(); | 405 return manifest_->extension_id(); |
| 406 } | 406 } |
| 407 | 407 |
| 408 const std::string Extension::VersionString() const { | 408 const std::string Extension::VersionString() const { |
| 409 return version()->GetString(); | 409 return version()->GetString(); |
| 410 } | 410 } |
| 411 | 411 |
| 412 void Extension::AddInstallWarnings( | 412 void Extension::AddInstallWarnings( |
| 413 const std::vector<std::string>& new_warnings) { | 413 const InstallWarningVector& new_warnings) { |
| 414 install_warnings_.insert(install_warnings_.end(), | 414 install_warnings_.insert(install_warnings_.end(), |
| 415 new_warnings.begin(), new_warnings.end()); | 415 new_warnings.begin(), new_warnings.end()); |
| 416 } | 416 } |
| 417 | 417 |
| 418 // static | 418 // static |
| 419 bool Extension::IsExtension(const FilePath& file_name) { | 419 bool Extension::IsExtension(const FilePath& file_name) { |
| 420 return file_name.MatchesExtension(chrome::kExtensionFileExtension); | 420 return file_name.MatchesExtension(chrome::kExtensionFileExtension); |
| 421 } | 421 } |
| 422 | 422 |
| 423 // static | 423 // static |
| (...skipping 916 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1340 manifest_version < 1) { | 1340 manifest_version < 1) { |
| 1341 *error = ASCIIToUTF16(errors::kInvalidManifestVersion); | 1341 *error = ASCIIToUTF16(errors::kInvalidManifestVersion); |
| 1342 return false; | 1342 return false; |
| 1343 } | 1343 } |
| 1344 } | 1344 } |
| 1345 | 1345 |
| 1346 manifest_version_ = manifest_->GetManifestVersion(); | 1346 manifest_version_ = manifest_->GetManifestVersion(); |
| 1347 if (creation_flags_ & REQUIRE_MODERN_MANIFEST_VERSION && | 1347 if (creation_flags_ & REQUIRE_MODERN_MANIFEST_VERSION && |
| 1348 manifest_version_ < kModernManifestVersion && | 1348 manifest_version_ < kModernManifestVersion && |
| 1349 !CommandLine::ForCurrentProcess()->HasSwitch( | 1349 !CommandLine::ForCurrentProcess()->HasSwitch( |
| 1350 switches::kAllowLegacyExtensionManifests)) { | 1350 switches::kAllowLegacyExtensionManifests)) { |
| 1351 *error = ASCIIToUTF16(errors::kInvalidManifestVersion); | 1351 *error = ASCIIToUTF16(errors::kInvalidManifestVersion); |
| 1352 return false; | 1352 return false; |
| 1353 } |
| 1354 |
| 1355 if (location() == LOAD && manifest_version_ == 1) { |
| 1356 install_warnings_.push_back(Extension::InstallWarning( |
| 1357 Extension::InstallWarning::FORMAT_HTML, |
| 1358 l10n_util::GetStringFUTF8( |
| 1359 IDS_EXTENSION_MANIFEST_VERSION_OLD, |
| 1360 ASCIIToUTF16("<a href='http://code.google.com/chrome/extensions/" |
| 1361 "manifestVersion.html'>"), |
| 1362 ASCIIToUTF16("</a>")))); |
| 1353 } | 1363 } |
| 1354 | 1364 |
| 1355 return true; | 1365 return true; |
| 1356 } | 1366 } |
| 1357 | 1367 |
| 1358 bool Extension::LoadHomepageURL(string16* error) { | 1368 bool Extension::LoadHomepageURL(string16* error) { |
| 1359 if (!manifest_->HasKey(keys::kHomepageURL)) | 1369 if (!manifest_->HasKey(keys::kHomepageURL)) |
| 1360 return true; | 1370 return true; |
| 1361 std::string tmp; | 1371 std::string tmp; |
| 1362 if (!manifest_->GetString(keys::kHomepageURL, &tmp)) { | 1372 if (!manifest_->GetString(keys::kHomepageURL, &tmp)) { |
| (...skipping 1871 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3234 extensions::Feature::Availability availability = | 3244 extensions::Feature::Availability availability = |
| 3235 feature->IsAvailableToManifest( | 3245 feature->IsAvailableToManifest( |
| 3236 id(), | 3246 id(), |
| 3237 GetType(), | 3247 GetType(), |
| 3238 extensions::Feature::ConvertLocation(location()), | 3248 extensions::Feature::ConvertLocation(location()), |
| 3239 manifest_version()); | 3249 manifest_version()); |
| 3240 if (availability != extensions::Feature::IS_AVAILABLE) { | 3250 if (availability != extensions::Feature::IS_AVAILABLE) { |
| 3241 // Don't fail, but warn the developer that the manifest contains | 3251 // Don't fail, but warn the developer that the manifest contains |
| 3242 // unrecognized permissions. This may happen legitimately if the | 3252 // unrecognized permissions. This may happen legitimately if the |
| 3243 // extensions requests platform- or channel-specific permissions. | 3253 // extensions requests platform- or channel-specific permissions. |
| 3244 install_warnings_.push_back(feature->GetErrorMessage(availability)); | 3254 install_warnings_.push_back( |
| 3255 InstallWarning(InstallWarning::FORMAT_TEXT, |
| 3256 feature->GetErrorMessage(availability))); |
| 3245 continue; | 3257 continue; |
| 3246 } | 3258 } |
| 3247 | 3259 |
| 3248 if (permission->id() == ExtensionAPIPermission::kExperimental) { | 3260 if (permission->id() == ExtensionAPIPermission::kExperimental) { |
| 3249 if (!CanSpecifyExperimentalPermission()) { | 3261 if (!CanSpecifyExperimentalPermission()) { |
| 3250 *error = ASCIIToUTF16(errors::kExperimentalFlagRequired); | 3262 *error = ASCIIToUTF16(errors::kExperimentalFlagRequired); |
| 3251 return false; | 3263 return false; |
| 3252 } | 3264 } |
| 3253 } | 3265 } |
| 3254 | 3266 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 3280 pattern.SetValidSchemes( | 3292 pattern.SetValidSchemes( |
| 3281 pattern.valid_schemes() & ~URLPattern::SCHEME_FILE); | 3293 pattern.valid_schemes() & ~URLPattern::SCHEME_FILE); |
| 3282 } | 3294 } |
| 3283 | 3295 |
| 3284 host_permissions->AddPattern(pattern); | 3296 host_permissions->AddPattern(pattern); |
| 3285 continue; | 3297 continue; |
| 3286 } | 3298 } |
| 3287 | 3299 |
| 3288 // It's probably an unknown API permission. Do not throw an error so | 3300 // It's probably an unknown API permission. Do not throw an error so |
| 3289 // extensions can retain backwards compatability (http://crbug.com/42742). | 3301 // extensions can retain backwards compatability (http://crbug.com/42742). |
| 3290 install_warnings_.push_back(base::StringPrintf( | 3302 install_warnings_.push_back(InstallWarning( |
| 3291 "Permission '%s' is unknown or URL pattern is malformed.", | 3303 InstallWarning::FORMAT_TEXT, |
| 3292 permission_str.c_str())); | 3304 base::StringPrintf( |
| 3305 "Permission '%s' is unknown or URL pattern is malformed.", |
| 3306 permission_str.c_str()))); |
| 3293 } | 3307 } |
| 3294 } | 3308 } |
| 3295 return true; | 3309 return true; |
| 3296 } | 3310 } |
| 3297 | 3311 |
| 3298 bool Extension::CanSilentlyIncreasePermissions() const { | 3312 bool Extension::CanSilentlyIncreasePermissions() const { |
| 3299 return location() != INTERNAL; | 3313 return location() != INTERNAL; |
| 3300 } | 3314 } |
| 3301 | 3315 |
| 3302 bool Extension::CanSpecifyHostPermission(const URLPattern& pattern, | 3316 bool Extension::CanSpecifyHostPermission(const URLPattern& pattern, |
| (...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3723 | 3737 |
| 3724 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( | 3738 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( |
| 3725 const Extension* extension, | 3739 const Extension* extension, |
| 3726 const ExtensionPermissionSet* permissions, | 3740 const ExtensionPermissionSet* permissions, |
| 3727 Reason reason) | 3741 Reason reason) |
| 3728 : reason(reason), | 3742 : reason(reason), |
| 3729 extension(extension), | 3743 extension(extension), |
| 3730 permissions(permissions) {} | 3744 permissions(permissions) {} |
| 3731 | 3745 |
| 3732 } // namespace extensions | 3746 } // namespace extensions |
| OLD | NEW |