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)
57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/extensions/crx_installer.h"
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
98bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/extensions/extension_util.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/notification_service.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace extensions {
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ExtensionFunctionalTest : public ExtensionBrowserTest {
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)public:
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void InstallExtensionSilently(ExtensionService* service,
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                const char* filename) {
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    service->set_show_extensions_prompts(false);
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    size_t num_before = service->extensions()->size();
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::FilePath path = test_data_dir_.AppendASCII(filename);
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::WindowedNotificationObserver extension_loaded_observer(
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        chrome::NOTIFICATION_EXTENSION_LOADED,
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        content::NotificationService::AllSources());
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<extensions::CrxInstaller> installer(
31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        extensions::CrxInstaller::CreateSilent(service));
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    installer->set_is_gallery_install(false);
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    installer->set_allow_silent_install(true);
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    installer->set_install_source(Manifest::INTERNAL);
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    installer->set_off_store_install_allow_reason(
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        extensions::CrxInstaller::OffStoreInstallAllowedInTest);
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    observer_->Watch(
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        chrome::NOTIFICATION_CRX_INSTALLER_DONE,
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        content::Source<extensions::CrxInstaller>(installer.get()));
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    installer->InstallCrx(path);
438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    observer_->Wait();
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    size_t num_after = service->extensions()->size();
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(num_before + 1, num_after);
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    extension_loaded_observer.Wait();
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const Extension* extension = service->GetExtensionById(
508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        last_loaded_extension_id(), false);
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(extension != NULL);
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochIN_PROC_BROWSER_TEST_F(ExtensionFunctionalTest,
563240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                       PRE_TestAdblockExtensionCrash) {
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExtensionService* service = profile()->GetExtensionService();
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  InstallExtensionSilently(service, "adblock.crx");
593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch}
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochIN_PROC_BROWSER_TEST_F(ExtensionFunctionalTest, TestAdblockExtensionCrash) {
623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  ExtensionService* service = profile()->GetExtensionService();
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Verify that the extension is enabled and allowed in incognito
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // is disabled.
658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(service->IsExtensionEnabled(last_loaded_extension_id()));
668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_FALSE(
678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      extension_util::IsIncognitoEnabled(last_loaded_extension_id(), service));
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionFunctionalTest, TestSetExtensionsState) {
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExtensionService* service = profile()->GetExtensionService();
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  InstallExtensionSilently(service, "google_talk.crx");
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Disable the extension and verify.
758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  extension_util::SetIsIncognitoEnabled(
768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      last_loaded_extension_id(), service, false);
778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  service->DisableExtension(last_loaded_extension_id(),
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            Extension::DISABLE_USER_ACTION);
798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_FALSE(service->IsExtensionEnabled(last_loaded_extension_id()));
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Enable the extension and verify.
828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  extension_util::SetIsIncognitoEnabled(
838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      last_loaded_extension_id(), service, false);
848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  service->EnableExtension(last_loaded_extension_id());
858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(service->IsExtensionEnabled(last_loaded_extension_id()));
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Allow extension in incognito mode and verify.
888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  service->EnableExtension(last_loaded_extension_id());
898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  extension_util::SetIsIncognitoEnabled(
908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      last_loaded_extension_id(), service, true);
918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(
928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      extension_util::IsIncognitoEnabled(last_loaded_extension_id(), service));
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Disallow extension in incognito mode and verify.
958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  service->EnableExtension(last_loaded_extension_id());
968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  extension_util::SetIsIncognitoEnabled(
978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      last_loaded_extension_id(), service, false);
988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_FALSE(
998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      extension_util::IsIncognitoEnabled(last_loaded_extension_id(), service));
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace extensions
102