Chromium Code Reviews| Index: chrome/browser/ui/views/extensions/extension_message_bubble_view_browsertest.cc |
| diff --git a/chrome/browser/ui/views/extensions/extension_message_bubble_view_browsertest.cc b/chrome/browser/ui/views/extensions/extension_message_bubble_view_browsertest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..779b9fe323492eb2df7a86f1ac189aad687998e2 |
| --- /dev/null |
| +++ b/chrome/browser/ui/views/extensions/extension_message_bubble_view_browsertest.cc |
| @@ -0,0 +1,144 @@ |
| +// 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/extensions/extension_action_test_util.h" |
| +#include "chrome/browser/extensions/extension_service.h" |
| +#include "chrome/browser/ui/extensions/extension_message_bubble_factory.h" |
| +#include "chrome/browser/ui/toolbar/browser_actions_bar_browsertest.h" |
| +#include "chrome/browser/ui/views/extensions/extension_message_bubble_view.h" |
| +#include "chrome/browser/ui/views/frame/browser_view.h" |
| +#include "chrome/browser/ui/views/toolbar/browser_actions_container.h" |
| +#include "chrome/browser/ui/views/toolbar/toolbar_view.h" |
| +#include "chrome/browser/ui/views/toolbar/wrench_toolbar_button.h" |
| +#include "extensions/common/feature_switch.h" |
| + |
| +namespace { |
| + |
| +// Checks that the |bubble| is using the |expected_reference_view|, and is in |
| +// approximately the correct position. |
| +void CheckBubbleAndReferenceView(views::BubbleDelegateView* bubble, |
| + views::View* expected_reference_view) { |
| + ASSERT_TRUE(bubble); |
| + ASSERT_TRUE(expected_reference_view); |
| + EXPECT_EQ(expected_reference_view, bubble->GetAnchorView()); |
| + |
| + // Do a rough check that the bubble is in the right place. |
| + gfx::Rect bubble_bounds = bubble->GetBoundsInScreen(); |
| + gfx::Rect reference_bounds = expected_reference_view->GetBoundsInScreen(); |
| + // It should be below the reference view, but not too far below. |
| + EXPECT_GE(bubble_bounds.y(), reference_bounds.bottom()); |
| + // "Too far below" is kind of ambiguous. The exact logic of where a bubble |
| + // is positioned with respect to its anchor view should be tested as part of |
| + // the bubble logic, but we still want to make sure we didn't accidentally |
| + // place it somewhere crazy (which can happen if we draw it, and then |
| + // animate or reposition the reference view). |
| + const int kFudgeFactor = 50; |
| + EXPECT_LE(bubble_bounds.y(), reference_bounds.bottom() + kFudgeFactor); |
| + // The bubble should intersect the reference view somewhere along the x-axis. |
| + EXPECT_FALSE(bubble_bounds.x() > reference_bounds.right()); |
| + EXPECT_FALSE(reference_bounds.x() > bubble_bounds.right()); |
| + |
| + // And, of course, the bubble should be visible. |
| + EXPECT_TRUE(bubble->visible()); |
| +} |
| + |
| +} // namespace |
| + |
| +class ExtensionMessageBubbleViewBrowserTest |
| + : public BrowserActionsBarBrowserTest { |
| + protected: |
| + ExtensionMessageBubbleViewBrowserTest() {} |
| + ~ExtensionMessageBubbleViewBrowserTest() override {} |
| + |
| + void SetUpCommandLine(base::CommandLine* command_line) override; |
| + |
| + private: |
| + scoped_ptr<extensions::FeatureSwitch::ScopedOverride> |
| + dev_mode_bubble_override_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(ExtensionMessageBubbleViewBrowserTest); |
| +}; |
| + |
| +void ExtensionMessageBubbleViewBrowserTest::SetUpCommandLine( |
| + base::CommandLine* command_line) { |
| + BrowserActionsBarBrowserTest::SetUpCommandLine(command_line); |
| + // The dev mode warning bubble is an easy one to trigger, so we use that for |
| + // our testing purposes. |
| + dev_mode_bubble_override_.reset( |
| + new extensions::FeatureSwitch::ScopedOverride( |
| + extensions::FeatureSwitch::force_dev_mode_highlighting(), |
| + true)); |
| + ExtensionMessageBubbleFactory::set_enabled_for_tests(true); |
| +} |
| + |
| +// Tests that an extension bubble will be anchored to the wrench menu when there |
| +// aren't any extensions with actions. |
| +IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleViewBrowserTest, |
| + ExtensionBubbleAnchoredToWrenchMenu) { |
| + scoped_refptr<const extensions::Extension> action_extension = |
| + extensions::extension_action_test_util::CreateActionExtension( |
| + "action_extension", |
| + extensions::extension_action_test_util::BROWSER_ACTION, |
| + extensions::Manifest::UNPACKED); |
| + extension_service()->AddExtension(action_extension.get()); |
| + |
| + Browser* second_browser = new Browser( |
| + Browser::CreateParams(profile(), browser()->host_desktop_type())); |
| + base::RunLoop().RunUntilIdle(); |
| + |
| + BrowserActionsContainer* second_container = |
| + BrowserView::GetBrowserViewForBrowser(second_browser)->toolbar()-> |
| + browser_actions(); |
| + views::BubbleDelegateView* bubble = second_container->active_bubble(); |
| + CheckBubbleAndReferenceView(bubble, |
| + second_container->GetToolbarActionViewAt(0)); |
| + |
| + bubble->GetWidget()->Close(); |
| + EXPECT_EQ(nullptr, second_container->active_bubble()); |
| +} |
| + |
| +// Tests that an extension bubble will be anchored to an extension action when |
| +// there are extensions with actions. |
| +IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleViewBrowserTest, |
| + ExtensionBubbleAnchoredToExtensionAction) { |
| + scoped_refptr<const extensions::Extension> no_action_extension = |
| + extensions::extension_action_test_util::CreateActionExtension( |
| + "action_extension", |
| + extensions::extension_action_test_util::NO_ACTION, |
| + extensions::Manifest::UNPACKED); |
| + extension_service()->AddExtension(no_action_extension.get()); |
| + |
| + Browser* second_browser = new Browser( |
| + Browser::CreateParams(profile(), browser()->host_desktop_type())); |
| + ASSERT_TRUE(second_browser); |
| + base::RunLoop().RunUntilIdle(); |
| + |
| + ToolbarView* toolbar = |
| + BrowserView::GetBrowserViewForBrowser(second_browser)->toolbar(); |
| + BrowserActionsContainer* second_container = toolbar->browser_actions(); |
| + views::BubbleDelegateView* bubble = second_container->active_bubble(); |
| + CheckBubbleAndReferenceView(bubble, toolbar->app_menu()); |
| + |
| + bubble->GetWidget()->Close(); |
| + EXPECT_EQ(nullptr, second_container->active_bubble()); |
| +} |
| + |
| +// Tests that the extension bubble will show on startup. |
|
Finnur
2015/04/15 14:51:37
nit: Would be good for the test that exercises the
Devlin
2015/04/15 16:56:49
Done.
|
| +IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleViewBrowserTest, |
| + PRE_ExtensionBubbleShowsOnStartup) { |
| + LoadExtension(test_data_dir_.AppendASCII("good_unpacked")); |
| +} |
| +IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleViewBrowserTest, |
|
Finnur
2015/04/15 14:51:37
nit: missing line break above this.
Devlin
2015/04/15 16:56:49
It was a conscious decision, since the one above i
|
| + ExtensionBubbleShowsOnStartup) { |
| + base::RunLoop().RunUntilIdle(); |
| + BrowserActionsContainer* container = |
| + BrowserView::GetBrowserViewForBrowser(browser())->toolbar()-> |
| + browser_actions(); |
| + views::BubbleDelegateView* bubble = container->active_bubble(); |
| + CheckBubbleAndReferenceView(bubble, container->GetToolbarActionViewAt(0)); |
| + |
| + bubble->GetWidget()->Close(); |
| + EXPECT_EQ(nullptr, container->active_bubble()); |
| +} |