| Index: chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
|
| diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc b/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
|
| index ddd65431d0425cb1c51928ab151390cb4e46d7e6..eae2c2bdef709b4680dd3f999bb999f2be14d65e 100644
|
| --- a/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
|
| +++ b/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
|
| @@ -33,6 +33,7 @@
|
|
|
| #if defined(USE_ASH)
|
| #include "ash/display/display_controller.h"
|
| +#include "ash/display/multi_display_manager.h"
|
| #include "ash/shell.h"
|
| #include "ui/aura/test/event_generator.h"
|
| #include "ui/aura/root_window.h"
|
| @@ -940,8 +941,7 @@ IN_PROC_BROWSER_TEST_P(DetachToBrowserInSeparateDisplayTabDragControllerTest,
|
| ResetIDs(browser2->tab_strip_model(), 100);
|
|
|
| // Move the second browser to the second display.
|
| - std::vector<aura::RootWindow*> roots(
|
| - ash::Shell::GetInstance()->display_controller()->GetAllRootWindows());
|
| + std::vector<aura::RootWindow*> roots(ash::Shell::GetAllRootWindows());
|
| ASSERT_EQ(2u, roots.size());
|
| aura::RootWindow* second_root = roots[1];
|
| gfx::Rect work_area = gfx::Screen::GetDisplayNearestWindow(
|
| @@ -974,6 +974,89 @@ IN_PROC_BROWSER_TEST_P(DetachToBrowserInSeparateDisplayTabDragControllerTest,
|
| EXPECT_EQ("1", IDString(browser()->tab_strip_model()));
|
| }
|
|
|
| +namespace {
|
| +
|
| +// Invoked from the nested message loop.
|
| +void CancelDragTabToWindowInSeparateDisplayStep3(
|
| + DetachToBrowserTabDragControllerTest* test,
|
| + TabStrip* tab_strip) {
|
| + ASSERT_FALSE(tab_strip->IsDragSessionActive());
|
| + ASSERT_TRUE(TabDragController::IsActive());
|
| + ASSERT_EQ(2u, BrowserList::size());
|
| +
|
| + // Switching display mode should cancel the drag operation.
|
| + ash::internal::MultiDisplayManager::CycleDisplay();
|
| +}
|
| +
|
| +// Invoked from the nested message loop.
|
| +void CancelDragTabToWindowInSeparateDisplayStep2(
|
| + DetachToBrowserTabDragControllerTest* test,
|
| + TabStrip* tab_strip,
|
| + gfx::Point final_destination) {
|
| + ASSERT_FALSE(tab_strip->IsDragSessionActive());
|
| + ASSERT_TRUE(TabDragController::IsActive());
|
| + ASSERT_EQ(2u, BrowserList::size());
|
| +
|
| + Browser* new_browser = *(++BrowserList::begin());
|
| + EXPECT_EQ(ash::Shell::GetPrimaryRootWindow(),
|
| + new_browser->window()->GetNativeWindow()->GetRootWindow());
|
| +
|
| + ASSERT_TRUE(test->DragInputToNotifyWhenDone(
|
| + final_destination.x(), final_destination.y(),
|
| + base::Bind(&CancelDragTabToWindowInSeparateDisplayStep3,
|
| + test, tab_strip)));
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +// Drags from browser to a second display and releases input.
|
| +IN_PROC_BROWSER_TEST_P(DetachToBrowserInSeparateDisplayTabDragControllerTest,
|
| + CancelDragTabToWindowInSeparateDisplay) {
|
| + // Add another tab.
|
| + AddTabAndResetBrowser(browser());
|
| + TabStrip* tab_strip = GetTabStripForBrowser(browser());
|
| +
|
| + EXPECT_EQ("0 1", IDString(browser()->tab_strip_model()));
|
| +
|
| + // Move the second browser to the second display.
|
| + std::vector<aura::RootWindow*> roots(ash::Shell::GetAllRootWindows());
|
| + ASSERT_EQ(2u, roots.size());
|
| + gfx::Point final_destination =
|
| + gfx::Screen::GetDisplayNearestWindow(roots[1]).work_area().CenterPoint();
|
| +
|
| + // Move to the first tab and drag it enough so that it detaches, but not
|
| + // enough to move to another display.
|
| + gfx::Point tab_0_center(GetCenterInScreenCoordinates(tab_strip->tab_at(0)));
|
| + ASSERT_TRUE(PressInput(tab_0_center));
|
| + ASSERT_TRUE(DragInputToNotifyWhenDone(
|
| + tab_0_center.x(), tab_0_center.y() + GetDetachY(tab_strip),
|
| + base::Bind(&CancelDragTabToWindowInSeparateDisplayStep2,
|
| + this, tab_strip, final_destination)));
|
| + QuitWhenNotDragging();
|
| +
|
| + // Drag operation must have been cancelled.
|
| + if (input_source() == INPUT_SOURCE_TOUCH) {
|
| + // A window capture is reset to NULL when merging two root
|
| + // windows, and that capture event completes the touch based
|
| + // drag operation, instead of cancelling it.
|
| + ASSERT_EQ(2u, BrowserList::size());
|
| + ASSERT_FALSE(tab_strip->IsDragSessionActive());
|
| + ASSERT_FALSE(TabDragController::IsActive());
|
| + EXPECT_EQ("1", IDString(browser()->tab_strip_model()));
|
| + Browser* new_browser = *(++BrowserList::begin());
|
| + EXPECT_EQ("0", IDString(new_browser->tab_strip_model()));
|
| + } else {
|
| + // Mouse operation doesn't get cancelled when the capture is
|
| + // lost, and removing the display correctly cancel the operation.
|
| + ASSERT_EQ(1u, BrowserList::size());
|
| + ASSERT_FALSE(tab_strip->IsDragSessionActive());
|
| + ASSERT_FALSE(TabDragController::IsActive());
|
| + EXPECT_EQ("0 1", IDString(browser()->tab_strip_model()));
|
| + }
|
| + // Release the mouse
|
| + ASSERT_TRUE(ReleaseInput());
|
| +}
|
| +
|
| #endif
|
|
|
| #if defined(USE_ASH)
|
|
|