1 // Copyright (c) 2006-2009 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/logging.h" 10 #include "base/message_loop.h" 11 #include "base/utf_string_conversions.h" 12 #include "chrome/browser/platform_util.h" 13 14 // No AddRef required when using ExtensionErrorReporter with RunnableMethod. 15 // This is okay since the ExtensionErrorReporter is a singleton that lives until 16 // the end of the process. 17 DISABLE_RUNNABLE_METHOD_REFCOUNT(ExtensionErrorReporter); 18 19 ExtensionErrorReporter* ExtensionErrorReporter::instance_ = NULL; 20 21 // static Init(bool enable_noisy_errors)22void ExtensionErrorReporter::Init(bool enable_noisy_errors) { 23 if (!instance_) { 24 instance_ = new ExtensionErrorReporter(enable_noisy_errors); 25 } 26 } 27 28 // static GetInstance()29ExtensionErrorReporter* ExtensionErrorReporter::GetInstance() { 30 CHECK(instance_) << "Init() was never called"; 31 return instance_; 32 } 33 ExtensionErrorReporter(bool enable_noisy_errors)34ExtensionErrorReporter::ExtensionErrorReporter(bool enable_noisy_errors) 35 : ui_loop_(MessageLoop::current()), 36 enable_noisy_errors_(enable_noisy_errors) { 37 } 38 ~ExtensionErrorReporter()39ExtensionErrorReporter::~ExtensionErrorReporter() {} 40 ReportError(const std::string & message,bool be_noisy)41void ExtensionErrorReporter::ReportError(const std::string& message, 42 bool be_noisy) { 43 // NOTE: There won't be a ui_loop_ in the unit test environment. 44 if (ui_loop_ && MessageLoop::current() != ui_loop_) { 45 ui_loop_->PostTask(FROM_HERE, 46 NewRunnableMethod(this, &ExtensionErrorReporter::ReportError, message, 47 be_noisy)); 48 return; 49 } 50 51 errors_.push_back(message); 52 53 // TODO(aa): Print the error message out somewhere better. I think we are 54 // going to need some sort of 'extension inspector'. 55 LOG(ERROR) << "Extension error: " << message; 56 57 if (enable_noisy_errors_ && be_noisy) { 58 platform_util::SimpleErrorBox(NULL, 59 UTF8ToUTF16("Extension error"), 60 UTF8ToUTF16(message)); 61 } 62 } 63 GetErrors()64const std::vector<std::string>* ExtensionErrorReporter::GetErrors() { 65 return &errors_; 66 } 67 ClearErrors()68void ExtensionErrorReporter::ClearErrors() { 69 errors_.clear(); 70 } 71