1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/extensions/crx_installer.h"
6#include "chrome/browser/extensions/extension_browsertest.h"
7#include "chrome/browser/extensions/extension_service.h"
8#include "chrome/browser/extensions/extension_util.h"
9#include "chrome/browser/profiles/profile.h"
10#include "chrome/browser/ui/browser_commands.h"
11#include "chrome/test/base/ui_test_utils.h"
12#include "content/public/browser/notification_service.h"
13#include "extensions/browser/extension_system.h"
14#include "extensions/browser/notification_types.h"
15
16namespace extensions {
17
18class ExtensionFunctionalTest : public ExtensionBrowserTest {
19 public:
20  void InstallExtensionSilently(ExtensionService* service,
21                                const char* filename) {
22    service->set_show_extensions_prompts(false);
23    size_t num_before = service->extensions()->size();
24
25    base::FilePath path = test_data_dir_.AppendASCII(filename);
26
27    content::WindowedNotificationObserver extension_loaded_observer(
28        extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED,
29        content::NotificationService::AllSources());
30
31    scoped_refptr<extensions::CrxInstaller> installer(
32        extensions::CrxInstaller::CreateSilent(service));
33    installer->set_is_gallery_install(false);
34    installer->set_allow_silent_install(true);
35    installer->set_install_source(Manifest::INTERNAL);
36    installer->set_off_store_install_allow_reason(
37        extensions::CrxInstaller::OffStoreInstallAllowedInTest);
38
39    observer_->Watch(
40        extensions::NOTIFICATION_CRX_INSTALLER_DONE,
41        content::Source<extensions::CrxInstaller>(installer.get()));
42
43    installer->InstallCrx(path);
44    observer_->Wait();
45
46    size_t num_after = service->extensions()->size();
47    EXPECT_EQ(num_before + 1, num_after);
48
49    extension_loaded_observer.Wait();
50    const Extension* extension = service->GetExtensionById(
51        last_loaded_extension_id(), false);
52    EXPECT_TRUE(extension != NULL);
53  }
54
55  ExtensionService* GetExtensionService() {
56    return ExtensionSystem::Get(profile())->extension_service();
57  }
58};
59
60IN_PROC_BROWSER_TEST_F(ExtensionFunctionalTest,
61                       PRE_TestAdblockExtensionCrash) {
62  InstallExtensionSilently(GetExtensionService(), "adblock.crx");
63}
64
65// Timing out on XP and Vista: http://crbug.com/387866
66#if defined(OS_WIN)
67#define MAYBE_TestAdblockExtensionCrash DISABLED_TestAdblockExtensionCrash
68#else
69#define MAYBE_TestAdblockExtensionCrash TestAdblockExtensionCrash
70#endif
71IN_PROC_BROWSER_TEST_F(ExtensionFunctionalTest,
72                       MAYBE_TestAdblockExtensionCrash) {
73  ExtensionService* service = GetExtensionService();
74  // Verify that the extension is enabled and allowed in incognito
75  // is disabled.
76  EXPECT_TRUE(service->IsExtensionEnabled(last_loaded_extension_id()));
77  EXPECT_FALSE(util::IsIncognitoEnabled(last_loaded_extension_id(), profile()));
78}
79
80// Failing on XP: http://crbug.com/389545
81#if defined(OS_WIN)
82#define MAYBE_TestSetExtensionsState DISABLED_TestSetExtensionsState
83#else
84#define MAYBE_TestSetExtensionsState TestSetExtensionsState
85#endif
86IN_PROC_BROWSER_TEST_F(ExtensionFunctionalTest, MAYBE_TestSetExtensionsState) {
87  InstallExtensionSilently(GetExtensionService(), "google_talk.crx");
88
89  // Disable the extension and verify.
90  util::SetIsIncognitoEnabled(last_loaded_extension_id(), profile(), false);
91  ExtensionService* service = GetExtensionService();
92  service->DisableExtension(last_loaded_extension_id(),
93                            Extension::DISABLE_USER_ACTION);
94  EXPECT_FALSE(service->IsExtensionEnabled(last_loaded_extension_id()));
95
96  // Enable the extension and verify.
97  util::SetIsIncognitoEnabled(last_loaded_extension_id(), profile(), false);
98  service->EnableExtension(last_loaded_extension_id());
99  EXPECT_TRUE(service->IsExtensionEnabled(last_loaded_extension_id()));
100
101  // Allow extension in incognito mode and verify.
102  service->EnableExtension(last_loaded_extension_id());
103  util::SetIsIncognitoEnabled(last_loaded_extension_id(), profile(), true);
104  EXPECT_TRUE(util::IsIncognitoEnabled(last_loaded_extension_id(), profile()));
105
106  // Disallow extension in incognito mode and verify.
107  service->EnableExtension(last_loaded_extension_id());
108  util::SetIsIncognitoEnabled(last_loaded_extension_id(), profile(), false);
109  EXPECT_FALSE(util::IsIncognitoEnabled(last_loaded_extension_id(), profile()));
110}
111}  // namespace extensions
112