blob: d865329206ecbae731c717f04aa9d888bda425ff [file] [log] [blame]
// Copyright (c) 2011 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 "chrome/browser/sync/test/integration/themes_helper.h"
#include "base/bind.h"
#include "base/logging.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/sync/test/integration/sync_datatype_helper.h"
#include "chrome/browser/sync/test/integration/sync_extension_helper.h"
#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/themes/theme_service_factory.h"
#include "components/crx_file/id_util.h"
#include "content/public/browser/notification_source.h"
#include "extensions/common/manifest.h"
using sync_datatype_helper::test;
namespace {
// Make a name to pass to an extension helper.
std::string MakeName(int index) {
return "faketheme" + base::NumberToString(index);
}
ThemeService* GetThemeService(Profile* profile) {
return ThemeServiceFactory::GetForProfile(profile);
}
} // namespace
namespace themes_helper {
std::string GetCustomTheme(int index) {
return crx_file::id_util::GenerateId(MakeName(index));
}
std::string GetThemeID(Profile* profile) {
return GetThemeService(profile)->GetThemeID();
}
bool UsingCustomTheme(Profile* profile) {
return GetThemeID(profile) != ThemeService::kDefaultThemeID;
}
bool UsingDefaultTheme(Profile* profile) {
return GetThemeService(profile)->UsingDefaultTheme();
}
bool UsingSystemTheme(Profile* profile) {
return GetThemeService(profile)->UsingSystemTheme();
}
bool ThemeIsPendingInstall(Profile* profile, const std::string& id) {
return SyncExtensionHelper::GetInstance()->
IsExtensionPendingInstallForSync(profile, id);
}
void UseCustomTheme(Profile* profile, int index) {
SyncExtensionHelper::GetInstance()->InstallExtension(
profile, MakeName(index), extensions::Manifest::TYPE_THEME);
}
void UseDefaultTheme(Profile* profile) {
GetThemeService(profile)->UseDefaultTheme();
}
void UseSystemTheme(Profile* profile) {
GetThemeService(profile)->UseSystemTheme();
}
// Helper function to let us bind this functionality into a base::Callback.
bool UsingSystemThemeFunc(ThemeService* theme_service) {
return theme_service->UsingSystemTheme();
}
// Helper function to let us bind this functionality into a base::Callback.
bool UsingDefaultThemeFunc(ThemeService* theme_service) {
return theme_service->UsingDefaultTheme();
}
} // namespace themes_helper
ThemePendingInstallChecker::ThemePendingInstallChecker(Profile* profile,
const std::string& theme)
: profile_(profile), theme_(theme) {
// We'll check to see if the condition is met whenever the extension system
// tries to contact the web store.
registrar_.Add(this, extensions::NOTIFICATION_EXTENSION_UPDATING_STARTED,
content::Source<Profile>(profile_));
}
ThemePendingInstallChecker::~ThemePendingInstallChecker() {
}
std::string ThemePendingInstallChecker::GetDebugMessage() const {
return base::StringPrintf("Waiting for pending theme to be '%s'",
theme_.c_str());
}
bool ThemePendingInstallChecker::IsExitConditionSatisfied() {
return themes_helper::ThemeIsPendingInstall(profile_, theme_);
}
void ThemePendingInstallChecker::Observe(
int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) {
DCHECK_EQ(extensions::NOTIFICATION_EXTENSION_UPDATING_STARTED, type);
CheckExitCondition();
}
ThemeConditionChecker::ThemeConditionChecker(
Profile* profile,
const std::string& debug_message,
base::Callback<bool(ThemeService*)> exit_condition)
: profile_(profile),
debug_message_(debug_message),
exit_condition_(exit_condition) {
registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
content::Source<ThemeService>(GetThemeService(profile_)));
}
ThemeConditionChecker::~ThemeConditionChecker() {
}
std::string ThemeConditionChecker::GetDebugMessage() const {
return debug_message_;
}
bool ThemeConditionChecker::IsExitConditionSatisfied() {
return exit_condition_.Run(GetThemeService(profile_));
}
void ThemeConditionChecker::Observe(
int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) {
DCHECK_EQ(chrome::NOTIFICATION_BROWSER_THEME_CHANGED, type);
CheckExitCondition();
}
SystemThemeChecker::SystemThemeChecker(Profile* profile)
: ThemeConditionChecker(profile,
"Waiting until profile is using system theme",
base::Bind(&themes_helper::UsingSystemThemeFunc)) {}
DefaultThemeChecker::DefaultThemeChecker(Profile* profile)
: ThemeConditionChecker(profile,
"Waiting until profile is using default theme",
base::Bind(&themes_helper::UsingDefaultThemeFunc)) {
}