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

Side by Side Diff: extensions/browser/api/management/management_api.cc

Issue 948413005: [Extensions] Make chrome://extensions use management.uninstall (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Latest master Created 5 years, 9 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 "extensions/browser/api/management/management_api.h" 5 #include "extensions/browser/api/management/management_api.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 JoinString(requirements_errors, ' '))); 504 JoinString(requirements_errors, ' ')));
505 } 505 }
506 } 506 }
507 507
508 ManagementUninstallFunctionBase::ManagementUninstallFunctionBase() { 508 ManagementUninstallFunctionBase::ManagementUninstallFunctionBase() {
509 } 509 }
510 510
511 ManagementUninstallFunctionBase::~ManagementUninstallFunctionBase() { 511 ManagementUninstallFunctionBase::~ManagementUninstallFunctionBase() {
512 } 512 }
513 513
514 bool ManagementUninstallFunctionBase::Uninstall( 514 ExtensionFunction::ResponseAction ManagementUninstallFunctionBase::Uninstall(
515 const std::string& target_extension_id, 515 const std::string& target_extension_id,
516 bool show_confirm_dialog) { 516 bool show_confirm_dialog) {
517 const ManagementAPIDelegate* delegate = ManagementAPI::GetFactoryInstance() 517 const ManagementAPIDelegate* delegate = ManagementAPI::GetFactoryInstance()
518 ->Get(browser_context()) 518 ->Get(browser_context())
519 ->GetDelegate(); 519 ->GetDelegate();
520 extension_id_ = target_extension_id; 520 target_extension_id_ = target_extension_id;
521 const Extension* target_extension = 521 const Extension* target_extension =
522 extensions::ExtensionRegistry::Get(browser_context()) 522 extensions::ExtensionRegistry::Get(browser_context())
523 ->GetExtensionById(extension_id_, ExtensionRegistry::EVERYTHING); 523 ->GetExtensionById(target_extension_id_,
524 ExtensionRegistry::EVERYTHING);
524 if (!target_extension || 525 if (!target_extension ||
525 ShouldNotBeVisible(target_extension, browser_context())) { 526 ShouldNotBeVisible(target_extension, browser_context())) {
526 error_ = 527 return RespondNow(Error(keys::kNoExtensionError, target_extension_id_));
527 ErrorUtils::FormatErrorMessage(keys::kNoExtensionError, extension_id_);
528 return false;
529 } 528 }
530 529
531 ManagementPolicy* policy = 530 ManagementPolicy* policy =
532 ExtensionSystem::Get(browser_context())->management_policy(); 531 ExtensionSystem::Get(browser_context())->management_policy();
533 if (!policy->UserMayModifySettings(target_extension, nullptr) || 532 if (!policy->UserMayModifySettings(target_extension, nullptr) ||
534 policy->MustRemainInstalled(target_extension, nullptr)) { 533 policy->MustRemainInstalled(target_extension, nullptr)) {
535 error_ = ErrorUtils::FormatErrorMessage(keys::kUserCantModifyError, 534 return RespondNow(Error(keys::kUserCantModifyError, target_extension_id_));
536 extension_id_);
537 return false;
538 } 535 }
539 536
540 if (auto_confirm_for_test == DO_NOT_SKIP) { 537 // Note: null extension() means it's WebUI.
541 if (show_confirm_dialog) { 538 bool self_uninstall = extension() && extension_id() == target_extension_id_;
539 // We need to show a dialog for any extension uninstalling another extension.
540 show_confirm_dialog |= !self_uninstall;
541
542 if (show_confirm_dialog && !user_gesture())
543 return RespondNow(Error(keys::kGestureNeededForUninstallError));
544
545 if (show_confirm_dialog) {
546 if (auto_confirm_for_test == DO_NOT_SKIP) {
547 // We show the programmatic uninstall ui for extensions uninstalling
548 // other extensions.
549 bool show_programmatic_uninstall_ui = !self_uninstall && extension();
542 AddRef(); // Balanced in ExtensionUninstallAccepted/Canceled 550 AddRef(); // Balanced in ExtensionUninstallAccepted/Canceled
551 // TODO(devlin): A method called "UninstallFunctionDelegate" does not in
552 // any way imply that this actually creates a dialog and runs it.
543 uninstall_dialog_ = 553 uninstall_dialog_ =
544 delegate->UninstallFunctionDelegate(this, target_extension_id); 554 delegate->UninstallFunctionDelegate(
555 this,
556 target_extension,
557 show_programmatic_uninstall_ui);
545 } else { 558 } else {
546 Finish(true); 559 // Skip the confirm dialog for testing.
560 base::MessageLoop::current()->PostTask(
561 FROM_HERE,
562 base::Bind(&ManagementUninstallFunctionBase::Finish,
563 this,
564 auto_confirm_for_test == PROCEED));
547 } 565 }
548 } else { 566 } else { // No confirm dialog.
549 Finish(auto_confirm_for_test == PROCEED); 567 base::MessageLoop::current()->PostTask(
568 FROM_HERE,
569 base::Bind(&ManagementUninstallFunctionBase::Finish, this, true));
550 } 570 }
551 571
552 return true; 572 return RespondLater();
553 } 573 }
554 574
555 // static 575 // static
556 void ManagementUninstallFunctionBase::SetAutoConfirmForTest( 576 void ManagementUninstallFunctionBase::SetAutoConfirmForTest(
557 bool should_proceed) { 577 bool should_proceed) {
558 auto_confirm_for_test = should_proceed ? PROCEED : ABORT; 578 auto_confirm_for_test = should_proceed ? PROCEED : ABORT;
559 } 579 }
560 580
561 void ManagementUninstallFunctionBase::Finish(bool should_uninstall) { 581 void ManagementUninstallFunctionBase::Finish(bool should_uninstall) {
562 if (should_uninstall) { 582 if (!should_uninstall) {
563 // The extension can be uninstalled in another window while the UI was 583 Respond(Error(keys::kUninstallCanceledError, target_extension_id_));
564 // showing. Do nothing in that case. 584 return;
565 ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context()); 585 }
566 const Extension* extension = registry->GetExtensionById(
567 extension_id_, ExtensionRegistry::EVERYTHING);
568 if (!extension) {
569 error_ = ErrorUtils::FormatErrorMessage(keys::kNoExtensionError,
570 extension_id_);
571 SendResponse(false);
572 } else {
573 const ManagementAPIDelegate* delegate =
574 ManagementAPI::GetFactoryInstance()
575 ->Get(browser_context())
576 ->GetDelegate();
577 bool success = delegate->UninstallExtension(
578 browser_context(), extension_id_,
579 extensions::UNINSTALL_REASON_MANAGEMENT_API,
580 base::Bind(&base::DoNothing), NULL);
581 586
582 // TODO set error_ if !success 587 // The extension can be uninstalled in another window while the UI was
583 SendResponse(success); 588 // showing. Do nothing in that case.
584 } 589 const Extension* target_extension =
585 } else { 590 extensions::ExtensionRegistry::Get(browser_context())
586 error_ = ErrorUtils::FormatErrorMessage(keys::kUninstallCanceledError, 591 ->GetExtensionById(target_extension_id_,
587 extension_id_); 592 ExtensionRegistry::EVERYTHING);
588 SendResponse(false); 593 if (!target_extension) {
594 Respond(Error(keys::kNoExtensionError, target_extension_id_));
595 return;
589 } 596 }
597
598 const ManagementAPIDelegate* delegate =
599 ManagementAPI::GetFactoryInstance()
600 ->Get(browser_context())
601 ->GetDelegate();
602 base::string16 error;
603 bool success = delegate->UninstallExtension(
604 browser_context(), target_extension_id_,
605 extensions::UNINSTALL_REASON_MANAGEMENT_API,
606 base::Bind(&base::DoNothing), &error);
607 Respond(success ? NoArguments() : Error(base::UTF16ToUTF8(error)));
590 } 608 }
591 609
592 void ManagementUninstallFunctionBase::ExtensionUninstallAccepted() { 610 void ManagementUninstallFunctionBase::ExtensionUninstallAccepted() {
593 Finish(true); 611 Finish(true);
594 Release(); 612 Release();
595 } 613 }
596 614
597 void ManagementUninstallFunctionBase::ExtensionUninstallCanceled() { 615 void ManagementUninstallFunctionBase::ExtensionUninstallCanceled() {
598 Finish(false); 616 Finish(false);
599 Release(); 617 Release();
600 } 618 }
601 619
602 ManagementUninstallFunction::ManagementUninstallFunction() { 620 ManagementUninstallFunction::ManagementUninstallFunction() {
603 } 621 }
604 622
605 ManagementUninstallFunction::~ManagementUninstallFunction() { 623 ManagementUninstallFunction::~ManagementUninstallFunction() {
606 } 624 }
607 625
608 bool ManagementUninstallFunction::RunAsync() { 626 ExtensionFunction::ResponseAction ManagementUninstallFunction::Run() {
609 scoped_ptr<management::Uninstall::Params> params( 627 scoped_ptr<management::Uninstall::Params> params(
610 management::Uninstall::Params::Create(*args_)); 628 management::Uninstall::Params::Create(*args_));
611 EXTENSION_FUNCTION_VALIDATE(extension_.get());
612 EXTENSION_FUNCTION_VALIDATE(params.get()); 629 EXTENSION_FUNCTION_VALIDATE(params.get());
613 630
614 bool show_confirm_dialog = true; 631 bool show_confirm_dialog = params->options.get() &&
615 // By default confirmation dialog isn't shown when uninstalling self, but this 632 params->options->show_confirm_dialog.get() &&
616 // can be overridden with showConfirmDialog. 633 *params->options->show_confirm_dialog;
617 if (params->id == extension_->id()) {
618 show_confirm_dialog = params->options.get() &&
619 params->options->show_confirm_dialog.get() &&
620 *params->options->show_confirm_dialog;
621 }
622 if (show_confirm_dialog && !user_gesture()) {
623 error_ = keys::kGestureNeededForUninstallError;
624 return false;
625 }
626 return Uninstall(params->id, show_confirm_dialog); 634 return Uninstall(params->id, show_confirm_dialog);
627 } 635 }
628 636
629 ManagementUninstallSelfFunction::ManagementUninstallSelfFunction() { 637 ManagementUninstallSelfFunction::ManagementUninstallSelfFunction() {
630 } 638 }
631 639
632 ManagementUninstallSelfFunction::~ManagementUninstallSelfFunction() { 640 ManagementUninstallSelfFunction::~ManagementUninstallSelfFunction() {
633 } 641 }
634 642
635 bool ManagementUninstallSelfFunction::RunAsync() { 643 ExtensionFunction::ResponseAction ManagementUninstallSelfFunction::Run() {
636 scoped_ptr<management::UninstallSelf::Params> params( 644 scoped_ptr<management::UninstallSelf::Params> params(
637 management::UninstallSelf::Params::Create(*args_)); 645 management::UninstallSelf::Params::Create(*args_));
638 EXTENSION_FUNCTION_VALIDATE(params.get()); 646 EXTENSION_FUNCTION_VALIDATE(params.get());
647 EXTENSION_FUNCTION_VALIDATE(extension_.get());
639 648
640 bool show_confirm_dialog = false; 649 bool show_confirm_dialog = params->options.get() &&
641 if (params->options.get() && params->options->show_confirm_dialog.get()) 650 params->options->show_confirm_dialog.get() &&
642 show_confirm_dialog = *params->options->show_confirm_dialog; 651 *params->options->show_confirm_dialog;
643 return Uninstall(extension_->id(), show_confirm_dialog); 652 return Uninstall(extension_->id(), show_confirm_dialog);
644 } 653 }
645 654
646 ManagementCreateAppShortcutFunction::ManagementCreateAppShortcutFunction() { 655 ManagementCreateAppShortcutFunction::ManagementCreateAppShortcutFunction() {
647 } 656 }
648 657
649 ManagementCreateAppShortcutFunction::~ManagementCreateAppShortcutFunction() { 658 ManagementCreateAppShortcutFunction::~ManagementCreateAppShortcutFunction() {
650 } 659 }
651 660
652 // static 661 // static
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
908 ManagementAPI::GetFactoryInstance() { 917 ManagementAPI::GetFactoryInstance() {
909 return g_factory.Pointer(); 918 return g_factory.Pointer();
910 } 919 }
911 920
912 void ManagementAPI::OnListenerAdded(const EventListenerInfo& details) { 921 void ManagementAPI::OnListenerAdded(const EventListenerInfo& details) {
913 management_event_router_.reset(new ManagementEventRouter(browser_context_)); 922 management_event_router_.reset(new ManagementEventRouter(browser_context_));
914 EventRouter::Get(browser_context_)->UnregisterObserver(this); 923 EventRouter::Get(browser_context_)->UnregisterObserver(this);
915 } 924 }
916 925
917 } // namespace extensions 926 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698