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