OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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/ntp/app_launcher_handler.h" | 5 #include "chrome/browser/ui/webui/ntp/app_launcher_handler.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 30 matching lines...) Expand all Loading... | |
41 #include "chrome/browser/ui/webui/ntp/new_tab_ui.h" | 41 #include "chrome/browser/ui/webui/ntp/new_tab_ui.h" |
42 #include "chrome/common/chrome_switches.h" | 42 #include "chrome/common/chrome_switches.h" |
43 #include "chrome/common/extensions/extension_constants.h" | 43 #include "chrome/common/extensions/extension_constants.h" |
44 #include "chrome/common/extensions/extension_metrics.h" | 44 #include "chrome/common/extensions/extension_metrics.h" |
45 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h" | 45 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h" |
46 #include "chrome/common/pref_names.h" | 46 #include "chrome/common/pref_names.h" |
47 #include "chrome/common/url_constants.h" | 47 #include "chrome/common/url_constants.h" |
48 #include "chrome/common/web_application_info.h" | 48 #include "chrome/common/web_application_info.h" |
49 #include "chrome/grit/generated_resources.h" | 49 #include "chrome/grit/generated_resources.h" |
50 #include "components/favicon_base/favicon_types.h" | 50 #include "components/favicon_base/favicon_types.h" |
51 #include "components/pref_registry/pref_registry_syncable.h" | |
51 #include "components/prefs/pref_service.h" | 52 #include "components/prefs/pref_service.h" |
52 #include "components/prefs/scoped_user_pref_update.h" | 53 #include "components/prefs/scoped_user_pref_update.h" |
53 #include "content/public/browser/notification_service.h" | 54 #include "content/public/browser/notification_service.h" |
54 #include "content/public/browser/web_ui.h" | 55 #include "content/public/browser/web_ui.h" |
55 #include "content/public/common/favicon_url.h" | 56 #include "content/public/common/favicon_url.h" |
56 #include "extensions/browser/app_sorting.h" | 57 #include "extensions/browser/app_sorting.h" |
57 #include "extensions/browser/extension_prefs.h" | 58 #include "extensions/browser/extension_prefs.h" |
58 #include "extensions/browser/extension_registry.h" | 59 #include "extensions/browser/extension_registry.h" |
59 #include "extensions/browser/extension_system.h" | 60 #include "extensions/browser/extension_system.h" |
60 #include "extensions/browser/management_policy.h" | 61 #include "extensions/browser/management_policy.h" |
(...skipping 11 matching lines...) Expand all Loading... | |
72 using extensions::AppSorting; | 73 using extensions::AppSorting; |
73 using extensions::CrxInstaller; | 74 using extensions::CrxInstaller; |
74 using extensions::Extension; | 75 using extensions::Extension; |
75 using extensions::ExtensionPrefs; | 76 using extensions::ExtensionPrefs; |
76 using extensions::ExtensionRegistry; | 77 using extensions::ExtensionRegistry; |
77 using extensions::ExtensionSet; | 78 using extensions::ExtensionSet; |
78 using extensions::ExtensionSystem; | 79 using extensions::ExtensionSystem; |
79 | 80 |
80 namespace { | 81 namespace { |
81 | 82 |
83 // The purpose of this enum is to track which page on the NTP is showing. | |
84 // The lower 10 bits of kNtpShownPage are used for the index within the page | |
85 // group, and the rest of the bits are used for the page group ID (defined | |
86 // here). | |
87 static const int kPageIdOffset = 10; | |
88 enum { | |
89 INDEX_MASK = (1 << kPageIdOffset) - 1, | |
90 APPS_PAGE_ID = 2 << kPageIdOffset, | |
91 }; | |
92 | |
82 void RecordAppLauncherPromoHistogram( | 93 void RecordAppLauncherPromoHistogram( |
83 apps::AppLauncherPromoHistogramValues value) { | 94 apps::AppLauncherPromoHistogramValues value) { |
84 DCHECK_LT(value, apps::APP_LAUNCHER_PROMO_MAX); | 95 DCHECK_LT(value, apps::APP_LAUNCHER_PROMO_MAX); |
85 UMA_HISTOGRAM_ENUMERATION( | 96 UMA_HISTOGRAM_ENUMERATION( |
86 "Apps.AppLauncherPromo", value, apps::APP_LAUNCHER_PROMO_MAX); | 97 "Apps.AppLauncherPromo", value, apps::APP_LAUNCHER_PROMO_MAX); |
87 } | 98 } |
88 | 99 |
89 // This is used to avoid a DCHECK due to an unhandled WebUI callback. The | |
90 // JavaScript used to switch between pages sends "pageSelected" which is used | |
91 // in the context of the NTP for recording metrics we don't need here. | |
92 void NoOpCallback(const base::ListValue* args) {} | |
93 | |
94 } // namespace | 100 } // namespace |
95 | 101 |
96 AppLauncherHandler::AppInstallInfo::AppInstallInfo() {} | 102 AppLauncherHandler::AppInstallInfo::AppInstallInfo() {} |
97 | 103 |
98 AppLauncherHandler::AppInstallInfo::~AppInstallInfo() {} | 104 AppLauncherHandler::AppInstallInfo::~AppInstallInfo() {} |
99 | 105 |
100 AppLauncherHandler::AppLauncherHandler(ExtensionService* extension_service) | 106 AppLauncherHandler::AppLauncherHandler(ExtensionService* extension_service) |
101 : extension_service_(extension_service), | 107 : extension_service_(extension_service), |
102 ignore_changes_(false), | 108 ignore_changes_(false), |
103 attempted_bookmark_app_install_(false), | 109 attempted_bookmark_app_install_(false), |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
199 // ordinal). The webstore's app launch ordinal is always set to the first | 205 // ordinal). The webstore's app launch ordinal is always set to the first |
200 // position. | 206 // position. |
201 app_launch_ordinal = extension->id() == extensions::kWebStoreAppId ? | 207 app_launch_ordinal = extension->id() == extensions::kWebStoreAppId ? |
202 sorting->CreateFirstAppLaunchOrdinal(page_ordinal) : | 208 sorting->CreateFirstAppLaunchOrdinal(page_ordinal) : |
203 sorting->CreateNextAppLaunchOrdinal(page_ordinal); | 209 sorting->CreateNextAppLaunchOrdinal(page_ordinal); |
204 sorting->SetAppLaunchOrdinal(extension->id(), app_launch_ordinal); | 210 sorting->SetAppLaunchOrdinal(extension->id(), app_launch_ordinal); |
205 } | 211 } |
206 value->SetString("app_launch_ordinal", app_launch_ordinal.ToInternalValue()); | 212 value->SetString("app_launch_ordinal", app_launch_ordinal.ToInternalValue()); |
207 } | 213 } |
208 | 214 |
215 // static | |
216 void AppLauncherHandler::GetLocalizedValues(Profile* profile, | |
217 base::DictionaryValue* values) { | |
218 PrefService* prefs = profile->GetPrefs(); | |
219 int shown_page = prefs->GetInteger(prefs::kNtpShownPage); | |
220 values->SetInteger("shown_page_index", shown_page & INDEX_MASK); | |
221 } | |
222 | |
223 // static | |
224 void AppLauncherHandler::RegisterProfilePrefs( | |
225 user_prefs::PrefRegistrySyncable* registry) { | |
226 // TODO(estade): should be syncable. | |
Evan Stade
2016/03/03 19:59:53
this is so meh-worthy I wouldn't mind if you remov
Dan Beam
2016/03/03 21:09:41
Done.
| |
227 registry->RegisterIntegerPref(prefs::kNtpShownPage, APPS_PAGE_ID); | |
228 } | |
229 | |
209 void AppLauncherHandler::RegisterMessages() { | 230 void AppLauncherHandler::RegisterMessages() { |
210 registrar_.Add(this, chrome::NOTIFICATION_APP_INSTALLED_TO_NTP, | 231 registrar_.Add(this, chrome::NOTIFICATION_APP_INSTALLED_TO_NTP, |
211 content::Source<WebContents>(web_ui()->GetWebContents())); | 232 content::Source<WebContents>(web_ui()->GetWebContents())); |
212 | 233 |
213 // Some tests don't have a local state. | 234 // Some tests don't have a local state. |
214 #if defined(ENABLE_APP_LIST) | 235 #if defined(ENABLE_APP_LIST) |
215 if (g_browser_process->local_state()) { | 236 if (g_browser_process->local_state()) { |
216 local_state_pref_change_registrar_.Init(g_browser_process->local_state()); | 237 local_state_pref_change_registrar_.Init(g_browser_process->local_state()); |
217 local_state_pref_change_registrar_.Add( | 238 local_state_pref_change_registrar_.Add( |
218 prefs::kShowAppLauncherPromo, | 239 prefs::kShowAppLauncherPromo, |
(...skipping 25 matching lines...) Expand all Loading... | |
244 web_ui()->RegisterMessageCallback("setPageIndex", | 265 web_ui()->RegisterMessageCallback("setPageIndex", |
245 base::Bind(&AppLauncherHandler::HandleSetPageIndex, | 266 base::Bind(&AppLauncherHandler::HandleSetPageIndex, |
246 base::Unretained(this))); | 267 base::Unretained(this))); |
247 web_ui()->RegisterMessageCallback("saveAppPageName", | 268 web_ui()->RegisterMessageCallback("saveAppPageName", |
248 base::Bind(&AppLauncherHandler::HandleSaveAppPageName, | 269 base::Bind(&AppLauncherHandler::HandleSaveAppPageName, |
249 base::Unretained(this))); | 270 base::Unretained(this))); |
250 web_ui()->RegisterMessageCallback("generateAppForLink", | 271 web_ui()->RegisterMessageCallback("generateAppForLink", |
251 base::Bind(&AppLauncherHandler::HandleGenerateAppForLink, | 272 base::Bind(&AppLauncherHandler::HandleGenerateAppForLink, |
252 base::Unretained(this))); | 273 base::Unretained(this))); |
253 web_ui()->RegisterMessageCallback("stopShowingAppLauncherPromo", | 274 web_ui()->RegisterMessageCallback("stopShowingAppLauncherPromo", |
254 base::Bind(&AppLauncherHandler::StopShowingAppLauncherPromo, | 275 base::Bind(&AppLauncherHandler::HandleStopShowingAppLauncherPromo, |
255 base::Unretained(this))); | 276 base::Unretained(this))); |
256 web_ui()->RegisterMessageCallback("onLearnMore", | 277 web_ui()->RegisterMessageCallback("onLearnMore", |
257 base::Bind(&AppLauncherHandler::OnLearnMore, | 278 base::Bind(&AppLauncherHandler::HandleOnLearnMore, |
258 base::Unretained(this))); | 279 base::Unretained(this))); |
259 web_ui()->RegisterMessageCallback("pageSelected", base::Bind(&NoOpCallback)); | 280 web_ui()->RegisterMessageCallback("pageSelected", |
281 base::Bind(&AppLauncherHandler::HandlePageSelected, | |
282 base::Unretained(this))); | |
260 } | 283 } |
261 | 284 |
262 void AppLauncherHandler::Observe(int type, | 285 void AppLauncherHandler::Observe(int type, |
263 const content::NotificationSource& source, | 286 const content::NotificationSource& source, |
264 const content::NotificationDetails& details) { | 287 const content::NotificationDetails& details) { |
265 if (type == chrome::NOTIFICATION_APP_INSTALLED_TO_NTP) { | 288 if (type == chrome::NOTIFICATION_APP_INSTALLED_TO_NTP) { |
266 highlight_app_id_ = *content::Details<const std::string>(details).ptr(); | 289 highlight_app_id_ = *content::Details<const std::string>(details).ptr(); |
267 if (has_loaded_apps_) | 290 if (has_loaded_apps_) |
268 SetAppToBeHighlighted(); | 291 SetAppToBeHighlighted(); |
269 return; | 292 return; |
(...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
703 install_info->page_ordinal = page_ordinal; | 726 install_info->page_ordinal = page_ordinal; |
704 | 727 |
705 favicon_service->GetFaviconImageForPageURL( | 728 favicon_service->GetFaviconImageForPageURL( |
706 launch_url, | 729 launch_url, |
707 base::Bind(&AppLauncherHandler::OnFaviconForApp, | 730 base::Bind(&AppLauncherHandler::OnFaviconForApp, |
708 base::Unretained(this), | 731 base::Unretained(this), |
709 base::Passed(&install_info)), | 732 base::Passed(&install_info)), |
710 &cancelable_task_tracker_); | 733 &cancelable_task_tracker_); |
711 } | 734 } |
712 | 735 |
713 void AppLauncherHandler::StopShowingAppLauncherPromo( | 736 void AppLauncherHandler::HandleStopShowingAppLauncherPromo( |
714 const base::ListValue* args) { | 737 const base::ListValue* args) { |
715 #if defined(ENABLE_APP_LIST) | 738 #if defined(ENABLE_APP_LIST) |
716 g_browser_process->local_state()->SetBoolean( | 739 g_browser_process->local_state()->SetBoolean( |
717 prefs::kShowAppLauncherPromo, false); | 740 prefs::kShowAppLauncherPromo, false); |
718 RecordAppLauncherPromoHistogram(apps::APP_LAUNCHER_PROMO_DISMISSED); | 741 RecordAppLauncherPromoHistogram(apps::APP_LAUNCHER_PROMO_DISMISSED); |
719 #endif | 742 #endif |
720 } | 743 } |
721 | 744 |
722 void AppLauncherHandler::OnLearnMore(const base::ListValue* args) { | 745 void AppLauncherHandler::HandleOnLearnMore(const base::ListValue* args) { |
723 RecordAppLauncherPromoHistogram(apps::APP_LAUNCHER_PROMO_LEARN_MORE); | 746 RecordAppLauncherPromoHistogram(apps::APP_LAUNCHER_PROMO_LEARN_MORE); |
724 } | 747 } |
725 | 748 |
749 void AppLauncherHandler::HandlePageSelected(const base::ListValue* args) { | |
750 double index_double; | |
751 CHECK(args->GetDouble(0, &index_double)); | |
752 int index = static_cast<int>(index_double); | |
753 | |
754 PrefService* prefs = Profile::FromWebUI(web_ui())->GetPrefs(); | |
755 prefs->SetInteger(prefs::kNtpShownPage, APPS_PAGE_ID | index); | |
756 } | |
757 | |
726 void AppLauncherHandler::OnFaviconForApp( | 758 void AppLauncherHandler::OnFaviconForApp( |
727 scoped_ptr<AppInstallInfo> install_info, | 759 scoped_ptr<AppInstallInfo> install_info, |
728 const favicon_base::FaviconImageResult& image_result) { | 760 const favicon_base::FaviconImageResult& image_result) { |
729 scoped_ptr<WebApplicationInfo> web_app(new WebApplicationInfo()); | 761 scoped_ptr<WebApplicationInfo> web_app(new WebApplicationInfo()); |
730 web_app->title = install_info->title; | 762 web_app->title = install_info->title; |
731 web_app->app_url = install_info->app_url; | 763 web_app->app_url = install_info->app_url; |
732 | 764 |
733 if (!image_result.image.IsEmpty()) { | 765 if (!image_result.image.IsEmpty()) { |
734 WebApplicationInfo::IconInfo icon; | 766 WebApplicationInfo::IconInfo icon; |
735 icon.data = image_result.image.AsBitmap(); | 767 icon.data = image_result.image.AsBitmap(); |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
848 base::FundamentalValue(!extension_id_prompting_.empty())); | 880 base::FundamentalValue(!extension_id_prompting_.empty())); |
849 } | 881 } |
850 | 882 |
851 bool AppLauncherHandler::ShouldShow(const Extension* extension) const { | 883 bool AppLauncherHandler::ShouldShow(const Extension* extension) const { |
852 if (ignore_changes_ || !has_loaded_apps_ || !extension->is_app()) | 884 if (ignore_changes_ || !has_loaded_apps_ || !extension->is_app()) |
853 return false; | 885 return false; |
854 | 886 |
855 Profile* profile = Profile::FromWebUI(web_ui()); | 887 Profile* profile = Profile::FromWebUI(web_ui()); |
856 return extensions::ui_util::ShouldDisplayInNewTabPage(extension, profile); | 888 return extensions::ui_util::ShouldDisplayInNewTabPage(extension, profile); |
857 } | 889 } |
OLD | NEW |