Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(427)

Side by Side Diff: chrome/browser/ui/webui/ntp/app_launcher_handler.cc

Issue 7776001: ntp4: improved app install, try 2 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: remove #app-id altogether Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/ntp/app_launcher_handler.h" 5 #include "chrome/browser/ui/webui/ntp/app_launcher_handler.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/auto_reset.h" 10 #include "base/auto_reset.h"
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 CHECK(bucket < extension_misc::APP_LAUNCH_BUCKET_BOUNDARY); 68 CHECK(bucket < extension_misc::APP_LAUNCH_BUCKET_BOUNDARY);
69 return bucket; 69 return bucket;
70 } 70 }
71 71
72 } // namespace 72 } // namespace
73 73
74 AppLauncherHandler::AppLauncherHandler(ExtensionService* extension_service) 74 AppLauncherHandler::AppLauncherHandler(ExtensionService* extension_service)
75 : extension_service_(extension_service), 75 : extension_service_(extension_service),
76 promo_active_(false), 76 promo_active_(false),
77 ignore_changes_(false), 77 ignore_changes_(false),
78 attempted_bookmark_app_install_(false) { 78 attempted_bookmark_app_install_(false),
79 has_loaded_apps_(false) {
79 } 80 }
80 81
81 AppLauncherHandler::~AppLauncherHandler() {} 82 AppLauncherHandler::~AppLauncherHandler() {}
82 83
83 // Serializes |notification| into a new DictionaryValue which the caller then 84 // Serializes |notification| into a new DictionaryValue which the caller then
84 // owns. 85 // owns.
85 static DictionaryValue* SerializeNotification( 86 static DictionaryValue* SerializeNotification(
86 const AppNotification& notification) { 87 const AppNotification& notification) {
87 DictionaryValue* dictionary = new DictionaryValue(); 88 DictionaryValue* dictionary = new DictionaryValue();
88 dictionary->SetString("title", notification.title); 89 dictionary->SetString("title", notification.title);
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 RecordWebStoreLaunch(is_promo_active); 215 RecordWebStoreLaunch(is_promo_active);
215 } else { 216 } else {
216 CHECK(params.size() == 3); 217 CHECK(params.size() == 3);
217 RecordAppLaunchByID(is_promo_active, ParseLaunchSource(params.at(2))); 218 RecordAppLaunchByID(is_promo_active, ParseLaunchSource(params.at(2)));
218 } 219 }
219 220
220 return true; 221 return true;
221 } 222 }
222 223
223 WebUIMessageHandler* AppLauncherHandler::Attach(WebUI* web_ui) { 224 WebUIMessageHandler* AppLauncherHandler::Attach(WebUI* web_ui) {
225 registrar_.Add(this, chrome::NOTIFICATION_APP_INSTALLED_TO_NTP,
226 Source<TabContents>(web_ui->tab_contents()));
224 return WebUIMessageHandler::Attach(web_ui); 227 return WebUIMessageHandler::Attach(web_ui);
225 } 228 }
226 229
227 void AppLauncherHandler::RegisterMessages() { 230 void AppLauncherHandler::RegisterMessages() {
228 web_ui_->RegisterMessageCallback("getApps", 231 web_ui_->RegisterMessageCallback("getApps",
229 NewCallback(this, &AppLauncherHandler::HandleGetApps)); 232 NewCallback(this, &AppLauncherHandler::HandleGetApps));
230 web_ui_->RegisterMessageCallback("launchApp", 233 web_ui_->RegisterMessageCallback("launchApp",
231 NewCallback(this, &AppLauncherHandler::HandleLaunchApp)); 234 NewCallback(this, &AppLauncherHandler::HandleLaunchApp));
232 web_ui_->RegisterMessageCallback("setLaunchType", 235 web_ui_->RegisterMessageCallback("setLaunchType",
233 NewCallback(this, &AppLauncherHandler::HandleSetLaunchType)); 236 NewCallback(this, &AppLauncherHandler::HandleSetLaunchType));
(...skipping 28 matching lines...) Expand all
262 const std::string& id = *Details<const std::string>(details).ptr(); 265 const std::string& id = *Details<const std::string>(details).ptr();
263 const AppNotification* notification = 266 const AppNotification* notification =
264 extension_service_->app_notification_manager()->GetLast(id); 267 extension_service_->app_notification_manager()->GetLast(id);
265 ListValue args; 268 ListValue args;
266 args.Append(new StringValue(id)); 269 args.Append(new StringValue(id));
267 if (notification) 270 if (notification)
268 args.Append(SerializeNotification(*notification)); 271 args.Append(SerializeNotification(*notification));
269 web_ui_->CallJavascriptFunction("appNotificationChanged", args); 272 web_ui_->CallJavascriptFunction("appNotificationChanged", args);
270 break; 273 break;
271 } 274 }
275 case chrome::NOTIFICATION_APP_INSTALLED_TO_NTP: {
276 if (!NewTabUI::NTP4Enabled())
277 break;
278
279 highlight_app_id_ = *Details<const std::string>(details).ptr();
280 if (has_loaded_apps_)
281 SetAppToBeHighlighted();
Rick Byers 2011/08/29 19:51:12 I assume we can't do this unconditionally because
Evan Stade 2011/08/29 20:30:51 yes, the js isn't ready yet.
282 break;
283 }
272 case chrome::NOTIFICATION_EXTENSION_LOADED: { 284 case chrome::NOTIFICATION_EXTENSION_LOADED: {
273 const Extension* extension = Details<const Extension>(details).ptr(); 285 const Extension* extension = Details<const Extension>(details).ptr();
274 if (!extension->is_app()) 286 if (!extension->is_app())
275 return; 287 return;
276 288
277 if (!NewTabUI::NTP4Enabled()) { 289 if (!NewTabUI::NTP4Enabled()) {
278 HandleGetApps(NULL); 290 HandleGetApps(NULL);
279 break; 291 break;
280 } 292 }
281 293
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 468
457 // If the default apps have just expired (user viewed them too many times with 469 // If the default apps have just expired (user viewed them too many times with
458 // no interaction), then we uninstall them and focus the recent sites section. 470 // no interaction), then we uninstall them and focus the recent sites section.
459 if (apps_promo_just_expired) { 471 if (apps_promo_just_expired) {
460 ignore_changes_ = true; 472 ignore_changes_ = true;
461 UninstallDefaultApps(); 473 UninstallDefaultApps();
462 ignore_changes_ = false; 474 ignore_changes_ = false;
463 ShownSectionsHandler::SetShownSection(prefs, THUMB); 475 ShownSectionsHandler::SetShownSection(prefs, THUMB);
464 } 476 }
465 477
478 SetAppToBeHighlighted();
466 FillAppDictionary(&dictionary); 479 FillAppDictionary(&dictionary);
467 web_ui_->CallJavascriptFunction("getAppsCallback", dictionary); 480 web_ui_->CallJavascriptFunction("getAppsCallback", dictionary);
468 481
469 // First time we get here we set up the observer so that we can tell update 482 // First time we get here we set up the observer so that we can tell update
470 // the apps as they change. 483 // the apps as they change.
471 if (registrar_.IsEmpty()) { 484 if (!has_loaded_apps_) {
485 pref_change_registrar_.Init(
486 extension_service_->extension_prefs()->pref_service());
487 pref_change_registrar_.Add(ExtensionPrefs::kExtensionsPref, this);
488 pref_change_registrar_.Add(prefs::kNTPAppPageNames, this);
489
472 registrar_.Add(this, chrome::NOTIFICATION_APP_NOTIFICATION_STATE_CHANGED, 490 registrar_.Add(this, chrome::NOTIFICATION_APP_NOTIFICATION_STATE_CHANGED,
473 NotificationService::AllSources()); 491 NotificationService::AllSources());
474 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED, 492 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED,
475 NotificationService::AllSources()); 493 NotificationService::AllSources());
476 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, 494 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED,
477 NotificationService::AllSources()); 495 NotificationService::AllSources());
478 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LAUNCHER_REORDERED, 496 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LAUNCHER_REORDERED,
479 NotificationService::AllSources()); 497 NotificationService::AllSources());
480 registrar_.Add(this, chrome::NOTIFICATION_WEB_STORE_PROMO_LOADED, 498 registrar_.Add(this, chrome::NOTIFICATION_WEB_STORE_PROMO_LOADED,
481 NotificationService::AllSources()); 499 NotificationService::AllSources());
482 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_INSTALL_ERROR, 500 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_INSTALL_ERROR,
483 NotificationService::AllSources()); 501 NotificationService::AllSources());
484 } 502 }
485 if (pref_change_registrar_.IsEmpty()) { 503
486 pref_change_registrar_.Init( 504 has_loaded_apps_ = true;
487 extension_service_->extension_prefs()->pref_service());
488 pref_change_registrar_.Add(ExtensionPrefs::kExtensionsPref, this);
489 pref_change_registrar_.Add(prefs::kNTPAppPageNames, this);
490 }
491 } 505 }
492 506
493 void AppLauncherHandler::HandleLaunchApp(const ListValue* args) { 507 void AppLauncherHandler::HandleLaunchApp(const ListValue* args) {
494 std::string extension_id; 508 std::string extension_id;
495 double source = -1.0; 509 double source = -1.0;
496 bool alt_key = false; 510 bool alt_key = false;
497 bool ctrl_key = false; 511 bool ctrl_key = false;
498 bool meta_key = false; 512 bool meta_key = false;
499 bool shift_key = false; 513 bool shift_key = false;
500 double button = 0.0; 514 double button = 0.0;
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
788 web_app->icons.clear(); 802 web_app->icons.clear();
789 } 803 }
790 804
791 scoped_refptr<CrxInstaller> installer( 805 scoped_refptr<CrxInstaller> installer(
792 extension_service_->MakeCrxInstaller(NULL)); 806 extension_service_->MakeCrxInstaller(NULL));
793 installer->set_page_index(install_info->page_index); 807 installer->set_page_index(install_info->page_index);
794 installer->InstallWebApp(*web_app); 808 installer->InstallWebApp(*web_app);
795 attempted_bookmark_app_install_ = true; 809 attempted_bookmark_app_install_ = true;
796 } 810 }
797 811
812 void AppLauncherHandler::SetAppToBeHighlighted() {
813 if (highlight_app_id_.empty())
814 return;
815
816 scoped_ptr<StringValue> app_id(Value::CreateStringValue(highlight_app_id_));
817 web_ui_->CallJavascriptFunction("ntp4.setAppToBeHighlighted", *app_id);
818 highlight_app_id_.clear();
819 }
820
798 // static 821 // static
799 void AppLauncherHandler::RegisterUserPrefs(PrefService* pref_service) { 822 void AppLauncherHandler::RegisterUserPrefs(PrefService* pref_service) {
800 // TODO(csilv): We will want this to be a syncable preference instead. 823 // TODO(csilv): We will want this to be a syncable preference instead.
801 pref_service->RegisterListPref(prefs::kNTPAppPageNames, 824 pref_service->RegisterListPref(prefs::kNTPAppPageNames,
802 PrefService::UNSYNCABLE_PREF); 825 PrefService::UNSYNCABLE_PREF);
803 } 826 }
804 827
805 // statiic 828 // statiic
806 void AppLauncherHandler::RecordWebStoreLaunch(bool promo_active) { 829 void AppLauncherHandler::RecordWebStoreLaunch(bool promo_active) {
807 UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppLaunchHistogram, 830 UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppLaunchHistogram,
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
858 extension = extension_service_->GetExtensionById(extension_id, true); 881 extension = extension_service_->GetExtensionById(extension_id, true);
859 } 882 }
860 883
861 ExtensionPrefs* extension_prefs = extension_service_->extension_prefs(); 884 ExtensionPrefs* extension_prefs = extension_service_->extension_prefs();
862 if (!extension_prefs->DidExtensionEscalatePermissions(extension_id)) { 885 if (!extension_prefs->DidExtensionEscalatePermissions(extension_id)) {
863 // Enable the extension immediately if its privileges weren't escalated. 886 // Enable the extension immediately if its privileges weren't escalated.
864 // This is a no-op if the extension was previously terminated. 887 // This is a no-op if the extension was previously terminated.
865 extension_service_->EnableExtension(extension_id); 888 extension_service_->EnableExtension(extension_id);
866 889
867 // Launch app asynchronously so the image will update. 890 // Launch app asynchronously so the image will update.
868 StringValue* app_id = Value::CreateStringValue(extension_id); 891 scoped_ptr<StringValue> app_id(Value::CreateStringValue(extension_id));
869 web_ui_->CallJavascriptFunction("launchAppAfterEnable", *app_id); 892 web_ui_->CallJavascriptFunction("launchAppAfterEnable", *app_id);
870 return; 893 return;
871 } 894 }
872 895
873 if (!extension_id_prompting_.empty()) 896 if (!extension_id_prompting_.empty())
874 return; // Only one prompt at a time. 897 return; // Only one prompt at a time.
875 898
876 extension_id_prompting_ = extension_id; 899 extension_id_prompting_ = extension_id;
877 GetExtensionInstallUI()->ConfirmReEnable(this, extension); 900 GetExtensionInstallUI()->ConfirmReEnable(this, extension);
878 } 901 }
(...skipping 29 matching lines...) Expand all
908 extension_service_->GetExtensionById(extension_id_prompting_, true); 931 extension_service_->GetExtensionById(extension_id_prompting_, true);
909 if (!extension) 932 if (!extension)
910 return; 933 return;
911 934
912 extension_service_->GrantPermissionsAndEnableExtension(extension); 935 extension_service_->GrantPermissionsAndEnableExtension(extension);
913 936
914 // We bounce this off the NTP so the browser can update the apps icon. 937 // We bounce this off the NTP so the browser can update the apps icon.
915 // If we don't launch the app asynchronously, then the app's disabled 938 // If we don't launch the app asynchronously, then the app's disabled
916 // icon disappears but isn't replaced by the enabled icon, making a poor 939 // icon disappears but isn't replaced by the enabled icon, making a poor
917 // visual experience. 940 // visual experience.
918 StringValue* app_id = Value::CreateStringValue(extension->id()); 941 scoped_ptr<StringValue> app_id(Value::CreateStringValue(extension->id()));
919 web_ui_->CallJavascriptFunction("launchAppAfterEnable", *app_id); 942 web_ui_->CallJavascriptFunction("launchAppAfterEnable", *app_id);
920 943
921 extension_id_prompting_ = ""; 944 extension_id_prompting_ = "";
922 } 945 }
923 946
924 void AppLauncherHandler::InstallUIAbort(bool user_initiated) { 947 void AppLauncherHandler::InstallUIAbort(bool user_initiated) {
925 // We record the histograms here because ExtensionDialogCanceled is also 948 // We record the histograms here because ExtensionDialogCanceled is also
926 // called when the extension uninstall dialog is canceled. 949 // called when the extension uninstall dialog is canceled.
927 const Extension* extension = 950 const Extension* extension =
928 extension_service_->GetExtensionById(extension_id_prompting_, true); 951 extension_service_->GetExtensionById(extension_id_prompting_, true);
(...skipping 24 matching lines...) Expand all
953 976
954 void AppLauncherHandler::UninstallDefaultApps() { 977 void AppLauncherHandler::UninstallDefaultApps() {
955 AppsPromo* apps_promo = extension_service_->apps_promo(); 978 AppsPromo* apps_promo = extension_service_->apps_promo();
956 const ExtensionIdSet& app_ids = apps_promo->old_default_apps(); 979 const ExtensionIdSet& app_ids = apps_promo->old_default_apps();
957 for (ExtensionIdSet::const_iterator iter = app_ids.begin(); 980 for (ExtensionIdSet::const_iterator iter = app_ids.begin();
958 iter != app_ids.end(); ++iter) { 981 iter != app_ids.end(); ++iter) {
959 if (extension_service_->GetExtensionById(*iter, true)) 982 if (extension_service_->GetExtensionById(*iter, true))
960 extension_service_->UninstallExtension(*iter, false, NULL); 983 extension_service_->UninstallExtension(*iter, false, NULL);
961 } 984 }
962 } 985 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/webui/ntp/app_launcher_handler.h ('k') | chrome/common/chrome_notification_types.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698