Index: chrome/browser/ui/panels/panel_overflow_browsertest.cc |
diff --git a/chrome/browser/ui/panels/panel_overflow_browsertest.cc b/chrome/browser/ui/panels/panel_overflow_browsertest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..af7f1682d1d717f4bdcd440b639d785168ef6b55 |
--- /dev/null |
+++ b/chrome/browser/ui/panels/panel_overflow_browsertest.cc |
@@ -0,0 +1,718 @@ |
+// Copyright (c) 2011 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 <vector> |
+#include "chrome/browser/ui/browser.h" |
+#include "chrome/browser/ui/panels/base_panel_browser_test.h" |
+#include "chrome/browser/ui/panels/native_panel.h" |
+#include "chrome/browser/ui/panels/panel.h" |
+#include "chrome/browser/ui/panels/panel_manager.h" |
+#include "chrome/browser/ui/panels/panel_overflow_strip.h" |
+#include "chrome/browser/ui/panels/panel_settings_menu_model.h" |
+#include "chrome/browser/ui/panels/panel_strip.h" |
+#include "chrome/browser/ui/panels/test_panel_mouse_watcher.h" |
+#include "chrome/common/chrome_notification_types.h" |
+#include "chrome/test/base/ui_test_utils.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace { |
+ |
+// We override the default value for testing purpose. |
+const int kMaxVisibleOverflowForTesting = 3; |
+ |
+// Encapsulates all the info we need to verify if a panel behaves as expected |
+// when we do the overflow testing. |
+struct PanelData { |
+ Panel* panel; |
+ Panel::ExpansionState expansion_state; |
+ bool visible; |
+ bool active; |
+ |
+ explicit PanelData(Panel* panel) |
+ : panel(panel), |
+ expansion_state(panel->expansion_state()), |
+ visible(!panel->GetBounds().IsEmpty()), |
+ active(panel->IsActive()) { |
+ } |
+ |
+ PanelData(Panel* panel, Panel::ExpansionState expansion_state, |
+ bool visible, bool active) |
+ : panel(panel), |
+ expansion_state(expansion_state), |
+ visible(visible), |
+ active(active) { |
+ } |
+ |
+ bool operator==(const PanelData& another) const { |
+ return panel == another.panel && |
+ expansion_state == another.expansion_state && |
+ visible == another.visible && |
+ active == another.active; |
+ } |
+ |
+ bool operator!=(const PanelData& another) const { |
+ return !(*this == another); |
+ } |
+}; |
+ |
+// For gtest printing. |
+::std::ostream& operator<<(::std::ostream& os, const PanelData& data); |
+::std::ostream& operator<<(::std::ostream& os, const PanelData& data) { |
+ return os << "(" << data.panel->browser()->app_name() << ", " |
+ << data.expansion_state << ", " << data.visible << ", " |
+ << data.active << ")"; |
+} |
+ |
+ |
+class PanelDataList : public std::vector<PanelData> { |
+ public: |
+ void Add(Panel* panel, Panel::ExpansionState expansion_state, |
+ bool visible, bool active) { |
+ push_back(PanelData(panel, expansion_state, visible, active)); |
+ } |
+}; |
+ |
+} // namespace |
+ |
+class PanelOverflowBrowserTest : public BasePanelBrowserTest { |
+ public: |
+ PanelOverflowBrowserTest() : BasePanelBrowserTest() { |
+ } |
+ |
+ virtual ~PanelOverflowBrowserTest() { |
+ } |
+ |
+ virtual void SetUpOnMainThread() OVERRIDE { |
+ BasePanelBrowserTest::SetUpOnMainThread(); |
+ |
+ PanelManager::GetInstance()->panel_overflow_strip()-> |
+ set_max_visible_panels(kMaxVisibleOverflowForTesting); |
+ |
+ // All the overflow tests assume 800x600 work area. Do the check now. |
+ DCHECK(PanelManager::GetInstance()->work_area().width() == 800); |
+ } |
+ |
+ protected: |
+ static PanelDataList GetAllNormalPanelData() { |
+ PanelDataList panel_data_list; |
+ PanelStrip::Panels panels = |
+ PanelManager::GetInstance()->panel_strip()->panels(); |
+ for (PanelStrip::Panels::const_iterator iter = panels.begin(); |
+ iter != panels.end(); ++iter) { |
+ Panel* panel = *iter; |
+ panel_data_list.push_back(PanelData(panel)); |
+ } |
+ return panel_data_list; |
+ } |
+ |
+ static PanelDataList GetAllOverflowPanelData() { |
+ PanelDataList panel_data_list; |
+ PanelOverflowStrip::Panels panels = |
+ PanelManager::GetInstance()->panel_overflow_strip()->panels(); |
+ for (PanelOverflowStrip::Panels::const_iterator iter = panels.begin(); |
+ iter != panels.end(); ++iter) { |
+ Panel* panel = *iter; |
+ panel_data_list.push_back(PanelData(panel)); |
+ } |
+ return panel_data_list; |
+ } |
+ |
+ static void MoveMouseAndWaitForOverflowAnimationEnded( |
+ const gfx::Point& position) { |
+ ui_test_utils::WindowedNotificationObserver signal( |
+ chrome::NOTIFICATION_PANEL_BOUNDS_ANIMATIONS_FINISHED, |
+ content::Source<PanelOverflowStrip>( |
+ PanelManager::GetInstance()->panel_overflow_strip())); |
+ MoveMouse(position); |
+ signal.Wait(); |
+ } |
+ |
+ static bool IsPanelVisible(Panel* panel) { |
+ return !panel->GetBounds().IsEmpty(); |
+ } |
+ |
+ std::vector<Panel*> CreateOverflowPanels(int num_normal_panels, |
+ int num_overflow_panels, |
+ const int* panel_widths) { |
+ const int kTestPanelHeight = 200; |
+ std::vector<Panel*> panels; |
+ |
+ // First, create normal panels to fill the panel strip. |
+ int i = 0; |
+ for (; i < num_normal_panels; ++i) { |
+ CreatePanelParams params( |
+ MakePanelName(i), |
+ gfx::Rect(0, 0, panel_widths[i], kTestPanelHeight), |
+ SHOW_AS_INACTIVE); |
+ Panel* panel = CreatePanelWithParams(params); |
+ panels.push_back(panel); |
+ } |
+ |
+ // Then, create panels that would be placed in the overflow strip. |
+ int num_panels = num_normal_panels + num_overflow_panels; |
+ for (; i < num_panels; ++i) { |
+ CreatePanelParams params( |
+ MakePanelName(i), |
+ gfx::Rect(0, 0, panel_widths[i], kTestPanelHeight), |
+ SHOW_AS_INACTIVE); |
+ Panel* panel = CreatePanelWithParams(params); |
+ WaitForExpansionStateChanged(panel, Panel::IN_OVERFLOW); |
+ panels.push_back(panel); |
+ } |
+ |
+ return panels; |
+ } |
+}; |
+ |
+// TODO(jianli): remove the guard when overflow support is enabled on other |
+// platforms. http://crbug.com/105073 |
+#if defined(OS_WIN) |
+#define MAYBE_CreateOverflowPanels CreateOverflowPanels |
+#define MAYBE_CreateMoreOverflowPanels CreateMoreOverflowPanels |
+// http://crbug.com/107230 |
+#define MAYBE_CreatePanelOnDelayedOverflow FAILS_CreatePanelOnDelayedOverflow |
+#define MAYBE_CloseOverflowPanels CloseOverflowPanels |
+#define MAYBE_CloseNormalPanels CloseNormalPanels |
+#define MAYBE_ActivateOverflowPanels ActivateOverflowPanels |
+#define MAYBE_HoverOverOverflowArea HoverOverOverflowArea |
+#else |
+#define MAYBE_CreateOverflowPanels DISABLED_CreateOverflowPanels |
+#define MAYBE_CreateMoreOverflowPanels DISABLED_CreateMoreOverflowPanels |
+#define MAYBE_CreatePanelOnDelayedOverflow DISABLED_CreatePanelOnDelayedOverflow |
+#define MAYBE_CloseOverflowPanels DISABLED_CloseOverflowPanels |
+#define MAYBE_CloseNormalPanels DISABLED_CloseNormalPanels |
+#define MAYBE_ActivateOverflowPanels DISABLED_ActivateOverflowPanels |
+#define MAYBE_HoverOverOverflowArea DISABLED_HoverOverOverflowArea |
+#endif |
+ |
+IN_PROC_BROWSER_TEST_F(PanelOverflowBrowserTest, MAYBE_CreateOverflowPanels) { |
+ PanelManager* panel_manager = PanelManager::GetInstance(); |
+ PanelStrip* panel_strip = panel_manager->panel_strip(); |
+ PanelOverflowStrip* panel_overflow_strip = |
+ panel_manager->panel_overflow_strip(); |
+ |
+ const int panel_widths[] = { |
+ 250, 260, 200, // normal |
+ 255, 220 // overflow |
+ }; |
+ CreateOverflowPanels(3, 2, panel_widths); |
+ |
+ std::vector<Panel*> panels = panel_manager->panels(); |
+ ASSERT_EQ(5u, panels.size()); |
+ EXPECT_EQ(3, panel_strip->num_panels()); |
+ EXPECT_EQ(2, panel_overflow_strip->num_panels()); |
+ EXPECT_EQ(Panel::IN_OVERFLOW, panels[3]->expansion_state()); |
+ EXPECT_TRUE(IsPanelVisible(panels[3])); |
+ EXPECT_EQ(Panel::IN_OVERFLOW, panels[4]->expansion_state()); |
+ EXPECT_TRUE(IsPanelVisible(panels[4])); |
+ |
+ PanelManager::GetInstance()->RemoveAll(); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(PanelOverflowBrowserTest, |
+ MAYBE_CreateMoreOverflowPanels) { |
+ PanelManager* panel_manager = PanelManager::GetInstance(); |
+ PanelStrip* panel_strip = panel_manager->panel_strip(); |
+ PanelOverflowStrip* panel_overflow_strip = |
+ panel_manager->panel_overflow_strip(); |
+ |
+ const int panel_widths[] = { |
+ 250, 260, 200, // normal |
+ 255, 220, 210, // overflow |
+ 220, 230 // overflow-on-overflow |
+ }; |
+ CreateOverflowPanels(3, 5, panel_widths); |
+ |
+ std::vector<Panel*> panels = panel_manager->panels(); |
+ ASSERT_EQ(8u, panels.size()); |
+ EXPECT_EQ(3, panel_strip->num_panels()); |
+ EXPECT_EQ(5, panel_overflow_strip->num_panels()); |
+ EXPECT_EQ(Panel::IN_OVERFLOW, panels[3]->expansion_state()); |
+ EXPECT_TRUE(IsPanelVisible(panels[3])); |
+ EXPECT_EQ(Panel::IN_OVERFLOW, panels[4]->expansion_state()); |
+ EXPECT_TRUE(IsPanelVisible(panels[4])); |
+ EXPECT_EQ(Panel::IN_OVERFLOW, panels[5]->expansion_state()); |
+ EXPECT_TRUE(IsPanelVisible(panels[5])); |
+ EXPECT_EQ(Panel::IN_OVERFLOW, panels[6]->expansion_state()); |
+ EXPECT_FALSE(IsPanelVisible(panels[6])); |
+ EXPECT_EQ(Panel::IN_OVERFLOW, panels[7]->expansion_state()); |
+ EXPECT_FALSE(IsPanelVisible(panels[7])); |
+ |
+ PanelManager::GetInstance()->RemoveAll(); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(PanelOverflowBrowserTest, |
+ MAYBE_CreatePanelOnDelayedOverflow) { |
+ // Create 2 big panels. |
+ CreatePanelWithBounds("Panel0", gfx::Rect(0, 0, 260, 200)); |
+ CreatePanelWithBounds("Panel1", gfx::Rect(0, 0, 260, 200)); |
+ |
+ // Create an overflow panel without waiting for it to be moved to overflow. |
+ CreatePanelParams params( |
+ "Panel2", gfx::Rect(0, 0, 255, 200), SHOW_AS_INACTIVE); |
+ params.wait_for_fully_created = false; |
+ CreatePanelWithParams(params); |
+ |
+ // Create a small panel that could fit within the available space in the |
+ // panel strip. |
+ CreatePanelParams params2( |
+ "Panel3", gfx::Rect(0, 0, 110, 200), SHOW_AS_INACTIVE); |
+ Panel* panel3 = CreatePanelWithParams(params2); |
+ EXPECT_EQ(Panel::EXPANDED, panel3->expansion_state()); |
+ EXPECT_FALSE(panel3->has_temporary_layout()); |
+ |
+ PanelManager::GetInstance()->RemoveAll(); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(PanelOverflowBrowserTest, MAYBE_CloseOverflowPanels) { |
+ PanelManager* panel_manager = PanelManager::GetInstance(); |
+ PanelStrip* panel_strip = panel_manager->panel_strip(); |
+ PanelOverflowStrip* panel_overflow_strip = |
+ panel_manager->panel_overflow_strip(); |
+ |
+ // Create normal and overflow panels. |
+ // normal: P0, P1, P2 |
+ // overflow: P3, P4, P5 |
+ // overflow-on-overflow: P6, P7 |
+ int num_normal_panels = 3; |
+ int num_overflow_panels = 5; |
+ const int panel_widths[] = { |
+ 260, 250, 200, // normal |
+ 255, 260, 120, // overflow |
+ 240, 210 // overflow-on-overflow |
+ }; |
+ std::vector<Panel*> panels = CreateOverflowPanels( |
+ num_normal_panels, num_overflow_panels, panel_widths); |
+ |
+ PanelDataList expected_normal_list; |
+ expected_normal_list.Add(panels[0], Panel::EXPANDED, true, false); |
+ expected_normal_list.Add(panels[1], Panel::EXPANDED, true, false); |
+ expected_normal_list.Add(panels[2], Panel::EXPANDED, true, false); |
+ EXPECT_EQ(expected_normal_list, GetAllNormalPanelData()); |
+ |
+ PanelDataList expected_overflow_list; |
+ expected_overflow_list.Add(panels[3], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[4], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[5], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[6], Panel::IN_OVERFLOW, false, false); |
+ expected_overflow_list.Add(panels[7], Panel::IN_OVERFLOW, false, false); |
+ EXPECT_EQ(expected_overflow_list, GetAllOverflowPanelData()); |
+ |
+ // Close an overflow-on-overflow panel. Expect only that panel is closed. |
+ // normal: P0, P1, P2 |
+ // overflow: P3, P4, P5, |
+ // overflow-on-overflow: P7 |
+ CloseWindowAndWait(panels[6]->browser()); |
+ num_overflow_panels--; |
+ ASSERT_EQ(num_normal_panels + num_overflow_panels, |
+ panel_manager->num_panels()); |
+ EXPECT_EQ(num_normal_panels, panel_strip->num_panels()); |
+ EXPECT_EQ(num_overflow_panels, panel_overflow_strip->num_panels()); |
+ |
+ EXPECT_EQ(expected_normal_list, GetAllNormalPanelData()); |
+ |
+ expected_overflow_list.clear(); |
+ expected_overflow_list.Add(panels[3], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[4], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[5], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[7], Panel::IN_OVERFLOW, false, false); |
+ EXPECT_EQ(expected_overflow_list, GetAllOverflowPanelData()); |
+ |
+ // Close an overflow panel. Expect an overflow-on-overflow panel to become |
+ // visible in the overflow strip. |
+ // normal: P0, P1, P2 |
+ // overflow: P3, P5, P7 |
+ CloseWindowAndWait(panels[4]->browser()); |
+ num_overflow_panels--; |
+ ASSERT_EQ(num_normal_panels + num_overflow_panels, |
+ panel_manager->num_panels()); |
+ EXPECT_EQ(num_normal_panels, panel_strip->num_panels()); |
+ EXPECT_EQ(num_overflow_panels, panel_overflow_strip->num_panels()); |
+ |
+ EXPECT_EQ(expected_normal_list, GetAllNormalPanelData()); |
+ |
+ expected_overflow_list.clear(); |
+ expected_overflow_list.Add(panels[3], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[5], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[7], Panel::IN_OVERFLOW, true, false); |
+ EXPECT_EQ(expected_overflow_list, GetAllOverflowPanelData()); |
+ |
+ // Close an overflow panel. Expect only that panel is closed. |
+ // normal: P0, P1, P2 |
+ // overflow: P5, P7 |
+ CloseWindowAndWait(panels[3]->browser()); |
+ num_overflow_panels--; |
+ ASSERT_EQ(num_normal_panels + num_overflow_panels, |
+ panel_manager->num_panels()); |
+ EXPECT_EQ(num_normal_panels, panel_strip->num_panels()); |
+ EXPECT_EQ(num_overflow_panels, panel_overflow_strip->num_panels()); |
+ |
+ EXPECT_EQ(expected_normal_list, GetAllNormalPanelData()); |
+ |
+ expected_overflow_list.clear(); |
+ expected_overflow_list.Add(panels[5], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[7], Panel::IN_OVERFLOW, true, false); |
+ EXPECT_EQ(expected_overflow_list, GetAllOverflowPanelData()); |
+ |
+ panel_manager->RemoveAll(); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(PanelOverflowBrowserTest, MAYBE_CloseNormalPanels) { |
+ PanelManager* panel_manager = PanelManager::GetInstance(); |
+ PanelStrip* panel_strip = panel_manager->panel_strip(); |
+ PanelOverflowStrip* panel_overflow_strip = |
+ panel_manager->panel_overflow_strip(); |
+ |
+ // Create normal and overflow panels. |
+ // normal: P0, P1, P2 |
+ // overflow: P3, P4, P5 |
+ // overflow-on-overflow: P6, P7, P8 |
+ int num_normal_panels = 3; |
+ int num_overflow_panels = 6; |
+ const int panel_widths[] = { |
+ 260, 250, 200, // normal |
+ 255, 260, 120, // overflow |
+ 240, 210, 258 // overflow-on-overflow |
+ }; |
+ std::vector<Panel*> panels = CreateOverflowPanels( |
+ num_normal_panels, num_overflow_panels, panel_widths); |
+ |
+ PanelDataList expected_normal_list; |
+ expected_normal_list.Add(panels[0], Panel::EXPANDED, true, false); |
+ expected_normal_list.Add(panels[1], Panel::EXPANDED, true, false); |
+ expected_normal_list.Add(panels[2], Panel::EXPANDED, true, false); |
+ EXPECT_EQ(expected_normal_list, GetAllNormalPanelData()); |
+ |
+ PanelDataList expected_overflow_list; |
+ expected_overflow_list.Add(panels[3], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[4], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[5], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[6], Panel::IN_OVERFLOW, false, false); |
+ expected_overflow_list.Add(panels[7], Panel::IN_OVERFLOW, false, false); |
+ expected_overflow_list.Add(panels[8], Panel::IN_OVERFLOW, false, false); |
+ EXPECT_EQ(expected_overflow_list, GetAllOverflowPanelData()); |
+ |
+ // Close a normal panel. Expect an overflow panel to move over and an |
+ // overflow-on-overflow panel to become visible. |
+ // normal: P0, P2, P3 |
+ // overflow: P4, P5, P6 |
+ // overflow-on-overflow: P7, P8 |
+ CloseWindowAndWait(panels[1]->browser()); |
+ num_overflow_panels--; |
+ ASSERT_EQ(num_normal_panels + num_overflow_panels, |
+ panel_manager->num_panels()); |
+ EXPECT_EQ(num_normal_panels, panel_strip->num_panels()); |
+ EXPECT_EQ(num_overflow_panels, panel_overflow_strip->num_panels()); |
+ |
+ expected_normal_list.clear(); |
+ expected_normal_list.Add(panels[0], Panel::EXPANDED, true, false); |
+ expected_normal_list.Add(panels[2], Panel::EXPANDED, true, false); |
+ expected_normal_list.Add(panels[3], Panel::EXPANDED, true, false); |
+ EXPECT_EQ(expected_normal_list, GetAllNormalPanelData()); |
+ |
+ expected_overflow_list.clear(); |
+ expected_overflow_list.Add(panels[4], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[5], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[6], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[7], Panel::IN_OVERFLOW, false, false); |
+ expected_overflow_list.Add(panels[8], Panel::IN_OVERFLOW, false, false); |
+ EXPECT_EQ(expected_overflow_list, GetAllOverflowPanelData()); |
+ |
+ // Close another normal panel. Remaining overflow panels cannot move over |
+ // due to not enough room. |
+ // normal: P0, P3 |
+ // overflow: P4, P5, P6 |
+ // overflow-on-overflow: P7, P8 |
+ CloseWindowAndWait(panels[2]->browser()); |
+ num_normal_panels--; |
+ ASSERT_EQ(num_normal_panels + num_overflow_panels, |
+ panel_manager->num_panels()); |
+ EXPECT_EQ(num_normal_panels, panel_strip->num_panels()); |
+ EXPECT_EQ(num_overflow_panels, panel_overflow_strip->num_panels()); |
+ |
+ expected_normal_list.clear(); |
+ expected_normal_list.Add(panels[0], Panel::EXPANDED, true, false); |
+ expected_normal_list.Add(panels[3], Panel::EXPANDED, true, false); |
+ EXPECT_EQ(expected_normal_list, GetAllNormalPanelData()); |
+ |
+ EXPECT_EQ(expected_overflow_list, GetAllOverflowPanelData()); |
+ |
+ // Close one more normal panel. Expect two overflow panels to move over and |
+ // two overflow-on-overflow panels to become visible. |
+ // normal: P0, P4, P5 |
+ // overflow: P6, P7, P8 |
+ CloseWindowAndWait(panels[3]->browser()); |
+ num_normal_panels++; |
+ num_overflow_panels -= 2; |
+ ASSERT_EQ(num_normal_panels + num_overflow_panels, |
+ panel_manager->num_panels()); |
+ EXPECT_EQ(num_normal_panels, panel_strip->num_panels()); |
+ EXPECT_EQ(num_overflow_panels, panel_overflow_strip->num_panels()); |
+ |
+ expected_normal_list.clear(); |
+ expected_normal_list.Add(panels[0], Panel::EXPANDED, true, false); |
+ expected_normal_list.Add(panels[4], Panel::EXPANDED, true, false); |
+ expected_normal_list.Add(panels[5], Panel::EXPANDED, true, false); |
+ EXPECT_EQ(expected_normal_list, GetAllNormalPanelData()); |
+ |
+ expected_overflow_list.clear(); |
+ expected_overflow_list.Add(panels[6], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[7], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[8], Panel::IN_OVERFLOW, true, false); |
+ EXPECT_EQ(expected_overflow_list, GetAllOverflowPanelData()); |
+ |
+ // Close another normal panel. Expect one overflow panel to move over. |
+ // normal: P4, P5, P6 |
+ // overflow: P7, P8 |
+ CloseWindowAndWait(panels[0]->browser()); |
+ num_overflow_panels--; |
+ ASSERT_EQ(num_normal_panels + num_overflow_panels, |
+ panel_manager->num_panels()); |
+ EXPECT_EQ(num_normal_panels, panel_strip->num_panels()); |
+ EXPECT_EQ(num_overflow_panels, panel_overflow_strip->num_panels()); |
+ |
+ expected_normal_list.clear(); |
+ expected_normal_list.Add(panels[4], Panel::EXPANDED, true, false); |
+ expected_normal_list.Add(panels[5], Panel::EXPANDED, true, false); |
+ expected_normal_list.Add(panels[6], Panel::EXPANDED, true, false); |
+ EXPECT_EQ(expected_normal_list, GetAllNormalPanelData()); |
+ |
+ expected_overflow_list.clear(); |
+ expected_overflow_list.Add(panels[7], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[8], Panel::IN_OVERFLOW, true, false); |
+ EXPECT_EQ(expected_overflow_list, GetAllOverflowPanelData()); |
+ |
+ panel_manager->RemoveAll(); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(PanelOverflowBrowserTest, MAYBE_ActivateOverflowPanels) { |
+ // Create normal and overflow panels. |
+ // normal: P0, P1, P2 |
+ // overflow: P3, P4, P5 |
+ // overflow-on-overflow: P6, P7 |
+ const int panel_widths[] = { |
+ 250, 260, 200, // normal |
+ 210, 260, 230, // overflow |
+ 255, 210 // overflow-on-overflow |
+ }; |
+ std::vector<Panel*> panels = CreateOverflowPanels(3, 5, panel_widths); |
+ |
+ PanelDataList expected_normal_list; |
+ expected_normal_list.Add(panels[0], Panel::EXPANDED, true, false); |
+ expected_normal_list.Add(panels[1], Panel::EXPANDED, true, false); |
+ expected_normal_list.Add(panels[2], Panel::EXPANDED, true, false); |
+ EXPECT_EQ(expected_normal_list, GetAllNormalPanelData()); |
+ |
+ PanelDataList expected_overflow_list; |
+ expected_overflow_list.Add(panels[3], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[4], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[5], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[6], Panel::IN_OVERFLOW, false, false); |
+ expected_overflow_list.Add(panels[7], Panel::IN_OVERFLOW, false, false); |
+ EXPECT_EQ(expected_overflow_list, GetAllOverflowPanelData()); |
+ |
+ // Activate an overflow panel. Expect one normal panel is swapped into the |
+ // overflow strip. |
+ // normal: P0, P1, P3 |
+ // overflow: P2, P4, P5 |
+ // overflow-on-overflow: P6, P7 |
+ panels[3]->Activate(); |
+ WaitForPanelActiveState(panels[3], SHOW_AS_ACTIVE); |
+ WaitForExpansionStateChanged(panels[3], Panel::EXPANDED); |
+ |
+ expected_normal_list.clear(); |
+ expected_normal_list.Add(panels[0], Panel::EXPANDED, true, false); |
+ expected_normal_list.Add(panels[1], Panel::EXPANDED, true, false); |
+ expected_normal_list.Add(panels[3], Panel::EXPANDED, true, true); |
+ EXPECT_EQ(expected_normal_list, GetAllNormalPanelData()); |
+ |
+ expected_overflow_list.clear(); |
+ expected_overflow_list.Add(panels[2], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[4], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[5], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[6], Panel::IN_OVERFLOW, false, false); |
+ expected_overflow_list.Add(panels[7], Panel::IN_OVERFLOW, false, false); |
+ EXPECT_EQ(expected_overflow_list, GetAllOverflowPanelData()); |
+ |
+ // Activate an overflow panel. Expect two normal panels are swapped into the |
+ // overflow strip and one overflow panel to become hidden. |
+ // normal: P0, P4 |
+ // overflow: P1, P3, P2 |
+ // overflow-on-overflow: P5, P6, P7 |
+ panels[4]->Activate(); |
+ WaitForPanelActiveState(panels[4], SHOW_AS_ACTIVE); |
+ WaitForExpansionStateChanged(panels[4], Panel::EXPANDED); |
+ WaitForPanelActiveState(panels[3], SHOW_AS_INACTIVE); |
+ |
+ expected_normal_list.clear(); |
+ expected_normal_list.Add(panels[0], Panel::EXPANDED, true, false); |
+ expected_normal_list.Add(panels[4], Panel::EXPANDED, true, true); |
+ EXPECT_EQ(expected_normal_list, GetAllNormalPanelData()); |
+ |
+ expected_overflow_list.clear(); |
+ expected_overflow_list.Add(panels[1], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[3], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[2], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[5], Panel::IN_OVERFLOW, false, false); |
+ expected_overflow_list.Add(panels[6], Panel::IN_OVERFLOW, false, false); |
+ expected_overflow_list.Add(panels[7], Panel::IN_OVERFLOW, false, false); |
+ EXPECT_EQ(expected_overflow_list, GetAllOverflowPanelData()); |
+ |
+ // Activate an overflow-on-overflow panel. Expect one normal panel is swapped |
+ // into the overflow strip. |
+ // normal: P0, P6 |
+ // overflow: P4, P1, P3, |
+ // overflow-on-overflow: P2, P5, P7 |
+ panels[6]->Activate(); |
+ WaitForPanelActiveState(panels[6], SHOW_AS_ACTIVE); |
+ WaitForExpansionStateChanged(panels[6], Panel::EXPANDED); |
+ WaitForPanelActiveState(panels[4], SHOW_AS_INACTIVE); |
+ |
+ expected_normal_list.clear(); |
+ expected_normal_list.Add(panels[0], Panel::EXPANDED, true, false); |
+ expected_normal_list.Add(panels[6], Panel::EXPANDED, true, true); |
+ EXPECT_EQ(expected_normal_list, GetAllNormalPanelData()); |
+ |
+ expected_overflow_list.clear(); |
+ expected_overflow_list.Add(panels[4], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[1], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[3], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[2], Panel::IN_OVERFLOW, false, false); |
+ expected_overflow_list.Add(panels[5], Panel::IN_OVERFLOW, false, false); |
+ expected_overflow_list.Add(panels[7], Panel::IN_OVERFLOW, false, false); |
+ EXPECT_EQ(expected_overflow_list, GetAllOverflowPanelData()); |
+ |
+ // Activate an overflow-on-overflow panel. No normal panel is swapped |
+ // since there has already been enough space in the panel strip. |
+ // normal: P0, P6, P7 |
+ // overflow: P4, P1, P3, |
+ // overflow-on-overflow: P2, P5 |
+ panels[7]->Activate(); |
+ WaitForPanelActiveState(panels[7], SHOW_AS_ACTIVE); |
+ WaitForExpansionStateChanged(panels[7], Panel::EXPANDED); |
+ WaitForPanelActiveState(panels[6], SHOW_AS_INACTIVE); |
+ |
+ expected_normal_list.clear(); |
+ expected_normal_list.Add(panels[0], Panel::EXPANDED, true, false); |
+ expected_normal_list.Add(panels[6], Panel::EXPANDED, true, false); |
+ expected_normal_list.Add(panels[7], Panel::EXPANDED, true, true); |
+ EXPECT_EQ(expected_normal_list, GetAllNormalPanelData()); |
+ |
+ expected_overflow_list.clear(); |
+ expected_overflow_list.Add(panels[4], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[1], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[3], Panel::IN_OVERFLOW, true, false); |
+ expected_overflow_list.Add(panels[2], Panel::IN_OVERFLOW, false, false); |
+ expected_overflow_list.Add(panels[5], Panel::IN_OVERFLOW, false, false); |
+ EXPECT_EQ(expected_overflow_list, GetAllOverflowPanelData()); |
+ |
+ PanelManager::GetInstance()->RemoveAll(); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(PanelOverflowBrowserTest, MAYBE_HoverOverOverflowArea) { |
+ PanelManager* panel_manager = PanelManager::GetInstance(); |
+ PanelMouseWatcher* mouse_watcher = new TestPanelMouseWatcher(); |
+ panel_manager->SetMouseWatcherForTesting(mouse_watcher); |
+ PanelOverflowStrip* panel_overflow_strip = |
+ panel_manager->panel_overflow_strip(); |
+ int iconified_width = panel_overflow_strip->current_display_width(); |
+ |
+ // Create normal and overflow panels. |
+ // normal: P0, P1, P2 |
+ // overflow: P3, P4, P5 |
+ // overflow-on-overflow: P6, P7 |
+ const int panel_widths[] = { |
+ 250, 260, 200, // normal |
+ 255, 220, 260, // overflow |
+ 140, 210 // overflow-on-overflow |
+ }; |
+ std::vector<Panel*> panels = CreateOverflowPanels(3, 5, panel_widths); |
+ |
+ // Move mouse beyond the right edge of the top overflow panel. |
+ // Expect the overflow area remains shrunk. |
+ MoveMouse(gfx::Point(panels[5]->GetBounds().right() + 1, |
+ panels[5]->GetBounds().y())); |
+ EXPECT_EQ(iconified_width, panel_overflow_strip->current_display_width()); |
+ |
+ // Move mouse above the top overflow panel. Expect the overflow area |
+ // remains shrunk. |
+ MoveMouse(gfx::Point(panels[5]->GetBounds().x(), |
+ panels[5]->GetBounds().y() - 1)); |
+ EXPECT_EQ(iconified_width, panel_overflow_strip->current_display_width()); |
+ |
+ // Move mouse below the bottom overflow panel. Expect the overflow area |
+ // remains shrunk. |
+ MoveMouse(gfx::Point(panels[3]->GetBounds().right(), |
+ panels[3]->GetBounds().bottom() + 1)); |
+ EXPECT_EQ(iconified_width, panel_overflow_strip->current_display_width()); |
+ |
+ // Move mouse to the origin of an overflow panel. Expect the overflow area |
+ // gets expanded. |
+ MoveMouseAndWaitForOverflowAnimationEnded( |
+ panels[4]->GetBounds().origin()); |
+ int hover_width = panel_overflow_strip->current_display_width(); |
+ EXPECT_GT(hover_width, iconified_width); |
+ EXPECT_EQ(hover_width, panels[3]->GetBounds().width()); |
+ EXPECT_EQ(hover_width, panels[4]->GetBounds().width()); |
+ EXPECT_EQ(hover_width, panels[5]->GetBounds().width()); |
+ EXPECT_EQ(hover_width, panels[6]->GetBounds().width()); |
+ EXPECT_EQ(hover_width, panels[7]->GetBounds().width()); |
+ |
+ // Move mouse to the origin of another overflow panel. Expect the overflow |
+ // area remains expanded. |
+ MoveMouse(panels[5]->GetBounds().origin()); |
+ EXPECT_EQ(hover_width, panel_overflow_strip->current_display_width()); |
+ |
+ // Move mouse beyond the left edge of an overflow panel. Expect the overflow |
+ // area remains expanded. |
+ MoveMouse(gfx::Point(panels[5]->GetBounds().x() - 5, |
+ panels[5]->GetBounds().y())); |
+ EXPECT_EQ(hover_width, panel_overflow_strip->current_display_width()); |
+ |
+ // Move mouse to the origin of the top overflow-on-overflow panel. Expect the |
+ // overflow area remains expanded. |
+ MoveMouse(panels[7]->GetBounds().origin()); |
+ EXPECT_EQ(hover_width, panel_overflow_strip->current_display_width()); |
+ |
+ // Move mouse to the bottom-right corner of the bottom overflow panel. |
+ // Expect the overflow area remains expanded. |
+ MoveMouse(gfx::Point(panels[3]->GetBounds().right(), |
+ panels[3]->GetBounds().bottom())); |
+ EXPECT_EQ(hover_width, panel_overflow_strip->current_display_width()); |
+ |
+ // Move mouse beyond the right edge of the hover panel. Expect the overflow |
+ // area gets shrunk. |
+ MoveMouseAndWaitForOverflowAnimationEnded(gfx::Point( |
+ panels[4]->GetBounds().right() + 5, panels[4]->GetBounds().y())); |
+ EXPECT_EQ(iconified_width, panel_overflow_strip->current_display_width()); |
+ EXPECT_EQ(iconified_width, panels[3]->GetBounds().width()); |
+ EXPECT_EQ(iconified_width, panels[4]->GetBounds().width()); |
+ EXPECT_EQ(iconified_width, panels[5]->GetBounds().width()); |
+ EXPECT_EQ(0, panels[6]->GetBounds().width()); |
+ EXPECT_EQ(0, panels[7]->GetBounds().width()); |
+ |
+ // Move mouse beyond the left edge of an overflow panel. Expect the overflow |
+ // area gets expanded. |
+ MoveMouseAndWaitForOverflowAnimationEnded(gfx::Point( |
+ panels[4]->GetBounds().x() - 5, panels[4]->GetBounds().y())); |
+ EXPECT_EQ(hover_width, panel_overflow_strip->current_display_width()); |
+ EXPECT_EQ(hover_width, panels[3]->GetBounds().width()); |
+ EXPECT_EQ(hover_width, panels[4]->GetBounds().width()); |
+ EXPECT_EQ(hover_width, panels[5]->GetBounds().width()); |
+ EXPECT_EQ(hover_width, panels[6]->GetBounds().width()); |
+ EXPECT_EQ(hover_width, panels[7]->GetBounds().width()); |
+ |
+ // Move mouse above the top overflow-on-overflow panel. Expect the overflow |
+ // area gets shrunk. |
+ MoveMouseAndWaitForOverflowAnimationEnded(gfx::Point( |
+ panels[7]->GetBounds().x(), panels[7]->GetBounds().y() - 1)); |
+ EXPECT_EQ(iconified_width, panel_overflow_strip->current_display_width()); |
+ EXPECT_EQ(iconified_width, panels[3]->GetBounds().width()); |
+ EXPECT_EQ(iconified_width, panels[4]->GetBounds().width()); |
+ EXPECT_EQ(iconified_width, panels[5]->GetBounds().width()); |
+ EXPECT_EQ(0, panels[6]->GetBounds().width()); |
+ EXPECT_EQ(0, panels[7]->GetBounds().width()); |
+ |
+ panel_manager->RemoveAll(); |
+} |