| Index: chrome/browser/ui/webui/extensions/extension_loader_handler.cc
|
| diff --git a/chrome/browser/ui/webui/extensions/extension_loader_handler.cc b/chrome/browser/ui/webui/extensions/extension_loader_handler.cc
|
| index 6e43177a4a3abd3fe57b684c2c362b5012a36f9b..9893cae7916e85e4303a77e1b17dee22b976061a 100644
|
| --- a/chrome/browser/ui/webui/extensions/extension_loader_handler.cc
|
| +++ b/chrome/browser/ui/webui/extensions/extension_loader_handler.cc
|
| @@ -128,11 +128,23 @@ void ExtensionLoaderHandler::FileHelper::MultiFilesSelected(
|
| NOTREACHED();
|
| }
|
|
|
| +ExtensionLoaderHandler::FailureData::FailureData(base::FilePath file_path,
|
| + std::string error,
|
| + size_t line_number,
|
| + std::string manifest)
|
| + : file_path(file_path),
|
| + error(error),
|
| + line_number(line_number),
|
| + manifest(manifest) {}
|
| +
|
| ExtensionLoaderHandler::ExtensionLoaderHandler(Profile* profile)
|
| : profile_(profile),
|
| file_helper_(new FileHelper(this)),
|
| + extension_error_reporter_observer_(this),
|
| + display_ready_(false),
|
| weak_ptr_factory_(this) {
|
| DCHECK(profile_);
|
| + extension_error_reporter_observer_.Add(ExtensionErrorReporter::GetInstance());
|
| }
|
|
|
| ExtensionLoaderHandler::~ExtensionLoaderHandler() {
|
| @@ -166,6 +178,14 @@ void ExtensionLoaderHandler::RegisterMessages() {
|
| "extensionLoaderRetry",
|
| base::Bind(&ExtensionLoaderHandler::HandleRetry,
|
| weak_ptr_factory_.GetWeakPtr()));
|
| + web_ui()->RegisterMessageCallback(
|
| + "extensionLoaderSetDisplayLoading",
|
| + base::Bind(&ExtensionLoaderHandler::HandleSetDisplayLoading,
|
| + weak_ptr_factory_.GetWeakPtr()));
|
| + web_ui()->RegisterMessageCallback(
|
| + "extensionLoaderDisplayFailures",
|
| + base::Bind(&ExtensionLoaderHandler::HandleDisplayFailures,
|
| + weak_ptr_factory_.GetWeakPtr()));
|
| }
|
|
|
| void ExtensionLoaderHandler::HandleLoadUnpacked(const base::ListValue* args) {
|
| @@ -174,17 +194,40 @@ void ExtensionLoaderHandler::HandleLoadUnpacked(const base::ListValue* args) {
|
| }
|
|
|
| void ExtensionLoaderHandler::HandleRetry(const base::ListValue* args) {
|
| + DCHECK(!args->empty());
|
| + base::string16 path;
|
| + args->GetString(0, &path);
|
| + LoadUnpackedExtensionImpl(base::FilePath::FromUTF16Unsafe(path));
|
| +}
|
| +
|
| +void ExtensionLoaderHandler::HandleSetDisplayLoading(
|
| + const base::ListValue* args) {
|
| + DCHECK(args->empty());
|
| + display_ready_ = false;
|
| +}
|
| +
|
| +void ExtensionLoaderHandler::HandleDisplayFailures(
|
| + const base::ListValue* args) {
|
| DCHECK(args->empty());
|
| - LoadUnpackedExtensionImpl(failed_path_);
|
| + display_ready_ = true;
|
| +
|
| + if (failures_.empty())
|
| + return;
|
| +
|
| + for (size_t i = 0; i < failures_.size(); ++i) {
|
| + FailureData* failure = failures_[i];
|
| + NotifyFrontendOfFailure(failure->file_path,
|
| + failure->error,
|
| + failure->line_number,
|
| + failure->manifest);
|
| + }
|
| + failures_.clear();
|
| }
|
|
|
| void ExtensionLoaderHandler::LoadUnpackedExtensionImpl(
|
| const base::FilePath& file_path) {
|
| scoped_refptr<UnpackedInstaller> installer = UnpackedInstaller::Create(
|
| ExtensionSystem::Get(profile_)->extension_service());
|
| - installer->set_on_failure_callback(
|
| - base::Bind(&ExtensionLoaderHandler::OnLoadFailure,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
|
|
| // We do our own error handling, so we don't want a load failure to trigger
|
| // a dialog.
|
| @@ -195,7 +238,6 @@ void ExtensionLoaderHandler::LoadUnpackedExtensionImpl(
|
|
|
| void ExtensionLoaderHandler::OnLoadFailure(const base::FilePath& file_path,
|
| const std::string& error) {
|
| - failed_path_ = file_path;
|
| size_t line = 0u;
|
| size_t column = 0u;
|
| std::string regex =
|
| @@ -227,6 +269,15 @@ void ExtensionLoaderHandler::NotifyFrontendOfFailure(
|
| const std::string& error,
|
| size_t line_number,
|
| const std::string& manifest) {
|
| + // If the extensions page is not loaded, delay frontend notification.
|
| + if (!display_ready_) {
|
| + failures_.push_back(new FailureData(file_path,
|
| + error,
|
| + line_number,
|
| + manifest));
|
| + return;
|
| + }
|
| +
|
| base::StringValue file_value(file_path.LossyDisplayName());
|
| base::StringValue error_value(base::UTF8ToUTF16(error));
|
|
|
|
|