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 "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 Loading... | |
| 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* extension = |
|
not at google - send to devlin
2015/02/25 23:55:58
target_extension
Devlin
2015/02/26 00:19:54
Done.
| |
| 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 (!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 Loading... | |
| 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 |
| OLD | NEW |