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. 17DISABLE_RUNNABLE_METHOD_REFCOUNT(ExtensionErrorReporter); 18 19ExtensionErrorReporter* ExtensionErrorReporter::instance_ = NULL; 20 21// static 22void ExtensionErrorReporter::Init(bool enable_noisy_errors) { 23 if (!instance_) { 24 instance_ = new ExtensionErrorReporter(enable_noisy_errors); 25 } 26} 27 28// static 29ExtensionErrorReporter* ExtensionErrorReporter::GetInstance() { 30 CHECK(instance_) << "Init() was never called"; 31 return instance_; 32} 33 34ExtensionErrorReporter::ExtensionErrorReporter(bool enable_noisy_errors) 35 : ui_loop_(MessageLoop::current()), 36 enable_noisy_errors_(enable_noisy_errors) { 37} 38 39ExtensionErrorReporter::~ExtensionErrorReporter() {} 40 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 64const std::vector<std::string>* ExtensionErrorReporter::GetErrors() { 65 return &errors_; 66} 67 68void ExtensionErrorReporter::ClearErrors() { 69 errors_.clear(); 70} 71