| Index: chrome/browser/ui/toolbar/media_router_action_unittest.cc
|
| diff --git a/chrome/browser/ui/toolbar/media_router_action_unittest.cc b/chrome/browser/ui/toolbar/media_router_action_unittest.cc
|
| index d09f0225681e175132a815f50659208f07e74950..68edf5f19d2c9594d7e50185f11802262d5b941d 100644
|
| --- a/chrome/browser/ui/toolbar/media_router_action_unittest.cc
|
| +++ b/chrome/browser/ui/toolbar/media_router_action_unittest.cc
|
| @@ -2,11 +2,15 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| +#include "base/auto_reset.h"
|
| +#include "base/command_line.h"
|
| #include "base/macros.h"
|
| #include "chrome/browser/extensions/browser_action_test_util.h"
|
| #include "chrome/browser/extensions/extension_action_test_util.h"
|
| +#include "chrome/browser/extensions/test_extension_system.h"
|
| #include "chrome/browser/ui/browser_commands.h"
|
| #include "chrome/browser/ui/tabs/tab_strip_model.h"
|
| +#include "chrome/browser/ui/toolbar/component_toolbar_actions_factory.h"
|
| #include "chrome/browser/ui/toolbar/media_router_action.h"
|
| #include "chrome/browser/ui/toolbar/toolbar_action_view_delegate.h"
|
| #include "chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.h"
|
| @@ -48,6 +52,7 @@ class TestMediaRouterAction : public MediaRouterAction {
|
| MediaRouterDialogControllerImpl* controller) {
|
| DCHECK(controller);
|
| controller_ = controller;
|
| + controller_->SetMediaRouterAction(GetWeakPtr());
|
| }
|
|
|
| private:
|
| @@ -60,6 +65,11 @@ class TestMediaRouterAction : public MediaRouterAction {
|
| return platform_delegate_;
|
| }
|
|
|
| + void MaybeRemoveAction() override {
|
| + if (GetMediaRouterDialogController())
|
| + MediaRouterAction::MaybeRemoveAction();
|
| + }
|
| +
|
| MediaRouterDialogControllerImpl* controller_;
|
| MediaRouterActionPlatformDelegate* platform_delegate_;
|
| };
|
| @@ -114,8 +124,12 @@ class MediaRouterActionUnitTest : public MediaRouterTest {
|
| // MediaRouterTest:
|
| void SetUp() override {
|
| MediaRouterTest::SetUp();
|
| + static_cast<extensions::TestExtensionSystem*>(
|
| + extensions::ExtensionSystem::Get(profile()))
|
| + ->CreateExtensionService(base::CommandLine::ForCurrentProcess(),
|
| + base::FilePath(), false);
|
| toolbar_model_ = extensions::extension_action_test_util::
|
| - CreateToolbarModelForProfileWithoutWaitingForReady(profile());
|
| + CreateToolbarModelForProfile(profile());
|
|
|
| // browser() will only be valid once BrowserWithTestWindowTest::SetUp()
|
| // has run.
|
| @@ -125,6 +139,9 @@ class MediaRouterActionUnitTest : public MediaRouterTest {
|
| new TestMediaRouterAction(
|
| browser(),
|
| browser_action_test_util_->GetToolbarActionsBar()));
|
| + delegate_.reset(new MockToolbarActionViewDelegate());
|
| +
|
| + action()->SetDelegate(delegate_.get());
|
|
|
| local_display_route_list_.push_back(
|
| media_router::MediaRoute("routeId1", fake_source1_, "sinkId1",
|
| @@ -138,12 +155,23 @@ class MediaRouterActionUnitTest : public MediaRouterTest {
|
| }
|
|
|
| void TearDown() override {
|
| - browser_action_test_util_.reset();
|
| + delegate_.reset();
|
| action_.reset();
|
| + browser_action_test_util_.reset();
|
| MediaRouterTest::TearDown();
|
| }
|
|
|
| + bool ActionExists() {
|
| + return toolbar_model_->HasComponentAction(
|
| + ComponentToolbarActionsFactory::kMediaRouterActionId);
|
| + }
|
| +
|
| + void ResetTestMediaRouterAction() {
|
| + action_.reset();
|
| + }
|
| +
|
| TestMediaRouterAction* action() { return action_.get(); }
|
| + ToolbarActionsModel* toolbar_model() { return toolbar_model_; }
|
| const media_router::Issue* fake_issue_notification() {
|
| return &fake_issue_notification_;
|
| }
|
| @@ -175,6 +203,7 @@ class MediaRouterActionUnitTest : public MediaRouterTest {
|
| std::unique_ptr<BrowserActionTestUtil> browser_action_test_util_;
|
|
|
| std::unique_ptr<TestMediaRouterAction> action_;
|
| + std::unique_ptr<MockToolbarActionViewDelegate> delegate_;
|
|
|
| // The associated ToolbarActionsModel (owned by the keyed service setup).
|
| ToolbarActionsModel* toolbar_model_;
|
| @@ -320,42 +349,131 @@ TEST_F(MediaRouterActionUnitTest, UpdateIssuesAndRoutes) {
|
| }
|
|
|
| TEST_F(MediaRouterActionUnitTest, IconPressedState) {
|
| + base::AutoReset<bool> disable_animations(
|
| + &ToolbarActionsBar::disable_animations_for_testing_, true);
|
| +
|
| // Start with one window with one tab.
|
| EXPECT_EQ(0, browser()->tab_strip_model()->count());
|
| chrome::NewTab(browser());
|
| EXPECT_EQ(1, browser()->tab_strip_model()->count());
|
|
|
| - // Create a reference to initiator contents.
|
| - WebContents* initiator_ =
|
| - browser()->tab_strip_model()->GetActiveWebContents();
|
| -
|
| - MediaRouterDialogControllerImpl::CreateForWebContents(initiator_);
|
| - MediaRouterDialogControllerImpl* dialog_controller_ =
|
| - MediaRouterDialogControllerImpl::FromWebContents(initiator_);
|
| - ASSERT_TRUE(dialog_controller_);
|
| + WebContents* initiator = browser()->tab_strip_model()->GetActiveWebContents();
|
| + MediaRouterDialogControllerImpl::CreateForWebContents(initiator);
|
| + MediaRouterDialogControllerImpl* dialog_controller =
|
| + MediaRouterDialogControllerImpl::FromWebContents(initiator);
|
| + ASSERT_TRUE(dialog_controller);
|
|
|
| // Sets the controller to use for TestMediaRouterAction.
|
| - action()->SetMediaRouterDialogController(dialog_controller_);
|
| -
|
| - // Create a ToolbarActionViewDelegate to use for MediaRouterAction.
|
| - std::unique_ptr<MockToolbarActionViewDelegate> mock_delegate(
|
| - new MockToolbarActionViewDelegate());
|
| + action()->SetMediaRouterDialogController(dialog_controller);
|
|
|
| - EXPECT_CALL(*mock_delegate, GetCurrentWebContents()).WillOnce(
|
| - testing::Return(initiator_));
|
| - EXPECT_CALL(*mock_delegate, OnPopupClosed()).Times(1);
|
| - action()->SetDelegate(mock_delegate.get());
|
| + // Add the icon to the toolbar and make it persist.
|
| + toolbar_model()->AddComponentAction(
|
| + ComponentToolbarActionsFactory::kMediaRouterActionId);
|
| + action()->ToggleVisibilityPreference();
|
| + EXPECT_TRUE(ActionExists());
|
|
|
| - EXPECT_CALL(*mock_delegate, OnPopupShown(true)).Times(1);
|
| action()->ExecuteAction(true);
|
| + EXPECT_TRUE(dialog_controller->IsShowingMediaRouterDialog());
|
|
|
| // Pressing the icon while the popup is shown should close the popup
|
| - EXPECT_CALL(*mock_delegate, OnPopupClosed()).Times(1);
|
| action()->ExecuteAction(true);
|
| + EXPECT_FALSE(dialog_controller->IsShowingMediaRouterDialog());
|
| +
|
| + dialog_controller->CreateMediaRouterDialog();
|
| + EXPECT_TRUE(dialog_controller->IsShowingMediaRouterDialog());
|
| +
|
| + dialog_controller->HideMediaRouterDialog();
|
| + EXPECT_FALSE(dialog_controller->IsShowingMediaRouterDialog());
|
| +
|
| + // Make the icon go away.
|
| + action()->ToggleVisibilityPreference();
|
| + EXPECT_FALSE(ActionExists());
|
| +}
|
|
|
| - EXPECT_CALL(*mock_delegate, OnPopupShown(true)).Times(1);
|
| - dialog_controller_->CreateMediaRouterDialog();
|
| +TEST_F(MediaRouterActionUnitTest, EphemeralIcon) {
|
| + // We'll be using the action created by the toolbar model in this test,
|
| + // so we remove the test action here.
|
| + ResetTestMediaRouterAction();
|
|
|
| - EXPECT_CALL(*mock_delegate, OnPopupClosed()).Times(1);
|
| - dialog_controller_->HideMediaRouterDialog();
|
| + base::AutoReset<bool> disable_animations(
|
| + &ToolbarActionsBar::disable_animations_for_testing_, true);
|
| +
|
| + // Start with one window with one tab.
|
| + EXPECT_EQ(0, browser()->tab_strip_model()->count());
|
| + chrome::NewTab(browser());
|
| + EXPECT_EQ(1, browser()->tab_strip_model()->count());
|
| +
|
| + WebContents* initiator = browser()->tab_strip_model()->GetActiveWebContents();
|
| + MediaRouterDialogControllerImpl::CreateForWebContents(initiator);
|
| + MediaRouterDialogControllerImpl* dialog_controller =
|
| + MediaRouterDialogControllerImpl::FromWebContents(initiator);
|
| + ASSERT_TRUE(dialog_controller);
|
| +
|
| + EXPECT_FALSE(ActionExists());
|
| + // Show the popup. The icon should become visible.
|
| + dialog_controller->ShowMediaRouterDialog();
|
| + EXPECT_TRUE(ActionExists());
|
| + // Hide the popup. The icon should become hidden.
|
| + dialog_controller->HideMediaRouterDialog();
|
| + EXPECT_FALSE(ActionExists());
|
| +
|
| + // Show the popup.
|
| + dialog_controller->ShowMediaRouterDialog();
|
| + // Add a local display route.
|
| + dialog_controller->action_for_test()
|
| + ->OnRoutesUpdated(local_display_route_list(), empty_route_id_list());
|
| + EXPECT_TRUE(ActionExists());
|
| + // Hide the popup while there's still a local media route. The icon should not
|
| + // be hidden as long as the media route exists.
|
| + dialog_controller->HideMediaRouterDialog();
|
| + EXPECT_TRUE(ActionExists());
|
| + // Remove the local route. Now the icon should be hidden.
|
| + dialog_controller->action_for_test()->OnRoutesUpdated(
|
| + std::vector<media_router::MediaRoute>(),
|
| + empty_route_id_list());
|
| + EXPECT_FALSE(ActionExists());
|
| +}
|
| +
|
| +TEST_F(MediaRouterActionUnitTest, ToggleIconVisibilityPreference) {
|
| + // We'll be using the action created by the toolbar model in this test,
|
| + // so we remove the test action here.
|
| + ResetTestMediaRouterAction();
|
| +
|
| + base::AutoReset<bool> disable_animations(
|
| + &ToolbarActionsBar::disable_animations_for_testing_, true);
|
| +
|
| + // Start with one window with one tab.
|
| + EXPECT_EQ(0, browser()->tab_strip_model()->count());
|
| + chrome::NewTab(browser());
|
| + EXPECT_EQ(1, browser()->tab_strip_model()->count());
|
| +
|
| + WebContents* initiator = browser()->tab_strip_model()->GetActiveWebContents();
|
| + MediaRouterDialogControllerImpl::CreateForWebContents(initiator);
|
| + MediaRouterDialogControllerImpl* dialog_controller =
|
| + MediaRouterDialogControllerImpl::FromWebContents(initiator);
|
| + ASSERT_TRUE(dialog_controller);
|
| +
|
| + EXPECT_FALSE(ActionExists());
|
| + // Show the popup. The icon should become visible.
|
| + dialog_controller->ShowMediaRouterDialog();
|
| + EXPECT_TRUE(ActionExists());
|
| + // Turn on the settings to always show the icon.
|
| + dialog_controller->action_for_test()->ToggleVisibilityPreference();
|
| + // Hide the popup. The icon should stay visible.
|
| + dialog_controller->HideMediaRouterDialog();
|
| + EXPECT_TRUE(ActionExists());
|
| +
|
| + // Close the tab and open another.
|
| + browser()->tab_strip_model()->CloseAllTabs();
|
| + EXPECT_EQ(0, browser()->tab_strip_model()->count());
|
| + chrome::NewTab(browser());
|
| + // The icon should persist.
|
| + EXPECT_TRUE(ActionExists());
|
| + // Get the dialog controller for the new tab.
|
| + dialog_controller = MediaRouterDialogControllerImpl::FromWebContents(
|
| + browser()->tab_strip_model()->GetActiveWebContents());
|
| + // Turn off the setting to always show the icon.
|
| + // The icon should get hidden now.
|
| + dialog_controller->action_for_test()->ToggleVisibilityPreference();
|
| + EXPECT_FALSE(ActionExists());
|
| }
|
|
|