Chromium Code Reviews| 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 <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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 71 } // namespace | 71 } // namespace |
| 72 | 72 |
| 73 AppLauncherHandler::AppInstallInfo::AppInstallInfo() {} | 73 AppLauncherHandler::AppInstallInfo::AppInstallInfo() {} |
| 74 | 74 |
| 75 AppLauncherHandler::AppInstallInfo::~AppInstallInfo() {} | 75 AppLauncherHandler::AppInstallInfo::~AppInstallInfo() {} |
| 76 | 76 |
| 77 AppLauncherHandler::AppLauncherHandler(ExtensionService* extension_service) | 77 AppLauncherHandler::AppLauncherHandler(ExtensionService* extension_service) |
| 78 : extension_service_(extension_service), | 78 : extension_service_(extension_service), |
| 79 ignore_changes_(false), | 79 ignore_changes_(false), |
| 80 attempted_bookmark_app_install_(false), | 80 attempted_bookmark_app_install_(false), |
| 81 has_loaded_apps_(false) { | 81 has_loaded_apps_(false), |
| 82 uninstall_from_page_(false) { | |
| 82 } | 83 } |
| 83 | 84 |
| 84 AppLauncherHandler::~AppLauncherHandler() {} | 85 AppLauncherHandler::~AppLauncherHandler() {} |
| 85 | 86 |
| 86 // Serializes |notification| into a new DictionaryValue which the caller then | 87 // Serializes |notification| into a new DictionaryValue which the caller then |
| 87 // owns. | 88 // owns. |
| 88 static DictionaryValue* SerializeNotification( | 89 static DictionaryValue* SerializeNotification( |
| 89 const AppNotification& notification) { | 90 const AppNotification& notification) { |
| 90 DictionaryValue* dictionary = new DictionaryValue(); | 91 DictionaryValue* dictionary = new DictionaryValue(); |
| 91 dictionary->SetString("title", notification.title()); | 92 dictionary->SetString("title", notification.title()); |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 298 content::Details<UnloadedExtensionInfo>(details)->extension; | 299 content::Details<UnloadedExtensionInfo>(details)->extension; |
| 299 if (!extension->is_app()) | 300 if (!extension->is_app()) |
| 300 return; | 301 return; |
| 301 | 302 |
| 302 scoped_ptr<DictionaryValue> app_info(GetAppInfo(extension)); | 303 scoped_ptr<DictionaryValue> app_info(GetAppInfo(extension)); |
| 303 scoped_ptr<base::FundamentalValue> uninstall_value( | 304 scoped_ptr<base::FundamentalValue> uninstall_value( |
| 304 Value::CreateBooleanValue( | 305 Value::CreateBooleanValue( |
| 305 content::Details<UnloadedExtensionInfo>(details)->reason == | 306 content::Details<UnloadedExtensionInfo>(details)->reason == |
| 306 extension_misc::UNLOAD_REASON_UNINSTALL)); | 307 extension_misc::UNLOAD_REASON_UNINSTALL)); |
| 307 if (app_info.get()) { | 308 if (app_info.get()) { |
| 309 scoped_ptr<base::FundamentalValue> from_page( | |
| 310 Value::CreateBooleanValue(uninstall_from_page_)); | |
| 308 web_ui()->CallJavascriptFunction( | 311 web_ui()->CallJavascriptFunction( |
| 309 "ntp4.appRemoved", *app_info, *uninstall_value); | 312 "ntp4.appRemoved", *app_info, *uninstall_value, *from_page); |
| 310 } | 313 } |
| 311 break; | 314 break; |
| 312 } | 315 } |
| 313 case chrome::NOTIFICATION_EXTENSION_LAUNCHER_REORDERED: | 316 case chrome::NOTIFICATION_EXTENSION_LAUNCHER_REORDERED: |
| 314 // The promo may not load until a couple seconds after the first NTP view, | 317 // The promo may not load until a couple seconds after the first NTP view, |
| 315 // so we listen for the load notification and notify the NTP when ready. | 318 // so we listen for the load notification and notify the NTP when ready. |
| 316 case chrome::NOTIFICATION_WEB_STORE_PROMO_LOADED: | 319 case chrome::NOTIFICATION_WEB_STORE_PROMO_LOADED: |
| 317 // TODO(estade): try to get rid of this inefficient operation. | 320 // TODO(estade): Try to get rid of this inefficient operation. |
| 318 HandleGetApps(NULL); | 321 HandleGetApps(NULL); |
| 319 break; | 322 break; |
| 320 case chrome::NOTIFICATION_PREF_CHANGED: { | 323 case chrome::NOTIFICATION_PREF_CHANGED: { |
| 321 DictionaryValue dictionary; | 324 DictionaryValue dictionary; |
| 322 FillAppDictionary(&dictionary); | 325 FillAppDictionary(&dictionary); |
| 323 web_ui()->CallJavascriptFunction("appsPrefChangeCallback", dictionary); | 326 web_ui()->CallJavascriptFunction("appsPrefChangeCallback", dictionary); |
| 324 break; | 327 break; |
| 325 } | 328 } |
| 326 case chrome::NOTIFICATION_EXTENSION_INSTALL_ERROR: { | 329 case chrome::NOTIFICATION_EXTENSION_INSTALL_ERROR: { |
| 327 CrxInstaller* crx_installer = content::Source<CrxInstaller>(source).ptr(); | 330 CrxInstaller* crx_installer = content::Source<CrxInstaller>(source).ptr(); |
| 328 if (!Profile::FromWebUI(web_ui())->IsSameProfile( | 331 if (!Profile::FromWebUI(web_ui())->IsSameProfile( |
| 329 crx_installer->profile())) { | 332 crx_installer->profile())) { |
| 330 return; | 333 return; |
| 331 } | 334 } |
| 332 // Fall Through. | 335 // Fall through. |
| 333 } | 336 } |
| 334 case chrome::NOTIFICATION_EXTENSION_LOAD_ERROR: { | 337 case chrome::NOTIFICATION_EXTENSION_LOAD_ERROR: { |
| 335 attempted_bookmark_app_install_ = false; | 338 attempted_bookmark_app_install_ = false; |
| 336 break; | 339 break; |
| 337 } | 340 } |
| 338 default: | 341 default: |
| 339 NOTREACHED(); | 342 NOTREACHED(); |
| 340 } | 343 } |
| 341 } | 344 } |
| 342 | 345 |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 613 if (!extension_id_prompting_.empty()) | 616 if (!extension_id_prompting_.empty()) |
| 614 return; // Only one prompt at a time. | 617 return; // Only one prompt at a time. |
| 615 | 618 |
| 616 extension_id_prompting_ = extension_id; | 619 extension_id_prompting_ = extension_id; |
| 617 | 620 |
| 618 bool dont_confirm = false; | 621 bool dont_confirm = false; |
| 619 if (args->GetBoolean(1, &dont_confirm) && dont_confirm) { | 622 if (args->GetBoolean(1, &dont_confirm) && dont_confirm) { |
| 620 AutoReset<bool> auto_reset(&ignore_changes_, true); | 623 AutoReset<bool> auto_reset(&ignore_changes_, true); |
| 621 ExtensionUninstallAccepted(); | 624 ExtensionUninstallAccepted(); |
| 622 } else { | 625 } else { |
| 626 // We don't use an AutoReset<bool> here as the uninstall dialog runs in a | |
|
Evan Stade
2012/01/17 19:45:29
the uninstall dialog runs in the UI thread, same a
Dan Beam
2012/01/18 00:07:23
Done. (removed because of following review comment
| |
| 627 // different thread so it's not sync. | |
| 628 uninstall_from_page_ = true; | |
|
Evan Stade
2012/01/17 19:45:29
I don't see why you need this new boolean. What is
Dan Beam
2012/01/17 21:33:09
Done.
| |
| 623 GetExtensionUninstallDialog()->ConfirmUninstall(extension); | 629 GetExtensionUninstallDialog()->ConfirmUninstall(extension); |
| 624 } | 630 } |
| 625 } | 631 } |
| 626 | 632 |
| 627 void AppLauncherHandler::HandleHideAppsPromo(const ListValue* args) { | 633 void AppLauncherHandler::HandleHideAppsPromo(const ListValue* args) { |
| 628 // If the user has intentionally hidden the promotion, we'll uninstall all the | 634 // If the user has intentionally hidden the promotion, we'll uninstall all the |
| 629 // default apps (we know the user hasn't installed any apps on their own at | 635 // default apps (we know the user hasn't installed any apps on their own at |
| 630 // this point, or the promotion wouldn't have been shown). | 636 // this point, or the promotion wouldn't have been shown). |
| 631 // TODO(estade): this isn't used right now as we sort out the future of the | 637 // TODO(estade): this isn't used right now as we sort out the future of the |
| 632 // apps promo on ntp4. | 638 // apps promo on ntp4. |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 835 highlight_app_id_.clear(); | 841 highlight_app_id_.clear(); |
| 836 } | 842 } |
| 837 | 843 |
| 838 // static | 844 // static |
| 839 void AppLauncherHandler::RegisterUserPrefs(PrefService* pref_service) { | 845 void AppLauncherHandler::RegisterUserPrefs(PrefService* pref_service) { |
| 840 // TODO(csharp): We will want this to be a syncable preference instead. | 846 // TODO(csharp): We will want this to be a syncable preference instead. |
| 841 pref_service->RegisterListPref(prefs::kNTPAppPageNames, | 847 pref_service->RegisterListPref(prefs::kNTPAppPageNames, |
| 842 PrefService::UNSYNCABLE_PREF); | 848 PrefService::UNSYNCABLE_PREF); |
| 843 } | 849 } |
| 844 | 850 |
| 851 void AppLauncherHandler::CleanupAfterUninstall() { | |
| 852 uninstall_from_page_ = false; | |
| 853 extension_id_prompting_ = ""; | |
|
Evan Stade
2012/01/17 19:45:29
.clear()
Dan Beam
2012/01/18 00:04:27
Done.
| |
| 854 } | |
| 855 | |
| 845 // static | 856 // static |
| 846 void AppLauncherHandler::RecordWebStoreLaunch(bool promo_active) { | 857 void AppLauncherHandler::RecordWebStoreLaunch(bool promo_active) { |
| 847 UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppLaunchHistogram, | 858 UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppLaunchHistogram, |
| 848 extension_misc::APP_LAUNCH_NTP_WEBSTORE, | 859 extension_misc::APP_LAUNCH_NTP_WEBSTORE, |
| 849 extension_misc::APP_LAUNCH_BUCKET_BOUNDARY); | 860 extension_misc::APP_LAUNCH_BUCKET_BOUNDARY); |
| 850 | 861 |
| 851 if (!promo_active) return; | 862 if (!promo_active) return; |
| 852 | 863 |
| 853 UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppsPromoHistogram, | 864 UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppsPromoHistogram, |
| 854 extension_misc::PROMO_LAUNCH_WEB_STORE, | 865 extension_misc::PROMO_LAUNCH_WEB_STORE, |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 920 | 931 |
| 921 // The extension can be uninstalled in another window while the UI was | 932 // The extension can be uninstalled in another window while the UI was |
| 922 // showing. Do nothing in that case. | 933 // showing. Do nothing in that case. |
| 923 const Extension* extension = | 934 const Extension* extension = |
| 924 extension_service_->GetExtensionById(extension_id_prompting_, true); | 935 extension_service_->GetExtensionById(extension_id_prompting_, true); |
| 925 if (!extension) | 936 if (!extension) |
| 926 return; | 937 return; |
| 927 | 938 |
| 928 extension_service_->UninstallExtension(extension_id_prompting_, | 939 extension_service_->UninstallExtension(extension_id_prompting_, |
| 929 false /* external_uninstall */, NULL); | 940 false /* external_uninstall */, NULL); |
| 930 | 941 CleanupAfterUninstall(); |
| 931 extension_id_prompting_ = ""; | |
| 932 } | 942 } |
| 933 | 943 |
| 934 void AppLauncherHandler::ExtensionUninstallCanceled() { | 944 void AppLauncherHandler::ExtensionUninstallCanceled() { |
| 935 extension_id_prompting_ = ""; | 945 CleanupAfterUninstall(); |
| 936 } | 946 } |
| 937 | 947 |
| 938 void AppLauncherHandler::InstallUIProceed() { | 948 void AppLauncherHandler::InstallUIProceed() { |
| 939 // Do the re-enable work here. | 949 // Do the re-enable work here. |
| 940 DCHECK(!extension_id_prompting_.empty()); | 950 DCHECK(!extension_id_prompting_.empty()); |
| 941 | 951 |
| 942 // The extension can be uninstalled in another window while the UI was | 952 // The extension can be uninstalled in another window while the UI was |
| 943 // showing. Do nothing in that case. | 953 // showing. Do nothing in that case. |
| 944 const Extension* extension = | 954 const Extension* extension = |
| 945 extension_service_->GetExtensionById(extension_id_prompting_, true); | 955 extension_service_->GetExtensionById(extension_id_prompting_, true); |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 962 // We record the histograms here because ExtensionUninstallCanceled is also | 972 // We record the histograms here because ExtensionUninstallCanceled is also |
| 963 // called when the extension uninstall dialog is canceled. | 973 // called when the extension uninstall dialog is canceled. |
| 964 const Extension* extension = | 974 const Extension* extension = |
| 965 extension_service_->GetExtensionById(extension_id_prompting_, true); | 975 extension_service_->GetExtensionById(extension_id_prompting_, true); |
| 966 std::string histogram_name = user_initiated ? | 976 std::string histogram_name = user_initiated ? |
| 967 "Extensions.Permissions_ReEnableCancel" : | 977 "Extensions.Permissions_ReEnableCancel" : |
| 968 "Extensions.Permissions_ReEnableAbort"; | 978 "Extensions.Permissions_ReEnableAbort"; |
| 969 ExtensionService::RecordPermissionMessagesHistogram( | 979 ExtensionService::RecordPermissionMessagesHistogram( |
| 970 extension, histogram_name.c_str()); | 980 extension, histogram_name.c_str()); |
| 971 | 981 |
| 972 ExtensionUninstallCanceled(); | 982 CleanupAfterUninstall(); |
| 973 } | 983 } |
| 974 | 984 |
| 975 ExtensionUninstallDialog* AppLauncherHandler::GetExtensionUninstallDialog() { | 985 ExtensionUninstallDialog* AppLauncherHandler::GetExtensionUninstallDialog() { |
| 976 if (!extension_uninstall_dialog_.get()) { | 986 if (!extension_uninstall_dialog_.get()) { |
| 977 extension_uninstall_dialog_.reset( | 987 extension_uninstall_dialog_.reset( |
| 978 ExtensionUninstallDialog::Create(Profile::FromWebUI(web_ui()), this)); | 988 ExtensionUninstallDialog::Create(Profile::FromWebUI(web_ui()), this)); |
| 979 } | 989 } |
| 980 return extension_uninstall_dialog_.get(); | 990 return extension_uninstall_dialog_.get(); |
| 981 } | 991 } |
| 982 | 992 |
| 983 ExtensionInstallUI* AppLauncherHandler::GetExtensionInstallUI() { | 993 ExtensionInstallUI* AppLauncherHandler::GetExtensionInstallUI() { |
| 984 if (!extension_install_ui_.get()) { | 994 if (!extension_install_ui_.get()) { |
| 985 extension_install_ui_.reset( | 995 extension_install_ui_.reset( |
| 986 new ExtensionInstallUI(Profile::FromWebUI(web_ui()))); | 996 new ExtensionInstallUI(Profile::FromWebUI(web_ui()))); |
| 987 } | 997 } |
| 988 return extension_install_ui_.get(); | 998 return extension_install_ui_.get(); |
| 989 } | 999 } |
| 990 | 1000 |
| 991 void AppLauncherHandler::UninstallDefaultApps() { | 1001 void AppLauncherHandler::UninstallDefaultApps() { |
| 992 AppsPromo* apps_promo = extension_service_->apps_promo(); | 1002 AppsPromo* apps_promo = extension_service_->apps_promo(); |
| 993 const ExtensionIdSet& app_ids = apps_promo->old_default_apps(); | 1003 const ExtensionIdSet& app_ids = apps_promo->old_default_apps(); |
| 994 for (ExtensionIdSet::const_iterator iter = app_ids.begin(); | 1004 for (ExtensionIdSet::const_iterator iter = app_ids.begin(); |
| 995 iter != app_ids.end(); ++iter) { | 1005 iter != app_ids.end(); ++iter) { |
| 996 if (extension_service_->GetExtensionById(*iter, true)) | 1006 if (extension_service_->GetExtensionById(*iter, true)) |
| 997 extension_service_->UninstallExtension(*iter, false, NULL); | 1007 extension_service_->UninstallExtension(*iter, false, NULL); |
| 998 } | 1008 } |
| 999 } | 1009 } |
| OLD | NEW |