| 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/drag_window_resizer.h" | 5 #include "ash/wm/drag_window_resizer.h" |
| 6 | 6 |
| 7 #include "ash/display/mouse_cursor_event_filter.h" | 7 #include "ash/display/mouse_cursor_event_filter.h" |
| 8 #include "ash/root_window_controller.h" | 8 #include "ash/root_window_controller.h" |
| 9 #include "ash/shelf/shelf_layout_manager.h" | 9 #include "ash/shelf/shelf_layout_manager.h" |
| 10 #include "ash/shell.h" | 10 #include "ash/shell.h" |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 DISALLOW_COPY_AND_ASSIGN(DragWindowResizerTest); | 155 DISALLOW_COPY_AND_ASSIGN(DragWindowResizerTest); |
| 156 }; | 156 }; |
| 157 | 157 |
| 158 // Verifies a window can be moved from the primary display to another. | 158 // Verifies a window can be moved from the primary display to another. |
| 159 TEST_F(DragWindowResizerTest, WindowDragWithMultiDisplays) { | 159 TEST_F(DragWindowResizerTest, WindowDragWithMultiDisplays) { |
| 160 if (!SupportsMultipleDisplays()) | 160 if (!SupportsMultipleDisplays()) |
| 161 return; | 161 return; |
| 162 | 162 |
| 163 // The secondary display is logically on the right, but on the system (e.g. X) | 163 // The secondary display is logically on the right, but on the system (e.g. X) |
| 164 // layer, it's below the primary one. See UpdateDisplay() in ash_test_base.cc. | 164 // layer, it's below the primary one. See UpdateDisplay() in ash_test_base.cc. |
| 165 UpdateDisplay("800x600,400x300"); | 165 UpdateDisplay("800x600,800x600"); |
| 166 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); | 166 aura::Window::Windows root_windows = Shell::GetAllRootWindows(); |
| 167 ASSERT_EQ(2U, root_windows.size()); | 167 ASSERT_EQ(2U, root_windows.size()); |
| 168 | 168 |
| 169 window_->SetBoundsInScreen(gfx::Rect(0, 0, 50, 60), | 169 window_->SetBoundsInScreen(gfx::Rect(0, 0, 50, 60), |
| 170 Shell::GetScreen()->GetPrimaryDisplay()); | 170 Shell::GetScreen()->GetPrimaryDisplay()); |
| 171 EXPECT_EQ(root_windows[0], window_->GetRootWindow()); | 171 EXPECT_EQ(root_windows[0], window_->GetRootWindow()); |
| 172 { | 172 { |
| 173 // Grab (0, 0) of the window. | 173 // Grab (0, 0) of the window. |
| 174 scoped_ptr<WindowResizer> resizer(CreateDragWindowResizer( | 174 scoped_ptr<WindowResizer> resizer(CreateDragWindowResizer( |
| 175 window_.get(), gfx::Point(), HTCAPTION)); | 175 window_.get(), gfx::Point(), HTCAPTION)); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 resizer->CompleteDrag(0); | 216 resizer->CompleteDrag(0); |
| 217 // Since the pointer is on the secondary, the parent should be changed | 217 // Since the pointer is on the secondary, the parent should be changed |
| 218 // even though only small fraction of the window is within the secondary | 218 // even though only small fraction of the window is within the secondary |
| 219 // root window's bounds. | 219 // root window's bounds. |
| 220 EXPECT_EQ(root_windows[1], window_->GetRootWindow()); | 220 EXPECT_EQ(root_windows[1], window_->GetRootWindow()); |
| 221 // Window origin should be adjusted for minimum visibility (10px). | 221 // Window origin should be adjusted for minimum visibility (10px). |
| 222 int expected_x = -50 + 10; | 222 int expected_x = -50 + 10; |
| 223 EXPECT_EQ(base::IntToString(expected_x) + ",10 50x60", | 223 EXPECT_EQ(base::IntToString(expected_x) + ",10 50x60", |
| 224 window_->bounds().ToString()); | 224 window_->bounds().ToString()); |
| 225 } | 225 } |
| 226 // Dropping a window that is larger than the destination work area | |
| 227 // will shrink to fit to the work area. | |
| 228 window_->SetBoundsInScreen(gfx::Rect(0, 0, 700, 500), | |
| 229 Shell::GetScreen()->GetPrimaryDisplay()); | |
| 230 EXPECT_EQ(root_windows[0], window_->GetRootWindow()); | |
| 231 { | |
| 232 // Grab the top-right edge of the window and move the pointer to (0, 10) | |
| 233 // in the secondary root window's coordinates. | |
| 234 scoped_ptr<WindowResizer> resizer(CreateDragWindowResizer( | |
| 235 window_.get(), gfx::Point(699, 0), HTCAPTION)); | |
| 236 ASSERT_TRUE(resizer.get()); | |
| 237 resizer->Drag(CalculateDragPoint(*resizer, 101, 10), ui::EF_CONTROL_DOWN); | |
| 238 resizer->CompleteDrag(0); | |
| 239 EXPECT_EQ(root_windows[1], window_->GetRootWindow()); | |
| 240 // Window size should be adjusted to fit to the work area | |
| 241 EXPECT_EQ("400x253", window_->bounds().size().ToString()); | |
| 242 gfx::Rect window_bounds_in_screen = window_->GetBoundsInScreen(); | |
| 243 gfx::Rect intersect(window_->GetRootWindow()->GetBoundsInScreen()); | |
| 244 intersect.Intersect(window_bounds_in_screen); | |
| 245 EXPECT_LE(10, intersect.width()); | |
| 246 EXPECT_LE(10, intersect.height()); | |
| 247 EXPECT_TRUE(window_bounds_in_screen.Contains(gfx::Point(800, 10))); | |
| 248 } | |
| 249 | |
| 250 // Dropping a window that is larger than the destination work area | |
| 251 // will shrink to fit to the work area. | |
| 252 window_->SetBoundsInScreen(gfx::Rect(0, 0, 700, 500), | |
| 253 Shell::GetScreen()->GetPrimaryDisplay()); | |
| 254 EXPECT_EQ(root_windows[0], window_->GetRootWindow()); | |
| 255 { | |
| 256 // Grab the top-left edge of the window and move the pointer to (150, 10) | |
| 257 // in the secondary root window's coordinates. Make sure the window is | |
| 258 // shrink in such a way that it keeps the cursor within. | |
| 259 scoped_ptr<WindowResizer> resizer(CreateDragWindowResizer( | |
| 260 window_.get(), gfx::Point(0, 0), HTCAPTION)); | |
| 261 ASSERT_TRUE(resizer.get()); | |
| 262 resizer->Drag(CalculateDragPoint(*resizer, 799, 10), ui::EF_CONTROL_DOWN); | |
| 263 resizer->Drag(CalculateDragPoint(*resizer, 850, 10), ui::EF_CONTROL_DOWN); | |
| 264 resizer->CompleteDrag(0); | |
| 265 EXPECT_EQ(root_windows[1], window_->GetRootWindow()); | |
| 266 // Window size should be adjusted to fit to the work area | |
| 267 EXPECT_EQ("400x253", window_->bounds().size().ToString()); | |
| 268 gfx::Rect window_bounds_in_screen = window_->GetBoundsInScreen(); | |
| 269 gfx::Rect intersect(window_->GetRootWindow()->GetBoundsInScreen()); | |
| 270 intersect.Intersect(window_bounds_in_screen); | |
| 271 EXPECT_LE(10, intersect.width()); | |
| 272 EXPECT_LE(10, intersect.height()); | |
| 273 EXPECT_TRUE(window_bounds_in_screen.Contains(gfx::Point(850, 10))); | |
| 274 } | |
| 275 } | 226 } |
| 276 | 227 |
| 277 // Verifies that dragging the active window to another display makes the new | 228 // Verifies that dragging the active window to another display makes the new |
| 278 // root window the active root window. | 229 // root window the active root window. |
| 279 TEST_F(DragWindowResizerTest, WindowDragWithMultiDisplaysActiveRoot) { | 230 TEST_F(DragWindowResizerTest, WindowDragWithMultiDisplaysActiveRoot) { |
| 280 if (!SupportsMultipleDisplays()) | 231 if (!SupportsMultipleDisplays()) |
| 281 return; | 232 return; |
| 282 | 233 |
| 283 // The secondary display is logically on the right, but on the system (e.g. X) | 234 // The secondary display is logically on the right, but on the system (e.g. X) |
| 284 // layer, it's below the primary one. See UpdateDisplay() in ash_test_base.cc. | 235 // layer, it's below the primary one. See UpdateDisplay() in ash_test_base.cc. |
| (...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 714 resizer->CompleteDrag(0); | 665 resizer->CompleteDrag(0); |
| 715 EXPECT_EQ(1, session_delegate->num_transfer_to_desktop_of_user_calls()); | 666 EXPECT_EQ(1, session_delegate->num_transfer_to_desktop_of_user_calls()); |
| 716 EXPECT_NE(initial_bounds.ToString(), window->bounds().ToString()); | 667 EXPECT_NE(initial_bounds.ToString(), window->bounds().ToString()); |
| 717 } | 668 } |
| 718 } | 669 } |
| 719 #endif | 670 #endif |
| 720 | 671 |
| 721 | 672 |
| 722 } // namespace internal | 673 } // namespace internal |
| 723 } // namespace ash | 674 } // namespace ash |
| OLD | NEW |