Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1426)

Unified Diff: chrome/browser/ui/webui/extensions/extension_loader_handler.cc

Issue 342003005: Show alert failure for reloading unpacked extensions with bad manifest (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Synchronized page loading, support multiple load errors Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..97ec4d318a3dfb7cd3bd326790c7cb43843046bb 100644
--- a/chrome/browser/ui/webui/extensions/extension_loader_handler.cc
+++ b/chrome/browser/ui/webui/extensions/extension_loader_handler.cc
@@ -128,11 +128,31 @@ void ExtensionLoaderHandler::FileHelper::MultiFilesSelected(
NOTREACHED();
}
+// Class to hold failure data when NotifyFrontendOfFailure is called before
+// the extensions page is fully loaded.
+class ExtensionLoaderHandler::FailureData {
+ public:
Devlin 2014/06/27 22:31:10 fix indentation.
gpdavis 2014/06/28 02:31:18 Done.
+ explicit FailureData(base::FilePath path, std::string error,
Devlin 2014/06/27 22:31:09 nit: one param per line.
Devlin 2014/06/27 22:31:10 const & on non-simple arguments.
gpdavis 2014/06/28 02:31:18 Done.
gpdavis 2014/06/28 02:31:18 Done.
+ size_t line, std::string manifest)
+ : file_path(path),
+ error(error),
+ line_number(line),
+ manifest(manifest) {}
+
+ base::FilePath file_path;
Devlin 2014/06/27 22:31:09 entirely public classes are what structs are for ;
gpdavis 2014/06/27 23:42:54 That was what I started with, but I wasn't sure if
Devlin 2014/06/28 08:40:02 A couple of C++ finer points: - A vector of struct
+ std::string error;
+ size_t line_number;
+ std::string manifest;
+};
+
ExtensionLoaderHandler::ExtensionLoaderHandler(Profile* profile)
: profile_(profile),
file_helper_(new FileHelper(this)),
- weak_ptr_factory_(this) {
+ weak_ptr_factory_(this),
Devlin 2014/06/27 22:31:09 weak_ptr_factory_ should be the final data member.
gpdavis 2014/06/28 02:31:18 Done.
+ extension_error_reporter_observer_(this),
+ display_ready_(false) {
DCHECK(profile_);
+ extension_error_reporter_observer_.Add(ExtensionErrorReporter::GetInstance());
}
ExtensionLoaderHandler::~ExtensionLoaderHandler() {
@@ -166,6 +186,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) {
@@ -178,18 +206,45 @@ void ExtensionLoaderHandler::HandleRetry(const base::ListValue* args) {
LoadUnpackedExtensionImpl(failed_path_);
}
+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()) {
Devlin 2014/06/27 22:31:09 instead of: function { if (condition) { <lot
gpdavis 2014/06/27 23:42:54 That is indeed much better. Will fix (y)
gpdavis 2014/06/28 02:31:18 Done.
+ FailureData *failure = failures_[0];
Devlin 2014/06/27 22:31:09 nit: FailureData* failure
gpdavis 2014/06/28 02:31:18 Done.
+ NotifyFrontendOfFailure(failure->file_path, failure->error,
Devlin 2014/06/27 22:31:09 one arg per line.
gpdavis 2014/06/28 02:31:18 Done.
+ failure->line_number, failure->manifest);
+
+ std::string list("Additional failures:");
Devlin 2014/06/27 22:31:09 This needs to be i18n.
gpdavis 2014/06/28 02:31:18 Could you elaborate a little on this? I looked up
Devlin 2014/06/28 08:40:02 Ah, sorry :) i18n = internationalization. (See w
+ for (size_t i = 1; i < failures_.size(); i++) {
Devlin 2014/06/27 22:31:09 ++i.
gpdavis 2014/06/28 02:31:18 Done.
+ FailureData *failure = failures_[i];
+ list.append("\n");
+ list.append(failure->file_path.value());
Devlin 2014/06/27 22:31:10 Use one of the display functions in FilePath.
gpdavis 2014/06/27 23:42:54 Sounds good. LossyDisplayName seem reasonable?
Devlin 2014/06/28 08:40:02 Yep!
+ }
+ failures_.clear();
Devlin 2014/06/27 22:31:09 Gaaah! Leaaaaaaak! ;) But really. Leaks are bad
gpdavis 2014/06/27 23:42:54 I had a feeling there was going to be a memory lea
Devlin 2014/06/28 08:40:02 For vectors, take a look at scoped_vector.h. Hand
+ base::StringValue list_value(list);
+ web_ui()->CallJavascriptFunction(
+ "extensions.ExtensionLoader.notifyAdditional",
+ list_value);
Devlin 2014/06/27 22:31:09 If we go with this approach for multi errors, I th
gpdavis 2014/06/27 23:42:54 This is certainly going to require heavier UI adju
Devlin 2014/06/28 08:40:02 Sure, I'm not too worried about it. But the only
+ }
+}
+
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.
installer->set_be_noisy_on_failure(false);
+ display_ready_ = true;
Devlin 2014/06/27 22:31:10 This seems like an odd time to set |display_ready_
gpdavis 2014/06/28 02:31:18 Done.
installer->Load(file_path);
}
@@ -227,6 +282,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));
@@ -241,6 +305,7 @@ void ExtensionLoaderHandler::NotifyFrontendOfFailure(
file_value,
error_value,
manifest_value);
+ display_ready_ = false;
Devlin 2014/06/27 22:31:09 This too seems like an odd time to set display rea
gpdavis 2014/06/27 23:42:54 This was initially done because I started off impl
gpdavis 2014/06/28 02:31:18 Done.
}
} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698