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..29ee20474863bc3d0519270d11c4f12b9fdefc6a 100644 |
--- a/chrome/browser/ui/webui/extensions/extension_loader_handler.cc |
+++ b/chrome/browser/ui/webui/extensions/extension_loader_handler.cc |
@@ -12,7 +12,7 @@ |
#include "base/strings/string_util.h" |
#include "base/strings/stringprintf.h" |
#include "base/strings/utf_string_conversions.h" |
-#include "base/values.h" |
+#include "chrome/browser/extensions/path_util.h" |
#include "chrome/browser/extensions/unpacked_installer.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/ui/chrome_select_file_policy.h" |
@@ -131,8 +131,11 @@ void ExtensionLoaderHandler::FileHelper::MultiFilesSelected( |
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,9 +158,13 @@ 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() { |
+ content::WebContentsObserver::Observe(web_ui()->GetWebContents()); |
Finnur
2014/07/14 10:25:58
Do we need to call Observe(NULL) when we are done?
gpdavis
2014/07/14 18:58:19
Done with what, exactly? Done with observing for
Finnur
2014/07/15 10:38:45
Sounds good. Maybe that warrants a comment in the
gpdavis
2014/07/15 18:33:14
Will do!
|
web_ui()->RegisterMessageCallback( |
"extensionLoaderLoadUnpacked", |
base::Bind(&ExtensionLoaderHandler::HandleLoadUnpacked, |
@@ -166,6 +173,14 @@ void ExtensionLoaderHandler::RegisterMessages() { |
"extensionLoaderRetry", |
base::Bind(&ExtensionLoaderHandler::HandleRetry, |
weak_ptr_factory_.GetWeakPtr())); |
+ web_ui()->RegisterMessageCallback( |
+ "extensionLoaderIgnoreFailure", |
+ base::Bind(&ExtensionLoaderHandler::HandleIgnoreFailure, |
+ 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 +190,29 @@ void ExtensionLoaderHandler::HandleLoadUnpacked(const base::ListValue* args) { |
void ExtensionLoaderHandler::HandleRetry(const base::ListValue* args) { |
DCHECK(args->empty()); |
- LoadUnpackedExtensionImpl(failed_path_); |
+ const base::FilePath file_path = failed_paths_.back(); |
+ failed_paths_.pop_back(); |
+ LoadUnpackedExtensionImpl(file_path); |
Finnur
2014/07/14 10:25:58
This got me thinking... If I have two failures (ex
gpdavis
2014/07/14 18:58:19
Yes, that is the current functionality. The "Retr
Finnur
2014/07/15 10:38:45
I see. That's good.
|
+} |
+ |
+void ExtensionLoaderHandler::HandleIgnoreFailure(const base::ListValue* args) { |
+ DCHECK(args->empty()); |
+ failed_paths_.pop_back(); |
Finnur
2014/07/14 10:25:58
Similar argument here. Two failures: Should Ignore
gpdavis
2014/07/14 18:58:19
I guess that's more of a design question for you g
Finnur
2014/07/15 10:38:45
Yeah, that's fine.
Devlin
2014/07/15 17:51:44
Just a reminder: There are only multiple failures
|
+} |
+ |
+void ExtensionLoaderHandler::HandleDisplayFailures( |
+ const base::ListValue* args) { |
+ DCHECK(args->empty()); |
+ display_ready_ = true; |
+ |
+ if (!failures_.empty()) |
+ NotifyFrontendOfFailure(); |
} |
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 +223,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 = |
@@ -215,32 +242,51 @@ void ExtensionLoaderHandler::OnLoadFailure(const base::FilePath& file_path, |
content::BrowserThread::GetBlockingPool(), |
FROM_HERE, |
base::Bind(&ReadFileToString, file_path.Append(kManifestFilename)), |
- base::Bind(&ExtensionLoaderHandler::NotifyFrontendOfFailure, |
+ base::Bind(&ExtensionLoaderHandler::AddFailure, |
weak_ptr_factory_.GetWeakPtr(), |
file_path, |
error, |
line)); |
} |
-void ExtensionLoaderHandler::NotifyFrontendOfFailure( |
+void ExtensionLoaderHandler::DidStartNavigationToPendingEntry( |
+ const GURL& url, |
+ content::NavigationController::ReloadType reload_type) { |
+ if (reload_type != content::NavigationController::NO_RELOAD) |
+ display_ready_ = false; |
+} |
+ |
+void ExtensionLoaderHandler::AddFailure( |
const base::FilePath& file_path, |
const std::string& error, |
size_t line_number, |
const std::string& manifest) { |
- base::StringValue file_value(file_path.LossyDisplayName()); |
- base::StringValue error_value(base::UTF8ToUTF16(error)); |
+ failed_paths_.push_back(file_path); |
+ base::FilePath prettified_path = path_util::PrettifyPath(file_path); |
- base::DictionaryValue manifest_value; |
+ scoped_ptr<base::DictionaryValue> manifest_value(new base::DictionaryValue()); |
SourceHighlighter highlighter(manifest, line_number); |
// If the line number is 0, this highlights no regions, but still adds the |
// full manifest. |
- highlighter.SetHighlightedRegions(&manifest_value); |
+ highlighter.SetHighlightedRegions(manifest_value.get()); |
+ |
+ scoped_ptr<base::DictionaryValue> failure(new base::DictionaryValue()); |
+ failure->Set("path", |
+ new base::StringValue(prettified_path.LossyDisplayName())); |
+ failure->Set("error", new base::StringValue(base::UTF8ToUTF16(error))); |
+ failure->Set("manifest", manifest_value.release()); |
+ failures_.Append(failure.release()); |
+ |
+ // Only notify the frontend if the display is ready. |
+ if (display_ready_) |
+ NotifyFrontendOfFailure(); |
+} |
+void ExtensionLoaderHandler::NotifyFrontendOfFailure() { |
web_ui()->CallJavascriptFunction( |
"extensions.ExtensionLoader.notifyLoadFailed", |
- file_value, |
- error_value, |
- manifest_value); |
+ failures_); |
+ failures_.Clear(); |
} |
} // namespace extensions |