1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/extensions/crx_installer.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h"
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
88bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/extensions/extension_util.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/notification_service.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/extension_system.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/notification_types.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace extensions {
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ExtensionFunctionalTest : public ExtensionBrowserTest {
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void InstallExtensionSilently(ExtensionService* service,
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                const char* filename) {
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    service->set_show_extensions_prompts(false);
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    size_t num_before = service->extensions()->size();
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::FilePath path = test_data_dir_.AppendASCII(filename);
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::WindowedNotificationObserver extension_loaded_observer(
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        extensions::NOTIFICATION_EXTENSION_LOADED_DEPRECATED,
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        content::NotificationService::AllSources());
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<extensions::CrxInstaller> installer(
32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        extensions::CrxInstaller::CreateSilent(service));
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    installer->set_is_gallery_install(false);
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    installer->set_allow_silent_install(true);
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    installer->set_install_source(Manifest::INTERNAL);
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    installer->set_off_store_install_allow_reason(
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        extensions::CrxInstaller::OffStoreInstallAllowedInTest);
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    observer_->Watch(
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        extensions::NOTIFICATION_CRX_INSTALLER_DONE,
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        content::Source<extensions::CrxInstaller>(installer.get()));
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    installer->InstallCrx(path);
448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    observer_->Wait();
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    size_t num_after = service->extensions()->size();
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(num_before + 1, num_after);
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    extension_loaded_observer.Wait();
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const Extension* extension = service->GetExtensionById(
518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        last_loaded_extension_id(), false);
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(extension != NULL);
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExtensionService* GetExtensionService() {
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return ExtensionSystem::Get(profile())->extension_service();
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
603240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochIN_PROC_BROWSER_TEST_F(ExtensionFunctionalTest,
613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                       PRE_TestAdblockExtensionCrash) {
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  InstallExtensionSilently(GetExtensionService(), "adblock.crx");
633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch}
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Timing out on XP and Vista: http://crbug.com/387866
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_WIN)
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_TestAdblockExtensionCrash DISABLED_TestAdblockExtensionCrash
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_TestAdblockExtensionCrash TestAdblockExtensionCrash
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
71116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(ExtensionFunctionalTest,
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       MAYBE_TestAdblockExtensionCrash) {
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExtensionService* service = GetExtensionService();
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Verify that the extension is enabled and allowed in incognito
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // is disabled.
768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(service->IsExtensionEnabled(last_loaded_extension_id()));
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(util::IsIncognitoEnabled(last_loaded_extension_id(), profile()));
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Failing on XP: http://crbug.com/389545
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_WIN)
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_TestSetExtensionsState DISABLED_TestSetExtensionsState
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MAYBE_TestSetExtensionsState TestSetExtensionsState
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
86116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(ExtensionFunctionalTest, MAYBE_TestSetExtensionsState) {
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  InstallExtensionSilently(GetExtensionService(), "google_talk.crx");
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Disable the extension and verify.
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  util::SetIsIncognitoEnabled(last_loaded_extension_id(), profile(), false);
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExtensionService* service = GetExtensionService();
928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  service->DisableExtension(last_loaded_extension_id(),
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            Extension::DISABLE_USER_ACTION);
948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_FALSE(service->IsExtensionEnabled(last_loaded_extension_id()));
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Enable the extension and verify.
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  util::SetIsIncognitoEnabled(last_loaded_extension_id(), profile(), false);
988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  service->EnableExtension(last_loaded_extension_id());
998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(service->IsExtensionEnabled(last_loaded_extension_id()));
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Allow extension in incognito mode and verify.
1028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  service->EnableExtension(last_loaded_extension_id());
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  util::SetIsIncognitoEnabled(last_loaded_extension_id(), profile(), true);
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(util::IsIncognitoEnabled(last_loaded_extension_id(), profile()));
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Disallow extension in incognito mode and verify.
1078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  service->EnableExtension(last_loaded_extension_id());
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  util::SetIsIncognitoEnabled(last_loaded_extension_id(), profile(), false);
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(util::IsIncognitoEnabled(last_loaded_extension_id(), profile()));
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace extensions
112