1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// found in the LICENSE file.
4c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/memory/ref_counted.h"
6c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/extensions/extension_error_controller.h"
7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/extensions/extension_error_ui.h"
8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/extensions/extension_service.h"
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/extensions/extension_service_test_base.h"
10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/profiles/profile.h"
11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/test/base/testing_profile.h"
12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/browser/extension_prefs.h"
13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/browser/extension_registry.h"
14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/extension.h"
15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/extension_builder.h"
16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/value_builder.h"
17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace extensions {
19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace {
21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Create a mock for the UI component of the error alert that is shown for
23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// blacklisted extensions. This allows us to test which extensions the alert
24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// is showing, and also eliminates the UI component (since this is a unit
25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// test).
26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass MockExtensionErrorUI : public ExtensionErrorUI {
27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public:
28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  explicit MockExtensionErrorUI(ExtensionErrorUI::Delegate* delegate);
29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual ~MockExtensionErrorUI();
30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Wrappers around the similar methods in ExtensionErrorUI.
32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void CloseUI();
33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void Accept();
34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void Details();
35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ExtensionErrorUI::Delegate* delegate() { return delegate_; }
37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private:
39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // ExtensionErrorUI implementation.
40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual bool ShowErrorInBubbleView() OVERRIDE;
41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void ShowExtensions() OVERRIDE;
42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void Close() OVERRIDE;
43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Keep a copy of the delegate around for ourselves.
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ExtensionErrorUI::Delegate* delegate_;
46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// We use this as a slight hack to get the created Error UI, if any. We should
49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// only ever have one (since this is a single-profile test), and this avoids
50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// the need for any kind of accessor to the ErrorController from
51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// ExtensionService.
52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochMockExtensionErrorUI* g_error_ui = NULL;
53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochMockExtensionErrorUI::MockExtensionErrorUI(
55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ExtensionErrorUI::Delegate* delegate)
56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    : ExtensionErrorUI(delegate),
57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      delegate_(delegate) {
58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // We should never make more than one of these in a test.
59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  DCHECK(!g_error_ui);
60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  g_error_ui = this;
61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochMockExtensionErrorUI::~MockExtensionErrorUI() {
64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  g_error_ui = NULL;
65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid MockExtensionErrorUI::CloseUI() {
68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  BubbleViewDidClose();
69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid MockExtensionErrorUI::Accept() {
72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  BubbleViewAcceptButtonPressed();
73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid MockExtensionErrorUI::Details() {
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  BubbleViewCancelButtonPressed();
77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool MockExtensionErrorUI::ShowErrorInBubbleView() {
80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return true;
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid MockExtensionErrorUI::ShowExtensions() {}
84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid MockExtensionErrorUI::Close() {
86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  CloseUI();
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochExtensionErrorUI* CreateMockUI(ExtensionErrorUI::Delegate* delegate) {
90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return new MockExtensionErrorUI(delegate);
91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Builds and returns a simple extension.
94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochscoped_refptr<const Extension> BuildExtension() {
95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return ExtensionBuilder()
96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      .SetManifest(DictionaryBuilder().Set("name", "My Wonderful Extension")
97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                      .Set("version", "0.1.1.0")
98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                      .Set("manifest_version", 2)
99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                      .Build())
100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      .Build();
101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}  // namespace
104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass ExtensionErrorControllerUnitTest : public ExtensionServiceTestBase {
106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected:
107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void SetUp() OVERRIDE;
108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Add an extension to chrome, and mark it as blacklisted in the prefs.
110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  testing::AssertionResult AddBlacklistedExtension(const Extension* extension);
111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Return the ExtensionPrefs associated with the test.
113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ExtensionPrefs* GetPrefs();
114c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
115c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  Profile* profile() { return profile_.get(); }
116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
118c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid ExtensionErrorControllerUnitTest::SetUp() {
119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ExtensionServiceTestBase::SetUp();
120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Make sure we use the mock UI instead of the real UI.
121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ExtensionErrorController::SetUICreateMethodForTesting(CreateMockUI);
122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // We don't want a first-run ExtensionService, since we ignore warnings
124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // for new profiles.
125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ExtensionServiceInitParams params = CreateDefaultInitParams();
126c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  params.is_first_run = false;
127c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  InitializeExtensionService(params);
128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
129c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
130c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochtesting::AssertionResult
131c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochExtensionErrorControllerUnitTest::AddBlacklistedExtension(
132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const Extension* extension) {
133c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  GetPrefs()->SetExtensionBlacklisted(extension->id(), true);
134c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  service_->AddExtension(extension);
135c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
136c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Make sure the extension is added to the blacklisted set.
137c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!ExtensionRegistry::Get(profile())->blacklisted_extensions()
138c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          .Contains(extension->id())) {
139c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return testing::AssertionFailure()
140c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        << "Failed to add blacklisted extension.";
141c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
142c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
143c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return testing::AssertionSuccess();
144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
145c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochExtensionPrefs* ExtensionErrorControllerUnitTest::GetPrefs() {
147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return ExtensionPrefs::Get(profile());
148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Test that closing the extension alert for blacklisted extensions counts
151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// as acknowledging them in the prefs.
152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(ExtensionErrorControllerUnitTest, ClosingAcknowledgesBlacklisted) {
153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Add a blacklisted extension.
154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<const Extension> extension = BuildExtension();
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(AddBlacklistedExtension(extension.get()));
156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  service_->Init();
158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Make sure that we created an error "ui" to warn about the blacklisted
160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // extension.
161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_TRUE(g_error_ui);
162c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ExtensionErrorUI::Delegate* delegate = g_error_ui->delegate();
163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_TRUE(delegate);
164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
165c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Make sure that the blacklisted extension is reported (and that no other
166c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // extensions are).
167c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const ExtensionSet& delegate_blacklisted_extensions =
168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      delegate->GetBlacklistedExtensions();
169c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(1u, delegate_blacklisted_extensions.size());
170c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(delegate_blacklisted_extensions.Contains(extension->id()));
171c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
172c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Close, and verify that the extension ids now acknowledged.
173c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  g_error_ui->CloseUI();
174c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(GetPrefs()->IsBlacklistedExtensionAcknowledged(extension->id()));
175c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Verify we cleaned up after ourselves.
176c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(g_error_ui);
177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Test that clicking "accept" on the extension alert counts as acknowledging
180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// blacklisted extensions.
181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(ExtensionErrorControllerUnitTest, AcceptingAcknowledgesBlacklisted) {
182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Add a blacklisted extension.
183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<const Extension> extension = BuildExtension();
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(AddBlacklistedExtension(extension.get()));
185c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
186c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  service_->Init();
187c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Make sure that we created an error "ui" to warn about the blacklisted
189c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // extension.
190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_TRUE(g_error_ui);
191c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Accept, and verify that the extension ids now acknowledged.
193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  g_error_ui->Accept();
194c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(GetPrefs()->IsBlacklistedExtensionAcknowledged(extension->id()));
195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Verify we cleaned up after ourselves.
196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(g_error_ui);
197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Test that we don't warn for extensions which are blacklisted, but have
200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// already been acknowledged.
201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(ExtensionErrorControllerUnitTest, DontWarnForAcknowledgedBlacklisted) {
202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<const Extension> extension = BuildExtension();
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(AddBlacklistedExtension(extension.get()));
204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  GetPrefs()->AcknowledgeBlacklistedExtension(extension->id());
206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  service_->Init();
208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // We should never have made an alert, because the extension should already
210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // be acknowledged.
211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_FALSE(g_error_ui);
212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}  // namespace extensions
215