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..817712dbbbfd1fd6ae093e9b1aa3815405d7409b 100644 |
--- a/chrome/browser/ui/webui/extensions/extension_loader_handler.cc |
+++ b/chrome/browser/ui/webui/extensions/extension_loader_handler.cc |
@@ -128,11 +128,45 @@ void ExtensionLoaderHandler::FileHelper::MultiFilesSelected( |
NOTREACHED(); |
} |
+// Struct to hold failure data when NotifyFrontendOfFailure is called before |
+// the extensions page is fully loaded. |
+struct ExtensionLoaderHandler::FailureData { |
+ FailureData(base::FilePath file_path, |
Devlin
2014/07/02 17:46:50
this should take const file path and string.
gpdavis
2014/07/02 19:13:55
Done.
|
+ std::string error, |
+ size_t line_number, |
+ std::string manifest) |
+ : file_path(file_path), |
+ error(error), |
+ line_number(line_number), |
+ manifest(manifest) {} |
+ |
+ ~FailureData() {} |
+ |
+ base::FilePath file_path; |
+ std::string error; |
+ size_t line_number; |
+ std::string manifest; |
+}; |
+ |
+/* |
+ExtensionLoaderHandler::FailureData::FailureData(base::FilePath file_path, |
Devlin
2014/07/02 17:46:50
prefer this one :)
gpdavis
2014/07/02 19:13:55
Done.
|
+ 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() { |
@@ -155,6 +189,9 @@ void ExtensionLoaderHandler::GetLocalizedValues( |
source->AddString( |
"extensionLoadCouldNotLoadManifest", |
l10n_util::GetStringUTF16(IDS_EXTENSIONS_LOAD_COULD_NOT_LOAD_MANIFEST)); |
+ source->AddString( |
+ "extensionLoadAdditionalFailures", |
+ l10n_util::GetStringUTF16(IDS_EXTENSIONS_LOAD_ADDITIONAL_FAILURES)); |
} |
void ExtensionLoaderHandler::RegisterMessages() { |
@@ -166,6 +203,18 @@ void ExtensionLoaderHandler::RegisterMessages() { |
"extensionLoaderRetry", |
base::Bind(&ExtensionLoaderHandler::HandleRetry, |
weak_ptr_factory_.GetWeakPtr())); |
+ web_ui()->RegisterMessageCallback( |
+ "extensionLoaderGiveUp", |
+ base::Bind(&ExtensionLoaderHandler::HandleGiveUp, |
Devlin
2014/07/02 17:46:50
Even though we call it give up in the text, let's
gpdavis
2014/07/02 19:13:55
Done.
|
+ 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) { |
@@ -175,16 +224,43 @@ void ExtensionLoaderHandler::HandleLoadUnpacked(const base::ListValue* args) { |
void ExtensionLoaderHandler::HandleRetry(const base::ListValue* args) { |
DCHECK(args->empty()); |
- LoadUnpackedExtensionImpl(failed_path_); |
+ LoadUnpackedExtensionImpl(failed_paths_.back()); |
+ failed_paths_.pop_back(); |
+} |
+ |
+void ExtensionLoaderHandler::HandleGiveUp(const base::ListValue* args) { |
+ DCHECK(args->empty()); |
+ failed_paths_.pop_back(); |
+} |
+ |
+void ExtensionLoaderHandler::HandleSetDisplayLoading( |
+ const base::ListValue* args) { |
+ DCHECK(args->empty()); |
+ display_ready_ = false; |
+} |
+ |
+void ExtensionLoaderHandler::HandleDisplayFailures( |
+ const base::ListValue* args) { |
+ DCHECK(args->empty()); |
+ display_ready_ = true; |
+ |
+ if (failures_.empty()) |
+ return; |
+ |
+ for (size_t i = 0; i < failures_.size(); ++i) { |
+ FailureData* failure = failures_[i]; |
+ NotifyFrontendOfFailure(failure->file_path, |
Devlin
2014/07/02 17:46:50
I'd still like to be able to notify the frontend i
|
+ 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 +271,7 @@ void ExtensionLoaderHandler::LoadUnpackedExtensionImpl( |
void ExtensionLoaderHandler::OnLoadFailure(const base::FilePath& file_path, |
const std::string& error) { |
- failed_path_ = file_path; |
+ failed_paths_.push_back(file_path); |
size_t line = 0u; |
size_t column = 0u; |
std::string regex = |
@@ -227,6 +303,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)); |