blob: a326f317e05069afecabc2d2b88fcc9fb6d2ff90 [file] [log] [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_SYNC_TEST_INTEGRATION_THEMES_HELPER_H_
#define CHROME_BROWSER_SYNC_TEST_INTEGRATION_THEMES_HELPER_H_
#include <string>
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/raw_ref.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/sync/test/integration/status_change_checker.h"
#include "chrome/browser/themes/theme_service_observer.h"
class Profile;
class ThemeService;
namespace themes_helper {
bool IsSystemThemeDistinctFromDefaultTheme(Profile* profile);
// Gets the unique ID of the custom theme with the given index.
[[nodiscard]] std::string GetCustomTheme(int index);
// Gets the ID of |profile|'s theme.
[[nodiscard]] std::string GetThemeID(Profile* profile);
// Returns true iff |profile| is using a custom theme.
[[nodiscard]] bool UsingCustomTheme(Profile* profile);
// Returns true iff |profile| is using the default theme.
[[nodiscard]] bool UsingDefaultTheme(Profile* profile);
// Returns true iff |profile| is using the system theme.
[[nodiscard]] bool UsingSystemTheme(Profile* profile);
// Returns true iff `profile` has grayscale theme enabled.
[[nodiscard]] bool UsingGrayscaleTheme(Profile* profile);
// Returns true iff a theme with the given ID is pending install in
// |profile|.
[[nodiscard]] bool ThemeIsPendingInstall(Profile* profile,
const std::string& id);
// Sets |profile| to use the custom theme with the given index.
void UseCustomTheme(Profile* profile, int index);
// Sets `profile` to use the grayscale theme.
void UseGrayscaleTheme(Profile* profile);
// Sets |profile| to use the default theme.
void UseDefaultTheme(Profile* profile);
// Sets |profile| to use the system theme.
void UseSystemTheme(Profile* profile);
} // namespace themes_helper
// Helper to wait until a given condition is met, checking every time the
// current theme changes.
//
// The |exit_condition_| closure may be invoked zero or more times.
class ThemeConditionChecker : public StatusChangeChecker,
public ThemeServiceObserver {
public:
ThemeConditionChecker(
Profile* profile,
const std::string& debug_message_,
const base::RepeatingCallback<bool(ThemeService*)>& exit_condition);
~ThemeConditionChecker() override;
// Implementation of StatusChangeChecker.
bool IsExitConditionSatisfied(std::ostream* os) override;
// Implementation of ThemeServiceObserver.
void OnThemeChanged() override;
private:
const raw_ptr<Profile> profile_;
const std::string debug_message_;
base::RepeatingCallback<bool(ThemeService*)> exit_condition_;
};
// Waits until |theme| is pending for install on |profile|.
// Returns false in case of timeout.
// Helper to wait until the specified theme is pending for install on the
// specified profile.
//
// The themes sync integration tests don't actually install any custom themes,
// but they do occasionally check that the ThemeService attempts to install
// synced themes.
class ThemePendingInstallChecker : public StatusChangeChecker {
public:
ThemePendingInstallChecker(Profile* profile, const std::string& theme);
~ThemePendingInstallChecker() override;
// Implementation of StatusChangeChecker.
bool IsExitConditionSatisfied(std::ostream* os) override;
private:
const raw_ptr<Profile> profile_;
const raw_ref<const std::string> theme_;
base::WeakPtrFactory<ThemePendingInstallChecker> weak_ptr_factory_{this};
};
// Waits until |profile| is using the system theme.
// Returns false in case of timeout.
class SystemThemeChecker : public ThemeConditionChecker {
public:
explicit SystemThemeChecker(Profile* profile);
};
// Waits until |profile| is using the default theme.
// Returns false in case of timeout.
class DefaultThemeChecker : public ThemeConditionChecker {
public:
explicit DefaultThemeChecker(Profile* profile);
};
// Waits until |profile| is using a custom theme.
// Returns false in case of timeout.
class CustomThemeChecker : public ThemeConditionChecker {
public:
explicit CustomThemeChecker(Profile* profile);
};
// Waits until `profile` has grayscale theme enabled.
// Returns false in case of timeout.
class GrayscaleThemeChecker : public ThemeConditionChecker {
public:
explicit GrayscaleThemeChecker(Profile* profile);
};
#endif // CHROME_BROWSER_SYNC_TEST_INTEGRATION_THEMES_HELPER_H_