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

Side by Side Diff: chrome/browser/ui/webui/extensions/extension_settings_handler.cc

Issue 557953005: Allow the user to "repair" a corrupted extension. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 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
OLDNEW
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/extensions/extension_settings_handler.h" 5 #include "chrome/browser/ui/webui/extensions/extension_settings_handler.h"
6 6
7 #include "apps/app_load_service.h" 7 #include "apps/app_load_service.h"
8 #include "apps/saved_files_service.h" 8 #include "apps/saved_files_service.h"
9 #include "base/auto_reset.h" 9 #include "base/auto_reset.h"
10 #include "base/base64.h" 10 #include "base/base64.h"
(...skipping 22 matching lines...) Expand all
33 #include "chrome/browser/extensions/extension_error_reporter.h" 33 #include "chrome/browser/extensions/extension_error_reporter.h"
34 #include "chrome/browser/extensions/extension_management.h" 34 #include "chrome/browser/extensions/extension_management.h"
35 #include "chrome/browser/extensions/extension_service.h" 35 #include "chrome/browser/extensions/extension_service.h"
36 #include "chrome/browser/extensions/extension_tab_util.h" 36 #include "chrome/browser/extensions/extension_tab_util.h"
37 #include "chrome/browser/extensions/extension_ui_util.h" 37 #include "chrome/browser/extensions/extension_ui_util.h"
38 #include "chrome/browser/extensions/extension_util.h" 38 #include "chrome/browser/extensions/extension_util.h"
39 #include "chrome/browser/extensions/install_verifier.h" 39 #include "chrome/browser/extensions/install_verifier.h"
40 #include "chrome/browser/extensions/path_util.h" 40 #include "chrome/browser/extensions/path_util.h"
41 #include "chrome/browser/extensions/shared_module_service.h" 41 #include "chrome/browser/extensions/shared_module_service.h"
42 #include "chrome/browser/extensions/updater/extension_updater.h" 42 #include "chrome/browser/extensions/updater/extension_updater.h"
43 #include "chrome/browser/extensions/webstore_reinstaller.h"
43 #include "chrome/browser/platform_util.h" 44 #include "chrome/browser/platform_util.h"
44 #include "chrome/browser/prefs/incognito_mode_prefs.h" 45 #include "chrome/browser/prefs/incognito_mode_prefs.h"
45 #include "chrome/browser/profiles/profile.h" 46 #include "chrome/browser/profiles/profile.h"
46 #include "chrome/browser/supervised_user/supervised_user_service.h" 47 #include "chrome/browser/supervised_user/supervised_user_service.h"
47 #include "chrome/browser/supervised_user/supervised_user_service_factory.h" 48 #include "chrome/browser/supervised_user/supervised_user_service_factory.h"
48 #include "chrome/browser/tab_contents/background_contents.h" 49 #include "chrome/browser/tab_contents/background_contents.h"
49 #include "chrome/browser/ui/browser.h" 50 #include "chrome/browser/ui/browser.h"
50 #include "chrome/browser/ui/browser_finder.h" 51 #include "chrome/browser/ui/browser_finder.h"
51 #include "chrome/browser/ui/browser_window.h" 52 #include "chrome/browser/ui/browser_window.h"
52 #include "chrome/browser/ui/extensions/application_launch.h" 53 #include "chrome/browser/ui/extensions/application_launch.h"
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 false, 208 false,
208 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); 209 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
209 } 210 }
210 211
211 base::DictionaryValue* ExtensionSettingsHandler::CreateExtensionDetailValue( 212 base::DictionaryValue* ExtensionSettingsHandler::CreateExtensionDetailValue(
212 const Extension* extension, 213 const Extension* extension,
213 const std::vector<ExtensionPage>& pages, 214 const std::vector<ExtensionPage>& pages,
214 const WarningService* warning_service) { 215 const WarningService* warning_service) {
215 // The items which are to be written into app_dict are also described in 216 // The items which are to be written into app_dict are also described in
216 // chrome/browser/resources/extensions/extension_list.js in @typedef for 217 // chrome/browser/resources/extensions/extension_list.js in @typedef for
217 // ExtensionData. Please update it whenever you add or remove any keys here. 218 // ExtensionData. Please update it whenever you add or remove any keys here.
Dan Beam 2014/09/18 21:36:50 it actually worked! :)
Devlin 2014/09/19 21:30:09 ;)
218 base::DictionaryValue* extension_data = new base::DictionaryValue(); 219 base::DictionaryValue* extension_data = new base::DictionaryValue();
219 bool enabled = extension_service_->IsExtensionEnabled(extension->id()); 220 bool enabled = extension_service_->IsExtensionEnabled(extension->id());
220 GetExtensionBasicInfo(extension, enabled, extension_data); 221 GetExtensionBasicInfo(extension, enabled, extension_data);
221 222
222 ExtensionPrefs* prefs = ExtensionPrefs::Get(extension_service_->profile()); 223 ExtensionPrefs* prefs = ExtensionPrefs::Get(extension_service_->profile());
223 int disable_reasons = prefs->GetDisableReasons(extension->id()); 224 int disable_reasons = prefs->GetDisableReasons(extension->id());
224 225
225 bool suspicious_install = 226 bool suspicious_install =
226 (disable_reasons & Extension::DISABLE_NOT_VERIFIED) != 0; 227 (disable_reasons & Extension::DISABLE_NOT_VERIFIED) != 0;
227 extension_data->SetBoolean("suspiciousInstall", suspicious_install); 228 extension_data->SetBoolean("suspiciousInstall", suspicious_install);
(...skipping 18 matching lines...) Expand all
246 !enabled, NULL); 247 !enabled, NULL);
247 if (Manifest::IsUnpackedLocation(extension->location())) { 248 if (Manifest::IsUnpackedLocation(extension->location())) {
248 extension_data->SetString("path", extension->path().value()); 249 extension_data->SetString("path", extension->path().value());
249 extension_data->SetString( 250 extension_data->SetString(
250 "prettifiedPath", 251 "prettifiedPath",
251 extensions::path_util::PrettifyPath(extension->path()).value()); 252 extensions::path_util::PrettifyPath(extension->path()).value());
252 } 253 }
253 extension_data->SetString("icon", icon.spec()); 254 extension_data->SetString("icon", icon.spec());
254 extension_data->SetBoolean("isUnpacked", 255 extension_data->SetBoolean("isUnpacked",
255 Manifest::IsUnpackedLocation(extension->location())); 256 Manifest::IsUnpackedLocation(extension->location()));
257 extension_data->SetBoolean("isFromStore",
258 extension->location() == Manifest::INTERNAL &&
259 ManifestURL::UpdatesFromGallery(extension));
256 ExtensionRegistry* registry = 260 ExtensionRegistry* registry =
257 ExtensionRegistry::Get(extension_service_->profile()); 261 ExtensionRegistry::Get(extension_service_->profile());
258 extension_data->SetBoolean( 262 extension_data->SetBoolean(
259 "terminated", 263 "terminated",
260 registry->terminated_extensions().Contains(extension->id())); 264 registry->terminated_extensions().Contains(extension->id()));
261 extension_data->SetBoolean("enabledIncognito", 265 extension_data->SetBoolean("enabledIncognito",
262 util::IsIncognitoEnabled(extension->id(), extension_service_->profile())); 266 util::IsIncognitoEnabled(extension->id(), extension_service_->profile()));
263 extension_data->SetBoolean("incognitoCanBeEnabled", 267 extension_data->SetBoolean("incognitoCanBeEnabled",
264 extension->can_be_incognito_enabled()); 268 extension->can_be_incognito_enabled());
265 extension_data->SetBoolean("wantsFileAccess", extension->wants_file_access()); 269 extension_data->SetBoolean("wantsFileAccess", extension->wants_file_access());
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
503 source->AddString("extensionSettingsEnableErrorCollection", 507 source->AddString("extensionSettingsEnableErrorCollection",
504 l10n_util::GetStringUTF16(IDS_EXTENSIONS_ENABLE_ERROR_COLLECTION)); 508 l10n_util::GetStringUTF16(IDS_EXTENSIONS_ENABLE_ERROR_COLLECTION));
505 source->AddString("extensionSettingsAllowFileAccess", 509 source->AddString("extensionSettingsAllowFileAccess",
506 l10n_util::GetStringUTF16(IDS_EXTENSIONS_ALLOW_FILE_ACCESS)); 510 l10n_util::GetStringUTF16(IDS_EXTENSIONS_ALLOW_FILE_ACCESS));
507 source->AddString("extensionSettingsAllowOnAllUrls", 511 source->AddString("extensionSettingsAllowOnAllUrls",
508 l10n_util::GetStringUTF16(IDS_EXTENSIONS_ALLOW_ON_ALL_URLS)); 512 l10n_util::GetStringUTF16(IDS_EXTENSIONS_ALLOW_ON_ALL_URLS));
509 source->AddString("extensionSettingsIncognitoWarning", 513 source->AddString("extensionSettingsIncognitoWarning",
510 l10n_util::GetStringUTF16(IDS_EXTENSIONS_INCOGNITO_WARNING)); 514 l10n_util::GetStringUTF16(IDS_EXTENSIONS_INCOGNITO_WARNING));
511 source->AddString("extensionSettingsReloadTerminated", 515 source->AddString("extensionSettingsReloadTerminated",
512 l10n_util::GetStringUTF16(IDS_EXTENSIONS_RELOAD_TERMINATED)); 516 l10n_util::GetStringUTF16(IDS_EXTENSIONS_RELOAD_TERMINATED));
517 source->AddString("extensionSettingsRepairCorrupted",
518 l10n_util::GetStringUTF16(IDS_EXTENSIONS_REPAIR_CORRUPTED));
513 source->AddString("extensionSettingsLaunch", 519 source->AddString("extensionSettingsLaunch",
514 l10n_util::GetStringUTF16(IDS_EXTENSIONS_LAUNCH)); 520 l10n_util::GetStringUTF16(IDS_EXTENSIONS_LAUNCH));
515 source->AddString("extensionSettingsReloadUnpacked", 521 source->AddString("extensionSettingsReloadUnpacked",
516 l10n_util::GetStringUTF16(IDS_EXTENSIONS_RELOAD_UNPACKED)); 522 l10n_util::GetStringUTF16(IDS_EXTENSIONS_RELOAD_UNPACKED));
517 source->AddString("extensionSettingsOptions", 523 source->AddString("extensionSettingsOptions",
518 l10n_util::GetStringUTF16(IDS_EXTENSIONS_OPTIONS_LINK)); 524 l10n_util::GetStringUTF16(IDS_EXTENSIONS_OPTIONS_LINK));
519 source->AddString("extensionSettingsPermissions", 525 source->AddString("extensionSettingsPermissions",
520 l10n_util::GetStringUTF16(IDS_EXTENSIONS_PERMISSIONS_LINK)); 526 l10n_util::GetStringUTF16(IDS_EXTENSIONS_PERMISSIONS_LINK));
521 source->AddString("extensionSettingsVisitWebsite", 527 source->AddString("extensionSettingsVisitWebsite",
522 l10n_util::GetStringUTF16(IDS_EXTENSIONS_VISIT_WEBSITE)); 528 l10n_util::GetStringUTF16(IDS_EXTENSIONS_VISIT_WEBSITE));
523 source->AddString("extensionSettingsVisitWebStore", 529 source->AddString("extensionSettingsVisitWebStore",
524 l10n_util::GetStringUTF16(IDS_EXTENSIONS_VISIT_WEBSTORE)); 530 l10n_util::GetStringUTF16(IDS_EXTENSIONS_VISIT_WEBSTORE));
525 source->AddString("extensionSettingsPolicyControlled", 531 source->AddString("extensionSettingsPolicyControlled",
526 l10n_util::GetStringUTF16(IDS_EXTENSIONS_POLICY_CONTROLLED)); 532 l10n_util::GetStringUTF16(IDS_EXTENSIONS_POLICY_CONTROLLED));
527 source->AddString("extensionSettingsDependentExtensions", 533 source->AddString("extensionSettingsDependentExtensions",
528 l10n_util::GetStringUTF16(IDS_EXTENSIONS_DEPENDENT_EXTENSIONS)); 534 l10n_util::GetStringUTF16(IDS_EXTENSIONS_DEPENDENT_EXTENSIONS));
529 source->AddString("extensionSettingsSupervisedUser", 535 source->AddString("extensionSettingsSupervisedUser",
530 l10n_util::GetStringUTF16(IDS_EXTENSIONS_LOCKED_SUPERVISED_USER)); 536 l10n_util::GetStringUTF16(IDS_EXTENSIONS_LOCKED_SUPERVISED_USER));
531 source->AddString("extensionSettingsCorruptInstall", 537 source->AddString("extensionSettingsCorruptInstall",
532 l10n_util::GetStringUTF16( 538 l10n_util::GetStringUTF16(
533 IDS_EXTENSIONS_CORRUPTED_EXTENSION)); 539 IDS_EXTENSIONS_CORRUPTED_EXTENSION));
534 source->AddString("extensionSettingsSuspiciousInstall", 540 source->AddString("extensionSettingsSuspiciousInstall",
535 l10n_util::GetStringFUTF16( 541 l10n_util::GetStringFUTF16(
536 IDS_EXTENSIONS_ADDED_WITHOUT_KNOWLEDGE, 542 IDS_EXTENSIONS_ADDED_WITHOUT_KNOWLEDGE,
537 l10n_util::GetStringUTF16(IDS_EXTENSION_WEB_STORE_TITLE))); 543 l10n_util::GetStringUTF16(IDS_EXTENSION_WEB_STORE_TITLE)));
538 source->AddString("extensionSettingsLearnMore", 544 source->AddString("extensionSettingsLearnMore",
539 l10n_util::GetStringUTF16(IDS_LEARN_MORE)); 545 l10n_util::GetStringUTF16(IDS_LEARN_MORE));
540 source->AddString("extensionSettingsCorruptInstallHelpUrl",
541 base::ASCIIToUTF16(
542 google_util::AppendGoogleLocaleParam(
543 GURL(chrome::kCorruptExtensionURL),
544 g_browser_process->GetApplicationLocale()).spec()));
545 source->AddString("extensionSettingsSuspiciousInstallHelpUrl", 546 source->AddString("extensionSettingsSuspiciousInstallHelpUrl",
546 base::ASCIIToUTF16( 547 base::ASCIIToUTF16(
547 google_util::AppendGoogleLocaleParam( 548 google_util::AppendGoogleLocaleParam(
548 GURL(chrome::kRemoveNonCWSExtensionURL), 549 GURL(chrome::kRemoveNonCWSExtensionURL),
549 g_browser_process->GetApplicationLocale()).spec())); 550 g_browser_process->GetApplicationLocale()).spec()));
550 source->AddString("extensionSettingsShowButton", 551 source->AddString("extensionSettingsShowButton",
551 l10n_util::GetStringUTF16(IDS_EXTENSIONS_SHOW_BUTTON)); 552 l10n_util::GetStringUTF16(IDS_EXTENSIONS_SHOW_BUTTON));
552 source->AddString("extensionSettingsLoadUnpackedButton", 553 source->AddString("extensionSettingsLoadUnpackedButton",
553 l10n_util::GetStringUTF16(IDS_EXTENSIONS_LOAD_UNPACKED_BUTTON)); 554 l10n_util::GetStringUTF16(IDS_EXTENSIONS_LOAD_UNPACKED_BUTTON));
554 source->AddString("extensionSettingsPackButton", 555 source->AddString("extensionSettingsPackButton",
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
624 AsWeakPtr())); 625 AsWeakPtr()));
625 web_ui()->RegisterMessageCallback("extensionSettingsInspect", 626 web_ui()->RegisterMessageCallback("extensionSettingsInspect",
626 base::Bind(&ExtensionSettingsHandler::HandleInspectMessage, 627 base::Bind(&ExtensionSettingsHandler::HandleInspectMessage,
627 AsWeakPtr())); 628 AsWeakPtr()));
628 web_ui()->RegisterMessageCallback("extensionSettingsLaunch", 629 web_ui()->RegisterMessageCallback("extensionSettingsLaunch",
629 base::Bind(&ExtensionSettingsHandler::HandleLaunchMessage, 630 base::Bind(&ExtensionSettingsHandler::HandleLaunchMessage,
630 AsWeakPtr())); 631 AsWeakPtr()));
631 web_ui()->RegisterMessageCallback("extensionSettingsReload", 632 web_ui()->RegisterMessageCallback("extensionSettingsReload",
632 base::Bind(&ExtensionSettingsHandler::HandleReloadMessage, 633 base::Bind(&ExtensionSettingsHandler::HandleReloadMessage,
633 AsWeakPtr())); 634 AsWeakPtr()));
635 web_ui()->RegisterMessageCallback("extensionSettingsRepair",
636 base::Bind(&ExtensionSettingsHandler::HandleRepairMessage,
637 AsWeakPtr()));
634 web_ui()->RegisterMessageCallback("extensionSettingsEnable", 638 web_ui()->RegisterMessageCallback("extensionSettingsEnable",
635 base::Bind(&ExtensionSettingsHandler::HandleEnableMessage, 639 base::Bind(&ExtensionSettingsHandler::HandleEnableMessage,
636 AsWeakPtr())); 640 AsWeakPtr()));
637 web_ui()->RegisterMessageCallback("extensionSettingsEnableIncognito", 641 web_ui()->RegisterMessageCallback("extensionSettingsEnableIncognito",
638 base::Bind(&ExtensionSettingsHandler::HandleEnableIncognitoMessage, 642 base::Bind(&ExtensionSettingsHandler::HandleEnableIncognitoMessage,
639 AsWeakPtr())); 643 AsWeakPtr()));
640 web_ui()->RegisterMessageCallback("extensionSettingsEnableErrorCollection", 644 web_ui()->RegisterMessageCallback("extensionSettingsEnableErrorCollection",
641 base::Bind(&ExtensionSettingsHandler::HandleEnableErrorCollectionMessage, 645 base::Bind(&ExtensionSettingsHandler::HandleEnableErrorCollectionMessage,
642 AsWeakPtr())); 646 AsWeakPtr()));
643 web_ui()->RegisterMessageCallback("extensionSettingsAllowFileAccess", 647 web_ui()->RegisterMessageCallback("extensionSettingsAllowFileAccess",
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
971 NEW_WINDOW)); 975 NEW_WINDOW));
972 } 976 }
973 977
974 void ExtensionSettingsHandler::HandleReloadMessage( 978 void ExtensionSettingsHandler::HandleReloadMessage(
975 const base::ListValue* args) { 979 const base::ListValue* args) {
976 std::string extension_id = base::UTF16ToUTF8(ExtractStringValue(args)); 980 std::string extension_id = base::UTF16ToUTF8(ExtractStringValue(args));
977 CHECK(!extension_id.empty()); 981 CHECK(!extension_id.empty());
978 extension_service_->ReloadExtensionWithQuietFailure(extension_id); 982 extension_service_->ReloadExtensionWithQuietFailure(extension_id);
979 } 983 }
980 984
985 void ExtensionSettingsHandler::HandleRepairMessage(
986 const base::ListValue* args) {
987 std::string extension_id = base::UTF16ToUTF8(ExtractStringValue(args));
988 CHECK(!extension_id.empty());
989 scoped_refptr<WebstoreReinstaller> reinstaller(new WebstoreReinstaller(
990 web_contents(),
991 extension_id,
992 base::Bind(&ExtensionSettingsHandler::OnReinstallComplete,
993 AsWeakPtr())));
994 reinstaller->BeginReinstall();
995 }
996
981 void ExtensionSettingsHandler::HandleEnableMessage( 997 void ExtensionSettingsHandler::HandleEnableMessage(
982 const base::ListValue* args) { 998 const base::ListValue* args) {
983 CHECK_EQ(2U, args->GetSize()); 999 CHECK_EQ(2U, args->GetSize());
984 std::string extension_id, enable_str; 1000 std::string extension_id, enable_str;
985 CHECK(args->GetString(0, &extension_id)); 1001 CHECK(args->GetString(0, &extension_id));
986 CHECK(args->GetString(1, &enable_str)); 1002 CHECK(args->GetString(1, &enable_str));
987 1003
988 const Extension* extension = 1004 const Extension* extension =
989 extension_service_->GetInstalledExtension(extension_id); 1005 extension_service_->GetInstalledExtension(extension_id);
990 if (!extension) 1006 if (!extension)
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after
1400 ExtensionUninstallDialog::Create(extension_service_->profile(), 1416 ExtensionUninstallDialog::Create(extension_service_->profile(),
1401 browser->window()->GetNativeWindow(), 1417 browser->window()->GetNativeWindow(),
1402 this)); 1418 this));
1403 } 1419 }
1404 return extension_uninstall_dialog_.get(); 1420 return extension_uninstall_dialog_.get();
1405 #else 1421 #else
1406 return NULL; 1422 return NULL;
1407 #endif // !defined(OS_ANDROID) 1423 #endif // !defined(OS_ANDROID)
1408 } 1424 }
1409 1425
1426 void ExtensionSettingsHandler::OnReinstallComplete(
1427 bool success,
1428 const std::string& error,
1429 webstore_install::Result result) {
1430 MaybeUpdateAfterNotification();
Yoyo Zhou 2014/09/18 22:47:08 Why do we need to run this callback if the uninsta
Devlin 2014/09/18 23:19:10 To me, it seems safer and more consistent. It wou
1431 }
1432
1410 void ExtensionSettingsHandler::OnRequirementsChecked( 1433 void ExtensionSettingsHandler::OnRequirementsChecked(
1411 std::string extension_id, 1434 std::string extension_id,
1412 std::vector<std::string> requirement_errors) { 1435 std::vector<std::string> requirement_errors) {
1413 if (requirement_errors.empty()) { 1436 if (requirement_errors.empty()) {
1414 extension_service_->EnableExtension(extension_id); 1437 extension_service_->EnableExtension(extension_id);
1415 } else { 1438 } else {
1416 ExtensionErrorReporter::GetInstance()->ReportError( 1439 ExtensionErrorReporter::GetInstance()->ReportError(
1417 base::UTF8ToUTF16(JoinString(requirement_errors, ' ')), 1440 base::UTF8ToUTF16(JoinString(requirement_errors, ' ')),
1418 true); // Be noisy. 1441 true); // Be noisy.
1419 } 1442 }
1420 requirements_checker_.reset(); 1443 requirements_checker_.reset();
1421 } 1444 }
1422 1445
1423 } // namespace extensions 1446 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698