| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ash/wm/caption_buttons/hideable_caption_button_container.h" |
| 5 #include "chrome/browser/chrome_notification_types.h" | 6 #include "chrome/browser/chrome_notification_types.h" |
| 6 #include "chrome/browser/ui/browser.h" | 7 #include "chrome/browser/ui/browser.h" |
| 7 #include "chrome/browser/ui/browser_finder.h" | 8 #include "chrome/browser/ui/browser_finder.h" |
| 8 #include "chrome/browser/ui/browser_list.h" | 9 #include "chrome/browser/ui/browser_list.h" |
| 9 #include "chrome/browser/ui/browser_tabstrip.h" | 10 #include "chrome/browser/ui/browser_tabstrip.h" |
| 10 #include "chrome/browser/ui/browser_window.h" | 11 #include "chrome/browser/ui/browser_window.h" |
| 11 #include "chrome/browser/ui/views/frame/app_non_client_frame_view_ash.h" | 12 #include "chrome/browser/ui/views/frame/app_browser_frame_view_ash.h" |
| 12 #include "chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h" | 13 #include "chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h" |
| 13 #include "chrome/browser/ui/views/frame/browser_view.h" | 14 #include "chrome/browser/ui/views/frame/browser_view.h" |
| 14 #include "chrome/test/base/in_process_browser_test.h" | 15 #include "chrome/test/base/in_process_browser_test.h" |
| 15 #include "content/public/test/test_utils.h" | 16 #include "content/public/test/test_utils.h" |
| 16 #include "ui/aura/client/aura_constants.h" | 17 #include "ui/aura/client/aura_constants.h" |
| 17 #include "ui/aura/root_window.h" | 18 #include "ui/aura/root_window.h" |
| 18 #include "ui/aura/test/event_generator.h" | 19 #include "ui/aura/test/event_generator.h" |
| 19 #include "ui/aura/window.h" | 20 #include "ui/aura/window.h" |
| 20 #include "ui/gfx/screen.h" | 21 #include "ui/gfx/screen.h" |
| 21 | 22 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 43 void MinimizeWindow(aura::Window* window) { | 44 void MinimizeWindow(aura::Window* window) { |
| 44 window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED); | 45 window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED); |
| 45 } | 46 } |
| 46 | 47 |
| 47 void RestoreWindow(Window* window) { | 48 void RestoreWindow(Window* window) { |
| 48 window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); | 49 window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); |
| 49 } | 50 } |
| 50 | 51 |
| 51 } // namespace | 52 } // namespace |
| 52 | 53 |
| 53 class AppNonClientFrameViewAshTest : public InProcessBrowserTest { | 54 class AppBrowserFrameViewAshTest : public InProcessBrowserTest { |
| 54 public: | 55 public: |
| 55 AppNonClientFrameViewAshTest() : InProcessBrowserTest(), app_browser_(NULL) { | 56 AppBrowserFrameViewAshTest() : InProcessBrowserTest(), app_browser_(NULL) { |
| 56 } | 57 } |
| 57 virtual ~AppNonClientFrameViewAshTest() {} | 58 virtual ~AppBrowserFrameViewAshTest() {} |
| 58 | 59 |
| 59 virtual void SetUpOnMainThread() OVERRIDE { | 60 virtual void SetUpOnMainThread() OVERRIDE { |
| 60 Browser::CreateParams params = Browser::CreateParams::CreateForApp( | 61 Browser::CreateParams params = Browser::CreateParams::CreateForApp( |
| 61 Browser::TYPE_POPUP, | 62 Browser::TYPE_POPUP, |
| 62 std::string("Test"), | 63 std::string("Test"), |
| 63 gfx::Rect(), | 64 gfx::Rect(), |
| 64 browser()->profile(), | 65 browser()->profile(), |
| 65 browser()->host_desktop_type()); | 66 browser()->host_desktop_type()); |
| 66 params.initial_show_state = ui::SHOW_STATE_MAXIMIZED; | 67 params.initial_show_state = ui::SHOW_STATE_MAXIMIZED; |
| 67 params.app_type = Browser::APP_TYPE_HOST; | 68 params.app_type = Browser::APP_TYPE_HOST; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 90 Browser* app_browser() const { return app_browser_; } | 91 Browser* app_browser() const { return app_browser_; } |
| 91 | 92 |
| 92 private: | 93 private: |
| 93 Browser *app_browser_; | 94 Browser *app_browser_; |
| 94 }; | 95 }; |
| 95 | 96 |
| 96 #if defined(USE_ASH) | 97 #if defined(USE_ASH) |
| 97 // Ensure that restoring the app window replaces the frame with a normal one, | 98 // Ensure that restoring the app window replaces the frame with a normal one, |
| 98 // and maximizing again brings back the app frame. This has been the source of | 99 // and maximizing again brings back the app frame. This has been the source of |
| 99 // some crash bugs like crbug.com/155634 | 100 // some crash bugs like crbug.com/155634 |
| 100 IN_PROC_BROWSER_TEST_F(AppNonClientFrameViewAshTest, SwitchFrames) { | 101 IN_PROC_BROWSER_TEST_F(AppBrowserFrameViewAshTest, SwitchFrames) { |
| 101 // Convert to std::string so Windows can match EXPECT_EQ. | 102 // Convert to std::string so Windows can match EXPECT_EQ. |
| 102 const std::string kAppFrameClassName = | 103 const std::string kAppFrameClassName = |
| 103 AppNonClientFrameViewAsh::kViewClassName; | 104 AppBrowserFrameViewAsh::kViewClassName; |
| 104 const std::string kNormalFrameClassName = | 105 const std::string kNormalFrameClassName = |
| 105 BrowserNonClientFrameViewAsh::kViewClassName; | 106 BrowserNonClientFrameViewAsh::kViewClassName; |
| 106 | 107 |
| 107 // We start with the app frame. | 108 // We start with the app frame. |
| 108 EXPECT_EQ(kAppFrameClassName, GetFrameClassName()); | 109 EXPECT_EQ(kAppFrameClassName, GetFrameClassName()); |
| 109 | 110 |
| 110 // Restoring the window gives us the normal frame. | 111 // Restoring the window gives us the normal frame. |
| 111 Window* native_window = app_browser()->window()->GetNativeWindow(); | 112 Window* native_window = app_browser()->window()->GetNativeWindow(); |
| 112 RestoreWindow(native_window); | 113 RestoreWindow(native_window); |
| 113 EXPECT_EQ(kNormalFrameClassName, GetFrameClassName()); | 114 EXPECT_EQ(kNormalFrameClassName, GetFrameClassName()); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 129 // One more restore/maximize cycle for good measure. | 130 // One more restore/maximize cycle for good measure. |
| 130 RestoreWindow(native_window); | 131 RestoreWindow(native_window); |
| 131 EXPECT_EQ(kNormalFrameClassName, GetFrameClassName()); | 132 EXPECT_EQ(kNormalFrameClassName, GetFrameClassName()); |
| 132 MaximizeWindow(native_window); | 133 MaximizeWindow(native_window); |
| 133 EXPECT_EQ(kAppFrameClassName, GetFrameClassName()); | 134 EXPECT_EQ(kAppFrameClassName, GetFrameClassName()); |
| 134 } | 135 } |
| 135 #endif // USE_ASH | 136 #endif // USE_ASH |
| 136 | 137 |
| 137 // Ensure that we can click the close button when the controls are shown. | 138 // Ensure that we can click the close button when the controls are shown. |
| 138 // In particular make sure that we can click it on the top pixel of the button. | 139 // In particular make sure that we can click it on the top pixel of the button. |
| 139 IN_PROC_BROWSER_TEST_F(AppNonClientFrameViewAshTest, ClickClose) { | 140 IN_PROC_BROWSER_TEST_F(AppBrowserFrameViewAshTest, ClickClose) { |
| 140 aura::RootWindow* root_window = GetRootWindow(); | 141 aura::RootWindow* root_window = GetRootWindow(); |
| 141 aura::test::EventGenerator eg(root_window, gfx::Point(0, 1)); | 142 aura::test::EventGenerator eg(root_window, gfx::Point(0, 1)); |
| 142 | 143 |
| 143 // Click close button. | 144 // Click close button. |
| 144 eg.MoveMouseTo(root_window->bounds().width() - 1, 0); | 145 eg.MoveMouseTo(root_window->bounds().width() - 1, 0); |
| 145 content::WindowedNotificationObserver signal( | 146 content::WindowedNotificationObserver signal( |
| 146 chrome::NOTIFICATION_BROWSER_CLOSED, | 147 chrome::NOTIFICATION_BROWSER_CLOSED, |
| 147 content::Source<Browser>(app_browser())); | 148 content::Source<Browser>(app_browser())); |
| 148 eg.ClickLeftButton(); | 149 eg.ClickLeftButton(); |
| 149 signal.Wait(); | 150 signal.Wait(); |
| 150 EXPECT_EQ(1u, chrome::GetBrowserCount(browser()->profile(), | 151 EXPECT_EQ(1u, chrome::GetBrowserCount(browser()->profile(), |
| 151 browser()->host_desktop_type())); | 152 browser()->host_desktop_type())); |
| 152 } | 153 } |
| 153 | 154 |
| 154 // Ensure that closing a maximized app with Ctrl-W does not crash the | 155 // Ensure that closing a maximized app with Ctrl-W does not crash the |
| 155 // application. crbug.com/147635 | 156 // application. crbug.com/147635 |
| 156 IN_PROC_BROWSER_TEST_F(AppNonClientFrameViewAshTest, KeyboardClose) { | 157 IN_PROC_BROWSER_TEST_F(AppBrowserFrameViewAshTest, KeyboardClose) { |
| 157 aura::RootWindow* root_window = GetRootWindow(); | 158 aura::RootWindow* root_window = GetRootWindow(); |
| 158 aura::test::EventGenerator eg(root_window); | 159 aura::test::EventGenerator eg(root_window); |
| 159 | 160 |
| 160 // Base browser and app browser. | 161 // Base browser and app browser. |
| 161 EXPECT_EQ(2u, chrome::GetBrowserCount(browser()->profile(), | 162 EXPECT_EQ(2u, chrome::GetBrowserCount(browser()->profile(), |
| 162 browser()->host_desktop_type())); | 163 browser()->host_desktop_type())); |
| 163 | 164 |
| 164 // Send Control-W. | 165 // Send Control-W. |
| 165 content::WindowedNotificationObserver signal( | 166 content::WindowedNotificationObserver signal( |
| 166 chrome::NOTIFICATION_BROWSER_CLOSED, | 167 chrome::NOTIFICATION_BROWSER_CLOSED, |
| 167 content::Source<Browser>(app_browser())); | 168 content::Source<Browser>(app_browser())); |
| 168 eg.PressKey(ui::VKEY_W, ui::EF_CONTROL_DOWN); | 169 eg.PressKey(ui::VKEY_W, ui::EF_CONTROL_DOWN); |
| 169 eg.ReleaseKey(ui::VKEY_W, ui::EF_CONTROL_DOWN); | 170 eg.ReleaseKey(ui::VKEY_W, ui::EF_CONTROL_DOWN); |
| 170 signal.Wait(); | 171 signal.Wait(); |
| 171 | 172 |
| 172 // App browser is closed. | 173 // App browser is closed. |
| 173 EXPECT_EQ(1u, chrome::GetBrowserCount(browser()->profile(), | 174 EXPECT_EQ(1u, chrome::GetBrowserCount(browser()->profile(), |
| 174 browser()->host_desktop_type())); | 175 browser()->host_desktop_type())); |
| 175 } | 176 } |
| 176 | 177 |
| 177 // Ensure that snapping left with Alt-[ closes the control window. | 178 // Ensure that snapping left with Alt-[ closes the control window. |
| 178 IN_PROC_BROWSER_TEST_F(AppNonClientFrameViewAshTest, SnapLeftClosesControls) { | 179 IN_PROC_BROWSER_TEST_F(AppBrowserFrameViewAshTest, SnapLeftClosesControls) { |
| 180 const char* kControlWindowName = |
| 181 ash::HideableCaptionButtonContainer::kButtonWindowName; |
| 182 |
| 179 aura::RootWindow* root_window = GetRootWindow(); | 183 aura::RootWindow* root_window = GetRootWindow(); |
| 180 aura::test::EventGenerator eg(root_window); | 184 aura::test::EventGenerator eg(root_window); |
| 181 aura::Window* native_window = app_browser()->window()->GetNativeWindow(); | 185 aura::Window* native_window = app_browser()->window()->GetNativeWindow(); |
| 182 | 186 |
| 183 // Control window exists. | 187 // Control window exists. |
| 184 EXPECT_TRUE(HasChildWindowNamed( | 188 EXPECT_TRUE(HasChildWindowNamed(native_window, kControlWindowName)); |
| 185 native_window, AppNonClientFrameViewAsh::kControlWindowName)); | |
| 186 | 189 |
| 187 // Send Alt-[ | 190 // Send Alt-[ |
| 188 eg.PressKey(ui::VKEY_OEM_4, ui::EF_ALT_DOWN); | 191 eg.PressKey(ui::VKEY_OEM_4, ui::EF_ALT_DOWN); |
| 189 eg.ReleaseKey(ui::VKEY_OEM_4, ui::EF_ALT_DOWN); | 192 eg.ReleaseKey(ui::VKEY_OEM_4, ui::EF_ALT_DOWN); |
| 190 content::RunAllPendingInMessageLoop(); | 193 content::RunAllPendingInMessageLoop(); |
| 191 | 194 |
| 192 // Control window is gone. | 195 // Control window is gone. |
| 193 EXPECT_FALSE(HasChildWindowNamed( | 196 EXPECT_FALSE(HasChildWindowNamed(native_window, kControlWindowName)); |
| 194 native_window, AppNonClientFrameViewAsh::kControlWindowName)); | |
| 195 } | 197 } |
| 196 | 198 |
| 197 // Ensure that the controls are at the proper locations. | 199 // Ensure that the controls are at the proper locations. |
| 198 IN_PROC_BROWSER_TEST_F(AppNonClientFrameViewAshTest, ControlsAtRightSide) { | 200 IN_PROC_BROWSER_TEST_F(AppBrowserFrameViewAshTest, ControlsAtRightSide) { |
| 201 const char* kControlWindowName = |
| 202 ash::HideableCaptionButtonContainer::kButtonWindowName; |
| 203 |
| 199 aura::RootWindow* root_window = GetRootWindow(); | 204 aura::RootWindow* root_window = GetRootWindow(); |
| 200 aura::test::EventGenerator eg(root_window); | 205 aura::test::EventGenerator eg(root_window); |
| 201 aura::Window* native_window = app_browser()->window()->GetNativeWindow(); | 206 aura::Window* native_window = app_browser()->window()->GetNativeWindow(); |
| 202 const gfx::Rect work_area = | 207 const gfx::Rect work_area = |
| 203 gfx::Screen::GetScreenFor(native_window)->GetPrimaryDisplay().work_area(); | 208 gfx::Screen::GetScreenFor(native_window)->GetPrimaryDisplay().work_area(); |
| 204 | 209 |
| 205 // Control window exists. | 210 // Control window exists. |
| 206 aura::Window* window = GetChildWindowNamed( | 211 aura::Window* window = GetChildWindowNamed(native_window, kControlWindowName); |
| 207 native_window, AppNonClientFrameViewAsh::kControlWindowName); | |
| 208 | 212 |
| 209 ASSERT_TRUE(window); | 213 ASSERT_TRUE(window); |
| 210 gfx::Rect rect = window->bounds(); | 214 gfx::Rect rect = window->bounds(); |
| 211 EXPECT_EQ(work_area.right(), rect.right()); | 215 EXPECT_EQ(work_area.right(), rect.right()); |
| 212 EXPECT_EQ(work_area.y(), rect.y()); | 216 EXPECT_EQ(work_area.y(), rect.y()); |
| 213 | 217 |
| 214 MinimizeWindow(native_window); | 218 MinimizeWindow(native_window); |
| 215 content::RunAllPendingInMessageLoop(); | 219 content::RunAllPendingInMessageLoop(); |
| 216 window = GetChildWindowNamed( | 220 window = GetChildWindowNamed(native_window, kControlWindowName); |
| 217 native_window, AppNonClientFrameViewAsh::kControlWindowName); | |
| 218 EXPECT_FALSE(window); | 221 EXPECT_FALSE(window); |
| 219 MaximizeWindow(native_window); | 222 MaximizeWindow(native_window); |
| 220 content::RunAllPendingInMessageLoop(); | 223 content::RunAllPendingInMessageLoop(); |
| 221 | 224 |
| 222 // Control window exists. | 225 // Control window exists. |
| 223 aura::Window* window_after = GetChildWindowNamed( | 226 aura::Window* window_after = GetChildWindowNamed( |
| 224 native_window, AppNonClientFrameViewAsh::kControlWindowName); | 227 native_window, kControlWindowName); |
| 225 ASSERT_TRUE(window_after); | 228 ASSERT_TRUE(window_after); |
| 226 gfx::Rect rect_after = window_after->bounds(); | 229 gfx::Rect rect_after = window_after->bounds(); |
| 227 EXPECT_EQ(work_area.right(), rect_after.right()); | 230 EXPECT_EQ(work_area.right(), rect_after.right()); |
| 228 EXPECT_EQ(work_area.y(), rect_after.y()); | 231 EXPECT_EQ(work_area.y(), rect_after.y()); |
| 229 } | 232 } |
| OLD | NEW |