1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/ui/webui/ntp/new_tab_page_handler.h"
8 #include "base/bind_helpers.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/metrics/histogram.h"
11 #include "base/prefs/pref_service.h"
12 #include "chrome/browser/profiles/profile.h"
13 #include "chrome/browser/sync/profile_sync_service.h"
14 #include "chrome/browser/ui/webui/ntp/new_tab_ui.h"
15 #include "chrome/browser/web_resource/notification_promo.h"
16 #include "chrome/common/pref_names.h"
17 #include "components/pref_registry/pref_registry_syncable.h"
18 #include "content/public/browser/notification_service.h"
19 #include "content/public/browser/web_ui.h"
23 const char kDefaultPageTypeHistogram
[] = "NewTabPage.DefaultPageType";
34 NewTabPageHandler::NewTabPageHandler() : page_switch_count_(0) {
37 NewTabPageHandler::~NewTabPageHandler() {
38 LOCAL_HISTOGRAM_COUNTS_100("NewTabPage.SingleSessionPageSwitches",
42 void NewTabPageHandler::RegisterMessages() {
43 // Record an open of the NTP with its default page type.
44 PrefService
* prefs
= Profile::FromWebUI(web_ui())->GetPrefs();
45 int shown_page_type
= prefs
->GetInteger(prefs::kNtpShownPage
) >>
47 UMA_HISTOGRAM_ENUMERATION(kDefaultPageTypeHistogram
,
48 shown_page_type
, kHistogramEnumerationMax
);
50 web_ui()->RegisterMessageCallback("notificationPromoClosed",
51 base::Bind(&NewTabPageHandler::HandleNotificationPromoClosed
,
52 base::Unretained(this)));
53 web_ui()->RegisterMessageCallback("notificationPromoViewed",
54 base::Bind(&NewTabPageHandler::HandleNotificationPromoViewed
,
55 base::Unretained(this)));
56 web_ui()->RegisterMessageCallback("notificationPromoLinkClicked",
57 base::Bind(&NewTabPageHandler::HandleNotificationPromoLinkClicked
,
58 base::Unretained(this)));
59 web_ui()->RegisterMessageCallback("bubblePromoClosed",
60 base::Bind(&NewTabPageHandler::HandleBubblePromoClosed
,
61 base::Unretained(this)));
62 web_ui()->RegisterMessageCallback("bubblePromoViewed",
63 base::Bind(&NewTabPageHandler::HandleBubblePromoViewed
,
64 base::Unretained(this)));
65 web_ui()->RegisterMessageCallback("bubblePromoLinkClicked",
66 base::Bind(&NewTabPageHandler::HandleBubblePromoLinkClicked
,
67 base::Unretained(this)));
68 web_ui()->RegisterMessageCallback("pageSelected",
69 base::Bind(&NewTabPageHandler::HandlePageSelected
,
70 base::Unretained(this)));
73 void NewTabPageHandler::HandleNotificationPromoClosed(
74 const base::ListValue
* args
) {
75 UMA_HISTOGRAM_ENUMERATION("NewTabPage.Promo.Notification",
76 PROMO_CLOSED
, PROMO_ACTION_MAX
);
77 NotificationPromo::HandleClosed(NotificationPromo::NTP_NOTIFICATION_PROMO
);
78 Notify(chrome::NOTIFICATION_PROMO_RESOURCE_STATE_CHANGED
);
81 void NewTabPageHandler::HandleNotificationPromoViewed(
82 const base::ListValue
* args
) {
83 UMA_HISTOGRAM_ENUMERATION("NewTabPage.Promo.Notification",
84 PROMO_VIEWED
, PROMO_ACTION_MAX
);
85 if (NotificationPromo::HandleViewed(
86 NotificationPromo::NTP_NOTIFICATION_PROMO
)) {
87 Notify(chrome::NOTIFICATION_PROMO_RESOURCE_STATE_CHANGED
);
91 void NewTabPageHandler::HandleNotificationPromoLinkClicked(
92 const base::ListValue
* args
) {
93 DVLOG(1) << "HandleNotificationPromoLinkClicked";
94 UMA_HISTOGRAM_ENUMERATION("NewTabPage.Promo.Notification",
95 PROMO_LINK_CLICKED
, PROMO_ACTION_MAX
);
98 void NewTabPageHandler::HandleBubblePromoClosed(const base::ListValue
* args
) {
99 UMA_HISTOGRAM_ENUMERATION("NewTabPage.Promo.Bubble",
100 PROMO_CLOSED
, PROMO_ACTION_MAX
);
101 NotificationPromo::HandleClosed(NotificationPromo::NTP_BUBBLE_PROMO
);
102 Notify(chrome::NOTIFICATION_PROMO_RESOURCE_STATE_CHANGED
);
105 void NewTabPageHandler::HandleBubblePromoViewed(const base::ListValue
* args
) {
106 UMA_HISTOGRAM_ENUMERATION("NewTabPage.Promo.Bubble",
107 PROMO_VIEWED
, PROMO_ACTION_MAX
);
108 if (NotificationPromo::HandleViewed(NotificationPromo::NTP_BUBBLE_PROMO
))
109 Notify(chrome::NOTIFICATION_PROMO_RESOURCE_STATE_CHANGED
);
112 void NewTabPageHandler::HandleBubblePromoLinkClicked(
113 const base::ListValue
* args
) {
114 DVLOG(1) << "HandleBubblePromoLinkClicked";
115 UMA_HISTOGRAM_ENUMERATION("NewTabPage.Promo.Bubble",
116 PROMO_LINK_CLICKED
, PROMO_ACTION_MAX
);
119 void NewTabPageHandler::HandlePageSelected(const base::ListValue
* args
) {
120 page_switch_count_
++;
122 double page_id_double
;
123 CHECK(args
->GetDouble(0, &page_id_double
));
124 int page_id
= static_cast<int>(page_id_double
);
127 CHECK(args
->GetDouble(1, &index_double
));
128 int index
= static_cast<int>(index_double
);
130 PrefService
* prefs
= Profile::FromWebUI(web_ui())->GetPrefs();
131 int previous_shown_page
=
132 prefs
->GetInteger(prefs::kNtpShownPage
) >> kPageIdOffset
;
133 UMA_HISTOGRAM_ENUMERATION("NewTabPage.PreviousSelectedPageType",
134 previous_shown_page
, kHistogramEnumerationMax
);
136 prefs
->SetInteger(prefs::kNtpShownPage
, page_id
| index
);
138 int shown_page_type
= page_id
>> kPageIdOffset
;
139 UMA_HISTOGRAM_ENUMERATION("NewTabPage.SelectedPageType",
140 shown_page_type
, kHistogramEnumerationMax
);
144 void NewTabPageHandler::RegisterProfilePrefs(
145 user_prefs::PrefRegistrySyncable
* registry
) {
146 // TODO(estade): should be syncable.
147 registry
->RegisterIntegerPref(prefs::kNtpShownPage
, APPS_PAGE_ID
);
151 void NewTabPageHandler::GetLocalizedValues(Profile
* profile
,
152 base::DictionaryValue
* values
) {
153 values
->SetInteger("apps_page_id", APPS_PAGE_ID
);
155 PrefService
* prefs
= profile
->GetPrefs();
156 int shown_page
= prefs
->GetInteger(prefs::kNtpShownPage
);
157 values
->SetInteger("shown_page_type", shown_page
& ~INDEX_MASK
);
158 values
->SetInteger("shown_page_index", shown_page
& INDEX_MASK
);
161 void NewTabPageHandler::Notify(chrome::NotificationType notification_type
) {
162 content::NotificationService
* service
=
163 content::NotificationService::current();
164 service
->Notify(notification_type
,
165 content::Source
<NewTabPageHandler
>(this),
166 content::NotificationService::NoDetails());