| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/ui/extensions/extension_message_bubble_bridge.h" |
| |
| #include "base/bind.h" |
| #include "base/command_line.h" |
| #include "base/logging.h" |
| #include "base/path_service.h" |
| #include "base/values.h" |
| #include "chrome/browser/extensions/extension_service.h" |
| #include "chrome/browser/extensions/extension_service_test_with_install.h" |
| #include "chrome/browser/extensions/extension_web_ui_override_registrar.h" |
| #include "chrome/browser/extensions/ntp_overridden_bubble_delegate.h" |
| #include "chrome/browser/extensions/suspicious_extension_bubble_delegate.h" |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/browser/ui/toolbar/test_toolbar_actions_bar_bubble_delegate.h" |
| #include "chrome/browser/ui/toolbar/toolbar_actions_bar_bubble_delegate.h" |
| #include "chrome/browser/ui/toolbar/toolbar_actions_model.h" |
| #include "chrome/browser/ui/toolbar/toolbar_actions_model_factory.h" |
| #include "chrome/common/chrome_paths.h" |
| #include "chrome/grit/generated_resources.h" |
| #include "chrome/test/base/test_browser_window.h" |
| #include "chrome/test/base/testing_profile.h" |
| #include "components/crx_file/id_util.h" |
| #include "components/keyed_service/core/keyed_service.h" |
| #include "components/strings/grit/components_strings.h" |
| #include "components/vector_icons/vector_icons.h" |
| #include "content/public/browser/browser_context.h" |
| #include "extensions/browser/disable_reason.h" |
| #include "extensions/browser/extension_registry.h" |
| #include "extensions/browser/extension_system.h" |
| #include "extensions/common/extension_builder.h" |
| #include "extensions/common/manifest.h" |
| #include "extensions/common/value_builder.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "ui/base/l10n/l10n_util.h" |
| |
| namespace { |
| |
| std::unique_ptr<KeyedService> BuildOverrideRegistrar( |
| content::BrowserContext* context) { |
| return std::make_unique<extensions::ExtensionWebUIOverrideRegistrar>(context); |
| } |
| |
| std::unique_ptr<KeyedService> BuildToolbarModel( |
| content::BrowserContext* context) { |
| return std::make_unique<ToolbarActionsModel>( |
| Profile::FromBrowserContext(context), |
| extensions::ExtensionPrefs::Get(context)); |
| } |
| |
| } // namespace |
| |
| class ExtensionMessageBubbleBridgeUnitTest |
| : public extensions::ExtensionServiceTestWithInstall { |
| public: |
| ExtensionMessageBubbleBridgeUnitTest() {} |
| ~ExtensionMessageBubbleBridgeUnitTest() override {} |
| Browser* browser() { return browser_.get(); } |
| |
| private: |
| void SetUp() override { |
| ExtensionServiceTestWithInstall::SetUp(); |
| InitializeEmptyExtensionService(); |
| |
| browser_window_.reset(new TestBrowserWindow()); |
| Browser::CreateParams params(profile(), true); |
| params.type = Browser::TYPE_TABBED; |
| params.window = browser_window_.get(); |
| browser_.reset(new Browser(params)); |
| |
| extensions::ExtensionWebUIOverrideRegistrar::GetFactoryInstance() |
| ->SetTestingFactory(browser()->profile(), |
| base::BindRepeating(&BuildOverrideRegistrar)); |
| extensions::ExtensionWebUIOverrideRegistrar::GetFactoryInstance()->Get( |
| browser()->profile()); |
| ToolbarActionsModelFactory::GetInstance()->SetTestingFactory( |
| browser()->profile(), base::BindRepeating(&BuildToolbarModel)); |
| } |
| |
| void TearDown() override { |
| browser_.reset(); |
| browser_window_.reset(); |
| ExtensionServiceTestWithInstall::TearDown(); |
| } |
| |
| std::unique_ptr<TestBrowserWindow> browser_window_; |
| std::unique_ptr<Browser> browser_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ExtensionMessageBubbleBridgeUnitTest); |
| }; |
| |
| TEST_F(ExtensionMessageBubbleBridgeUnitTest, |
| TestGetExtraViewInfoMethodWithNormalSettingsOverrideExtension) { |
| base::FilePath path(data_dir().AppendASCII("api_test/override/newtab/")); |
| EXPECT_NE(nullptr, PackAndInstallCRX(path, INSTALL_NEW)); |
| |
| std::unique_ptr<extensions::ExtensionMessageBubbleController> |
| ntp_bubble_controller(new extensions::ExtensionMessageBubbleController( |
| new extensions::NtpOverriddenBubbleDelegate(browser()->profile()), |
| browser())); |
| |
| ASSERT_EQ(1U, ntp_bubble_controller->GetExtensionList().size()); |
| |
| std::unique_ptr<ToolbarActionsBarBubbleDelegate> bridge( |
| new ExtensionMessageBubbleBridge(std::move(ntp_bubble_controller))); |
| |
| std::unique_ptr<ToolbarActionsBarBubbleDelegate::ExtraViewInfo> |
| extra_view_info = bridge->GetExtraViewInfo(); |
| |
| EXPECT_FALSE(extra_view_info->resource); |
| EXPECT_EQ(l10n_util::GetStringUTF16(IDS_LEARN_MORE), extra_view_info->text); |
| EXPECT_TRUE(extra_view_info->is_learn_more); |
| |
| EXPECT_EQ( |
| l10n_util::GetStringUTF16(IDS_EXTENSION_CONTROLLED_RESTORE_SETTINGS), |
| bridge->GetActionButtonText()); |
| } |
| |
| TEST_F(ExtensionMessageBubbleBridgeUnitTest, |
| TestGetExtraViewInfoMethodWithPolicyInstalledSettingsOverrideExtension) { |
| base::FilePath path(data_dir().AppendASCII("api_test/override/newtab/")); |
| EXPECT_NE(nullptr, |
| PackAndInstallCRX(path, extensions::Manifest::EXTERNAL_POLICY, |
| INSTALL_NEW)); |
| |
| std::unique_ptr<extensions::ExtensionMessageBubbleController> |
| ntp_bubble_controller(new extensions::ExtensionMessageBubbleController( |
| new extensions::NtpOverriddenBubbleDelegate(browser()->profile()), |
| browser())); |
| |
| ASSERT_EQ(1U, ntp_bubble_controller->GetExtensionList().size()); |
| |
| std::unique_ptr<ToolbarActionsBarBubbleDelegate> bridge( |
| new ExtensionMessageBubbleBridge(std::move(ntp_bubble_controller))); |
| |
| std::unique_ptr<ToolbarActionsBarBubbleDelegate::ExtraViewInfo> |
| extra_view_info = bridge->GetExtraViewInfo(); |
| |
| extra_view_info = bridge->GetExtraViewInfo(); |
| |
| EXPECT_EQ(&vector_icons::kBusinessIcon, extra_view_info->resource); |
| EXPECT_EQ(l10n_util::GetStringUTF16(IDS_EXTENSIONS_INSTALLED_BY_ADMIN), |
| extra_view_info->text); |
| EXPECT_FALSE(extra_view_info->is_learn_more); |
| |
| EXPECT_EQ(base::string16(), bridge->GetActionButtonText()); |
| } |
| |
| // Tests the ExtensionMessageBubbleBridge in conjunction with the |
| // SuspiciousExtensionBubbleDelegate. |
| TEST_F(ExtensionMessageBubbleBridgeUnitTest, SuspiciousExtensionBubble) { |
| // Load up a simple extension. |
| extensions::DictionaryBuilder manifest; |
| manifest.Set("name", "foo") |
| .Set("description", "some extension") |
| .Set("version", "0.1") |
| .Set("manifest_version", 2); |
| scoped_refptr<const extensions::Extension> extension = |
| extensions::ExtensionBuilder().SetID(crx_file::id_util::GenerateId("foo")) |
| .SetManifest(manifest.Build()) |
| .Build(); |
| ASSERT_TRUE(extension); |
| service()->AddExtension(extension.get()); |
| const std::string id = extension->id(); |
| ASSERT_TRUE(registry()->enabled_extensions().GetByID(id)); |
| |
| // Disable the extension for being from outside the webstore. |
| service()->DisableExtension(extension->id(), |
| extensions::disable_reason::DISABLE_NOT_VERIFIED); |
| EXPECT_TRUE(registry()->disabled_extensions().GetByID(id)); |
| |
| // Create a new message bubble; it should want to display for the disabled |
| // extension. (Note: The bubble logic itself is tested more thoroughly in |
| // extension_message_bubble_controller_unittest.cc.) |
| auto suspicious_bubble_controller = |
| std::make_unique<extensions::ExtensionMessageBubbleController>( |
| new extensions::SuspiciousExtensionBubbleDelegate(profile()), |
| browser()); |
| EXPECT_TRUE(suspicious_bubble_controller->ShouldShow()); |
| ASSERT_EQ(1u, suspicious_bubble_controller->GetExtensionIdList().size()); |
| EXPECT_EQ(id, suspicious_bubble_controller->GetExtensionIdList()[0]); |
| |
| // Create a new bridge and poke at a few of the methods to verify they are |
| // correct and that nothing crashes. |
| std::unique_ptr<ToolbarActionsBarBubbleDelegate> bridge = |
| std::make_unique<ExtensionMessageBubbleBridge>( |
| std::move(suspicious_bubble_controller)); |
| EXPECT_TRUE(bridge->ShouldShow()); |
| EXPECT_FALSE(bridge->ShouldCloseOnDeactivate()); |
| |
| std::unique_ptr<ToolbarActionsBarBubbleDelegate::ExtraViewInfo> |
| extra_view_info = bridge->GetExtraViewInfo(); |
| |
| ASSERT_TRUE(extra_view_info); |
| EXPECT_FALSE(extra_view_info->text.empty()); |
| EXPECT_TRUE(extra_view_info->is_learn_more); |
| EXPECT_FALSE(extra_view_info->resource); |
| } |