Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / extension_error_reporter.cc
index eb9b595..8986423 100644 (file)
@@ -8,10 +8,17 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/files/file_path.h"
 #include "base/logging.h"
 #include "base/message_loop/message_loop.h"
+#include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/simple_message_box.h"
+#include "content/public/browser/notification_service.h"
+#include "extensions/browser/notification_types.h"
+#include "grit/generated_resources.h"
+#include "ui/base/l10n/l10n_util.h"
 
 ExtensionErrorReporter* ExtensionErrorReporter::instance_ = NULL;
 
@@ -35,18 +42,34 @@ ExtensionErrorReporter::ExtensionErrorReporter(bool enable_noisy_errors)
 
 ExtensionErrorReporter::~ExtensionErrorReporter() {}
 
+void ExtensionErrorReporter::ReportLoadError(
+    const base::FilePath& extension_path,
+    const std::string& error,
+    content::BrowserContext* browser_context,
+    bool be_noisy) {
+  content::NotificationService::current()->Notify(
+      extensions::NOTIFICATION_EXTENSION_LOAD_ERROR,
+      content::Source<Profile>(Profile::FromBrowserContext(browser_context)),
+      content::Details<const std::string>(&error));
+
+  std::string path_str = base::UTF16ToUTF8(extension_path.LossyDisplayName());
+  base::string16 message = base::UTF8ToUTF16(base::StringPrintf(
+      "%s %s. %s",
+      l10n_util::GetStringUTF8(IDS_EXTENSIONS_LOAD_ERROR_MESSAGE).c_str(),
+      path_str.c_str(),
+      error.c_str()));
+  ReportError(message, be_noisy);
+  FOR_EACH_OBSERVER(Observer,
+                    observers_,
+                    OnLoadFailure(browser_context, extension_path, error));
+}
+
 void ExtensionErrorReporter::ReportError(const base::string16& message,
                                          bool be_noisy) {
   // NOTE: There won't be a ui_loop_ in the unit test environment.
-  if (ui_loop_ && base::MessageLoop::current() != ui_loop_) {
-    // base::Unretained is okay since the ExtensionErrorReporter is a singleton
-    // that lives until the end of the process.
-    ui_loop_->PostTask(FROM_HERE,
-        base::Bind(&ExtensionErrorReporter::ReportError,
-                   base::Unretained(this),
-                   message,
-                   be_noisy));
-    return;
+  if (ui_loop_) {
+    CHECK(base::MessageLoop::current() == ui_loop_)
+        << "ReportError can only be called from the UI thread.";
   }
 
   errors_.push_back(message);
@@ -56,8 +79,11 @@ void ExtensionErrorReporter::ReportError(const base::string16& message,
   LOG(WARNING) << "Extension error: " << message;
 
   if (enable_noisy_errors_ && be_noisy) {
-    chrome::ShowMessageBox(NULL, base::ASCIIToUTF16("Extension error"), message,
-                           chrome::MESSAGE_BOX_TYPE_WARNING);
+    chrome::ShowMessageBox(
+        NULL,
+        l10n_util::GetStringUTF16(IDS_EXTENSIONS_LOAD_ERROR_HEADING),
+        message,
+        chrome::MESSAGE_BOX_TYPE_WARNING);
   }
 }
 
@@ -68,3 +94,11 @@ const std::vector<base::string16>* ExtensionErrorReporter::GetErrors() {
 void ExtensionErrorReporter::ClearErrors() {
   errors_.clear();
 }
+
+void ExtensionErrorReporter::AddObserver(Observer* observer) {
+  observers_.AddObserver(observer);
+}
+
+void ExtensionErrorReporter::RemoveObserver(Observer* observer) {
+  observers_.RemoveObserver(observer);
+}