| Index: chrome/browser/extensions/crx_installer.cc
|
| diff --git a/chrome/browser/extensions/crx_installer.cc b/chrome/browser/extensions/crx_installer.cc
|
| index ad4a4cc1bf95dc6893c6a5723b387a0c534e422a..91610599f22ae27b19c5dcb6dcf0885d18351ff7 100644
|
| --- a/chrome/browser/extensions/crx_installer.cc
|
| +++ b/chrome/browser/extensions/crx_installer.cc
|
| @@ -9,6 +9,7 @@
|
| #include "base/file_util.h"
|
| #include "base/path_service.h"
|
| #include "base/scoped_temp_dir.h"
|
| +#include "base/singleton.h"
|
| #include "base/task.h"
|
| #include "base/utf_string_conversions.h"
|
| #include "base/version.h"
|
| @@ -31,11 +32,42 @@
|
| #include "third_party/skia/include/core/SkBitmap.h"
|
|
|
| namespace {
|
| - // Helper function to delete files. This is used to avoid ugly casts which
|
| - // would be necessary with PostMessage since file_util::Delete is overloaded.
|
| - static void DeleteFileHelper(const FilePath& path, bool recursive) {
|
| - file_util::Delete(path, recursive);
|
| +
|
| +// Helper function to delete files. This is used to avoid ugly casts which
|
| +// would be necessary with PostMessage since file_util::Delete is overloaded.
|
| +static void DeleteFileHelper(const FilePath& path, bool recursive) {
|
| + file_util::Delete(path, recursive);
|
| +}
|
| +
|
| +struct WhitelistedInstallData {
|
| + WhitelistedInstallData() {}
|
| + std::list<std::string> ids;
|
| +};
|
| +
|
| +}
|
| +
|
| +// static
|
| +void CrxInstaller::SetWhitelistedInstallId(const std::string& id) {
|
| + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
|
| + Singleton<WhitelistedInstallData>::get()->ids.push_back(id);
|
| +}
|
| +
|
| +// static
|
| +bool CrxInstaller::ClearWhitelistedInstallId(const std::string& id) {
|
| + std::list<std::string>& ids = Singleton<WhitelistedInstallData>::get()->ids;
|
| + std::list<std::string>::iterator iter = ids.begin();
|
| + for (; iter != ids.end(); ++iter) {
|
| + if (*iter == id) {
|
| + break;
|
| + }
|
| }
|
| +
|
| + if (iter != ids.end()) {
|
| + ids.erase(iter);
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| }
|
|
|
| CrxInstaller::CrxInstaller(const FilePath& install_directory,
|
| @@ -49,7 +81,8 @@ CrxInstaller::CrxInstaller(const FilePath& install_directory,
|
| create_app_shortcut_(false),
|
| frontend_(frontend),
|
| client_(client),
|
| - apps_require_extension_mime_type_(false) {
|
| + apps_require_extension_mime_type_(false),
|
| + allow_silent_install_(false) {
|
| extensions_enabled_ = frontend_->extensions_enabled();
|
| }
|
|
|
| @@ -221,7 +254,9 @@ void CrxInstaller::ConfirmInstall() {
|
| current_version_ =
|
| frontend_->extension_prefs()->GetVersionString(extension_->id());
|
|
|
| - if (client_) {
|
| + if (client_ &&
|
| + (!allow_silent_install_ ||
|
| + !ClearWhitelistedInstallId(extension_->id()))) {
|
| AddRef(); // Balanced in Proceed() and Abort().
|
| client_->ConfirmInstall(this, extension_.get());
|
| } else {
|
|
|