Commit 90dd8045 authored by Scott Chen's avatar Scott Chen Committed by Commit Bot

NUX Email: show experiment on startup if enabled.

Bug: 832933
Change-Id: I6399c3c2687e553d5d05df14d6b5263e985badab
Reviewed-on: https://chromium-review.googlesource.com/1194835Reviewed-by: default avatarScott Violet <sky@chromium.org>
Reviewed-by: default avatarHector Carmona <hcarmona@chromium.org>
Commit-Queue: Scott Chen <scottchen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#589693}
parent 9a16de1e
...@@ -1161,7 +1161,8 @@ if (closure_compile) { ...@@ -1161,7 +1161,8 @@ if (closure_compile) {
data_deps += [ "components/offline_pages/resources:closure_compile" ] data_deps += [ "components/offline_pages/resources:closure_compile" ]
} }
if (is_win && is_chrome_branded) { if (is_win && is_chrome_branded) {
data_deps += [ "components/nux/resources:closure_compile" ] # TODO(scottchen): uncomment after fixing closure compile deps for NUX.
# data_deps += [ "components/nux/resources:closure_compile" ]
} }
} }
} }
......
...@@ -142,6 +142,10 @@ ...@@ -142,6 +142,10 @@
#include "chrome/browser/profiles/profile_statistics_factory.h" #include "chrome/browser/profiles/profile_statistics_factory.h"
#endif #endif
#if defined(OS_WIN)
#include "base/win/win_util.h"
#endif
using base::UserMetricsAction; using base::UserMetricsAction;
using content::BrowserThread; using content::BrowserThread;
...@@ -1085,7 +1089,13 @@ void ProfileManager::InitProfileUserPrefs(Profile* profile) { ...@@ -1085,7 +1089,13 @@ void ProfileManager::InitProfileUserPrefs(Profile* profile) {
if (profile->IsNewProfile() || first_run::IsChromeFirstRun()) { if (profile->IsNewProfile() || first_run::IsChromeFirstRun()) {
profile->GetPrefs()->SetBoolean(prefs::kHasSeenWelcomePage, false); profile->GetPrefs()->SetBoolean(prefs::kHasSeenWelcomePage, false);
#if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) #if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
profile->GetPrefs()->SetBoolean(prefs::kHasSeenGoogleAppsPromoPage, false); // Enterprise users should not be included in any NUX flow.
if (!base::win::IsEnterpriseManaged()) {
profile->GetPrefs()->SetBoolean(prefs::kHasSeenGoogleAppsPromoPage,
false);
profile->GetPrefs()->SetBoolean(prefs::kHasSeenEmailPromoPage, false);
profile->GetPrefs()->SetBoolean(prefs::kOnboardDuringNUX, true);
}
#endif // defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) #endif // defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
} }
#endif // !defined(OS_ANDROID) #endif // !defined(OS_ANDROID)
......
...@@ -463,7 +463,15 @@ void StartupBrowserCreator::RegisterProfilePrefs(PrefRegistrySimple* registry) { ...@@ -463,7 +463,15 @@ void StartupBrowserCreator::RegisterProfilePrefs(PrefRegistrySimple* registry) {
// creation. // creation.
registry->RegisterBooleanPref(prefs::kHasSeenWelcomePage, true); registry->RegisterBooleanPref(prefs::kHasSeenWelcomePage, true);
#if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) #if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
// TODO(scottchen): To make this testable early by trybots, instead of hiding
// behind GOOGLE_CHROME_BUILD, use a function that returns true for official
// builds and conditionally returns true based on a command line switch to
// be set by tests.
registry->RegisterBooleanPref(prefs::kHasSeenGoogleAppsPromoPage, true); registry->RegisterBooleanPref(prefs::kHasSeenGoogleAppsPromoPage, true);
registry->RegisterBooleanPref(prefs::kHasSeenEmailPromoPage, true);
// This will be set to true for newly created profiles, and is used to
// indicate which users went through FRE after NUX is enabled.
registry->RegisterBooleanPref(prefs::kOnboardDuringNUX, false);
#endif // defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) #endif // defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
} }
......
...@@ -29,7 +29,6 @@ ...@@ -29,7 +29,6 @@
#if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) #if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
#include "components/nux/constants.h" #include "components/nux/constants.h"
#include "components/nux/google_apps/google_apps_handler.h"
#endif // defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) #endif // defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
namespace { namespace {
...@@ -60,6 +59,11 @@ bool ProfileHasOtherTabbedBrowser(Profile* profile) { ...@@ -60,6 +59,11 @@ bool ProfileHasOtherTabbedBrowser(Profile* profile) {
} // namespace } // namespace
StartupTabProviderImpl::StandardOnboardingTabsParams::
StandardOnboardingTabsParams() = default;
StartupTabProviderImpl::StandardOnboardingTabsParams::
~StandardOnboardingTabsParams() = default;
StartupTabs StartupTabProviderImpl::GetOnboardingTabs(Profile* profile) const { StartupTabs StartupTabProviderImpl::GetOnboardingTabs(Profile* profile) const {
// Onboarding content has not been launched on Chrome OS. // Onboarding content has not been launched on Chrome OS.
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
...@@ -84,11 +88,25 @@ StartupTabs StartupTabProviderImpl::GetOnboardingTabs(Profile* profile) const { ...@@ -84,11 +88,25 @@ StartupTabs StartupTabProviderImpl::GetOnboardingTabs(Profile* profile) const {
#if defined(OS_WIN) #if defined(OS_WIN)
#if defined(GOOGLE_CHROME_BUILD) #if defined(GOOGLE_CHROME_BUILD)
if (base::FeatureList::IsEnabled(nux::kNuxGoogleAppsFeature)) { // To avoid diluting data collection, existing users should not be assigned
// an NUX group. So, the kOnboardDuringNUX flag is used to short-circuit the
// feature checks below.
bool onboard_during_nux =
prefs && prefs->GetBoolean(prefs::kOnboardDuringNUX);
if (onboard_during_nux &&
base::FeatureList::IsEnabled(nux::kNuxGoogleAppsFeature)) {
standard_params.is_apps_promo_allowed = true; standard_params.is_apps_promo_allowed = true;
standard_params.has_seen_apps_promo = standard_params.has_seen_apps_promo =
prefs && prefs->GetBoolean(prefs::kHasSeenGoogleAppsPromoPage); prefs && prefs->GetBoolean(prefs::kHasSeenGoogleAppsPromoPage);
} }
if (onboard_during_nux &&
base::FeatureList::IsEnabled(nux::kNuxEmailFeature)) {
standard_params.is_email_promo_allowed = true;
standard_params.has_seen_email_promo =
prefs && prefs->GetBoolean(prefs::kHasSeenEmailPromoPage);
}
#endif // defined(GOOGLE_CHROME_BUILD) #endif // defined(GOOGLE_CHROME_BUILD)
// Windows 10 has unique onboarding policies and content. // Windows 10 has unique onboarding policies and content.
...@@ -216,6 +234,11 @@ StartupTabs StartupTabProviderImpl::GetStandardOnboardingTabsForState( ...@@ -216,6 +234,11 @@ StartupTabs StartupTabProviderImpl::GetStandardOnboardingTabsForState(
params.has_seen_apps_promo)) { params.has_seen_apps_promo)) {
return StartupTabs({StartupTab(GURL(nux::kNuxGoogleAppsUrl), false)}); return StartupTabs({StartupTab(GURL(nux::kNuxGoogleAppsUrl), false)});
} }
if (ShouldShowNewUserExperience(params.is_email_promo_allowed,
params.has_seen_email_promo)) {
return StartupTabs({StartupTab(GURL(nux::kNuxEmailUrl), false)});
}
#endif // defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) #endif // defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
StartupTabs tabs; StartupTabs tabs;
...@@ -254,6 +277,11 @@ StartupTabs StartupTabProviderImpl::GetWin10OnboardingTabsForState( ...@@ -254,6 +277,11 @@ StartupTabs StartupTabProviderImpl::GetWin10OnboardingTabsForState(
standard_params.has_seen_apps_promo)) { standard_params.has_seen_apps_promo)) {
return StartupTabs({StartupTab(GURL(nux::kNuxGoogleAppsUrl), false)}); return StartupTabs({StartupTab(GURL(nux::kNuxGoogleAppsUrl), false)});
} }
if (ShouldShowNewUserExperience(standard_params.is_email_promo_allowed,
standard_params.has_seen_email_promo)) {
return StartupTabs({StartupTab(GURL(nux::kNuxEmailUrl), false)});
}
#endif // defined(GOOGLE_CHROME_BUILD) #endif // defined(GOOGLE_CHROME_BUILD)
if (CanShowWin10Welcome(win10_params.set_default_browser_allowed, if (CanShowWin10Welcome(win10_params.set_default_browser_allowed,
...@@ -269,10 +297,9 @@ StartupTabs StartupTabProviderImpl::GetWin10OnboardingTabsForState( ...@@ -269,10 +297,9 @@ StartupTabs StartupTabProviderImpl::GetWin10OnboardingTabsForState(
#if defined(GOOGLE_CHROME_BUILD) #if defined(GOOGLE_CHROME_BUILD)
// static // static
bool StartupTabProviderImpl::ShouldShowNewUserExperience( bool StartupTabProviderImpl::ShouldShowNewUserExperience(bool is_promo_allowed,
bool is_apps_promo_allowed, bool has_seen_promo) {
bool has_seen_apps_promo) { return is_promo_allowed && !has_seen_promo;
return is_apps_promo_allowed && !has_seen_apps_promo;
} }
#endif // defined(GOOGLE_CHROME_BUILD) #endif // defined(GOOGLE_CHROME_BUILD)
#endif // defined(OS_WIN) #endif // defined(OS_WIN)
......
...@@ -65,6 +65,9 @@ class StartupTabProvider { ...@@ -65,6 +65,9 @@ class StartupTabProvider {
class StartupTabProviderImpl : public StartupTabProvider { class StartupTabProviderImpl : public StartupTabProvider {
public: public:
struct StandardOnboardingTabsParams { struct StandardOnboardingTabsParams {
StandardOnboardingTabsParams();
~StandardOnboardingTabsParams();
bool is_first_run = false; bool is_first_run = false;
bool has_seen_welcome_page = false; bool has_seen_welcome_page = false;
bool is_signin_allowed = false; bool is_signin_allowed = false;
...@@ -75,6 +78,8 @@ class StartupTabProviderImpl : public StartupTabProvider { ...@@ -75,6 +78,8 @@ class StartupTabProviderImpl : public StartupTabProvider {
#if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) #if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
bool has_seen_apps_promo = false; bool has_seen_apps_promo = false;
bool is_apps_promo_allowed = false; bool is_apps_promo_allowed = false;
bool has_seen_email_promo = false;
bool is_email_promo_allowed = false;
#endif // defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) #endif // defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
}; };
...@@ -126,8 +131,8 @@ class StartupTabProviderImpl : public StartupTabProvider { ...@@ -126,8 +131,8 @@ class StartupTabProviderImpl : public StartupTabProvider {
#if defined(GOOGLE_CHROME_BUILD) #if defined(GOOGLE_CHROME_BUILD)
// Returns true if showing one of the new user experience experiments is // Returns true if showing one of the new user experience experiments is
// permissible. // permissible.
static bool ShouldShowNewUserExperience(bool is_apps_promo_allowed, static bool ShouldShowNewUserExperience(bool is_promo_allowed,
bool has_seen_apps_promo); bool has_seen_promo);
#endif // defined(GOOGLE_CHROME_BUILD) #endif // defined(GOOGLE_CHROME_BUILD)
#endif // defined(OS_WIN) #endif // defined(OS_WIN)
......
...@@ -355,6 +355,41 @@ TEST(StartupTabProviderTest, GetAppsPromoTabsForState) { ...@@ -355,6 +355,41 @@ TEST(StartupTabProviderTest, GetAppsPromoTabsForState) {
EXPECT_FALSE(output[0].is_pinned); EXPECT_FALSE(output[0].is_pinned);
} }
} }
TEST(StartupTabProviderTest, GetEmailPromoTabsForState) {
{
// Show Email Promo on if enabled and not seen. Overrides any other tab for
// people in the experiment group.
StandardOnboardingTabsParams params;
params.has_seen_email_promo = false;
params.is_email_promo_allowed = true;
params.is_first_run = true;
StartupTabs output =
StartupTabProviderImpl::GetStandardOnboardingTabsForState(params);
ASSERT_EQ(1U, output.size());
EXPECT_EQ(nux::kNuxEmailUrl, output[0].url);
EXPECT_FALSE(output[0].is_pinned);
}
{
// Show Email Promo on if enabled and not seen. Overrides any other tab for
// people in the experiment group. Also works on Windows 10.
StandardOnboardingTabsParams standard_params;
standard_params.has_seen_email_promo = false;
standard_params.is_email_promo_allowed = true;
standard_params.is_first_run = true;
Win10OnboardingTabsParams win10_params;
StartupTabs output = StartupTabProviderImpl::GetWin10OnboardingTabsForState(
standard_params, win10_params);
ASSERT_EQ(1U, output.size());
EXPECT_EQ(nux::kNuxEmailUrl, output[0].url);
EXPECT_FALSE(output[0].is_pinned);
}
}
#endif // defined(GOOGLE_CHROME_BUILD) #endif // defined(GOOGLE_CHROME_BUILD)
#endif // defined(OS_WIN) #endif // defined(OS_WIN)
......
...@@ -121,7 +121,15 @@ WelcomeUI::WelcomeUI(content::WebUI* web_ui, const GURL& url) ...@@ -121,7 +121,15 @@ WelcomeUI::WelcomeUI(content::WebUI* web_ui, const GURL& url)
// experiments launch. // experiments launch.
} }
if (base::FeatureList::IsEnabled(nux::kNuxEmailFeature)) { // To avoid diluting data collection, existing users should not be assigned
// an NUX group. So, the kOnboardDuringNUX flag is used to short-circuit the
// feature checks below.
PrefService* prefs = profile->GetPrefs();
bool onboard_during_nux =
prefs && prefs->GetBoolean(prefs::kOnboardDuringNUX);
if (onboard_during_nux &&
base::FeatureList::IsEnabled(nux::kNuxEmailFeature)) {
content::BrowserContext* browser_context = content::BrowserContext* browser_context =
web_ui->GetWebContents()->GetBrowserContext(); web_ui->GetWebContents()->GetBrowserContext();
web_ui->AddMessageHandler(std::make_unique<nux::EmailHandler>( web_ui->AddMessageHandler(std::make_unique<nux::EmailHandler>(
...@@ -133,7 +141,8 @@ WelcomeUI::WelcomeUI(content::WebUI* web_ui, const GURL& url) ...@@ -133,7 +141,8 @@ WelcomeUI::WelcomeUI(content::WebUI* web_ui, const GURL& url)
nux::EmailHandler::AddSources(html_source, profile->GetPrefs()); nux::EmailHandler::AddSources(html_source, profile->GetPrefs());
} }
if (base::FeatureList::IsEnabled(nux::kNuxGoogleAppsFeature)) { if (onboard_during_nux &&
base::FeatureList::IsEnabled(nux::kNuxGoogleAppsFeature)) {
content::BrowserContext* browser_context = content::BrowserContext* browser_context =
web_ui->GetWebContents()->GetBrowserContext(); web_ui->GetWebContents()->GetBrowserContext();
web_ui->AddMessageHandler(std::make_unique<nux::GoogleAppsHandler>( web_ui->AddMessageHandler(std::make_unique<nux::GoogleAppsHandler>(
...@@ -163,6 +172,15 @@ void WelcomeUI::StorePageSeen(Profile* profile, const GURL& url) { ...@@ -163,6 +172,15 @@ void WelcomeUI::StorePageSeen(Profile* profile, const GURL& url) {
nux::GoogleAppsInteraction::kCount); nux::GoogleAppsInteraction::kCount);
return; return;
} }
if (url.EqualsIgnoringRef(GURL(nux::kNuxEmailUrl))) {
// Record that the new user experience page was visited.
profile->GetPrefs()->SetBoolean(prefs::kHasSeenEmailPromoPage, true);
// TODO(scottchen): Record UMA.
return;
}
#endif // defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) #endif // defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
// Store that this profile has been shown the Welcome page. // Store that this profile has been shown the Welcome page.
......
...@@ -1283,9 +1283,16 @@ const char kHasSeenWin10PromoPage[] = "browser.has_seen_win10_promo_page"; ...@@ -1283,9 +1283,16 @@ const char kHasSeenWin10PromoPage[] = "browser.has_seen_win10_promo_page";
#if defined(GOOGLE_CHROME_BUILD) #if defined(GOOGLE_CHROME_BUILD)
// Whether or not this profile has been shown the new user experience promo // Whether or not this profile has been shown the new user experience promo
// page. // page for google apps.
const char kHasSeenGoogleAppsPromoPage[] = const char kHasSeenGoogleAppsPromoPage[] =
"browser.has_seen_google_apps_promo_page"; "browser.has_seen_google_apps_promo_page";
// Whether or not this profile has been shown the new user experience promo
// page for adding email provider to bookmark.
const char kHasSeenEmailPromoPage[] = "browser.has_seen_email_promo_page";
// Whether or not this user went through the first-run experience after NUX
// launched. This is necessary for determining which users to keep "tagging"
// with the NUX finch experiment group, and allows a more accurate analysis.
const char kOnboardDuringNUX[] = "browser.onboard_during_nux";
#endif // defined(GOOGLE_CHROME_BUILD) #endif // defined(GOOGLE_CHROME_BUILD)
#endif // defined(OS_WIN) #endif // defined(OS_WIN)
......
...@@ -441,6 +441,8 @@ extern const char kHasSeenWelcomePage[]; ...@@ -441,6 +441,8 @@ extern const char kHasSeenWelcomePage[];
extern const char kHasSeenWin10PromoPage[]; extern const char kHasSeenWin10PromoPage[];
#if defined(GOOGLE_CHROME_BUILD) #if defined(GOOGLE_CHROME_BUILD)
extern const char kHasSeenGoogleAppsPromoPage[]; extern const char kHasSeenGoogleAppsPromoPage[];
extern const char kHasSeenEmailPromoPage[];
extern const char kOnboardDuringNUX[];
#endif // defined(GOOGLE_CHROME_BUILD) #endif // defined(GOOGLE_CHROME_BUILD)
#endif // defined(OS_WIN) #endif // defined(OS_WIN)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment