error_console_unittest.cc revision e5d81f57cb97b3b6b7fccc9c5610d21eb81db09d
1558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// found in the LICENSE file.
4558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
5558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/extensions/error_console/error_console.h"
6558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
7ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/logging.h"
8558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/memory/scoped_ptr.h"
9424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/prefs/pref_service.h"
10ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/strings/string_number_conversions.h"
11e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chrome/common/extensions/features/feature_channel.h"
12424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/common/pref_names.h"
13558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/test/base/testing_profile.h"
14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "extensions/browser/extension_error.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_error_test_util.h"
16e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "extensions/browser/extension_registry.h"
17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "extensions/common/constants.h"
18e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "extensions/common/extension_builder.h"
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/feature_switch.h"
20424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "extensions/common/id_util.h"
21e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "extensions/common/value_builder.h"
22558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
23558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
24558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace extensions {
25558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using error_test_util::CreateNewManifestError;
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using error_test_util::CreateNewRuntimeError;
28558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
29558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass ErrorConsoleUnitTest : public testing::Test {
30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch public:
31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ErrorConsoleUnitTest() : error_console_(NULL) { }
32558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  virtual ~ErrorConsoleUnitTest() { }
33558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
34424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
35424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    testing::Test::SetUp();
36424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
37424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // Errors are only kept if we have the FeatureSwitch and have Developer Mode
38424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // enabled.
39424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    FeatureSwitch::error_console()->SetOverrideValue(
40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        FeatureSwitch::OVERRIDE_ENABLED);
41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    profile_.reset(new TestingProfile);
42424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    profile_->GetPrefs()->SetBoolean(prefs::kExtensionsUIDeveloperMode, true);
43424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    error_console_ = ErrorConsole::Get(profile_.get());
44424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
45424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
46558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch protected:
47558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  scoped_ptr<TestingProfile> profile_;
48558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ErrorConsole* error_console_;
49558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch};
50558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
51e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Test that the error console is enabled/disabled appropriately.
52e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochTEST_F(ErrorConsoleUnitTest, EnableAndDisableErrorConsole) {
53e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Start in Dev Channel, without the feature switch.
54e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  scoped_ptr<ScopedCurrentChannel> channel_override(
55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      new ScopedCurrentChannel(chrome::VersionInfo::CHANNEL_DEV));
56e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ASSERT_EQ(chrome::VersionInfo::CHANNEL_DEV, GetCurrentChannel());
57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  FeatureSwitch::error_console()->SetOverrideValue(
58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      FeatureSwitch::OVERRIDE_DISABLED);
59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // At the start, the error console should be enabled, and specifically
61e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // enabled for the chrome:extensions page.
62e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_TRUE(error_console_->enabled());
63e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_TRUE(error_console_->IsEnabledForChromeExtensionsPage());
64e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_FALSE(error_console_->IsEnabledForAppsDeveloperTools());
65e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
66e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // If we disable developer mode, we should disable error console.
67e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  profile_->GetPrefs()->SetBoolean(prefs::kExtensionsUIDeveloperMode, false);
68e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_FALSE(error_console_->enabled());
69e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_FALSE(error_console_->IsEnabledForChromeExtensionsPage());
70e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_FALSE(error_console_->IsEnabledForAppsDeveloperTools());
71e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
72e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Similarly, if we change the current to less fun than Dev, ErrorConsole
73e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // should be disabled.
74e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  channel_override.reset();
75e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  channel_override.reset(
76e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      new ScopedCurrentChannel(chrome::VersionInfo::CHANNEL_BETA));
77e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  profile_->GetPrefs()->SetBoolean(prefs::kExtensionsUIDeveloperMode, true);
78e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_FALSE(error_console_->enabled());
79e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_FALSE(error_console_->IsEnabledForChromeExtensionsPage());
80e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_FALSE(error_console_->IsEnabledForAppsDeveloperTools());
81e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
82e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // But if we add the feature switch, that should override the channel.
83e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  FeatureSwitch::error_console()->SetOverrideValue(
84e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      FeatureSwitch::OVERRIDE_ENABLED);
85e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ASSERT_TRUE(FeatureSwitch::error_console()->IsEnabled());
86e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // We use a pref mod to "poke" the ErrorConsole, because it needs an
87e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // indication that something changed (FeatureSwitches don't change in a real
88e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // environment, so ErrorConsole doesn't listen for them).
89e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  profile_->GetPrefs()->SetBoolean(prefs::kExtensionsUIDeveloperMode, false);
90e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  profile_->GetPrefs()->SetBoolean(prefs::kExtensionsUIDeveloperMode, true);
91e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_TRUE(error_console_->enabled());
92e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_TRUE(error_console_->IsEnabledForChromeExtensionsPage());
93e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_FALSE(error_console_->IsEnabledForAppsDeveloperTools());
94e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
95e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Next, remove the feature switch (turning error console off), and install
96e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // the Apps Developer Tools. If we have Apps Developer Tools, Error Console
97e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // should be enabled by default.
98e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  FeatureSwitch::error_console()->SetOverrideValue(
99e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      FeatureSwitch::OVERRIDE_DISABLED);
100e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  const char kAppsDeveloperToolsExtensionId[] =
101e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      "ohmmkhmmmpcnpikjeljgnaoabkaalbgc";
102e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  scoped_refptr<Extension> adt =
103e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      ExtensionBuilder()
104e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          .SetManifest(
105e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch              DictionaryBuilder().Set("name", "apps dev tools")
106e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                 .Set("version", "0.2.0")
107e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                 .Set("manifest_version", 2)
108e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                 .Build())
109e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          .SetID(kAppsDeveloperToolsExtensionId)
110e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          .Build();
111e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ExtensionRegistry* registry = ExtensionRegistry::Get(profile_.get());
112e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  registry->AddEnabled(adt);
113e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  registry->TriggerOnLoaded(adt);
114e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_TRUE(error_console_->enabled());
115e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_FALSE(error_console_->IsEnabledForChromeExtensionsPage());
116e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_TRUE(error_console_->IsEnabledForAppsDeveloperTools());
117e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
118e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Unloading the Apps Developer Tools should disable error console.
119e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  registry->RemoveEnabled(adt->id());
120e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  registry->TriggerOnUnloaded(adt);
121e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_FALSE(error_console_->enabled());
122e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_FALSE(error_console_->IsEnabledForChromeExtensionsPage());
123e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  EXPECT_FALSE(error_console_->IsEnabledForAppsDeveloperTools());
124e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
125e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test that errors are successfully reported. This is a simple test, since it
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// is tested more thoroughly in extensions/browser/error_map_unittest.cc
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ErrorConsoleUnitTest, ReportErrors) {
129558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  const size_t kNumTotalErrors = 6;
130424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const std::string kId = id_util::GenerateId("id");
131ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(0u, error_console_->GetErrorsForExtension(kId).size());
132ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < kNumTotalErrors; ++i) {
134ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    error_console_->ReportError(
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        CreateNewManifestError(kId, base::UintToString(i)));
136ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(kNumTotalErrors, error_console_->GetErrorsForExtension(kId).size());
139424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
140424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ErrorConsoleUnitTest, DontStoreErrorsWithoutEnablingType) {
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Disable default runtime error reporting.
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_console_->set_default_reporting_for_test(ExtensionError::RUNTIME_ERROR,
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                false);
145424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
146424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const std::string kId = id_util::GenerateId("id");
147424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Try to report a runtime error - it should be ignored.
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_console_->ReportError(CreateNewRuntimeError(kId, "a"));
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(0u, error_console_->GetErrorsForExtension(kId).size());
151424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Check that manifest errors are reported successfully.
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_console_->ReportError(CreateNewManifestError(kId, "b"));
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1u, error_console_->GetErrorsForExtension(kId).size());
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // We should still ignore runtime errors.
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_console_->ReportError(CreateNewRuntimeError(kId, "c"));
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1u, error_console_->GetErrorsForExtension(kId).size());
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Enable runtime errors specifically for this extension, and disable the use
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // of the default mask.
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_console_->SetReportingForExtension(
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kId, ExtensionError::RUNTIME_ERROR, true);
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // We should now accept runtime and manifest errors.
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_console_->ReportError(CreateNewManifestError(kId, "d"));
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(2u, error_console_->GetErrorsForExtension(kId).size());
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_console_->ReportError(CreateNewRuntimeError(kId, "e"));
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(3u, error_console_->GetErrorsForExtension(kId).size());
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // All other extensions should still use the default mask, and ignore runtime
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // errors but report manifest errors.
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::string kId2 = id_util::GenerateId("id2");
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_console_->ReportError(CreateNewRuntimeError(kId2, "f"));
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(0u, error_console_->GetErrorsForExtension(kId2).size());
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_console_->ReportError(CreateNewManifestError(kId2, "g"));
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1u, error_console_->GetErrorsForExtension(kId2).size());
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // By reverting to default reporting, we should again allow manifest errors,
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // but not runtime errors.
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_console_->UseDefaultReportingForExtension(kId);
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_console_->ReportError(CreateNewManifestError(kId, "h"));
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(4u, error_console_->GetErrorsForExtension(kId).size());
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  error_console_->ReportError(CreateNewRuntimeError(kId, "i"));
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(4u, error_console_->GetErrorsForExtension(kId).size());
186558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
187558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
188558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}  // namespace extensions
189