Index: chrome/browser/extensions/crx_installer.cc |
=================================================================== |
--- chrome/browser/extensions/crx_installer.cc (revision 143212) |
+++ chrome/browser/extensions/crx_installer.cc (working copy) |
@@ -172,7 +172,7 @@ |
scoped_refptr<Extension> extension = |
ConvertUserScriptToExtension(source_file_, download_url_, &error); |
if (!extension) { |
- ReportFailureFromFileThread(error); |
+ ReportFailureFromFileThread(CrxInstallerError(error)); |
return; |
} |
@@ -202,36 +202,34 @@ |
OnUnpackSuccess(extension->path(), extension->path(), NULL, extension); |
} |
-bool CrxInstaller::AllowInstall(const Extension* extension, |
- string16* error) { |
+CrxInstallerError CrxInstaller::AllowInstall(const Extension* extension) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
- DCHECK(error); |
// Make sure the expected ID matches if one was supplied or if we want to |
// bypass the prompt. |
if ((approved_ || !expected_id_.empty()) && |
expected_id_ != extension->id()) { |
- *error = l10n_util::GetStringFUTF16(IDS_EXTENSION_INSTALL_UNEXPECTED_ID, |
- ASCIIToUTF16(expected_id_), |
- ASCIIToUTF16(extension->id())); |
- return false; |
+ return CrxInstallerError( |
+ l10n_util::GetStringFUTF16(IDS_EXTENSION_INSTALL_UNEXPECTED_ID, |
+ ASCIIToUTF16(expected_id_), |
+ ASCIIToUTF16(extension->id()))); |
} |
if (expected_version_.get() && |
!expected_version_->Equals(*extension->version())) { |
- *error = l10n_util::GetStringFUTF16( |
- IDS_EXTENSION_INSTALL_UNEXPECTED_VERSION, |
- ASCIIToUTF16(expected_version_->GetString()), |
- ASCIIToUTF16(extension->version()->GetString())); |
- return false; |
+ return CrxInstallerError( |
+ l10n_util::GetStringFUTF16( |
+ IDS_EXTENSION_INSTALL_UNEXPECTED_VERSION, |
+ ASCIIToUTF16(expected_version_->GetString()), |
+ ASCIIToUTF16(extension->version()->GetString()))); |
} |
// Make sure the manifests match if we want to bypass the prompt. |
if (approved_ && |
(!expected_manifest_.get() || |
!expected_manifest_->Equals(original_manifest_.get()))) { |
- *error = l10n_util::GetStringUTF16(IDS_EXTENSION_MANIFEST_INVALID); |
- return false; |
+ return CrxInstallerError( |
+ l10n_util::GetStringUTF16(IDS_EXTENSION_MANIFEST_INVALID)); |
} |
// The checks below are skipped for themes and external installs. |
@@ -239,11 +237,11 @@ |
// and other uses of install_source_ that are no longer needed now that the |
// SandboxedExtensionUnpacker sets extension->location. |
if (extension->is_theme() || Extension::IsExternalLocation(install_source_)) |
- return true; |
+ return CrxInstallerError(); |
if (!extensions_enabled_) { |
- *error = l10n_util::GetStringUTF16(IDS_EXTENSION_INSTALL_NOT_ENABLED); |
- return false; |
+ return CrxInstallerError( |
+ l10n_util::GetStringUTF16(IDS_EXTENSION_INSTALL_NOT_ENABLED)); |
} |
if (install_cause_ == extension_misc::INSTALL_CAUSE_USER_DOWNLOAD) { |
@@ -270,13 +268,15 @@ |
} else { |
UMA_HISTOGRAM_ENUMERATION(kHistogramName, OffStoreInstallDisallowed, |
NumOffStoreInstallDecision); |
- *error = l10n_util::GetStringUTF16( |
- IDS_EXTENSION_INSTALL_DISALLOWED_ON_SITE); |
// Don't delete source in this case so that the user can install |
// manually if they want. |
delete_source_ = false; |
did_handle_successfully_ = false; |
- return false; |
+ |
+ return CrxInstallerError( |
+ CrxInstallerError::ERROR_OFF_STORE, |
+ l10n_util::GetStringUTF16( |
+ IDS_EXTENSION_INSTALL_DISALLOWED_ON_SITE)); |
} |
} |
} |
@@ -289,10 +289,10 @@ |
if (!download_url_.SchemeIsFile() && |
apps_require_extension_mime_type_ && |
original_mime_type_ != Extension::kMimeType) { |
- *error = l10n_util::GetStringFUTF16( |
- IDS_EXTENSION_INSTALL_INCORRECT_APP_CONTENT_TYPE, |
- ASCIIToUTF16(Extension::kMimeType)); |
- return false; |
+ return CrxInstallerError( |
+ l10n_util::GetStringFUTF16( |
+ IDS_EXTENSION_INSTALL_INCORRECT_APP_CONTENT_TYPE, |
+ ASCIIToUTF16(Extension::kMimeType))); |
} |
// If the client_ is NULL, then the app is either being installed via |
@@ -303,10 +303,10 @@ |
// from the gallery. |
// TODO(erikkay) Apply this rule for paid extensions and themes as well. |
if (extension->UpdatesFromGallery()) { |
- *error = l10n_util::GetStringFUTF16( |
- IDS_EXTENSION_DISALLOW_NON_DOWNLOADED_GALLERY_INSTALLS, |
- l10n_util::GetStringUTF16(IDS_EXTENSION_WEB_STORE_TITLE)); |
- return false; |
+ return CrxInstallerError( |
+ l10n_util::GetStringFUTF16( |
+ IDS_EXTENSION_DISALLOW_NON_DOWNLOADED_GALLERY_INSTALLS, |
+ l10n_util::GetStringUTF16(IDS_EXTENSION_WEB_STORE_TITLE))); |
} |
// For self-hosted apps, verify that the entire extent is on the same |
@@ -320,15 +320,15 @@ |
for (URLPatternSet::const_iterator i = patterns.begin(); |
i != patterns.end(); ++i) { |
if (!pattern.MatchesHost(i->host())) { |
- *error = l10n_util::GetStringUTF16( |
- IDS_EXTENSION_INSTALL_INCORRECT_INSTALL_HOST); |
- return false; |
+ return CrxInstallerError( |
+ l10n_util::GetStringUTF16( |
+ IDS_EXTENSION_INSTALL_INCORRECT_INSTALL_HOST)); |
} |
} |
} |
} |
- return true; |
+ return CrxInstallerError(); |
} |
void CrxInstaller::OnUnpackFailure(const string16& error_message) { |
@@ -341,7 +341,7 @@ |
install_cause(), |
extension_misc::NUM_INSTALL_CAUSES); |
- ReportFailureFromFileThread(error_message); |
+ ReportFailureFromFileThread(CrxInstallerError(error_message)); |
} |
void CrxInstaller::OnUnpackSuccess(const FilePath& temp_dir, |
@@ -369,8 +369,8 @@ |
// the temp dir. |
unpacked_extension_root_ = extension_dir; |
- string16 error; |
- if (!AllowInstall(extension, &error)) { |
+ CrxInstallerError error = AllowInstall(extension); |
+ if (error.type() != CrxInstallerError::ERROR_NONE) { |
ReportFailureFromFileThread(error); |
return; |
} |
@@ -398,14 +398,15 @@ |
VLOG(1) << "This extension: " << extension_->id() |
<< " is blacklisted. Install failed."; |
ReportFailureFromUIThread( |
- l10n_util::GetStringUTF16(IDS_EXTENSION_CANT_INSTALL_BLACKLISTED)); |
+ CrxInstallerError( |
+ l10n_util::GetStringUTF16(IDS_EXTENSION_CANT_INSTALL_BLACKLISTED))); |
return; |
} |
string16 error; |
if (!ExtensionSystem::Get(profile_)->management_policy()->UserMayLoad( |
extension_, &error)) { |
- ReportFailureFromUIThread(error); |
+ ReportFailureFromUIThread(CrxInstallerError(error)); |
return; |
} |
@@ -415,9 +416,11 @@ |
GetHostedAppByOverlappingWebExtent(extension_->web_extent()); |
if (overlapping_extension && |
overlapping_extension->id() != extension_->id()) { |
- ReportFailureFromUIThread(l10n_util::GetStringFUTF16( |
- IDS_EXTENSION_OVERLAPPING_WEB_EXTENT, |
- UTF8ToUTF16(overlapping_extension->name()))); |
+ ReportFailureFromUIThread( |
+ CrxInstallerError( |
+ l10n_util::GetStringFUTF16( |
+ IDS_EXTENSION_OVERLAPPING_WEB_EXTENT, |
+ UTF8ToUTF16(overlapping_extension->name())))); |
return; |
} |
@@ -474,7 +477,8 @@ |
Version::GetVersionFromString(current_version_)); |
if (current_version->CompareTo(*(extension_->version())) > 0) { |
ReportFailureFromFileThread( |
- l10n_util::GetStringUTF16(IDS_EXTENSION_CANT_DOWNGRADE_VERSION)); |
+ CrxInstallerError( |
+ l10n_util::GetStringUTF16(IDS_EXTENSION_CANT_DOWNGRADE_VERSION))); |
return; |
} |
} |
@@ -493,8 +497,9 @@ |
install_directory_); |
if (version_dir.empty()) { |
ReportFailureFromFileThread( |
- l10n_util::GetStringUTF16( |
- IDS_EXTENSION_MOVE_DIRECTORY_TO_PROFILE_FAILED)); |
+ CrxInstallerError( |
+ l10n_util::GetStringUTF16( |
+ IDS_EXTENSION_MOVE_DIRECTORY_TO_PROFILE_FAILED))); |
return; |
} |
@@ -516,29 +521,31 @@ |
ReportSuccessFromFileThread(); |
} |
-void CrxInstaller::ReportFailureFromFileThread(const string16& error) { |
+void CrxInstaller::ReportFailureFromFileThread(const CrxInstallerError& error) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
if (!BrowserThread::PostTask( |
BrowserThread::UI, FROM_HERE, |
- base::Bind(&CrxInstaller::ReportFailureFromUIThread, this, error))) |
+ base::Bind(&CrxInstaller::ReportFailureFromUIThread, this, error))) { |
NOTREACHED(); |
+ } |
} |
-void CrxInstaller::ReportFailureFromUIThread(const string16& error) { |
+void CrxInstaller::ReportFailureFromUIThread(const CrxInstallerError& error) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
content::NotificationService* service = |
content::NotificationService::current(); |
service->Notify(chrome::NOTIFICATION_EXTENSION_INSTALL_ERROR, |
content::Source<CrxInstaller>(this), |
- content::Details<const string16>(&error)); |
+ content::Details<const string16>(&error.message())); |
// This isn't really necessary, it is only used because unit tests expect to |
// see errors get reported via this interface. |
// |
// TODO(aa): Need to go through unit tests and clean them up too, probably get |
// rid of this line. |
- ExtensionErrorReporter::GetInstance()->ReportError(error, false); // quiet |
+ ExtensionErrorReporter::GetInstance()->ReportError( |
+ error.message(), false); // quiet |
if (client_) |
client_->OnInstallFailure(error); |