summaryrefslogtreecommitdiff
path: root/chromium/chrome/browser/extensions/api/management
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/chrome/browser/extensions/api/management')
-rw-r--r--chromium/chrome/browser/extensions/api/management/DEPS10
-rw-r--r--chromium/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc3
-rw-r--r--chromium/chrome/browser/extensions/api/management/management_api_unittest.cc166
-rw-r--r--chromium/chrome/browser/extensions/api/management/management_apitest.cc7
-rw-r--r--chromium/chrome/browser/extensions/api/management/management_browsertest.cc3
5 files changed, 84 insertions, 105 deletions
diff --git a/chromium/chrome/browser/extensions/api/management/DEPS b/chromium/chrome/browser/extensions/api/management/DEPS
new file mode 100644
index 00000000000..bd0ce11d35b
--- /dev/null
+++ b/chromium/chrome/browser/extensions/api/management/DEPS
@@ -0,0 +1,10 @@
+specific_include_rules = {
+ # This DEPS violation snuck in while there was a bug in the checkdeps tool.
+ # https://crbug.com/1084826
+ "chrome_management_api_delegate\.cc": [
+ "+chrome/browser/apps/app_service/app_launch_params.h",
+ "+chrome/browser/apps/app_service/app_service_proxy.h",
+ "+chrome/browser/apps/app_service/app_service_proxy_factory.h",
+ "+chrome/browser/apps/app_service/browser_app_launcher.h",
+ ],
+}
diff --git a/chromium/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc b/chromium/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
index b5b0ab58441..75ecb26f2e2 100644
--- a/chromium/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
+++ b/chromium/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
@@ -282,7 +282,8 @@ class ChromeAppForLinkDelegate : public extensions::AppForLinkDelegate {
info.icons->reserve(icon_infos.size());
for (const WebApplicationIconInfo& web_app_icon_info : icon_infos) {
extensions::api::management::IconInfo icon_info;
- icon_info.size = web_app_icon_info.square_size_px;
+ if (web_app_icon_info.square_size_px)
+ icon_info.size = *web_app_icon_info.square_size_px;
icon_info.url = web_app_icon_info.url.spec();
info.icons->push_back(std::move(icon_info));
}
diff --git a/chromium/chrome/browser/extensions/api/management/management_api_unittest.cc b/chromium/chrome/browser/extensions/api/management/management_api_unittest.cc
index c3f1fe7ff40..05567b35bde 100644
--- a/chromium/chrome/browser/extensions/api/management/management_api_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/management/management_api_unittest.cc
@@ -45,7 +45,6 @@
#include "chrome/browser/supervised_user/supervised_user_service.h"
#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
#include "chrome/browser/supervised_user/supervised_user_test_util.h"
-#include "components/web_modal/web_contents_modal_dialog_manager.h"
#include "content/public/browser/gpu_data_manager.h"
#endif
@@ -843,64 +842,87 @@ class TestManagementAPIDelegate : public ManagementAPIDelegate {
// A delegate that allows a child to try to install an extension and tracks
// whether the parent permission dialog would have opened.
-class TestSupervisedUserServiceDelegate : public SupervisedUserServiceDelegate {
+class TestSupervisedUserExtensionsDelegate
+ : public SupervisedUserExtensionsDelegate {
public:
- TestSupervisedUserServiceDelegate() = default;
- ~TestSupervisedUserServiceDelegate() override = default;
+ TestSupervisedUserExtensionsDelegate() = default;
+ ~TestSupervisedUserExtensionsDelegate() override = default;
- // SupervisedUserServiceDelegate:
+ // SupervisedUserExtensionsDelegate:
bool IsChild(content::BrowserContext* context) const override { return true; }
- bool IsSupervisedChildWhoMayInstallExtensions(
- content::BrowserContext* context) const override {
- return is_supervised_child_who_may_install_extensions_;
- }
bool IsExtensionAllowedByParent(
const extensions::Extension& extension,
content::BrowserContext* context) const override {
- return false;
+ SupervisedUserService* supervised_user_service =
+ SupervisedUserServiceFactory::GetForBrowserContext(context);
+ return supervised_user_service->IsExtensionAllowed(extension);
+ }
+
+ void PromptForParentPermissionOrShowError(
+ const extensions::Extension& extension,
+ content::BrowserContext* context,
+ content::WebContents* contents,
+ ParentPermissionDialogDoneCallback parent_permission_callback,
+ base::OnceClosure error_callback) override {
+ // Preconditions.
+ DCHECK(IsChild(context));
+ DCHECK(!IsExtensionAllowedByParent(extension, context));
+
+ if (CanInstallExtensions(context)) {
+ ShowParentPermissionDialogForExtension(
+ extension, context, contents, std::move(parent_permission_callback));
+ } else {
+ ShowExtensionEnableBlockedByParentDialogForExtension(
+ extension, contents, std::move(error_callback));
+ }
+ }
+
+ void set_next_parent_permission_dialog_result(
+ ParentPermissionDialogResult result) {
+ dialog_result_ = result;
}
+
+ int show_dialog_count() const { return show_dialog_count_; }
+ int show_block_dialog_count() const { return show_block_dialog_count_; }
+
+ private:
+ // Returns true if |context| represents a supervised child account who may
+ // install extensions with parent permission.
+ bool CanInstallExtensions(content::BrowserContext* context) const {
+ SupervisedUserService* supervised_user_service =
+ SupervisedUserServiceFactory::GetForBrowserContext(context);
+ return supervised_user_service->CanInstallExtensions();
+ }
+
+ // Shows a parent permission dialog for |extension| and call |done_callback|
+ // when it completes.
void ShowParentPermissionDialogForExtension(
const extensions::Extension& extension,
content::BrowserContext* context,
content::WebContents* contents,
- ParentPermissionDialogDoneCallback done_callback) override {
+ ParentPermissionDialogDoneCallback done_callback) {
++show_dialog_count_;
std::move(done_callback).Run(dialog_result_);
}
+ // Shows a dialog indicating that |extension| has been blocked and call
+ // |done_callback| when it completes.
void ShowExtensionEnableBlockedByParentDialogForExtension(
- const extensions::Extension* extension,
+ const extensions::Extension& extension,
content::WebContents* contents,
- base::OnceClosure done_callback) override {
+ base::OnceClosure done_callback) {
show_block_dialog_count_++;
- std::move(done_callback).Run();
- }
-
- void RecordExtensionEnableBlockedByParentDialogUmaMetric() override {
SupervisedUserExtensionsMetricsRecorder::RecordEnablementUmaMetrics(
SupervisedUserExtensionsMetricsRecorder::EnablementState::
kFailedToEnable);
+ std::move(done_callback).Run();
}
- void set_next_parent_permission_dialog_result(
- ParentPermissionDialogResult result) {
- dialog_result_ = result;
- }
-
- void set_is_supervised_child_who_may_install_extensions(bool value) {
- is_supervised_child_who_may_install_extensions_ = value;
- }
-
- int show_dialog_count() const { return show_dialog_count_; }
- int show_block_dialog_count() const { return show_block_dialog_count_; }
-
- private:
ParentPermissionDialogResult dialog_result_ =
ParentPermissionDialogResult::kParentPermissionFailed;
int show_dialog_count_ = 0;
int show_block_dialog_count_ = 0;
- bool is_supervised_child_who_may_install_extensions_ = true;
};
// Tests for supervised users (child accounts). Supervised users are not allowed
@@ -940,15 +962,15 @@ class ManagementApiSupervisedUserTest : public ManagementApiUnitTest {
management_api_ = ManagementAPI::GetFactoryInstance()->Get(profile());
- // Install a SupervisedUserServiceDelegate to sense the dialog state.
- supervised_user_delegate_ = new TestSupervisedUserServiceDelegate;
- management_api_->set_supervised_user_service_delegate_for_test(
+ // Install a SupervisedUserExtensionsDelegate to sense the dialog state.
+ supervised_user_delegate_ = new TestSupervisedUserExtensionsDelegate;
+ management_api_->set_supervised_user_extensions_delegate_for_test(
base::WrapUnique(supervised_user_delegate_));
}
std::unique_ptr<content::WebContents> web_contents_;
ManagementAPI* management_api_ = nullptr;
- TestSupervisedUserServiceDelegate* supervised_user_delegate_ = nullptr;
+ TestSupervisedUserExtensionsDelegate* supervised_user_delegate_ = nullptr;
};
TEST_F(ManagementApiSupervisedUserTest, SetEnabled_BlockedByParent) {
@@ -974,11 +996,8 @@ TEST_F(ManagementApiSupervisedUserTest, SetEnabled_BlockedByParent) {
// Simulate disabling Permissions for sites, apps and extensions
// in the testing supervised user service delegate used by the Management API.
- supervised_user_delegate_->set_is_supervised_child_who_may_install_extensions(
- false);
- // Ensure that the web contents can be used to create a modal dialog.
- web_modal::WebContentsModalDialogManager::CreateForWebContents(
- web_contents_.get());
+ GetSupervisedUserService()
+ ->SetSupervisedUserExtensionsMayRequestPermissionsPrefForTesting(false);
// The supervised user trying to enable while Permissions for sites, apps and
// extensions is disabled should fail.
@@ -1007,61 +1026,6 @@ TEST_F(ManagementApiSupervisedUserTest, SetEnabled_BlockedByParent) {
SupervisedUserExtensionsMetricsRecorder::kFailedToEnableActionName));
}
-TEST_F(ManagementApiSupervisedUserTest,
- SetEnabled_BlockedByParentNoDialogWhenNoDialogManagerAvailable) {
- // Preconditions.
- ASSERT_TRUE(profile()->IsChild());
-
- base::HistogramTester histogram_tester;
- base::UserActionTester user_action_tester;
-
- base::FilePath base_path = data_dir().AppendASCII("permissions_increase");
- base::FilePath pem_path = base_path.AppendASCII("permissions.pem");
-
- base::FilePath path = base_path.AppendASCII("v1");
- const Extension* extension =
- PackAndInstallCRX(path, pem_path, INSTALL_WITHOUT_LOAD);
- ASSERT_TRUE(extension);
- // The extension should be installed but disabled.
- EXPECT_TRUE(registry()->disabled_extensions().Contains(extension->id()));
- const std::string extension_id = extension->id();
- ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
- EXPECT_TRUE(prefs->HasDisableReason(
- extension_id, disable_reason::DISABLE_CUSTODIAN_APPROVAL_REQUIRED));
-
- // Simulate disabling Permissions for sites, apps and extensions
- // in the testing supervised user service delegate used by the Management API.
- supervised_user_delegate_->set_is_supervised_child_who_may_install_extensions(
- false);
-
- // The supervised user trying to enable while Permissions for sites, apps and
- // extensions is disabled should fail.
- {
- std::string error;
-
- bool success = RunSetEnabledFunction(web_contents_.get(), extension_id,
- /*use_user_gesture=*/true,
- /*accept_dialog=*/true, &error);
- EXPECT_FALSE(success);
- EXPECT_FALSE(error.empty());
- EXPECT_TRUE(registry()->disabled_extensions().Contains(extension_id));
-
- // The block dialog should not have been shown.
- EXPECT_EQ(supervised_user_delegate_->show_block_dialog_count(), 0);
- }
-
- histogram_tester.ExpectUniqueSample(
- SupervisedUserExtensionsMetricsRecorder::kEnablementHistogramName,
- SupervisedUserExtensionsMetricsRecorder::EnablementState::kFailedToEnable,
- 1);
- histogram_tester.ExpectTotalCount(
- SupervisedUserExtensionsMetricsRecorder::kEnablementHistogramName, 1);
- EXPECT_EQ(
- 1,
- user_action_tester.GetActionCount(
- SupervisedUserExtensionsMetricsRecorder::kFailedToEnableActionName));
-}
-
// Tests enabling an extension via management API after it was disabled due to
// permission increase for supervised users.
// Prevents a regression to crbug/1068660.
@@ -1295,7 +1259,7 @@ TEST_F(ManagementApiSupervisedUserTest,
// Now try again with parent approval, and this should succeed.
{
supervised_user_delegate_->set_next_parent_permission_dialog_result(
- SupervisedUserServiceDelegate::ParentPermissionDialogResult::
+ SupervisedUserExtensionsDelegate::ParentPermissionDialogResult::
kParentPermissionReceived);
std::string error;
bool success = RunSetEnabledFunction(web_contents_.get(), extension_id,
@@ -1347,7 +1311,7 @@ TEST_F(ManagementApiSupervisedUserTest, SetEnabled_UnsupportedRequirement) {
// Parent approval should fail because of the unsupported requirements.
{
supervised_user_delegate_->set_next_parent_permission_dialog_result(
- SupervisedUserServiceDelegate::ParentPermissionDialogResult::
+ SupervisedUserExtensionsDelegate::ParentPermissionDialogResult::
kParentPermissionReceived);
std::string error;
bool success = RunSetEnabledFunction(web_contents_.get(), extension->id(),
@@ -1382,7 +1346,7 @@ TEST_F(ManagementApiSupervisedUserTest, SetEnabledDisabled_UmaMetrics) {
// The parent will approve.
supervised_user_delegate_->set_next_parent_permission_dialog_result(
- SupervisedUserServiceDelegate::ParentPermissionDialogResult::
+ SupervisedUserExtensionsDelegate::ParentPermissionDialogResult::
kParentPermissionReceived);
RunSetEnabledFunction(web_contents_.get(), extension->id(),
@@ -1469,7 +1433,7 @@ TEST_F(ManagementApiSupervisedUserTestWithSetup, SetEnabled_ParentApproves) {
// The parent will approve.
supervised_user_delegate_->set_next_parent_permission_dialog_result(
- SupervisedUserServiceDelegate::ParentPermissionDialogResult::
+ SupervisedUserExtensionsDelegate::ParentPermissionDialogResult::
kParentPermissionReceived);
// Simulate a call to chrome.management.setEnabled(). It should succeed.
@@ -1494,7 +1458,7 @@ TEST_F(ManagementApiSupervisedUserTestWithSetup, SetEnabled_ParentDenies) {
// The parent will deny the next dialog.
supervised_user_delegate_->set_next_parent_permission_dialog_result(
- SupervisedUserServiceDelegate::ParentPermissionDialogResult::
+ SupervisedUserExtensionsDelegate::ParentPermissionDialogResult::
kParentPermissionCanceled);
// Simulate a call to chrome.management.setEnabled(). It should not succeed.
@@ -1520,7 +1484,7 @@ TEST_F(ManagementApiSupervisedUserTestWithSetup, SetEnabled_DialogFails) {
// The next dialog will close due to a failure (e.g. network failure while
// looking up parent information).
supervised_user_delegate_->set_next_parent_permission_dialog_result(
- SupervisedUserServiceDelegate::ParentPermissionDialogResult::
+ SupervisedUserExtensionsDelegate::ParentPermissionDialogResult::
kParentPermissionFailed);
// Simulate a call to chrome.management.setEnabled(). It should not succeed.
diff --git a/chromium/chrome/browser/extensions/api/management/management_apitest.cc b/chromium/chrome/browser/extensions/api/management/management_apitest.cc
index aded1d518db..7804dcad939 100644
--- a/chromium/chrome/browser/extensions/api/management/management_apitest.cc
+++ b/chromium/chrome/browser/extensions/api/management/management_apitest.cc
@@ -18,6 +18,7 @@
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/web_applications/components/app_registrar.h"
#include "chrome/browser/web_applications/components/app_shortcut_manager.h"
+#include "chrome/browser/web_applications/components/install_finalizer.h"
#include "chrome/browser/web_applications/components/web_app_helpers.h"
#include "chrome/browser/web_applications/components/web_app_provider_base.h"
#include "chrome/browser/web_applications/test/test_web_app_ui_manager.h"
@@ -36,6 +37,7 @@
#include "extensions/test/result_catcher.h"
#include "extensions/test/test_extension_dir.h"
#include "net/dns/mock_host_resolver.h"
+#include "testing/gtest/include/gtest/gtest.h"
using extensions::Extension;
using extensions::Manifest;
@@ -241,9 +243,12 @@ class InstallReplacementWebAppApiTest : public ExtensionManagementApiTest {
chrome::SetAutoAcceptPWAInstallConfirmationForTesting(true);
const GURL start_url = https_test_server_.GetURL(web_app_start_url);
web_app::AppId web_app_id = web_app::GenerateAppIdFromURL(start_url);
-
auto* provider =
web_app::WebAppProviderBase::GetProviderBase(browser()->profile());
+ // Async legacy finalizer install was causing this test to be flaky (see
+ // crbug.com/1094616).
+ provider->install_finalizer().RemoveLegacyInstallFinalizerForTesting();
+
EXPECT_FALSE(provider->registrar().IsLocallyInstalled(start_url));
EXPECT_EQ(0, static_cast<int>(
provider->ui_manager().GetNumWindowsForApp(web_app_id)));
diff --git a/chromium/chrome/browser/extensions/api/management/management_browsertest.cc b/chromium/chrome/browser/extensions/api/management/management_browsertest.cc
index 68ecb30c5ed..ec72a41d2d6 100644
--- a/chromium/chrome/browser/extensions/api/management/management_browsertest.cc
+++ b/chromium/chrome/browser/extensions/api/management/management_browsertest.cc
@@ -87,8 +87,7 @@ class ExtensionHostDestructionObserver
}
// ExtensionHostObserver:
- void OnExtensionHostDestroyed(
- const extensions::ExtensionHost* host) override {
+ void OnExtensionHostDestroyed(extensions::ExtensionHost* host) override {
if (host == host_) {
extension_host_observer_.Remove(host_);
run_loop_.Quit();