blob: c7874ca78d4c7414f5989b15ef096bea6d534356 [file] [log] [blame]
// Copyright 2016 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.
#ifndef CHROME_BROWSER_UI_STARTUP_STARTUP_TAB_PROVIDER_H_
#define CHROME_BROWSER_UI_STARTUP_STARTUP_TAB_PROVIDER_H_
#include <vector>
#include "base/gtest_prod_util.h"
#include "build/build_config.h"
#include "chrome/browser/first_run/first_run.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/startup/startup_browser_creator.h"
#include "chrome/browser/ui/startup/startup_tab.h"
#include "url/gurl.h"
// Provides the sets of tabs to be shown at startup for given sets of policy.
// For instance, this class answers the question, "which tabs, if any, need to
// be shown for first run/onboarding?" Provided as a virtual interface to allow
// faking in unit tests.
class StartupTabProvider {
public:
// Gathers relevant system state and returns any tabs which should be
// shown according to onboarding/first run policy.
virtual StartupTabs GetOnboardingTabs(Profile* profile) const = 0;
// Gathers URLs from a Master Preferences file indicating first run logic
// specific to this distribution. Transforms any such URLs per policy and
// returns them. Also clears the value of first_run_urls_ in the provided
// BrowserCreator.
virtual StartupTabs GetDistributionFirstRunTabs(
StartupBrowserCreator* browser_creator) const = 0;
// Returns a "welcome back" tab to be shown if requested for a specific
// launch.
virtual StartupTabs GetWelcomeBackTabs(Profile* profile,
StartupBrowserCreator* browser_creator,
bool process_startup) const = 0;
// Checks for the presence of a trigger indicating the need to offer a Profile
// Reset on this profile. Returns any tabs which should be shown accordingly.
virtual StartupTabs GetResetTriggerTabs(Profile* profile) const = 0;
// Returns the user's pinned tabs, if they should be shown.
virtual StartupTabs GetPinnedTabs(const base::CommandLine& command_line,
Profile* profile) const = 0;
// Returns tabs, if any, specified in the user's preferences as the default
// content for a new window.
virtual StartupTabs GetPreferencesTabs(const base::CommandLine& command_line,
Profile* profile) const = 0;
// Returns the New Tab Page, if the user's preferences indicate a
// configuration where it must be passed explicitly.
virtual StartupTabs GetNewTabPageTabs(const base::CommandLine& command_line,
Profile* profile) const = 0;
// Returns the Incompatible Applications settings subpage if any incompatible
// applications exist.
virtual StartupTabs GetPostCrashTabs(
bool has_incompatible_applications) const = 0;
};
class StartupTabProviderImpl : public StartupTabProvider {
public:
struct StandardOnboardingTabsParams {
bool is_first_run = false;
bool has_seen_welcome_page = false;
bool is_signin_allowed = false;
bool is_signed_in = false;
bool is_signin_in_progress = false;
bool is_supervised_user = false;
bool is_force_signin_enabled = false;
};
struct Win10OnboardingTabsParams {
bool has_seen_win10_promo = false;
bool set_default_browser_allowed = false;
bool is_default_browser = false;
};
StartupTabProviderImpl() = default;
// The static helper methods below implement the policies relevant to the
// respective Get*Tabs methods, but do not gather or interact with any
// system state relating to making those policy decisions. Exposed for
// testing.
// Returns true if showing the standard welcome page is permissible.
static bool CanShowWelcome(bool is_signin_allowed,
bool is_supervised_user,
bool is_force_signin_enabled);
// Returns true if the standard welcome page should be shown in a tab. This
// should only be used following a positive result from CanShowWelcome.
static bool ShouldShowWelcomeForOnboarding(bool has_seen_welcome_page,
bool is_signed_in,
bool is_signin_in_progress);
// Determines which tabs should be shown according to onboarding/first
// run policy.
static StartupTabs GetStandardOnboardingTabsForState(
const StandardOnboardingTabsParams& params);
#if defined(OS_WIN)
// returns true if showing the Windows 10 welcome page is permissible.
static bool CanShowWin10Welcome(bool set_default_browser_allowed,
bool is_supervised_user);
// Returns true if the Windows 10 welcome page should be shown in a tab. This
// should only be used following a positive result from CanShowWin10Welcome.
static bool ShouldShowWin10WelcomeForOnboarding(bool has_seen_win10_promo,
bool is_default_browser);
// Determines which tabs should be shown according to onboarding/first run
// policy, including promo content specific to Windows 10.
static StartupTabs GetWin10OnboardingTabsForState(
const StandardOnboardingTabsParams& standard_params,
const Win10OnboardingTabsParams& win10_params);
#endif // defined(OS_WIN)
// Processes first run URLs specified in Master Preferences file, replacing
// any "magic word" URL hosts with appropriate URLs.
static StartupTabs GetMasterPrefsTabsForState(
bool is_first_run,
const std::vector<GURL>& first_run_tabs);
// Determines which tabs should be shown as a result of the presence/absence
// of a Reset Trigger on this profile.
static StartupTabs GetResetTriggerTabsForState(bool profile_has_trigger);
// Determines whether the startup preference requires the contents of
// |pinned_tabs| to be shown. This is needed to avoid duplicates, as the
// session restore logic will also resurface pinned tabs on its own.
static StartupTabs GetPinnedTabsForState(
const SessionStartupPref& pref,
const StartupTabs& pinned_tabs,
bool profile_has_other_tabbed_browser);
// Determines whether preferences and window state indicate that
// user-specified tabs should be shown as the default new window content, and
// returns the specified tabs if so.
static StartupTabs GetPreferencesTabsForState(
const SessionStartupPref& pref,
bool profile_has_other_tabbed_browser);
// Determines whether startup preferences require the New Tab Page to be
// explicitly specified. Session Restore does not expect the NTP to be passed.
static StartupTabs GetNewTabPageTabsForState(const SessionStartupPref& pref);
// Determines if the Incompatible Applications settings subpage should be
// shown.
static StartupTabs GetPostCrashTabsForState(
bool has_incompatible_applications);
// Gets the URL for the Welcome page. If |use_later_run_variant| is true, a
// URL parameter will be appended so as to access the variant page used when
// onboarding occurs after the first Chrome execution (e.g., when creating an
// additional profile).
static GURL GetWelcomePageUrl(bool use_later_run_variant);
#if defined(OS_WIN)
// Gets the URL for the Windows 10 Welcome page. If |use_later_run_variant| is
// true, a URL parameter will be appended so as to access the variant page
// used when onboarding occurs after the first Chrome execution.
static GURL GetWin10WelcomePageUrl(bool use_later_run_variant);
#if defined(GOOGLE_CHROME_BUILD)
// Gets the URL for the Incompatible Applications subpage of the Chrome
// settings.
static GURL GetIncompatibleApplicationsUrl();
#endif // defined(GOOGLE_CHROME_BUILD)
#endif // defined(OS_WIN)
// Gets the URL for the page which offers to reset the user's profile
// settings.
static GURL GetTriggeredResetSettingsUrl();
// StartupTabProvider:
StartupTabs GetOnboardingTabs(Profile* profile) const override;
StartupTabs GetWelcomeBackTabs(Profile* profile,
StartupBrowserCreator* browser_creator,
bool process_startup) const override;
StartupTabs GetDistributionFirstRunTabs(
StartupBrowserCreator* browser_creator) const override;
StartupTabs GetResetTriggerTabs(Profile* profile) const override;
StartupTabs GetPinnedTabs(const base::CommandLine& command_line,
Profile* profile) const override;
StartupTabs GetPreferencesTabs(const base::CommandLine& command_line,
Profile* profile) const override;
StartupTabs GetNewTabPageTabs(const base::CommandLine& command_line,
Profile* profile) const override;
StartupTabs GetPostCrashTabs(
bool has_incompatible_applications) const override;
private:
DISALLOW_COPY_AND_ASSIGN(StartupTabProviderImpl);
};
#endif // CHROME_BROWSER_UI_STARTUP_STARTUP_TAB_PROVIDER_H_