// Copyright 2015 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 "base/run_loop.h" #include "chrome/browser/ui/extensions/extension_action_view_controller.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/toolbar/toolbar_actions_bar.h" #include "chrome/browser/ui/toolbar/toolbar_actions_bar_unittest.h" #include "chrome/common/icon_with_badge_image_source.h" #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" #include "ui/base/l10n/l10n_util.h" // Tests the icon appearance of extension actions without the toolbar redesign. // In this case, the action should never be grayscaled or decorated to indicate // whether or not it wants to run. TEST_F(ToolbarActionsBarUnitTest, ExtensionActionNormalAppearance) { CreateAndAddExtension("extension", extensions::extension_action_test_util::BROWSER_ACTION); EXPECT_EQ(1u, toolbar_actions_bar()->GetIconCount()); AddTab(browser(), GURL("chrome://newtab")); gfx::Size size(ToolbarActionsBar::IconWidth(false), ToolbarActionsBar::IconHeight()); content::WebContents* web_contents = browser()->tab_strip_model()->GetActiveWebContents(); ExtensionActionViewController* action = static_cast( toolbar_actions_bar()->GetActions()[0]); scoped_ptr image_source = action->GetIconImageSourceForTesting(web_contents, size); EXPECT_FALSE(image_source->grayscale()); EXPECT_FALSE(image_source->paint_decoration()); SetActionWantsToRunOnTab(action->extension_action(), web_contents, false); image_source = action->GetIconImageSourceForTesting(web_contents, size); EXPECT_FALSE(image_source->grayscale()); EXPECT_FALSE(image_source->paint_decoration()); toolbar_model()->SetVisibleIconCount(0u); image_source = action->GetIconImageSourceForTesting(web_contents, size); EXPECT_FALSE(image_source->grayscale()); EXPECT_FALSE(image_source->paint_decoration()); SetActionWantsToRunOnTab(action->extension_action(), web_contents, true); image_source = action->GetIconImageSourceForTesting(web_contents, size); EXPECT_FALSE(image_source->grayscale()); EXPECT_FALSE(image_source->paint_decoration()); } // Tests the icon appearance of extension actions with the toolbar redesign. // Extensions that don't want to run should have their icons grayscaled. // Overflowed extensions that want to run should have an additional decoration. TEST_F(ToolbarActionsBarRedesignUnitTest, ExtensionActionWantsToRunAppearance) { CreateAndAddExtension("extension", extensions::extension_action_test_util::PAGE_ACTION); EXPECT_EQ(1u, toolbar_actions_bar()->GetIconCount()); EXPECT_EQ(0u, overflow_bar()->GetIconCount()); AddTab(browser(), GURL("chrome://newtab")); gfx::Size size(ToolbarActionsBar::IconWidth(false), ToolbarActionsBar::IconHeight()); content::WebContents* web_contents = browser()->tab_strip_model()->GetActiveWebContents(); ExtensionActionViewController* action = static_cast( toolbar_actions_bar()->GetActions()[0]); scoped_ptr image_source = action->GetIconImageSourceForTesting(web_contents, size); EXPECT_TRUE(image_source->grayscale()); EXPECT_FALSE(image_source->paint_decoration()); SetActionWantsToRunOnTab(action->extension_action(), web_contents, true); image_source = action->GetIconImageSourceForTesting(web_contents, size); EXPECT_FALSE(image_source->grayscale()); EXPECT_FALSE(image_source->paint_decoration()); toolbar_model()->SetVisibleIconCount(0u); EXPECT_EQ(0u, toolbar_actions_bar()->GetIconCount()); EXPECT_EQ(1u, overflow_bar()->GetIconCount()); action = static_cast( overflow_bar()->GetActions()[0]); image_source = action->GetIconImageSourceForTesting(web_contents, size); EXPECT_FALSE(image_source->grayscale()); EXPECT_TRUE(image_source->paint_decoration()); SetActionWantsToRunOnTab(action->extension_action(), web_contents, false); image_source = action->GetIconImageSourceForTesting(web_contents, size); EXPECT_TRUE(image_source->grayscale()); EXPECT_FALSE(image_source->paint_decoration()); } TEST_F(ToolbarActionsBarRedesignUnitTest, ExtensionActionContextMenu) { CreateAndAddExtension("extension", extensions::extension_action_test_util::BROWSER_ACTION); EXPECT_EQ(1u, toolbar_actions_bar()->GetIconCount()); // Check that the context menu has the proper string for the action's position // (in the main toolbar, in the overflow container, or temporarily popped // out). auto check_visibility_string = [](ToolbarActionViewController* action, int expected_visibility_string) { ui::SimpleMenuModel* context_menu = static_cast(action->GetContextMenu()); int visibility_index = context_menu->GetIndexOfCommandId( extensions::ExtensionContextMenuModel::TOGGLE_VISIBILITY); ASSERT_GE(visibility_index, 0); base::string16 visibility_label = context_menu->GetLabelAt(visibility_index); EXPECT_EQ(l10n_util::GetStringUTF16(expected_visibility_string), visibility_label); }; check_visibility_string(toolbar_actions_bar()->GetActions()[0], IDS_EXTENSIONS_HIDE_BUTTON_IN_MENU); toolbar_model()->SetVisibleIconCount(0u); check_visibility_string(overflow_bar()->GetActions()[0], IDS_EXTENSIONS_SHOW_BUTTON_IN_TOOLBAR); base::RunLoop run_loop; toolbar_actions_bar()->PopOutAction(toolbar_actions_bar()->GetActions()[0], run_loop.QuitClosure()); run_loop.Run(); check_visibility_string(toolbar_actions_bar()->GetActions()[0], IDS_EXTENSIONS_KEEP_BUTTON_IN_TOOLBAR); }