| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/webui/sync_promo/sync_promo_handler.h" | 5 #include "chrome/browser/ui/webui/sync_promo/sync_promo_handler.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
| 10 #include "base/time.h" | 10 #include "base/time.h" |
| 11 #include "chrome/browser/prefs/pref_service.h" | 11 #include "chrome/browser/prefs/pref_service.h" |
| 12 #include "chrome/browser/profiles/profile.h" | 12 #include "chrome/browser/profiles/profile.h" |
| 13 #include "chrome/browser/sync/profile_sync_service.h" | 13 #include "chrome/browser/sync/profile_sync_service.h" |
| 14 #include "chrome/browser/sync/sync_setup_flow.h" | 14 #include "chrome/browser/sync/sync_setup_flow.h" |
| 15 #include "chrome/browser/tabs/tab_strip_model.h" | 15 #include "chrome/browser/tabs/tab_strip_model.h" |
| 16 #include "chrome/browser/ui/browser.h" | 16 #include "chrome/browser/ui/browser.h" |
| 17 #include "chrome/browser/ui/browser_list.h" | 17 #include "chrome/browser/ui/browser_list.h" |
| 18 #include "chrome/browser/ui/webui/sync_promo/sync_promo_trial.h" | 18 #include "chrome/browser/ui/webui/sync_promo/sync_promo_trial.h" |
| 19 #include "chrome/browser/ui/webui/sync_promo/sync_promo_ui.h" | 19 #include "chrome/browser/ui/webui/sync_promo/sync_promo_ui.h" |
| 20 #include "chrome/common/chrome_notification_types.h" | 20 #include "chrome/common/chrome_notification_types.h" |
| 21 #include "chrome/common/extensions/extension_constants.h" | 21 #include "chrome/common/extensions/extension_constants.h" |
| 22 #include "chrome/common/pref_names.h" | 22 #include "chrome/common/pref_names.h" |
| 23 #include "chrome/common/url_constants.h" | 23 #include "chrome/common/url_constants.h" |
| 24 #include "content/browser/tab_contents/tab_contents.h" | 24 #include "content/browser/tab_contents/navigation_controller.h" |
| 25 #include "content/public/browser/navigation_entry.h" | 25 #include "content/public/browser/navigation_entry.h" |
| 26 #include "content/public/browser/notification_details.h" | 26 #include "content/public/browser/notification_details.h" |
| 27 #include "content/public/browser/notification_service.h" | 27 #include "content/public/browser/notification_service.h" |
| 28 #include "content/public/browser/web_contents.h" |
| 28 | 29 |
| 29 using content::OpenURLParams; | 30 using content::OpenURLParams; |
| 30 using content::Referrer; | 31 using content::Referrer; |
| 31 | 32 |
| 32 namespace { | 33 namespace { |
| 33 | 34 |
| 34 // User actions on the sync promo (aka "Sign in to Chrome"). | 35 // User actions on the sync promo (aka "Sign in to Chrome"). |
| 35 enum SyncPromoUserFlowActionEnums { | 36 enum SyncPromoUserFlowActionEnums { |
| 36 SYNC_PROMO_VIEWED, | 37 SYNC_PROMO_VIEWED, |
| 37 SYNC_PROMO_LEARN_MORE_CLICKED, | 38 SYNC_PROMO_LEARN_MORE_CLICKED, |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 79 PrefService::UNSYNCABLE_PREF); | 80 PrefService::UNSYNCABLE_PREF); |
| 80 } | 81 } |
| 81 | 82 |
| 82 void SyncPromoHandler::RegisterMessages() { | 83 void SyncPromoHandler::RegisterMessages() { |
| 83 // Keep a reference to the preferences service for convenience and it's | 84 // Keep a reference to the preferences service for convenience and it's |
| 84 // probably a little faster that getting it via Profile::FromWebUI() every | 85 // probably a little faster that getting it via Profile::FromWebUI() every |
| 85 // time we need to interact with preferences. | 86 // time we need to interact with preferences. |
| 86 prefs_ = Profile::FromWebUI(web_ui())->GetPrefs(); | 87 prefs_ = Profile::FromWebUI(web_ui())->GetPrefs(); |
| 87 DCHECK(prefs_); | 88 DCHECK(prefs_); |
| 88 // Ignore events from view-source:chrome://syncpromo. | 89 // Ignore events from view-source:chrome://syncpromo. |
| 89 if (!web_ui()->tab_contents()->GetController().GetActiveEntry()-> | 90 if (!web_ui()->web_contents()->GetController().GetActiveEntry()-> |
| 90 IsViewSourceMode()) { | 91 IsViewSourceMode()) { |
| 91 // Listen to see if the tab we're in gets closed. | 92 // Listen to see if the tab we're in gets closed. |
| 92 registrar_.Add(this, content::NOTIFICATION_TAB_CLOSING, | 93 registrar_.Add(this, content::NOTIFICATION_TAB_CLOSING, |
| 93 content::Source<NavigationController>( | 94 content::Source<NavigationController>( |
| 94 &web_ui()->tab_contents()->GetController())); | 95 &web_ui()->web_contents()->GetController())); |
| 95 // Listen to see if the window we're in gets closed. | 96 // Listen to see if the window we're in gets closed. |
| 96 registrar_.Add(this, chrome::NOTIFICATION_BROWSER_CLOSING, | 97 registrar_.Add(this, chrome::NOTIFICATION_BROWSER_CLOSING, |
| 97 content::NotificationService::AllSources()); | 98 content::NotificationService::AllSources()); |
| 98 } | 99 } |
| 99 | 100 |
| 100 web_ui()->RegisterMessageCallback("SyncPromo:Close", | 101 web_ui()->RegisterMessageCallback("SyncPromo:Close", |
| 101 base::Bind(&SyncPromoHandler::HandleCloseSyncPromo, | 102 base::Bind(&SyncPromoHandler::HandleCloseSyncPromo, |
| 102 base::Unretained(this))); | 103 base::Unretained(this))); |
| 103 web_ui()->RegisterMessageCallback("SyncPromo:Initialize", | 104 web_ui()->RegisterMessageCallback("SyncPromo:Initialize", |
| 104 base::Bind(&SyncPromoHandler::HandleInitializeSyncPromo, | 105 base::Bind(&SyncPromoHandler::HandleInitializeSyncPromo, |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 switch (type) { | 157 switch (type) { |
| 157 case content::NOTIFICATION_TAB_CLOSING: { | 158 case content::NOTIFICATION_TAB_CLOSING: { |
| 158 if (!window_already_closed_) | 159 if (!window_already_closed_) |
| 159 RecordUserFlowAction(SYNC_PROMO_CLOSED_TAB); | 160 RecordUserFlowAction(SYNC_PROMO_CLOSED_TAB); |
| 160 break; | 161 break; |
| 161 } | 162 } |
| 162 case chrome::NOTIFICATION_BROWSER_CLOSING: { | 163 case chrome::NOTIFICATION_BROWSER_CLOSING: { |
| 163 // Make sure we're in the tab strip of the closing window. | 164 // Make sure we're in the tab strip of the closing window. |
| 164 Browser* browser = content::Source<Browser>(source).ptr(); | 165 Browser* browser = content::Source<Browser>(source).ptr(); |
| 165 if (browser->tabstrip_model()->GetWrapperIndex( | 166 if (browser->tabstrip_model()->GetWrapperIndex( |
| 166 web_ui()->tab_contents()) != TabStripModel::kNoTab) { | 167 web_ui()->web_contents()) != TabStripModel::kNoTab) { |
| 167 RecordUserFlowAction(SYNC_PROMO_CLOSED_WINDOW); | 168 RecordUserFlowAction(SYNC_PROMO_CLOSED_WINDOW); |
| 168 window_already_closed_ = true; | 169 window_already_closed_ = true; |
| 169 } | 170 } |
| 170 break; | 171 break; |
| 171 } | 172 } |
| 172 default: { | 173 default: { |
| 173 NOTREACHED(); | 174 NOTREACHED(); |
| 174 } | 175 } |
| 175 } | 176 } |
| 176 } | 177 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 192 void SyncPromoHandler::HandleCloseSyncPromo(const base::ListValue* args) { | 193 void SyncPromoHandler::HandleCloseSyncPromo(const base::ListValue* args) { |
| 193 CloseSyncSetup(); | 194 CloseSyncSetup(); |
| 194 | 195 |
| 195 // If the user has signed in then set the pref to show them NTP bubble | 196 // If the user has signed in then set the pref to show them NTP bubble |
| 196 // confirming that they're signed in. | 197 // confirming that they're signed in. |
| 197 std::string username = prefs_->GetString(prefs::kGoogleServicesUsername); | 198 std::string username = prefs_->GetString(prefs::kGoogleServicesUsername); |
| 198 if (!username.empty()) | 199 if (!username.empty()) |
| 199 prefs_->SetBoolean(prefs::kSyncPromoShowNTPBubble, true); | 200 prefs_->SetBoolean(prefs::kSyncPromoShowNTPBubble, true); |
| 200 | 201 |
| 201 GURL url = SyncPromoUI::GetNextPageURLForSyncPromoURL( | 202 GURL url = SyncPromoUI::GetNextPageURLForSyncPromoURL( |
| 202 web_ui()->tab_contents()->GetURL()); | 203 web_ui()->web_contents()->GetURL()); |
| 203 OpenURLParams params( | 204 OpenURLParams params( |
| 204 url, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_LINK, false); | 205 url, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_LINK, false); |
| 205 web_ui()->tab_contents()->OpenURL(params); | 206 web_ui()->web_contents()->OpenURL(params); |
| 206 } | 207 } |
| 207 | 208 |
| 208 void SyncPromoHandler::HandleInitializeSyncPromo(const base::ListValue* args) { | 209 void SyncPromoHandler::HandleInitializeSyncPromo(const base::ListValue* args) { |
| 209 // If the promo is also the Chrome launch page, we want to show the title and | 210 // If the promo is also the Chrome launch page, we want to show the title and |
| 210 // log an event if we are running an experiment. | 211 // log an event if we are running an experiment. |
| 211 bool is_launch_page = SyncPromoUI::GetIsLaunchPageForSyncPromoURL( | 212 bool is_launch_page = SyncPromoUI::GetIsLaunchPageForSyncPromoURL( |
| 212 web_ui()->tab_contents()->GetURL()); | 213 web_ui()->web_contents()->GetURL()); |
| 213 if (is_launch_page && sync_promo_trial::IsExperimentActive()) | 214 if (is_launch_page && sync_promo_trial::IsExperimentActive()) |
| 214 sync_promo_trial::RecordUserSawMessage(); | 215 sync_promo_trial::RecordUserSawMessage(); |
| 215 base::FundamentalValue visible(is_launch_page); | 216 base::FundamentalValue visible(is_launch_page); |
| 216 web_ui()->CallJavascriptFunction("SyncSetupOverlay.setPromoTitleVisible", | 217 web_ui()->CallJavascriptFunction("SyncSetupOverlay.setPromoTitleVisible", |
| 217 visible); | 218 visible); |
| 218 | 219 |
| 219 OpenSyncSetup(); | 220 OpenSyncSetup(); |
| 220 // We don't need to compute anything for this, just do this every time. | 221 // We don't need to compute anything for this, just do this every time. |
| 221 RecordUserFlowAction(SYNC_PROMO_VIEWED); | 222 RecordUserFlowAction(SYNC_PROMO_VIEWED); |
| 222 // Increment view count first and show natural numbers in stats rather than 0 | 223 // Increment view count first and show natural numbers in stats rather than 0 |
| 223 // based starting point (if it happened to be our first time showing this). | 224 // based starting point (if it happened to be our first time showing this). |
| 224 IncrementViewCountBy(1); | 225 IncrementViewCountBy(1); |
| 225 // Record +1 for every view. This is the only thing we record that's not part | 226 // Record +1 for every view. This is the only thing we record that's not part |
| 226 // of the user flow histogram. | 227 // of the user flow histogram. |
| 227 UMA_HISTOGRAM_COUNTS("SyncPromo.NumTimesViewed", GetViewCount()); | 228 UMA_HISTOGRAM_COUNTS("SyncPromo.NumTimesViewed", GetViewCount()); |
| 228 } | 229 } |
| 229 | 230 |
| 230 void SyncPromoHandler::HandleShowAdvancedSettings( | 231 void SyncPromoHandler::HandleShowAdvancedSettings( |
| 231 const base::ListValue* args) { | 232 const base::ListValue* args) { |
| 232 CloseSyncSetup(); | 233 CloseSyncSetup(); |
| 233 std::string url(chrome::kChromeUISettingsURL); | 234 std::string url(chrome::kChromeUISettingsURL); |
| 234 url += chrome::kSyncSetupSubPage; | 235 url += chrome::kSyncSetupSubPage; |
| 235 OpenURLParams params( | 236 OpenURLParams params( |
| 236 GURL(url), Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_LINK, false); | 237 GURL(url), Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_LINK, false); |
| 237 web_ui()->tab_contents()->OpenURL(params); | 238 web_ui()->web_contents()->OpenURL(params); |
| 238 RecordUserFlowAction(SYNC_PROMO_ADVANCED_CLICKED); | 239 RecordUserFlowAction(SYNC_PROMO_ADVANCED_CLICKED); |
| 239 } | 240 } |
| 240 | 241 |
| 241 // TODO(dbeam): Replace with metricsHandler:recordHistogramTime when it exists. | 242 // TODO(dbeam): Replace with metricsHandler:recordHistogramTime when it exists. |
| 242 void SyncPromoHandler::HandleRecordThrobberTime(const base::ListValue* args) { | 243 void SyncPromoHandler::HandleRecordThrobberTime(const base::ListValue* args) { |
| 243 double time_double; | 244 double time_double; |
| 244 CHECK(args->GetDouble(0, &time_double)); | 245 CHECK(args->GetDouble(0, &time_double)); |
| 245 UMA_HISTOGRAM_TIMES("SyncPromo.ThrobberTime", | 246 UMA_HISTOGRAM_TIMES("SyncPromo.ThrobberTime", |
| 246 base::TimeDelta::FromMilliseconds(time_double)); | 247 base::TimeDelta::FromMilliseconds(time_double)); |
| 247 } | 248 } |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 int adjusted = GetViewCount() + amount; | 281 int adjusted = GetViewCount() + amount; |
| 281 prefs_->SetInteger(prefs::kSyncPromoViewCount, adjusted); | 282 prefs_->SetInteger(prefs::kSyncPromoViewCount, adjusted); |
| 282 return adjusted; | 283 return adjusted; |
| 283 } | 284 } |
| 284 | 285 |
| 285 void SyncPromoHandler::RecordExperimentOutcomesOnSignIn() { | 286 void SyncPromoHandler::RecordExperimentOutcomesOnSignIn() { |
| 286 if (sync_promo_trial::IsExperimentActive()) | 287 if (sync_promo_trial::IsExperimentActive()) |
| 287 sync_promo_trial::RecordUserSignedIn(); | 288 sync_promo_trial::RecordUserSignedIn(); |
| 288 if (sync_promo_trial::IsPartOfBrandTrialToEnable()) { | 289 if (sync_promo_trial::IsPartOfBrandTrialToEnable()) { |
| 289 bool is_start_up = SyncPromoUI::GetIsLaunchPageForSyncPromoURL( | 290 bool is_start_up = SyncPromoUI::GetIsLaunchPageForSyncPromoURL( |
| 290 web_ui()->tab_contents()->GetURL()); | 291 web_ui()->web_contents()->GetURL()); |
| 291 Profile* profile = Profile::FromWebUI(web_ui()); | 292 Profile* profile = Profile::FromWebUI(web_ui()); |
| 292 sync_promo_trial::RecordUserSignedInWithTrialBrand(is_start_up, profile); | 293 sync_promo_trial::RecordUserSignedInWithTrialBrand(is_start_up, profile); |
| 293 } | 294 } |
| 294 } | 295 } |
| 295 | 296 |
| 296 void SyncPromoHandler::RecordUserFlowAction(int action) { | 297 void SyncPromoHandler::RecordUserFlowAction(int action) { |
| 297 // Send an enumeration to our single user flow histogram. | 298 // Send an enumeration to our single user flow histogram. |
| 298 UMA_HISTOGRAM_ENUMERATION("SyncPromo.UserFlow", action, | 299 UMA_HISTOGRAM_ENUMERATION("SyncPromo.UserFlow", action, |
| 299 SYNC_PROMO_BUCKET_BOUNDARY); | 300 SYNC_PROMO_BUCKET_BOUNDARY); |
| 300 } | 301 } |
| OLD | NEW |