1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/extensions/extension_error_reporter.h" 6 7 #include "build/build_config.h" 8 9 #include "base/bind.h" 10 #include "base/bind_helpers.h" 11 #include "base/logging.h" 12 #include "base/message_loop/message_loop.h" 13 #include "base/strings/utf_string_conversions.h" 14 #include "chrome/browser/ui/simple_message_box.h" 15 16 ExtensionErrorReporter* ExtensionErrorReporter::instance_ = NULL; 17 18 // static 19 void ExtensionErrorReporter::Init(bool enable_noisy_errors) { 20 if (!instance_) { 21 instance_ = new ExtensionErrorReporter(enable_noisy_errors); 22 } 23 } 24 25 // static 26 ExtensionErrorReporter* ExtensionErrorReporter::GetInstance() { 27 CHECK(instance_) << "Init() was never called"; 28 return instance_; 29 } 30 31 ExtensionErrorReporter::ExtensionErrorReporter(bool enable_noisy_errors) 32 : ui_loop_(base::MessageLoop::current()), 33 enable_noisy_errors_(enable_noisy_errors) { 34 } 35 36 ExtensionErrorReporter::~ExtensionErrorReporter() {} 37 38 void ExtensionErrorReporter::ReportError(const string16& message, 39 bool be_noisy) { 40 // NOTE: There won't be a ui_loop_ in the unit test environment. 41 if (ui_loop_ && base::MessageLoop::current() != ui_loop_) { 42 // base::Unretained is okay since the ExtensionErrorReporter is a singleton 43 // that lives until the end of the process. 44 ui_loop_->PostTask(FROM_HERE, 45 base::Bind(&ExtensionErrorReporter::ReportError, 46 base::Unretained(this), 47 message, 48 be_noisy)); 49 return; 50 } 51 52 errors_.push_back(message); 53 54 // TODO(aa): Print the error message out somewhere better. I think we are 55 // going to need some sort of 'extension inspector'. 56 LOG(ERROR) << "Extension error: " << message; 57 58 if (enable_noisy_errors_ && be_noisy) { 59 chrome::ShowMessageBox(NULL, ASCIIToUTF16("Extension error"), message, 60 chrome::MESSAGE_BOX_TYPE_WARNING); 61 } 62 } 63 64 const std::vector<string16>* ExtensionErrorReporter::GetErrors() { 65 return &errors_; 66 } 67 68 void ExtensionErrorReporter::ClearErrors() { 69 errors_.clear(); 70 } 71