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