blob: df1491e89ed044a372811f883eac71230af5a828 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/command_line.h"
#include "base/macros.h"
#include "base/strings/string_util.h"
#include "build/build_config.h"
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/extensions/extension_browsertest.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/infobars/infobar_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/themes/theme_service_factory.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/ui/webui/ntp/new_tab_ui.h"
#include "chrome/common/url_constants.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/crx_file/id_util.h"
#include "components/infobars/core/confirm_infobar_delegate.h"
#include "components/infobars/core/infobar.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/browser_test_utils.h"
#include "extensions/browser/app_sorting.h"
#include "extensions/common/constants.h"
using content::WebContents;
using extensions::AppSorting;
using extensions::Extension;
class ExtensionInstallUIBrowserTest : public ExtensionBrowserTest {
public:
// Checks that a theme info bar is currently visible and issues an undo to
// revert to the previous theme.
void VerifyThemeInfoBarAndUndoInstall() {
WebContents* web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
ASSERT_TRUE(web_contents);
InfoBarService* infobar_service =
InfoBarService::FromWebContents(web_contents);
ASSERT_EQ(1U, infobar_service->infobar_count());
ConfirmInfoBarDelegate* delegate =
infobar_service->infobar_at(0)->delegate()->AsConfirmInfoBarDelegate();
ASSERT_TRUE(delegate);
delegate->Cancel();
ASSERT_EQ(0U, infobar_service->infobar_count());
}
// Install the given theme from the data dir and verify expected name.
void InstallThemeAndVerify(const char* theme_name,
const std::string& expected_name) {
// If there is already a theme installed, the current theme should be
// disabled and the new one installed + enabled.
int expected_change = GetTheme() ? 0 : 1;
const base::FilePath theme_path = test_data_dir_.AppendASCII(theme_name);
ASSERT_TRUE(InstallExtensionWithUIAutoConfirm(theme_path, expected_change,
browser()));
const Extension* theme = GetTheme();
ASSERT_TRUE(theme);
ASSERT_EQ(theme->name(), expected_name);
}
const Extension* GetTheme() const {
return ThemeServiceFactory::GetThemeForProfile(browser()->profile());
}
};
// Fails on Linux and Windows (http://crbug.com/580907).
IN_PROC_BROWSER_TEST_F(ExtensionInstallUIBrowserTest,
DISABLED_TestThemeInstallUndoResetsToDefault) {
// Install theme once and undo to verify we go back to default theme.
base::FilePath theme_crx = PackExtension(test_data_dir_.AppendASCII("theme"));
ASSERT_TRUE(InstallExtensionWithUIAutoConfirm(theme_crx, 1, browser()));
const Extension* theme = GetTheme();
ASSERT_TRUE(theme);
std::string theme_id = theme->id();
VerifyThemeInfoBarAndUndoInstall();
ASSERT_EQ(NULL, GetTheme());
// Set the same theme twice and undo to verify we go back to default theme.
ASSERT_TRUE(InstallExtensionWithUIAutoConfirm(theme_crx, 0, browser()));
theme = GetTheme();
ASSERT_TRUE(theme);
ASSERT_EQ(theme_id, theme->id());
ASSERT_TRUE(InstallExtensionWithUIAutoConfirm(theme_crx, 0, browser()));
theme = GetTheme();
ASSERT_TRUE(theme);
ASSERT_EQ(theme_id, theme->id());
VerifyThemeInfoBarAndUndoInstall();
ASSERT_EQ(NULL, GetTheme());
}
IN_PROC_BROWSER_TEST_F(ExtensionInstallUIBrowserTest,
TestThemeInstallUndoResetsToPreviousTheme) {
// Install first theme.
InstallThemeAndVerify("theme", "camo theme");
const Extension* theme = GetTheme();
std::string theme_id = theme->id();
// Then install second theme.
InstallThemeAndVerify("theme2", "snowflake theme");
const Extension* theme2 = GetTheme();
EXPECT_FALSE(theme_id == theme2->id());
// Undo second theme will revert to first theme.
VerifyThemeInfoBarAndUndoInstall();
EXPECT_EQ(theme, GetTheme());
}
IN_PROC_BROWSER_TEST_F(ExtensionInstallUIBrowserTest,
TestThemeReset) {
InstallThemeAndVerify("theme", "camo theme");
// Reset to default theme.
ThemeServiceFactory::GetForProfile(browser()->profile())->UseDefaultTheme();
ASSERT_FALSE(GetTheme());
}
IN_PROC_BROWSER_TEST_F(ExtensionInstallUIBrowserTest,
TestInstallThemeInFullScreen) {
EXPECT_TRUE(chrome::ExecuteCommand(browser(), IDC_FULLSCREEN));
InstallThemeAndVerify("theme", "camo theme");
}
// TODO(samarth): remove along with NTP4 code.
IN_PROC_BROWSER_TEST_F(ExtensionInstallUIBrowserTest,
DISABLED_AppInstallConfirmation) {
int num_tabs = browser()->tab_strip_model()->count();
base::FilePath app_dir = test_data_dir_.AppendASCII("app");
ASSERT_TRUE(InstallExtensionWithUIAutoConfirm(app_dir, 1, browser()));
if (NewTabUI::ShouldShowApps()) {
EXPECT_EQ(num_tabs + 1, browser()->tab_strip_model()->count());
WebContents* web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
ASSERT_TRUE(web_contents);
EXPECT_TRUE(base::StartsWith(web_contents->GetURL().spec(),
"chrome://newtab/",
base::CompareCase::INSENSITIVE_ASCII));
} else {
// TODO(xiyuan): Figure out how to test extension installed bubble?
}
}
// TODO(samarth): remove along with NTP4 code.
IN_PROC_BROWSER_TEST_F(ExtensionInstallUIBrowserTest,
DISABLED_AppInstallConfirmation_Incognito) {
Browser* incognito_browser = CreateIncognitoBrowser();
int num_incognito_tabs = incognito_browser->tab_strip_model()->count();
int num_normal_tabs = browser()->tab_strip_model()->count();
base::FilePath app_dir = test_data_dir_.AppendASCII("app");
ASSERT_TRUE(InstallExtensionWithUIAutoConfirm(app_dir, 1,
incognito_browser));
EXPECT_EQ(num_incognito_tabs,
incognito_browser->tab_strip_model()->count());
if (NewTabUI::ShouldShowApps()) {
EXPECT_EQ(num_normal_tabs + 1, browser()->tab_strip_model()->count());
WebContents* web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
ASSERT_TRUE(web_contents);
EXPECT_TRUE(base::StartsWith(web_contents->GetURL().spec(),
"chrome://newtab/",
base::CompareCase::INSENSITIVE_ASCII));
} else {
// TODO(xiyuan): Figure out how to test extension installed bubble?
}
}
class NewTabUISortingBrowserTest : public ExtensionInstallUIBrowserTest,
public content::NotificationObserver {
public:
NewTabUISortingBrowserTest() {}
void Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) override {
if (type != chrome::NOTIFICATION_APP_LAUNCHER_REORDERED) {
observer_->Observe(type, source, details);
return;
}
const std::string* id = content::Details<const std::string>(details).ptr();
EXPECT_TRUE(id);
last_reordered_extension_id_ = *id;
}
protected:
std::string last_reordered_extension_id_;
content::NotificationRegistrar registrar_;
private:
DISALLOW_COPY_AND_ASSIGN(NewTabUISortingBrowserTest);
};
// TODO(samarth): remove along with NTP4 code.
IN_PROC_BROWSER_TEST_F(NewTabUISortingBrowserTest,
DISABLED_ReorderDuringInstall) {
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
ExtensionService* service = extensions::ExtensionSystem::Get(
browser()->profile())->extension_service();
base::FilePath app_dir = test_data_dir_.AppendASCII("app");
const std::string app_id = crx_file::id_util::GenerateIdForPath(app_dir);
const extensions::Extension* webstore_extension =
service->GetInstalledExtension(extensions::kWebStoreAppId);
EXPECT_TRUE(webstore_extension);
AppSorting* sorting =
extensions::ExtensionSystem::Get(browser()->profile())->app_sorting();
// Register for notifications in the same way as AppLauncherHandler.
registrar_.Add(this,
chrome::NOTIFICATION_APP_LAUNCHER_REORDERED,
content::Source<AppSorting>(sorting));
// ExtensionAppItem calls this when an app install starts.
sorting->EnsureValidOrdinals(app_id, syncer::StringOrdinal());
// Vefify the app is not actually installed yet.
EXPECT_FALSE(service->GetInstalledExtension(app_id));
// Move the test app from the end to be before the web store.
sorting->OnExtensionMoved(
app_id, std::string(), extensions::kWebStoreAppId);
EXPECT_EQ(app_id, last_reordered_extension_id_);
// Now install the app.
const extensions::Extension* test_app = LoadExtension(app_dir);
ASSERT_TRUE(test_app);
EXPECT_TRUE(service->GetInstalledExtension(app_id));
EXPECT_EQ(app_id, test_app->id());
}