diff options
Diffstat (limited to 'chromium/chrome/browser/extensions/api/management')
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(); |