error_console_unittest.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// Copyright 2013 The Chromium Authors. All rights reserved.
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// Use of this source code is governed by a BSD-style license that can be
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// found in the LICENSE file.
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "chrome/browser/extensions/error_console/error_console.h"
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "base/logging.h"
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "base/memory/ref_counted.h"
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "base/memory/scoped_ptr.h"
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "base/prefs/pref_service.h"
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "base/strings/string_number_conversions.h"
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "chrome/common/extensions/features/feature_channel.h"
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "chrome/common/pref_names.h"
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "chrome/test/base/testing_profile.h"
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "components/crx_file/id_util.h"
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "extensions/browser/extension_error.h"
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "extensions/browser/extension_error_test_util.h"
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "extensions/browser/extension_registry.h"
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "extensions/common/constants.h"
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "extensions/common/extension_builder.h"
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "extensions/common/feature_switch.h"
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "extensions/common/value_builder.h"
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "testing/gtest/include/gtest/gtest.h"
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectnamespace extensions {
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectusing error_test_util::CreateNewManifestError;
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectusing error_test_util::CreateNewRuntimeError;
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclass ErrorConsoleUnitTest : public testing::Test {
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project public:
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  ErrorConsoleUnitTest() : error_console_(NULL) { }
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  virtual ~ErrorConsoleUnitTest() { }
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  virtual void SetUp() OVERRIDE {
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    testing::Test::SetUp();
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // Errors are only kept if we have the FeatureSwitch and have Developer Mode
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // enabled.
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    FeatureSwitch::error_console()->SetOverrideValue(
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        FeatureSwitch::OVERRIDE_ENABLED);
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    profile_.reset(new TestingProfile);
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    profile_->GetPrefs()->SetBoolean(prefs::kExtensionsUIDeveloperMode, true);
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    error_console_ = ErrorConsole::Get(profile_.get());
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project protected:
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  scoped_ptr<TestingProfile> profile_;
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  ErrorConsole* error_console_;
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// Test that the error console is enabled/disabled appropriately.
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectTEST_F(ErrorConsoleUnitTest, EnableAndDisableErrorConsole) {
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // Start in Dev Channel, without the feature switch.
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  scoped_ptr<ScopedCurrentChannel> channel_override(
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      new ScopedCurrentChannel(chrome::VersionInfo::CHANNEL_DEV));
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  ASSERT_EQ(chrome::VersionInfo::CHANNEL_DEV, GetCurrentChannel());
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  FeatureSwitch::error_console()->SetOverrideValue(
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      FeatureSwitch::OVERRIDE_DISABLED);
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
61e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu  // At the start, the error console should be enabled, and specifically
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // enabled for the chrome:extensions page.
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_TRUE(error_console_->enabled());
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_TRUE(error_console_->IsEnabledForChromeExtensionsPage());
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_FALSE(error_console_->IsEnabledForAppsDeveloperTools());
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // If we disable developer mode, we should disable error console.
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  profile_->GetPrefs()->SetBoolean(prefs::kExtensionsUIDeveloperMode, false);
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_FALSE(error_console_->enabled());
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_FALSE(error_console_->IsEnabledForChromeExtensionsPage());
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_FALSE(error_console_->IsEnabledForAppsDeveloperTools());
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // Similarly, if we change the current to less fun than Dev, ErrorConsole
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // should be disabled.
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  channel_override.reset();
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  channel_override.reset(
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      new ScopedCurrentChannel(chrome::VersionInfo::CHANNEL_BETA));
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  profile_->GetPrefs()->SetBoolean(prefs::kExtensionsUIDeveloperMode, true);
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_FALSE(error_console_->enabled());
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_FALSE(error_console_->IsEnabledForChromeExtensionsPage());
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_FALSE(error_console_->IsEnabledForAppsDeveloperTools());
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // But if we add the feature switch, that should override the channel.
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  FeatureSwitch::error_console()->SetOverrideValue(
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      FeatureSwitch::OVERRIDE_ENABLED);
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  ASSERT_TRUE(FeatureSwitch::error_console()->IsEnabled());
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // We use a pref mod to "poke" the ErrorConsole, because it needs an
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // indication that something changed (FeatureSwitches don't change in a real
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // environment, so ErrorConsole doesn't listen for them).
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  profile_->GetPrefs()->SetBoolean(prefs::kExtensionsUIDeveloperMode, false);
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  profile_->GetPrefs()->SetBoolean(prefs::kExtensionsUIDeveloperMode, true);
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_TRUE(error_console_->enabled());
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_TRUE(error_console_->IsEnabledForChromeExtensionsPage());
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_FALSE(error_console_->IsEnabledForAppsDeveloperTools());
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // Next, remove the feature switch (turning error console off), and install
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // the Apps Developer Tools. If we have Apps Developer Tools, Error Console
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // should be enabled by default.
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  FeatureSwitch::error_console()->SetOverrideValue(
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      FeatureSwitch::OVERRIDE_DISABLED);
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  const char kAppsDeveloperToolsExtensionId[] =
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      "ohmmkhmmmpcnpikjeljgnaoabkaalbgc";
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  scoped_refptr<Extension> adt =
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      ExtensionBuilder()
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project          .SetManifest(
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project              DictionaryBuilder().Set("name", "apps dev tools")
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                 .Set("version", "0.2.0")
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                 .Set("manifest_version", 2)
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                 .Build())
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project          .SetID(kAppsDeveloperToolsExtensionId)
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project          .Build();
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  ExtensionRegistry* registry = ExtensionRegistry::Get(profile_.get());
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  registry->AddEnabled(adt);
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  registry->TriggerOnLoaded(adt);
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_TRUE(error_console_->enabled());
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_FALSE(error_console_->IsEnabledForChromeExtensionsPage());
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_TRUE(error_console_->IsEnabledForAppsDeveloperTools());
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // Unloading the Apps Developer Tools should disable error console.
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  registry->RemoveEnabled(adt->id());
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  registry->TriggerOnUnloaded(adt, UnloadedExtensionInfo::REASON_DISABLE);
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_FALSE(error_console_->enabled());
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_FALSE(error_console_->IsEnabledForChromeExtensionsPage());
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_FALSE(error_console_->IsEnabledForAppsDeveloperTools());
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// Test that errors are successfully reported. This is a simple test, since it
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// is tested more thoroughly in extensions/browser/error_map_unittest.cc
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectTEST_F(ErrorConsoleUnitTest, ReportErrors) {
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  const size_t kNumTotalErrors = 6;
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  const std::string kId = crx_file::id_util::GenerateId("id");
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  error_console_->set_default_reporting_for_test(ExtensionError::MANIFEST_ERROR,
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                                 true);
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  ASSERT_EQ(0u, error_console_->GetErrorsForExtension(kId).size());
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  for (size_t i = 0; i < kNumTotalErrors; ++i) {
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    error_console_->ReportError(
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        CreateNewManifestError(kId, base::UintToString(i)));
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  ASSERT_EQ(kNumTotalErrors, error_console_->GetErrorsForExtension(kId).size());
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectTEST_F(ErrorConsoleUnitTest, DontStoreErrorsWithoutEnablingType) {
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // Disable default runtime error reporting, and enable default manifest error
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // reporting.
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  error_console_->set_default_reporting_for_test(ExtensionError::RUNTIME_ERROR,
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                                 false);
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  error_console_->set_default_reporting_for_test(ExtensionError::MANIFEST_ERROR,
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                                 true);
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  const std::string kId = crx_file::id_util::GenerateId("id");
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // Try to report a runtime error - it should be ignored.
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  error_console_->ReportError(CreateNewRuntimeError(kId, "a"));
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  ASSERT_EQ(0u, error_console_->GetErrorsForExtension(kId).size());
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // Check that manifest errors are reported successfully.
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  error_console_->ReportError(CreateNewManifestError(kId, "b"));
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  ASSERT_EQ(1u, error_console_->GetErrorsForExtension(kId).size());
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // We should still ignore runtime errors.
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  error_console_->ReportError(CreateNewRuntimeError(kId, "c"));
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  ASSERT_EQ(1u, error_console_->GetErrorsForExtension(kId).size());
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // Enable runtime errors specifically for this extension, and disable the use
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // of the default mask.
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  error_console_->SetReportingForExtension(
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      kId, ExtensionError::RUNTIME_ERROR, true);
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // We should now accept runtime and manifest errors.
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  error_console_->ReportError(CreateNewManifestError(kId, "d"));
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  ASSERT_EQ(2u, error_console_->GetErrorsForExtension(kId).size());
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  error_console_->ReportError(CreateNewRuntimeError(kId, "e"));
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  ASSERT_EQ(3u, error_console_->GetErrorsForExtension(kId).size());
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // All other extensions should still use the default mask, and ignore runtime
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // errors but report manifest errors.
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  const std::string kId2 = crx_file::id_util::GenerateId("id2");
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  error_console_->ReportError(CreateNewRuntimeError(kId2, "f"));
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  ASSERT_EQ(0u, error_console_->GetErrorsForExtension(kId2).size());
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  error_console_->ReportError(CreateNewManifestError(kId2, "g"));
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  ASSERT_EQ(1u, error_console_->GetErrorsForExtension(kId2).size());
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // By reverting to default reporting, we should again allow manifest errors,
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // but not runtime errors.
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  error_console_->UseDefaultReportingForExtension(kId);
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  error_console_->ReportError(CreateNewManifestError(kId, "h"));
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  ASSERT_EQ(4u, error_console_->GetErrorsForExtension(kId).size());
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  error_console_->ReportError(CreateNewRuntimeError(kId, "i"));
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  ASSERT_EQ(4u, error_console_->GetErrorsForExtension(kId).size());
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// Test that we only store errors by default for unpacked extensions, and that
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// assigning a preference to any extension overrides the defaults.
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectTEST_F(ErrorConsoleUnitTest, TestDefaultStoringPrefs) {
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // For this, we need actual extensions.
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  scoped_refptr<const Extension> unpacked_extension =
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      ExtensionBuilder()
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project          .SetManifest(DictionaryBuilder()
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                           .Set("name", "unpacked")
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                           .Set("version", "0.0.1")
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                           .Set("manifest_version", 2)
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                           .Build())
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project          .SetLocation(Manifest::UNPACKED)
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project          .SetID(crx_file::id_util::GenerateId("unpacked"))
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project          .Build();
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  scoped_refptr<const Extension> packed_extension =
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      ExtensionBuilder()
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project          .SetManifest(DictionaryBuilder()
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                           .Set("name", "packed")
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                           .Set("version", "0.0.1")
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                           .Set("manifest_version", 2)
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                           .Build())
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project          .SetLocation(Manifest::INTERNAL)
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project          .SetID(crx_file::id_util::GenerateId("packed"))
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project          .Build();
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  ExtensionRegistry* registry = ExtensionRegistry::Get(profile_.get());
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  registry->AddEnabled(unpacked_extension);
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  registry->AddEnabled(packed_extension);
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // We should start with a clean slate.
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_EQ(0u, error_console_->GetErrorsForExtension(
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      unpacked_extension->id()).size());
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_EQ(0u, error_console_->GetErrorsForExtension(
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      packed_extension->id()).size());
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // Errors should be ignored by default for the packed extension.
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  error_console_->ReportError(
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      CreateNewManifestError(packed_extension->id(), "manifest error 1"));
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  error_console_->ReportError(
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      CreateNewRuntimeError(packed_extension->id(), "runtime error 1"));
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_EQ(0u, error_console_->GetErrorsForExtension(
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      packed_extension->id()).size());
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // Also check that reporting settings are correctly returned.
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_FALSE(error_console_->IsReportingEnabledForExtension(
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      packed_extension->id()));
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // Errors should be reported by default for the unpacked extension.
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  error_console_->ReportError(
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      CreateNewManifestError(unpacked_extension->id(), "manifest error 2"));
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  error_console_->ReportError(
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      CreateNewRuntimeError(unpacked_extension->id(), "runtime error 2"));
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_EQ(2u, error_console_->GetErrorsForExtension(
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      unpacked_extension->id()).size());
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // Also check that reporting settings are correctly returned.
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_TRUE(error_console_->IsReportingEnabledForExtension(
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      unpacked_extension->id()));
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // Registering a preference should override this for both types of extensions
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // (should be able to enable errors for packed, or disable errors for
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  // unpacked).
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  error_console_->SetReportingForExtension(packed_extension->id(),
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                           ExtensionError::RUNTIME_ERROR,
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                           true);
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  error_console_->ReportError(
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      CreateNewRuntimeError(packed_extension->id(), "runtime error 3"));
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_EQ(1u, error_console_->GetErrorsForExtension(
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      packed_extension->id()).size());
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_TRUE(error_console_->IsReportingEnabledForExtension(
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      packed_extension->id()));
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  error_console_->SetReportingForExtension(unpacked_extension->id(),
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                           ExtensionError::RUNTIME_ERROR,
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                           false);
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  error_console_->ReportError(
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      CreateNewRuntimeError(packed_extension->id(), "runtime error 4"));
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_EQ(2u,  // We should still have the first two errors.
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            error_console_->GetErrorsForExtension(
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                unpacked_extension->id()).size());
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  EXPECT_FALSE(error_console_->IsReportingEnabledForExtension(
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      unpacked_extension->id()));
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}  // namespace extensions
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project