diff options
author | dimich@chromium.org <dimich@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-14 01:01:14 +0000 |
---|---|---|
committer | dimich@chromium.org <dimich@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-14 01:01:14 +0000 |
commit | 11050e6894430cdd326ff0138f8a590c64b5a157 (patch) | |
tree | e642f9cdca8dac2150f2553342eea2c47ab03487 /chrome | |
parent | 0a86afaaa91e199a209f6dff3d678146ef8d0a91 (diff) | |
download | chromium_src-11050e6894430cdd326ff0138f8a590c64b5a157.zip chromium_src-11050e6894430cdd326ff0138f8a590c64b5a157.tar.gz chromium_src-11050e6894430cdd326ff0138f8a590c64b5a157.tar.bz2 |
Add activation/deactivation test for Panels.
Also fix Activation/Deactivation code for Linux and Mac so the test passes
TEST=PanelBrowserTest.Activation
Review URL: http://codereview.chromium.org/8221013
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@105430 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/ui/gtk/browser_window_gtk.cc | 7 | ||||
-rw-r--r-- | chrome/browser/ui/gtk/browser_window_gtk.h | 3 | ||||
-rw-r--r-- | chrome/browser/ui/panels/base_panel_browser_test.cc | 28 | ||||
-rw-r--r-- | chrome/browser/ui/panels/panel_browser_window_gtk.cc | 12 | ||||
-rw-r--r-- | chrome/browser/ui/panels/panel_browser_window_gtk.h | 5 | ||||
-rw-r--r-- | chrome/browser/ui/panels/panel_browsertest.cc | 234 | ||||
-rw-r--r-- | chrome/chrome_tests.gypi | 6 |
7 files changed, 188 insertions, 107 deletions
diff --git a/chrome/browser/ui/gtk/browser_window_gtk.cc b/chrome/browser/ui/gtk/browser_window_gtk.cc index 7d4846f..fdcc4c6 100644 --- a/chrome/browser/ui/gtk/browser_window_gtk.cc +++ b/chrome/browser/ui/gtk/browser_window_gtk.cc @@ -2198,10 +2198,15 @@ bool BrowserWindowGtk::HandleTitleBarLeftMousePress( gboolean BrowserWindowGtk::OnFocusIn(GtkWidget* widget, GdkEventFocus* event) { - BrowserList::SetLastActive(browser_.get()); + HandleFocusIn(widget, event); return FALSE; } +void BrowserWindowGtk::HandleFocusIn(GtkWidget* widget, + GdkEventFocus* event) { + BrowserList::SetLastActive(browser_.get()); +} + gboolean BrowserWindowGtk::OnFocusOut(GtkWidget* widget, GdkEventFocus* event) { return FALSE; diff --git a/chrome/browser/ui/gtk/browser_window_gtk.h b/chrome/browser/ui/gtk/browser_window_gtk.h index 3073b47..0a75640 100644 --- a/chrome/browser/ui/gtk/browser_window_gtk.h +++ b/chrome/browser/ui/gtk/browser_window_gtk.h @@ -263,6 +263,9 @@ class BrowserWindowGtk : public BrowserWindow, virtual void DrawCustomFrame(cairo_t* cr, GtkWidget* widget, GdkEventExpose* event); + // 'focus-in-event' handler. + virtual void HandleFocusIn(GtkWidget* widget, GdkEventFocus* event); + // Returns the size of the window frame around the client content area. gfx::Size GetNonClientFrameSize() const; diff --git a/chrome/browser/ui/panels/base_panel_browser_test.cc b/chrome/browser/ui/panels/base_panel_browser_test.cc index a3ab898..f6f2b1f 100644 --- a/chrome/browser/ui/panels/base_panel_browser_test.cc +++ b/chrome/browser/ui/panels/base_panel_browser_test.cc @@ -4,6 +4,8 @@ #include "chrome/browser/ui/panels/base_panel_browser_test.h" +#include "chrome/browser/ui/browser_list.h" + #include "base/command_line.h" #include "base/mac/scoped_nsautorelease_pool.h" #include "base/message_loop.h" @@ -249,10 +251,32 @@ Panel* BasePanelBrowserTest::CreatePanelWithParams( } Panel* panel = static_cast<Panel*>(panel_browser->window()); - if (params.show_flag == SHOW_AS_ACTIVE) + + if (params.show_flag == SHOW_AS_ACTIVE) { panel->Show(); - else + } else { +#if defined(OS_LINUX) + std::string wm_name; + bool has_name = ui::GetWindowManagerName(&wm_name); + // On bots, we might have a simple window manager which always activates new + // windows, and can't always deactivate them. Activate previously active + // window back to ensure the new window is inactive. + // IceWM has a name string like "IceWM 1.3.6 (Linux 2.6.24-23-server/x86)" + if (has_name && wm_name.find("IceWM") != std::string::npos) { + Browser* last_active_browser = BrowserList::GetLastActive(); + EXPECT_TRUE(last_active_browser); + EXPECT_NE(last_active_browser, panel->browser()); + panel->ShowInactive(); // Shows as active anyways in icewm. + MessageLoopForUI::current()->RunAllPending(); + // Restore focus where it was. It will deactivate the new panel. + last_active_browser->window()->Activate(); + } else { + panel->ShowInactive(); + } +#else panel->ShowInactive(); +#endif + } MessageLoopForUI::current()->RunAllPending(); // More waiting, because gaining or losing focus may require inter-process // asynchronous communication, and it is not enough to just run the local diff --git a/chrome/browser/ui/panels/panel_browser_window_gtk.cc b/chrome/browser/ui/panels/panel_browser_window_gtk.cc index 5fc7878..482b24c 100644 --- a/chrome/browser/ui/panels/panel_browser_window_gtk.cc +++ b/chrome/browser/ui/panels/panel_browser_window_gtk.cc @@ -4,6 +4,7 @@ #include "chrome/browser/ui/panels/panel_browser_window_gtk.h" +#include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/panels/panel.h" #include "chrome/browser/ui/panels/panel_manager.h" #include "chrome/browser/ui/panels/panel_settings_menu_model.h" @@ -85,8 +86,6 @@ void PanelBrowserWindowGtk::Init() { // minimize etc. can only be done from the panel UI. gtk_window_set_skip_taskbar_hint(window(), TRUE); - g_signal_connect(titlebar_widget(), "focus-in-event", - G_CALLBACK(OnFocusInThunk), this); g_signal_connect(titlebar_widget(), "button-press-event", G_CALLBACK(OnTitlebarButtonPressEventThunk), this); g_signal_connect(titlebar_widget(), "button-release-event", @@ -263,6 +262,8 @@ void PanelBrowserWindowGtk::ClosePanel() { } void PanelBrowserWindowGtk::ActivatePanel() { + if (IsActive()) + return; Activate(); } @@ -559,10 +560,12 @@ gboolean PanelBrowserWindowGtk::OnTitlebarButtonReleaseEvent( return TRUE; } -gboolean PanelBrowserWindowGtk::OnFocusIn(GtkWidget* widget, +void PanelBrowserWindowGtk::HandleFocusIn(GtkWidget* widget, GdkEventFocus* event) { + BrowserWindowGtk::HandleFocusIn(widget, event); + if (!is_drawing_attention_) - return FALSE; + return; is_drawing_attention_ = false; UpdateTitleBar(); @@ -570,7 +573,6 @@ gboolean PanelBrowserWindowGtk::OnFocusIn(GtkWidget* widget, disableMinimizeUntilTime_ = base::Time::Now() + kSuspendMinimizeOnClickIntervalMs; - return FALSE; } void PanelBrowserWindowGtk::OnDragBegin(GtkWidget* widget, diff --git a/chrome/browser/ui/panels/panel_browser_window_gtk.h b/chrome/browser/ui/panels/panel_browser_window_gtk.h index ac76bb2..0957e87 100644 --- a/chrome/browser/ui/panels/panel_browser_window_gtk.h +++ b/chrome/browser/ui/panels/panel_browser_window_gtk.h @@ -54,6 +54,9 @@ class PanelBrowserWindowGtk : public BrowserWindowGtk, virtual void DrawCustomFrame(cairo_t* cr, GtkWidget* widget, GdkEventExpose* event) OVERRIDE; virtual void ActiveWindowChanged(GdkWindow* active_window) OVERRIDE; + // 'focus-in-event' handler. + virtual void HandleFocusIn(GtkWidget* widget, + GdkEventFocus* event) OVERRIDE; // Overridden from NativePanel: @@ -113,8 +116,6 @@ class PanelBrowserWindowGtk : public BrowserWindowGtk, OnTitlebarButtonPressEvent, GdkEventButton*); CHROMEGTK_CALLBACK_1(PanelBrowserWindowGtk, gboolean, OnTitlebarButtonReleaseEvent, GdkEventButton*); - CHROMEGTK_CALLBACK_1(PanelBrowserWindowGtk, gboolean, OnFocusIn, - GdkEventFocus*); // drag-begin is emitted when the drag is started. We connect so that we can // set the drag icon to a transparent pixbuf. diff --git a/chrome/browser/ui/panels/panel_browsertest.cc b/chrome/browser/ui/panels/panel_browsertest.cc index 3122111..20dd241 100644 --- a/chrome/browser/ui/panels/panel_browsertest.cc +++ b/chrome/browser/ui/panels/panel_browsertest.cc @@ -935,9 +935,146 @@ IN_PROC_BROWSER_TEST_F(PanelBrowserTest, MinimizeRestore) { PanelManager::GetInstance()->RemoveAll(); } -// Exclude linux_cromeos, linux_view and linux bots. The panels created inactive +// TODO(dimich): Enable on chromeos. +#if defined(TOOLKIT_GTK) || defined(OS_MACOSX) || defined(OS_WIN) +#define MAYBE_ActivatePanelOrTabbedWindow ActivatePanelOrTabbedWindow +#else +#define MAYBE_ActivatePanelOrTabbedWindow DISABLED_ActivatePanelOrTabbedWindow +#endif + +IN_PROC_BROWSER_TEST_F(PanelBrowserTest, MAYBE_ActivatePanelOrTabbedWindow) { + CreatePanelParams params1("Inactive", gfx::Rect(), SHOW_AS_INACTIVE); + Panel* panel1 = CreatePanelWithParams(params1); + CreatePanelParams params2("Active", gfx::Rect(), SHOW_AS_ACTIVE); + Panel* panel2 = CreatePanelWithParams(params2); + + ASSERT_FALSE(panel1->IsActive()); + ASSERT_TRUE(panel2->IsActive()); + // Activate main tabbed window. + browser()->window()->Activate(); + WaitForPanelActiveState(panel2, SHOW_AS_INACTIVE); + + // Activate a panel. + panel2->Activate(); + WaitForPanelActiveState(panel2, SHOW_AS_ACTIVE); + + // Activate the main tabbed window back. + browser()->window()->Activate(); + WaitForPanelActiveState(panel2, SHOW_AS_INACTIVE); + // Close the main tabbed window. That should move focus back to panel. + CloseWindowAndWait(browser()); + WaitForPanelActiveState(panel2, SHOW_AS_ACTIVE); + + // Activate another panel. + panel1->Activate(); + WaitForPanelActiveState(panel1, SHOW_AS_ACTIVE); + WaitForPanelActiveState(panel2, SHOW_AS_INACTIVE); + + // Switch focus between panels. + panel2->Activate(); + WaitForPanelActiveState(panel2, SHOW_AS_ACTIVE); + WaitForPanelActiveState(panel1, SHOW_AS_INACTIVE); + + // Close active panel, focus should move to the remaining one. + CloseWindowAndWait(panel2->browser()); + WaitForPanelActiveState(panel1, SHOW_AS_ACTIVE); + panel1->Close(); +} + +// TODO(jianli): To be enabled for other platforms. +#if defined(OS_WIN) +#define MAYBE_ActivateDeactivateBasic ActivateDeactivateBasic +#else +#define MAYBE_ActivateDeactivateBasic DISABLED_ActivateDeactivateBasic +#endif +IN_PROC_BROWSER_TEST_F(PanelBrowserTest, MAYBE_ActivateDeactivateBasic) { + // Create an active panel. + Panel* panel = CreatePanel("PanelTest"); + scoped_ptr<NativePanelTesting> native_panel_testing( + NativePanelTesting::Create(panel->native_panel())); + EXPECT_TRUE(panel->IsActive()); + EXPECT_TRUE(native_panel_testing->VerifyActiveState(true)); + + // Deactivate the panel. + panel->Deactivate(); + WaitForPanelActiveState(panel, SHOW_AS_INACTIVE); + EXPECT_FALSE(panel->IsActive()); + EXPECT_TRUE(native_panel_testing->VerifyActiveState(false)); + + // Reactivate the panel. + panel->Activate(); + WaitForPanelActiveState(panel, SHOW_AS_ACTIVE); + EXPECT_TRUE(panel->IsActive()); + EXPECT_TRUE(native_panel_testing->VerifyActiveState(true)); +} + +// TODO(jianli): To be enabled for other platforms. +#if defined(OS_WIN) +#define MAYBE_ActivateDeactivateMultiple ActivateDeactivateMultiple +#else +#define MAYBE_ActivateDeactivateMultiple DISABLED_ActivateDeactivateMultiple +#endif +IN_PROC_BROWSER_TEST_F(PanelBrowserTest, MAYBE_ActivateDeactivateMultiple) { + BrowserWindow* tabbed_window = BrowserList::GetLastActive()->window(); + + // Create 4 panels in the following screen layout: + // P3 P2 P1 P0 + const int kNumPanels = 4; + std::string panel_name_base("PanelTest"); + for (int i = 0; i < kNumPanels; ++i) { + CreatePanelWithBounds(panel_name_base + base::IntToString(i), + gfx::Rect(0, 0, 100, 100)); + } + const std::vector<Panel*>& panels = PanelManager::GetInstance()->panels(); + + std::vector<bool> expected_active_states; + std::vector<bool> last_active_states; + + // The last created panel, P3, should be active. + expected_active_states = ProduceExpectedActiveStates(3); + EXPECT_EQ(expected_active_states, GetAllPanelActiveStates()); + EXPECT_FALSE(tabbed_window->IsActive()); + + // Activating P1 should cause P3 to lose focus. + panels[1]->Activate(); + last_active_states = expected_active_states; + expected_active_states = ProduceExpectedActiveStates(1); + WaitForPanelActiveStates(last_active_states, expected_active_states); + EXPECT_EQ(expected_active_states, GetAllPanelActiveStates()); + + // Minimizing inactive panel P2 should not affect other panels' active states. + panels[2]->SetExpansionState(Panel::MINIMIZED); + EXPECT_EQ(expected_active_states, GetAllPanelActiveStates()); + EXPECT_FALSE(tabbed_window->IsActive()); + + // Minimizing active panel P1 should activate last active panel P3. + panels[1]->SetExpansionState(Panel::MINIMIZED); + last_active_states = expected_active_states; + expected_active_states = ProduceExpectedActiveStates(3); + WaitForPanelActiveStates(last_active_states, expected_active_states); + EXPECT_EQ(expected_active_states, GetAllPanelActiveStates()); + EXPECT_FALSE(tabbed_window->IsActive()); + + // Minimizing active panel P3 should activate last active panel P0. + panels[3]->SetExpansionState(Panel::MINIMIZED); + last_active_states = expected_active_states; + expected_active_states = ProduceExpectedActiveStates(0); + WaitForPanelActiveStates(last_active_states, expected_active_states); + EXPECT_EQ(expected_active_states, GetAllPanelActiveStates()); + EXPECT_FALSE(tabbed_window->IsActive()); + + // Minimizing active panel P0 should activate last active tabbed window. + panels[0]->SetExpansionState(Panel::MINIMIZED); + last_active_states = expected_active_states; + expected_active_states = ProduceExpectedActiveStates(-1); // -1 means none. + WaitForPanelActiveStates(last_active_states, expected_active_states); + EXPECT_EQ(expected_active_states, GetAllPanelActiveStates()); + EXPECT_TRUE(tabbed_window->IsActive()); +} + +// Exclude linux_cromeos and linux_view bots. The panels created inactive // appear to be active there. Need more investigation. -#if defined(OS_WIN) || defined(OS_MACOSX) +#if defined(TOOLKIT_GTK) || defined(OS_WIN) || defined(OS_MACOSX) #define MAYBE_DrawAttentionBasic DrawAttentionBasic #define MAYBE_DrawAttentionWhileMinimized DrawAttentionWhileMinimized #define MAYBE_DrawAttentionResetOnActivate DrawAttentionResetOnActivate @@ -1003,7 +1140,7 @@ IN_PROC_BROWSER_TEST_F(PanelBrowserTest, MAYBE_DrawAttentionWhileMinimized) { } IN_PROC_BROWSER_TEST_F(PanelBrowserTest, DrawAttentionWhenActive) { - CreatePanelParams params("Initially Inactive", gfx::Rect(), SHOW_AS_ACTIVE); + CreatePanelParams params("Initially Active", gfx::Rect(), SHOW_AS_ACTIVE); Panel* panel = CreatePanelWithParams(params); scoped_ptr<NativePanelTesting> native_panel_testing( NativePanelTesting::Create(panel->native_panel())); @@ -1042,97 +1179,6 @@ IN_PROC_BROWSER_TEST_F(PanelBrowserTest, MAYBE_DrawAttentionResetOnActivate) { panel->Close(); } -// TODO(jianli): To be enabled for other platforms. -#if defined(OS_WIN) -#define MAYBE_ActivateDeactivateBasic ActivateDeactivateBasic -#else -#define MAYBE_ActivateDeactivateBasic DISABLED_ActivateDeactivateBasic -#endif -IN_PROC_BROWSER_TEST_F(PanelBrowserTest, MAYBE_ActivateDeactivateBasic) { - // Create an active panel. - Panel* panel = CreatePanel("PanelTest"); - scoped_ptr<NativePanelTesting> native_panel_testing( - NativePanelTesting::Create(panel->native_panel())); - EXPECT_TRUE(panel->IsActive()); - EXPECT_TRUE(native_panel_testing->VerifyActiveState(true)); - - // Deactivate the panel. - panel->Deactivate(); - WaitForPanelActiveState(panel, SHOW_AS_INACTIVE); - EXPECT_FALSE(panel->IsActive()); - EXPECT_TRUE(native_panel_testing->VerifyActiveState(false)); - - // Reactivate the panel. - panel->Activate(); - WaitForPanelActiveState(panel, SHOW_AS_ACTIVE); - EXPECT_TRUE(panel->IsActive()); - EXPECT_TRUE(native_panel_testing->VerifyActiveState(true)); -} - -// TODO(jianli): To be enabled for other platforms. -#if defined(OS_WIN) -#define MAYBE_ActivateDeactivateMultiple ActivateDeactivateMultiple -#else -#define MAYBE_ActivateDeactivateMultiple DISABLED_ActivateDeactivateMultiple -#endif -IN_PROC_BROWSER_TEST_F(PanelBrowserTest, MAYBE_ActivateDeactivateMultiple) { - BrowserWindow* tabbed_window = BrowserList::GetLastActive()->window(); - - // Create 4 panels in the following screen layout: - // P3 P2 P1 P0 - const int kNumPanels = 4; - std::string panel_name_base("PanelTest"); - for (int i = 0; i < kNumPanels; ++i) { - CreatePanelWithBounds(panel_name_base + base::IntToString(i), - gfx::Rect(0, 0, 100, 100)); - } - const std::vector<Panel*>& panels = PanelManager::GetInstance()->panels(); - - std::vector<bool> expected_active_states; - std::vector<bool> last_active_states; - - // The last created panel, P3, should be active. - expected_active_states = ProduceExpectedActiveStates(3); - EXPECT_EQ(expected_active_states, GetAllPanelActiveStates()); - EXPECT_FALSE(tabbed_window->IsActive()); - - // Activating P1 should cause P3 to lose focus. - panels[1]->Activate(); - last_active_states = expected_active_states; - expected_active_states = ProduceExpectedActiveStates(1); - WaitForPanelActiveStates(last_active_states, expected_active_states); - EXPECT_EQ(expected_active_states, GetAllPanelActiveStates()); - - // Minimizing inactive panel P2 should not affect other panels' active states. - panels[2]->SetExpansionState(Panel::MINIMIZED); - EXPECT_EQ(expected_active_states, GetAllPanelActiveStates()); - EXPECT_FALSE(tabbed_window->IsActive()); - - // Minimizing active panel P1 should activate last active panel P3. - panels[1]->SetExpansionState(Panel::MINIMIZED); - last_active_states = expected_active_states; - expected_active_states = ProduceExpectedActiveStates(3); - WaitForPanelActiveStates(last_active_states, expected_active_states); - EXPECT_EQ(expected_active_states, GetAllPanelActiveStates()); - EXPECT_FALSE(tabbed_window->IsActive()); - - // Minimizing active panel P3 should activate last active panel P0. - panels[3]->SetExpansionState(Panel::MINIMIZED); - last_active_states = expected_active_states; - expected_active_states = ProduceExpectedActiveStates(0); - WaitForPanelActiveStates(last_active_states, expected_active_states); - EXPECT_EQ(expected_active_states, GetAllPanelActiveStates()); - EXPECT_FALSE(tabbed_window->IsActive()); - - // Minimizing active panel P0 should activate last active tabbed window. - panels[0]->SetExpansionState(Panel::MINIMIZED); - last_active_states = expected_active_states; - expected_active_states = ProduceExpectedActiveStates(-1); // -1 means none. - WaitForPanelActiveStates(last_active_states, expected_active_states); - EXPECT_EQ(expected_active_states, GetAllPanelActiveStates()); - EXPECT_TRUE(tabbed_window->IsActive()); -} - class PanelDownloadTest : public PanelBrowserTest { public: PanelDownloadTest() : PanelBrowserTest() { } diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index 8b59d40..36cd220 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -134,6 +134,8 @@ 'browser/sync/syncable/syncable_mock.cc', 'browser/sync/syncable/syncable_mock.h', 'browser/ui/browser.h', + 'browser/ui/panels/base_panel_browser_test.cc', + 'browser/ui/panels/base_panel_browser_test.h', 'browser/ui/tab_contents/test_tab_contents_wrapper.cc', 'browser/ui/tab_contents/test_tab_contents_wrapper.h', 'common/pref_store_observer_mock.cc', @@ -513,6 +515,7 @@ 'browser/npapi_interactive_test.cc', 'browser/ui/gtk/bookmarks/bookmark_bar_gtk_interactive_uitest.cc', 'browser/ui/omnibox/omnibox_view_browsertest.cc', + 'browser/ui/panels/panel_browsertest.cc', 'browser/ui/views/bookmarks/bookmark_bar_view_test.cc', 'browser/ui/views/button_dropdown_test.cc', 'browser/ui/views/find_bar_host_interactive_uitest.cc', @@ -2475,10 +2478,7 @@ 'browser/ui/gtk/view_id_util_browsertest.cc', 'browser/ui/intents/web_intent_picker_controller_browsertest.cc', 'browser/ui/login/login_prompt_browsertest.cc', - 'browser/ui/panels/base_panel_browser_test.cc', - 'browser/ui/panels/base_panel_browser_test.h', 'browser/ui/panels/panel_app_browsertest.cc', - 'browser/ui/panels/panel_browsertest.cc', 'browser/ui/panels/panel_browser_view_browsertest.cc', 'browser/ui/views/browser_actions_container_browsertest.cc', 'browser/ui/views/dom_view_browsertest.cc', |