15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/property_util.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/run_loop.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_iterator.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_list.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/host_desktop.h" 197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/ui/immersive_fullscreen_configuration.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/frame/browser_view.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/tabs/tab.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/tabs/tab_drag_controller.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/tabs/tab_strip.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/interactive_test_utils.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/base/test/ui_controls.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_ASH) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/display/display_controller.h" 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/display/display_manager.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/cursor_manager_test_api.h" 4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ash/wm/coordinate_conversion.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h" 467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/ui/views/frame/immersive_mode_controller_ash.h" 4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/aura/client/screen_position_client.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h" 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/test/event_generator.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::WebContents; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTabDragControllerInteractiveUITestUserDataKey[] = 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "TabDragControllerInteractiveUITestUserData"; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TabDragControllerInteractiveUITestUserData 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public base::SupportsUserData::Data { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit TabDragControllerInteractiveUITestUserData(int id) : id_(id) {} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TabDragControllerInteractiveUITestUserData() {} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id() { return id_; } 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id_; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QuitDraggingObserver : public content::NotificationObserver { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuitDraggingObserver() { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_TAB_DRAG_LOOP_DONE, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(chrome::NOTIFICATION_TAB_DRAG_LOOP_DONE, type); 85b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoopForUI::current()->Quit(); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete this; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~QuitDraggingObserver() {} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(QuitDraggingObserver); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Point GetCenterInScreenCoordinates(const views::View* view) { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point center(view->width() / 2, view->height() / 2); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View::ConvertPointToScreen(view, ¢er); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return center; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SetID(WebContents* web_contents, int id) { 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->SetUserData(&kTabDragControllerInteractiveUITestUserDataKey, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new TabDragControllerInteractiveUITestUserData(id)); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ResetIDs(TabStripModel* model, int start) { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < model->count(); ++i) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetID(model->GetWebContentsAt(i), start + i); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string IDString(TabStripModel* model) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < model->count(); ++i) { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i != 0) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result += " "; 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* contents = model->GetWebContentsAt(i); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabDragControllerInteractiveUITestUserData* user_data = 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TabDragControllerInteractiveUITestUserData*>( 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents->GetUserData( 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &kTabDragControllerInteractiveUITestUserDataKey)); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_data) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result += base::IntToString(user_data->id()); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result += "?"; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates a listener that quits the message loop when no longer dragging. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void QuitWhenNotDraggingImpl() { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new QuitDraggingObserver(); // QuitDraggingObserver deletes itself. 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabStrip* GetTabStripForBrowser(Browser* browser) { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<TabStrip*>(browser_view->tabstrip()); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace test 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using test::GetCenterInScreenCoordinates; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using test::SetID; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using test::ResetIDs; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using test::IDString; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using test::GetTabStripForBrowser; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TabDragControllerTest::TabDragControllerTest() 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : native_browser_list(BrowserList::GetInstance( 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::HOST_DESKTOP_TYPE_NATIVE)) { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabDragControllerTest::~TabDragControllerTest() { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 157a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdochvoid TabDragControllerTest::SetUp() { 158a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch // TODO(danakj): Remove this when the tests are not flaky (crbug.com/270065) 159a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch // or we use test contexts in the renderer to keep things fast enough to 160a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch // avoid the flake (crbug.com/270918). 161a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch UseRealGLBindings(); 162a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch 163a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch InProcessBrowserTest::SetUp(); 164a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch} 165a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabDragControllerTest::StopAnimating(TabStrip* tab_strip) { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip->StopAnimating(true); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabDragControllerTest::AddTabAndResetBrowser(Browser* browser) { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddBlankTabAndShow(browser); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StopAnimating(GetTabStripForBrowser(browser)); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetIDs(browser->tab_strip_model(), 0); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser* TabDragControllerTest::CreateAnotherWindowBrowserAndRelayout() { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create another browser. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser2 = CreateBrowser(browser()->profile()); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetIDs(browser2->tab_strip_model(), 100); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Resize the two windows so they're right next to each other. 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect work_area = gfx::Screen::GetNativeScreen()->GetDisplayNearestWindow( 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->window()->GetNativeWindow()).work_area(); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size half_size = 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size(work_area.width() / 3 - 10, work_area.height() / 2 - 10); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->window()->SetBounds(gfx::Rect(work_area.origin(), half_size)); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser2->window()->SetBounds(gfx::Rect( 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) work_area.x() + half_size.width(), work_area.y(), 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) half_size.width(), half_size.height())); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser2; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum InputSource { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INPUT_SOURCE_MOUSE = 0, 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INPUT_SOURCE_TOUCH = 1 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetDetachY(TabStrip* tab_strip) { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::max(TabDragController::kTouchVerticalDetachMagnetism, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabDragController::kVerticalDetachMagnetism) + 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_strip->height() + 1; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetTrackedByWorkspace(Browser* browser) { 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(USE_ASH) || defined(OS_WIN) // TODO(win_ash) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ash::GetTrackedByWorkspace(browser->window()->GetNativeWindow()); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(USE_ASH) && !defined(OS_WIN) // TODO(win_ash) 21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ScreenEventGeneratorDelegate : public aura::test::EventGeneratorDelegate { 21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) explicit ScreenEventGeneratorDelegate(aura::RootWindow* root_window) 22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : root_window_(root_window) {} 22190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ~ScreenEventGeneratorDelegate() {} 22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // EventGeneratorDelegate overrides: 22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual aura::RootWindow* GetRootWindowAt( 22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const gfx::Point& point) const OVERRIDE { 22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return root_window_; 22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual aura::client::ScreenPositionClient* GetScreenPositionClient( 23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const aura::Window* window) const OVERRIDE { 23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return aura::client::GetScreenPositionClient(root_window_); 23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) aura::RootWindow* root_window_; 23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScreenEventGeneratorDelegate); 23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif 24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DetachToBrowserTabDragControllerTest 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public TabDragControllerTest, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public ::testing::WithParamInterface<const char*> { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DetachToBrowserTabDragControllerTest() {} 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitch(switches::kTabBrowserDragging); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_ASH) && !defined(OS_WIN) // TODO(win_ash) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_generator_.reset(new aura::test::EventGenerator( 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::Shell::GetPrimaryRootWindow())); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputSource input_source() const { 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !strcmp(GetParam(), "mouse") ? 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INPUT_SOURCE_MOUSE : INPUT_SOURCE_TOUCH; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Set root window from a point in screen coordinates 26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void SetEventGeneratorRootWindow(const gfx::Point& point) { 26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (input_source() == INPUT_SOURCE_MOUSE) 26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(USE_ASH) && !defined(OS_WIN) // TODO(win_ash) 26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) event_generator_.reset(new aura::test::EventGenerator( 27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new ScreenEventGeneratorDelegate(ash::wm::GetRootWindowAt(point)))); 27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif 27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The following methods update one of the mouse or touch input depending upon 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the InputSource. 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool PressInput(const gfx::Point& location) { 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input_source() == INPUT_SOURCE_MOUSE) { 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui_test_utils::SendMouseMoveSync(location) && 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::SendMouseEventsSync( 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_controls::LEFT, ui_controls::DOWN); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_ASH) && !defined(OS_WIN) // TODO(win_ash) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_generator_->set_current_location(location); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_generator_->PressTouch(); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool DragInputTo(const gfx::Point& location) { 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input_source() == INPUT_SOURCE_MOUSE) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui_test_utils::SendMouseMoveSync(location); 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_ASH) && !defined(OS_WIN) // TODO(win_ash) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_generator_->MoveTouch(location); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool DragInputToAsync(const gfx::Point& location) { 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input_source() == INPUT_SOURCE_MOUSE) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui_controls::SendMouseMove(location.x(), location.y()); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_ASH) && !defined(OS_WIN) // TODO(win_ash) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_generator_->MoveTouch(location); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool DragInputToNotifyWhenDone(int x, 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y, 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& task) { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input_source() == INPUT_SOURCE_MOUSE) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui_controls::SendMouseMoveNotifyWhenDone(x, y, task); 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_ASH) && !defined(OS_WIN) // TODO(win_ash) 319b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::current()->PostTask(FROM_HERE, task); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_generator_->MoveTouch(gfx::Point(x, y)); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ReleaseInput() { 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input_source() == INPUT_SOURCE_MOUSE) { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui_test_utils::SendMouseEventsSync( 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_controls::LEFT, ui_controls::UP); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_ASH) && !defined(OS_WIN) // TODO(win_ash) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_generator_->ReleaseTouch(); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ReleaseMouseAsync() { 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return input_source() == INPUT_SOURCE_MOUSE && 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_controls::SendMouseEvents(ui_controls::LEFT, ui_controls::UP); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void QuitWhenNotDragging() { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input_source() == INPUT_SOURCE_MOUSE) { 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Schedule observer to quit message loop when done dragging. This has to 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be async so the message loop can run. 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test::QuitWhenNotDraggingImpl(); 350b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::current()->Run(); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Touch events are sync, so we know we're not in a drag session. But some 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tests rely on the browser fully closing, which is async. So, run all 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pending tasks. 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RunLoop run_loop; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) run_loop.RunUntilIdle(); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddBlankTabAndShow(Browser* browser) { 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InProcessBrowserTest::AddBlankTabAndShow(browser); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser() const { return InProcessBrowserTest::browser(); } 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_ASH) && !defined(OS_WIN) // TODO(win_ash) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<aura::test::EventGenerator> event_generator_; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DetachToBrowserTabDragControllerTest); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates a browser with two tabs, drags the second to the first. 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(sky): this won't work with touch as it requires a long press. 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(DetachToBrowserTabDragControllerTest, 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISABLED_DragInSameWindow) { 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddTabAndResetBrowser(browser()); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip = GetTabStripForBrowser(browser()); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStripModel* model = browser()->tab_strip_model(); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point tab_1_center(GetCenterInScreenCoordinates(tab_strip->tab_at(1))); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PressInput(tab_1_center)); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point tab_0_center(GetCenterInScreenCoordinates(tab_strip->tab_at(0))); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(DragInputTo(tab_0_center)); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ReleaseInput()); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("1 0", IDString(model)); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(TabDragController::IsActive()); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(tab_strip->IsDragSessionActive()); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Invoked from the nested message loop. 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DragToSeparateWindowStep2(DetachToBrowserTabDragControllerTest* test, 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* not_attached_tab_strip, 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* target_tab_strip) { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(not_attached_tab_strip->IsDragSessionActive()); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(target_tab_strip->IsDragSessionActive()); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(TabDragController::IsActive()); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag to target_tab_strip. This should stop the nested loop from dragging 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the window. 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point target_point(target_tab_strip->width() -1, 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_tab_strip->height() / 2); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View::ConvertPointToScreen(target_tab_strip, &target_point); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test->DragInputToAsync(target_point)); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 413a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if defined(OS_WIN) && defined(USE_AURA) 414a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#define MAYBE_DragToSeparateWindow DISABLED_DragToSeparateWindow 415a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#else 416a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#define MAYBE_DragToSeparateWindow DragToSeparateWindow 417a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif 418a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates two browsers, drags from first into second. 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(DetachToBrowserTabDragControllerTest, 421a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MAYBE_DragToSeparateWindow) { 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip = GetTabStripForBrowser(browser()); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add another tab to browser(). 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddTabAndResetBrowser(browser()); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create another browser. 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser2 = CreateAnotherWindowBrowserAndRelayout(); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip2 = GetTabStripForBrowser(browser2); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to the first tab and drag it enough so that it detaches, but not 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enough that it attaches to browser2. 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point tab_0_center(GetCenterInScreenCoordinates(tab_strip->tab_at(0))); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PressInput(tab_0_center)); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(DragInputToNotifyWhenDone( 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_0_center.x(), tab_0_center.y() + GetDetachY(tab_strip), 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&DragToSeparateWindowStep2, 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, tab_strip, tab_strip2))); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuitWhenNotDragging(); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should now be attached to tab_strip2. 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(tab_strip2->IsDragSessionActive()); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip->IsDragSessionActive()); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(TabDragController::IsActive()); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetTrackedByWorkspace(browser())); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Release the mouse, stopping the drag session. 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ReleaseInput()); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip2->IsDragSessionActive()); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip->IsDragSessionActive()); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(TabDragController::IsActive()); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100 0", IDString(browser2->tab_strip_model())); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("1", IDString(browser()->tab_strip_model())); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetTrackedByWorkspace(browser2)); 45590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 45690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Both windows should not be maximized 45790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(browser()->window()->IsMaximized()); 45890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(browser2->window()->IsMaximized()); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DetachToOwnWindowStep2(DetachToBrowserTabDragControllerTest* test) { 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (test->input_source() == INPUT_SOURCE_TOUCH) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test->ReleaseInput()); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_ASH) && !defined(OS_WIN) // TODO(win_ash) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsWindowPositionManaged(aura::Window* window) { 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ash::wm::IsWindowPositionManaged(window); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HasUserChangedWindowPositionOrSize(aura::Window* window) { 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ash::wm::HasUserChangedWindowPositionOrSize(window); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsWindowPositionManaged(gfx::NativeWindow window) { 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HasUserChangedWindowPositionOrSize(gfx::NativeWindow window) { 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Drags from browser to separate window and releases mouse. 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(DetachToBrowserTabDragControllerTest, 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DetachToOwnWindow) { 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect initial_bounds(browser()->window()->GetBounds()); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add another tab. 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddTabAndResetBrowser(browser()); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip = GetTabStripForBrowser(browser()); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to the first tab and drag it enough so that it detaches. 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point tab_0_center( 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCenterInScreenCoordinates(tab_strip->tab_at(0))); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PressInput(tab_0_center)); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(DragInputToNotifyWhenDone( 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_0_center.x(), tab_0_center.y() + GetDetachY(tab_strip), 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&DetachToOwnWindowStep2, this))); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input_source() == INPUT_SOURCE_MOUSE) { 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ReleaseMouseAsync()); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuitWhenNotDragging(); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should no longer be dragging. 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip->IsDragSessionActive()); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(TabDragController::IsActive()); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There should now be another browser. 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2u, native_browser_list->size()); 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* new_browser = native_browser_list->get(1); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(new_browser->window()->IsActive()); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip2 = GetTabStripForBrowser(new_browser); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip2->IsDragSessionActive()); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0", IDString(new_browser->tab_strip_model())); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("1", IDString(browser()->tab_strip_model())); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The bounds of the initial window should not have changed. 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(initial_bounds.ToString(), 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->window()->GetBounds().ToString()); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetTrackedByWorkspace(browser())); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetTrackedByWorkspace(new_browser)); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // After this both windows should still be managable. 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsWindowPositionManaged(browser()->window()->GetNativeWindow())); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsWindowPositionManaged( 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_browser->window()->GetNativeWindow())); 53090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 53190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Both windows should not be maximized 53290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(browser()->window()->IsMaximized()); 53390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(new_browser->window()->IsMaximized()); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Drags from browser to separate window and releases mouse. 5377dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_P(DetachToBrowserTabDragControllerTest, 5387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DetachToOwnWindowFromMaximizedWindow) { 5397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!TabDragController::ShouldDetachIntoNewBrowser()) { 5407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch VLOG(1) 5417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch << "Skipping DetachToOwnWindowFromMaximizedWindow on this platform."; 5427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 5437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 5447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Maximize the initial browser window. 5467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch browser()->window()->Maximize(); 5477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(browser()->window()->IsMaximized()); 5487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Add another tab. 5507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch AddTabAndResetBrowser(browser()); 5517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch TabStrip* tab_strip = GetTabStripForBrowser(browser()); 5527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Move to the first tab and drag it enough so that it detaches. 5547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch gfx::Point tab_0_center( 5557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetCenterInScreenCoordinates(tab_strip->tab_at(0))); 5567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(PressInput(tab_0_center)); 5577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(DragInputToNotifyWhenDone( 5587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch tab_0_center.x(), tab_0_center.y() + GetDetachY(tab_strip), 5597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind(&DetachToOwnWindowStep2, this))); 5607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (input_source() == INPUT_SOURCE_MOUSE) { 5617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(ReleaseMouseAsync()); 5627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch QuitWhenNotDragging(); 5637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 5647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Should no longer be dragging. 5667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_FALSE(tab_strip->IsDragSessionActive()); 5677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_FALSE(TabDragController::IsActive()); 5687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // There should now be another browser. 5707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_EQ(2u, native_browser_list->size()); 5717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Browser* new_browser = native_browser_list->get(1); 5727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_TRUE(new_browser->window()->IsActive()); 5737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch TabStrip* tab_strip2 = GetTabStripForBrowser(new_browser); 5747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ASSERT_FALSE(tab_strip2->IsDragSessionActive()); 5757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ("0", IDString(new_browser->tab_strip_model())); 5777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ("1", IDString(browser()->tab_strip_model())); 5787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The bounds of the initial window should not have changed. 5807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(browser()->window()->IsMaximized()); 5817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(GetTrackedByWorkspace(browser())); 5837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(GetTrackedByWorkspace(new_browser)); 5847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // After this both windows should still be managable. 5857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(IsWindowPositionManaged(browser()->window()->GetNativeWindow())); 5867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(IsWindowPositionManaged( 5877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch new_browser->window()->GetNativeWindow())); 5887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The new window should not be maximized. 5907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(new_browser->window()->IsMaximized()); 5917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 5927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Deletes a tab being dragged before the user moved enough to start a drag. 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(DetachToBrowserTabDragControllerTest, 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteBeforeStartedDragging) { 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add another tab. 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddTabAndResetBrowser(browser()); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip = GetTabStripForBrowser(browser()); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Click on the first tab, but don't move it. 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point tab_0_center(GetCenterInScreenCoordinates(tab_strip->tab_at(0))); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PressInput(tab_0_center)); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should be dragging. 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(tab_strip->IsDragSessionActive()); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(TabDragController::IsActive()); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the tab being dragged. 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete browser()->tab_strip_model()->GetWebContentsAt(0); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should have canceled dragging. 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip->IsDragSessionActive()); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(TabDragController::IsActive()); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("1", IDString(browser()->tab_strip_model())); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetTrackedByWorkspace(browser())); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Deletes a tab being dragged while still attached. 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(DetachToBrowserTabDragControllerTest, 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteTabWhileAttached) { 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add another tab. 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddTabAndResetBrowser(browser()); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip = GetTabStripForBrowser(browser()); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Click on the first tab and move it enough so that it starts dragging but is 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // still attached. 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point tab_0_center(GetCenterInScreenCoordinates(tab_strip->tab_at(0))); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PressInput(tab_0_center)); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(DragInputTo( 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(tab_0_center.x() + 20, tab_0_center.y()))); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should be dragging. 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(tab_strip->IsDragSessionActive()); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(TabDragController::IsActive()); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the tab being dragged. 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete browser()->tab_strip_model()->GetWebContentsAt(0); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should have canceled dragging. 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip->IsDragSessionActive()); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(TabDragController::IsActive()); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("1", IDString(browser()->tab_strip_model())); 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetTrackedByWorkspace(browser())); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeleteWhileDetachedStep2(WebContents* tab) { 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete tab; 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Deletes a tab being dragged after dragging a tab so that a new window is 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// created. 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(DetachToBrowserTabDragControllerTest, 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteTabWhileDetached) { 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add another tab. 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddTabAndResetBrowser(browser()); 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip = GetTabStripForBrowser(browser()); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to the first tab and drag it enough so that it detaches. 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point tab_0_center(GetCenterInScreenCoordinates(tab_strip->tab_at(0))); 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* to_delete = 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetWebContentsAt(0); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PressInput(tab_0_center)); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(DragInputToNotifyWhenDone( 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_0_center.x(), tab_0_center.y() + GetDetachY(tab_strip), 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&DeleteWhileDetachedStep2, to_delete))); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuitWhenNotDragging(); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should not be dragging. 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip->IsDragSessionActive()); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(TabDragController::IsActive()); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("1", IDString(browser()->tab_strip_model())); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetTrackedByWorkspace(browser())); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DeleteSourceDetachedStep2(WebContents* tab, 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BrowserList* browser_list) { 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2u, browser_list->size()); 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* new_browser = browser_list->get(1); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This ends up closing the source window. 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete tab; 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel the drag. 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_controls::SendKeyPress(new_browser->window()->GetNativeWindow(), 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::VKEY_ESCAPE, false, false, false, false); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Detaches a tab and while detached deletes a tab from the source so that the 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// source window closes then presses escape to cancel the drag. 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(DetachToBrowserTabDragControllerTest, 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteSourceDetached) { 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add another tab. 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddTabAndResetBrowser(browser()); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip = GetTabStripForBrowser(browser()); 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to the first tab and drag it enough so that it detaches. 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point tab_0_center(GetCenterInScreenCoordinates(tab_strip->tab_at(0))); 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* to_delete = browser()->tab_strip_model()->GetWebContentsAt(1); 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PressInput(tab_0_center)); 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(DragInputToNotifyWhenDone( 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_0_center.x(), tab_0_center.y() + GetDetachY(tab_strip), 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&DeleteSourceDetachedStep2, to_delete, native_browser_list))); 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuitWhenNotDragging(); 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should not be dragging. 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1u, native_browser_list->size()); 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* new_browser = native_browser_list->get(0); 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(GetTabStripForBrowser(new_browser)->IsDragSessionActive()); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(TabDragController::IsActive()); 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0", IDString(new_browser->tab_strip_model())); 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetTrackedByWorkspace(new_browser)); 72590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 72690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Remaining browser window should not be maximized 72790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(new_browser->window()->IsMaximized()); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PressEscapeWhileDetachedStep2(const BrowserList* browser_list) { 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2u, browser_list->size()); 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* new_browser = browser_list->get(1); 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_controls::SendKeyPress( 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_browser->window()->GetNativeWindow(), ui::VKEY_ESCAPE, false, false, 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false, false); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is disabled until NativeViewHost::Detach really detaches. 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Detaches a tab and while detached presses escape to revert the drag. 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(DetachToBrowserTabDragControllerTest, 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PressEscapeWhileDetached) { 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add another tab. 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddTabAndResetBrowser(browser()); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip = GetTabStripForBrowser(browser()); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to the first tab and drag it enough so that it detaches. 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point tab_0_center(GetCenterInScreenCoordinates(tab_strip->tab_at(0))); 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PressInput(tab_0_center)); 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(DragInputToNotifyWhenDone( 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_0_center.x(), tab_0_center.y() + GetDetachY(tab_strip), 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&PressEscapeWhileDetachedStep2, native_browser_list))); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuitWhenNotDragging(); 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should not be dragging. 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip->IsDragSessionActive()); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(TabDragController::IsActive()); 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And there should only be one window. 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, native_browser_list->size()); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0 1", IDString(browser()->tab_strip_model())); 76690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 76790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Remaining browser window should not be maximized 76890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(browser()->window()->IsMaximized()); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DragAllStep2(DetachToBrowserTabDragControllerTest* test, 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BrowserList* browser_list) { 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should only be one window. 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1u, browser_list->size()); 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (test->input_source() == INPUT_SOURCE_TOUCH) { 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test->ReleaseInput()); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test->ReleaseMouseAsync()); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Selects multiple tabs and starts dragging the window. 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(DetachToBrowserTabDragControllerTest, DragAll) { 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add another tab. 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddTabAndResetBrowser(browser()); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip = GetTabStripForBrowser(browser()); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->tab_strip_model()->AddTabAtToSelection(0); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->tab_strip_model()->AddTabAtToSelection(1); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to the first tab and drag it enough so that it would normally 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // detach. 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point tab_0_center(GetCenterInScreenCoordinates(tab_strip->tab_at(0))); 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PressInput(tab_0_center)); 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(DragInputToNotifyWhenDone( 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_0_center.x(), tab_0_center.y() + GetDetachY(tab_strip), 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&DragAllStep2, this, native_browser_list))); 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuitWhenNotDragging(); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should not be dragging. 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip->IsDragSessionActive()); 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(TabDragController::IsActive()); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And there should only be one window. 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, native_browser_list->size()); 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0 1", IDString(browser()->tab_strip_model())); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetTrackedByWorkspace(browser())); 81390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 81490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Remaining browser window should not be maximized 81590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(browser()->window()->IsMaximized()); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Invoked from the nested message loop. 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DragAllToSeparateWindowStep2(DetachToBrowserTabDragControllerTest* test, 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* attached_tab_strip, 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TabStrip* target_tab_strip, 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BrowserList* browser_list) { 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(attached_tab_strip->IsDragSessionActive()); 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(target_tab_strip->IsDragSessionActive()); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(TabDragController::IsActive()); 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2u, browser_list->size()); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag to target_tab_strip. This should stop the nested loop from dragging 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the window. 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point target_point(target_tab_strip->width() - 1, 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_tab_strip->height() / 2); 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View::ConvertPointToScreen(target_tab_strip, &target_point); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test->DragInputToAsync(target_point)); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates two browsers, selects all tabs in first and drags into second. 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(DetachToBrowserTabDragControllerTest, 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragAllToSeparateWindow) { 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip = GetTabStripForBrowser(browser()); 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add another tab to browser(). 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddTabAndResetBrowser(browser()); 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create another browser. 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser2 = CreateAnotherWindowBrowserAndRelayout(); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip2 = GetTabStripForBrowser(browser2); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->tab_strip_model()->AddTabAtToSelection(0); 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->tab_strip_model()->AddTabAtToSelection(1); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to the first tab and drag it enough so that it detaches, but not 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enough that it attaches to browser2. 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point tab_0_center( 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCenterInScreenCoordinates(tab_strip->tab_at(0))); 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PressInput(tab_0_center)); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(DragInputToNotifyWhenDone( 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_0_center.x(), tab_0_center.y() + GetDetachY(tab_strip), 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&DragAllToSeparateWindowStep2, this, tab_strip, tab_strip2, 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) native_browser_list))); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuitWhenNotDragging(); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should now be attached to tab_strip2. 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(tab_strip2->IsDragSessionActive()); 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(TabDragController::IsActive()); 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1u, native_browser_list->size()); 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Release the mouse, stopping the drag session. 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ReleaseInput()); 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip2->IsDragSessionActive()); 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(TabDragController::IsActive()); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100 0 1", IDString(browser2->tab_strip_model())); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetTrackedByWorkspace(browser2)); 87890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 87990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Remaining browser window should not be maximized 88090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(browser2->window()->IsMaximized()); 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Invoked from the nested message loop. 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DragAllToSeparateWindowAndCancelStep2( 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DetachToBrowserTabDragControllerTest* test, 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* attached_tab_strip, 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TabStrip* target_tab_strip, 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BrowserList* browser_list) { 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(attached_tab_strip->IsDragSessionActive()); 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(target_tab_strip->IsDragSessionActive()); 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(TabDragController::IsActive()); 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2u, browser_list->size()); 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag to target_tab_strip. This should stop the nested loop from dragging 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the window. 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point target_point(target_tab_strip->width() - 1, 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_tab_strip->height() / 2); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View::ConvertPointToScreen(target_tab_strip, &target_point); 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test->DragInputToAsync(target_point)); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates two browsers, selects all tabs in first, drags into second, then hits 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// escape. 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(DetachToBrowserTabDragControllerTest, 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragAllToSeparateWindowAndCancel) { 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip = GetTabStripForBrowser(browser()); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add another tab to browser(). 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddTabAndResetBrowser(browser()); 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create another browser. 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser2 = CreateAnotherWindowBrowserAndRelayout(); 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip2 = GetTabStripForBrowser(browser2); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->tab_strip_model()->AddTabAtToSelection(0); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->tab_strip_model()->AddTabAtToSelection(1); 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to the first tab and drag it enough so that it detaches, but not 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enough that it attaches to browser2. 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point tab_0_center( 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCenterInScreenCoordinates(tab_strip->tab_at(0))); 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PressInput(tab_0_center)); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(DragInputToNotifyWhenDone( 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_0_center.x(), tab_0_center.y() + GetDetachY(tab_strip), 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&DragAllToSeparateWindowAndCancelStep2, this, 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip, tab_strip2, native_browser_list))); 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuitWhenNotDragging(); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should now be attached to tab_strip2. 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(tab_strip2->IsDragSessionActive()); 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(TabDragController::IsActive()); 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1u, native_browser_list->size()); 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel the drag. 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ui_test_utils::SendKeyPressSync( 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser2, ui::VKEY_ESCAPE, false, false, false, false)); 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip2->IsDragSessionActive()); 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(TabDragController::IsActive()); 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100 0 1", IDString(browser2->tab_strip_model())); 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // browser() will have been destroyed, but browser2 should remain. 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1u, native_browser_list->size()); 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetTrackedByWorkspace(browser2)); 95090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 95190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Remaining browser window should not be maximized 95290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(browser2->window()->IsMaximized()); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates two browsers, drags from first into the second in such a way that 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// no detaching should happen. 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(DetachToBrowserTabDragControllerTest, 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragDirectlyToSecondWindow) { 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip = GetTabStripForBrowser(browser()); 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add another tab to browser(). 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddTabAndResetBrowser(browser()); 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create another browser. 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser2 = CreateAnotherWindowBrowserAndRelayout(); 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip2 = GetTabStripForBrowser(browser2); 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move the tabstrip down enough so that we can detach. 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds(browser2->window()->GetBounds()); 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.Offset(0, 100); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser2->window()->SetBounds(bounds); 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to the first tab and drag it enough so that it detaches, but not 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enough that it attaches to browser2. 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point tab_0_center(GetCenterInScreenCoordinates(tab_strip->tab_at(0))); 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PressInput(tab_0_center)); 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point b2_location(5, 0); 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View::ConvertPointToScreen(tab_strip2, &b2_location); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(DragInputTo(b2_location)); 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should now be attached to tab_strip2. 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(tab_strip2->IsDragSessionActive()); 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip->IsDragSessionActive()); 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(TabDragController::IsActive()); 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Release the mouse, stopping the drag session. 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ReleaseInput()); 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip2->IsDragSessionActive()); 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip->IsDragSessionActive()); 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(TabDragController::IsActive()); 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0 100", IDString(browser2->tab_strip_model())); 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("1", IDString(browser()->tab_strip_model())); 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetTrackedByWorkspace(browser())); 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetTrackedByWorkspace(browser2)); 99790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 99890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Both windows should not be maximized 99990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(browser()->window()->IsMaximized()); 100090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(browser2->window()->IsMaximized()); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates two browsers, the first browser has a single tab and drags into the 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// second browser. 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(DetachToBrowserTabDragControllerTest, 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragSingleTabToSeparateWindow) { 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip = GetTabStripForBrowser(browser()); 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetIDs(browser()->tab_strip_model(), 0); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create another browser. 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser2 = CreateAnotherWindowBrowserAndRelayout(); 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip2 = GetTabStripForBrowser(browser2); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect initial_bounds(browser2->window()->GetBounds()); 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to the first tab and drag it enough so that it detaches, but not 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enough that it attaches to browser2. 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point tab_0_center( 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCenterInScreenCoordinates(tab_strip->tab_at(0))); 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PressInput(tab_0_center)); 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(DragInputToNotifyWhenDone( 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_0_center.x(), tab_0_center.y() + GetDetachY(tab_strip), 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&DragAllToSeparateWindowStep2, this, tab_strip, tab_strip2, 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) native_browser_list))); 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuitWhenNotDragging(); 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should now be attached to tab_strip2. 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(tab_strip2->IsDragSessionActive()); 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(TabDragController::IsActive()); 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1u, native_browser_list->size()); 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Release the mouse, stopping the drag session. 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ReleaseInput()); 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip2->IsDragSessionActive()); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(TabDragController::IsActive()); 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("100 0", IDString(browser2->tab_strip_model())); 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetTrackedByWorkspace(browser2)); 103990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 104090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Remaining browser window should not be maximized 104190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(browser2->window()->IsMaximized()); 104290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure that the window is still managed and not user moved. 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsWindowPositionManaged(browser2->window()->GetNativeWindow())); 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(HasUserChangedWindowPositionOrSize( 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser2->window()->GetNativeWindow())); 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Also make sure that the drag to window position has not changed. 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(initial_bounds.ToString(), 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser2->window()->GetBounds().ToString()); 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Invoked from the nested message loop. 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CancelOnNewTabWhenDraggingStep2( 10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DetachToBrowserTabDragControllerTest* test, 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BrowserList* browser_list) { 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(TabDragController::IsActive()); 10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2u, browser_list->size()); 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Add another tab. This should trigger exiting the nested loop. 10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test->AddBlankTabAndShow(browser_list->GetLastActive()); 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Adds another tab, detaches into separate window, adds another tab and 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// verifies the run loop ends. 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(DetachToBrowserTabDragControllerTest, 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelOnNewTabWhenDragging) { 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip = GetTabStripForBrowser(browser()); 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add another tab to browser(). 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddTabAndResetBrowser(browser()); 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to the first tab and drag it enough so that it detaches. 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point tab_0_center( 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCenterInScreenCoordinates(tab_strip->tab_at(0))); 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PressInput(tab_0_center)); 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(DragInputToNotifyWhenDone( 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_0_center.x(), tab_0_center.y() + GetDetachY(tab_strip), 10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&CancelOnNewTabWhenDraggingStep2, this, native_browser_list))); 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuitWhenNotDragging(); 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should be two windows and not dragging. 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(TabDragController::IsActive()); 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2u, native_browser_list->size()); 108890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (chrome::BrowserIterator it; !it.done(); it.Next()) { 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(GetTrackedByWorkspace(*it)); 109090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Should not be maximized 109190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(it->window()->IsMaximized()); 109290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_ASH) && !defined(OS_WIN) // TODO(win_ash) 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DragInMaximizedWindowStep2(DetachToBrowserTabDragControllerTest* test, 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser, 11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TabStrip* tab_strip, 11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BrowserList* browser_list) { 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There should be another browser. 11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2u, browser_list->size()); 11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* new_browser = browser_list->get(1); 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(browser, new_browser); 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(new_browser->window()->IsActive()); 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip2 = GetTabStripForBrowser(new_browser); 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(tab_strip2->IsDragSessionActive()); 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip->IsDragSessionActive()); 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Both windows should be visible. 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tab_strip->GetWidget()->IsVisible()); 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(tab_strip2->GetWidget()->IsVisible()); 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stops dragging. 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test->ReleaseInput()); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates a browser with two tabs, maximizes it, drags the tab out. 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(DetachToBrowserTabDragControllerTest, 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragInMaximizedWindow) { 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddTabAndResetBrowser(browser()); 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->window()->Maximize(); 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip = GetTabStripForBrowser(browser()); 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to the first tab and drag it enough so that it detaches. 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point tab_0_center( 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCenterInScreenCoordinates(tab_strip->tab_at(0))); 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PressInput(tab_0_center)); 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(DragInputToNotifyWhenDone( 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_0_center.x(), tab_0_center.y() + GetDetachY(tab_strip), 11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&DragInMaximizedWindowStep2, this, browser(), tab_strip, 11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) native_browser_list))); 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuitWhenNotDragging(); 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(TabDragController::IsActive()); 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should be two browsers. 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2u, native_browser_list->size()); 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* new_browser = native_browser_list->get(1); 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(new_browser->window()->IsActive()); 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11485e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) EXPECT_TRUE(browser()->window()->GetNativeWindow()->IsVisible()); 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(new_browser->window()->GetNativeWindow()->IsVisible()); 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetTrackedByWorkspace(browser())); 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetTrackedByWorkspace(new_browser)); 115390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // The source window should be maximized, but the new window should now 11557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // be restored. 115690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(browser()->window()->IsMaximized()); 11577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_FALSE(new_browser->window()->IsMaximized()); 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Subclass of DetachToBrowserInSeparateDisplayTabDragControllerTest that 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// creates multiple displays. 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DetachToBrowserInSeparateDisplayTabDragControllerTest 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public DetachToBrowserTabDragControllerTest { 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DetachToBrowserInSeparateDisplayTabDragControllerTest() {} 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DetachToBrowserTabDragControllerTest::SetUpCommandLine(command_line); 116990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Make screens sufficiently wide to host 2 browsers side by side. 11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line->AppendSwitchASCII("ash-host-window-bounds", 117190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "0+0-600x600,601+0-600x600"); 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN( 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DetachToBrowserInSeparateDisplayTabDragControllerTest); 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 118190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void DragSingleTabToSeparateWindowInSecondDisplayStep3( 118290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DetachToBrowserTabDragControllerTest* test) { 118390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(test->ReleaseInput()); 118490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 118590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DragSingleTabToSeparateWindowInSecondDisplayStep2( 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DetachToBrowserTabDragControllerTest* test, 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& target_point) { 118990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(test->DragInputToNotifyWhenDone( 119090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) target_point.x(), target_point.y(), 119190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&DragSingleTabToSeparateWindowInSecondDisplayStep3, test))); 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Drags from browser to a second display and releases input. 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(DetachToBrowserInSeparateDisplayTabDragControllerTest, 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragSingleTabToSeparateWindowInSecondDisplay) { 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add another tab. 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddTabAndResetBrowser(browser()); 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip = GetTabStripForBrowser(browser()); 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to the first tab and drag it enough so that it detaches. 120490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Then drag it to the final destination on the second screen. 120590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Point tab_0_center(GetCenterInScreenCoordinates(tab_strip->tab_at(0))); 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PressInput(tab_0_center)); 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(DragInputToNotifyWhenDone( 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_0_center.x(), tab_0_center.y() + GetDetachY(tab_strip), 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&DragSingleTabToSeparateWindowInSecondDisplayStep2, 121090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) this, gfx::Point(600 + tab_0_center.x(), 121190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) tab_0_center.y() 121290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) + GetDetachY(tab_strip))))); 121390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) QuitWhenNotDragging(); 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should no longer be dragging. 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip->IsDragSessionActive()); 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(TabDragController::IsActive()); 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There should now be another browser. 12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2u, native_browser_list->size()); 12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* new_browser = native_browser_list->get(1); 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(new_browser->window()->IsActive()); 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip2 = GetTabStripForBrowser(new_browser); 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip2->IsDragSessionActive()); 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 122690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // This other browser should be on the second screen (with mouse drag) 122790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // With the touch input the browser cannot be dragged from one screen 122890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // to another and the window stays on the first screen. 122990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (input_source() == INPUT_SOURCE_MOUSE) { 123090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<aura::RootWindow*> roots(ash::Shell::GetAllRootWindows()); 123190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(2u, roots.size()); 123290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) aura::RootWindow* second_root = roots[1]; 123390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(second_root, 123490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new_browser->window()->GetNativeWindow()->GetRootWindow()); 123590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 123690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0", IDString(new_browser->tab_strip_model())); 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("1", IDString(browser()->tab_strip_model())); 123990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 124090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Both windows should not be maximized 124190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(browser()->window()->IsMaximized()); 124290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(new_browser->window()->IsMaximized()); 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Invoked from the nested message loop. 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DragTabToWindowInSeparateDisplayStep2( 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DetachToBrowserTabDragControllerTest* test, 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* not_attached_tab_strip, 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* target_tab_strip) { 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(not_attached_tab_strip->IsDragSessionActive()); 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(target_tab_strip->IsDragSessionActive()); 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(TabDragController::IsActive()); 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag to target_tab_strip. This should stop the nested loop from dragging 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the window. 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point target_point( 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCenterInScreenCoordinates(target_tab_strip->tab_at(0))); 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move it close to the beginning of the target tabstrip. 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_point.set_x( 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_point.x() - target_tab_strip->tab_at(0)->width() / 2 + 10); 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test->DragInputToAsync(target_point)); 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 126990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Drags from browser to another browser on a second display and releases input. 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(DetachToBrowserInSeparateDisplayTabDragControllerTest, 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DragTabToWindowInSeparateDisplay) { 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add another tab. 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddTabAndResetBrowser(browser()); 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip = GetTabStripForBrowser(browser()); 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create another browser. 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser2 = CreateBrowser(browser()->profile()); 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip2 = GetTabStripForBrowser(browser2); 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetIDs(browser2->tab_strip_model(), 100); 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move the second browser to the second display. 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::RootWindow*> roots(ash::Shell::GetAllRootWindows()); 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, roots.size()); 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::RootWindow* second_root = roots[1]; 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect work_area = gfx::Screen::GetNativeScreen()->GetDisplayNearestWindow( 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_root).work_area(); 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser2->window()->SetBounds(work_area); 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(second_root, 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser2->window()->GetNativeWindow()->GetRootWindow()); 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to the first tab and drag it enough so that it detaches, but not 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enough that it attaches to browser2. 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point tab_0_center(GetCenterInScreenCoordinates(tab_strip->tab_at(0))); 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PressInput(tab_0_center)); 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(DragInputToNotifyWhenDone( 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_0_center.x(), tab_0_center.y() + GetDetachY(tab_strip), 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&DragTabToWindowInSeparateDisplayStep2, 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, tab_strip, tab_strip2))); 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuitWhenNotDragging(); 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should now be attached to tab_strip2. 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(tab_strip2->IsDragSessionActive()); 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip->IsDragSessionActive()); 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(TabDragController::IsActive()); 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Release the mouse, stopping the drag session. 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ReleaseInput()); 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip2->IsDragSessionActive()); 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip->IsDragSessionActive()); 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(TabDragController::IsActive()); 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0 100", IDString(browser2->tab_strip_model())); 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("1", IDString(browser()->tab_strip_model())); 131390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 131490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Both windows should not be maximized 131590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(browser()->window()->IsMaximized()); 131690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(browser2->window()->IsMaximized()); 131790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 131890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 131990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Drags from browser to another browser on a second display and releases input. 132090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_P(DetachToBrowserInSeparateDisplayTabDragControllerTest, 132190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DragTabToWindowOnSecondDisplay) { 132290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Add another tab. 132390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddTabAndResetBrowser(browser()); 132490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TabStrip* tab_strip = GetTabStripForBrowser(browser()); 132590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 132690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Create another browser. 132790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Browser* browser2 = CreateBrowser(browser()->profile()); 132890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TabStrip* tab_strip2 = GetTabStripForBrowser(browser2); 132990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ResetIDs(browser2->tab_strip_model(), 100); 133090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 133190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Move both browsers to the second display. 133290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<aura::RootWindow*> roots(ash::Shell::GetAllRootWindows()); 133390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(2u, roots.size()); 133490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) aura::RootWindow* second_root = roots[1]; 133590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect work_area = gfx::Screen::GetNativeScreen()->GetDisplayNearestWindow( 133690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) second_root).work_area(); 133790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) browser()->window()->SetBounds(work_area); 133890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 133990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // position both browser windows side by side on the second screen. 134090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect work_area2(work_area); 134190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) work_area.set_width(work_area.width()/2); 134290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) browser()->window()->SetBounds(work_area); 134390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) work_area2.set_x(work_area2.x() + work_area2.width()/2); 134490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) work_area2.set_width(work_area2.width()/2); 134590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) browser2->window()->SetBounds(work_area2); 134690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(second_root, 134790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) browser()->window()->GetNativeWindow()->GetRootWindow()); 134890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(second_root, 134990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) browser2->window()->GetNativeWindow()->GetRootWindow()); 135090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 135190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Move to the first tab and drag it enough so that it detaches, but not 135290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // enough that it attaches to browser2. 135390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // SetEventGeneratorRootWindow sets correct (second) RootWindow 135490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Point tab_0_center(GetCenterInScreenCoordinates(tab_strip->tab_at(0))); 135590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetEventGeneratorRootWindow(tab_0_center); 135690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(PressInput(tab_0_center)); 135790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(DragInputToNotifyWhenDone( 135890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) tab_0_center.x(), tab_0_center.y() + GetDetachY(tab_strip), 135990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&DragTabToWindowInSeparateDisplayStep2, 136090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) this, tab_strip, tab_strip2))); 136190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) QuitWhenNotDragging(); 136290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 136390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Should now be attached to tab_strip2. 136490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(tab_strip2->IsDragSessionActive()); 136590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_FALSE(tab_strip->IsDragSessionActive()); 136690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(TabDragController::IsActive()); 136790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 136890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Release the mouse, stopping the drag session. 136990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(ReleaseInput()); 137090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_FALSE(tab_strip2->IsDragSessionActive()); 137190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_FALSE(tab_strip->IsDragSessionActive()); 137290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_FALSE(TabDragController::IsActive()); 137390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ("0 100", IDString(browser2->tab_strip_model())); 137490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ("1", IDString(browser()->tab_strip_model())); 137590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 137690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Both windows should not be maximized 137790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(browser()->window()->IsMaximized()); 137890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(browser2->window()->IsMaximized()); 137990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 138090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 138190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Drags from a maximized browser to another non-maximized browser on a second 138290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// display and releases input. 138390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_P(DetachToBrowserInSeparateDisplayTabDragControllerTest, 138490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DragMaxTabToNonMaxWindowInSeparateDisplay) { 138590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Add another tab. 138690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddTabAndResetBrowser(browser()); 138790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) browser()->window()->Maximize(); 138890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TabStrip* tab_strip = GetTabStripForBrowser(browser()); 138990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 139090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Create another browser on the second display. 139190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<aura::RootWindow*> roots(ash::Shell::GetAllRootWindows()); 139290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_EQ(2u, roots.size()); 139390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) aura::RootWindow* first_root = roots[0]; 139490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) aura::RootWindow* second_root = roots[1]; 139590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Rect work_area = gfx::Screen::GetNativeScreen()->GetDisplayNearestWindow( 139690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) second_root).work_area(); 139790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) work_area.Inset(20,20,20,60); 139890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Browser::CreateParams params(browser()->profile(), 1399eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch browser()->host_desktop_type()); 140090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.initial_show_state = ui::SHOW_STATE_NORMAL; 140190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) params.initial_bounds = work_area; 140290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Browser* browser2 = new Browser(params); 140390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AddBlankTabAndShow(browser2); 140490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 140590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) TabStrip* tab_strip2 = GetTabStripForBrowser(browser2); 140690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ResetIDs(browser2->tab_strip_model(), 100); 140790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 140890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(second_root, 140990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) browser2->window()->GetNativeWindow()->GetRootWindow()); 141090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(first_root, 141190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) browser()->window()->GetNativeWindow()->GetRootWindow()); 141290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(2, tab_strip->tab_count()); 141390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(1, tab_strip2->tab_count()); 141490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 141590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Move to the first tab and drag it enough so that it detaches, but not 141690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // enough that it attaches to browser2. 141790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Point tab_0_center(GetCenterInScreenCoordinates(tab_strip->tab_at(0))); 141890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(PressInput(tab_0_center)); 141990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(DragInputToNotifyWhenDone( 142090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) tab_0_center.x(), tab_0_center.y() + GetDetachY(tab_strip), 142190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&DragTabToWindowInSeparateDisplayStep2, 142290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) this, tab_strip, tab_strip2))); 142390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) QuitWhenNotDragging(); 142490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 142590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Should now be attached to tab_strip2. 142690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(tab_strip2->IsDragSessionActive()); 142790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_FALSE(tab_strip->IsDragSessionActive()); 142890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(TabDragController::IsActive()); 142990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 143090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Release the mouse, stopping the drag session. 143190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(ReleaseInput()); 143290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 143390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // tab should have moved 143490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(1, tab_strip->tab_count()); 143590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(2, tab_strip2->tab_count()); 143690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 143790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_FALSE(tab_strip2->IsDragSessionActive()); 143890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_FALSE(tab_strip->IsDragSessionActive()); 143990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_FALSE(TabDragController::IsActive()); 144090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ("0 100", IDString(browser2->tab_strip_model())); 144190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ("1", IDString(browser()->tab_strip_model())); 144290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 144390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Source browser should still be maximized, target should not 144490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(browser()->window()->IsMaximized()); 144590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(browser2->window()->IsMaximized()); 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Immersive fullscreen is ChromeOS only. 14497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if defined(OS_CHROMEOS) 14507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Drags from a restored browser to an immersive fullscreen browser on a 14517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// second display and releases input. 14527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(DetachToBrowserInSeparateDisplayTabDragControllerTest, 14537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DragTabToImmersiveBrowserOnSeparateDisplay) { 14547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ImmersiveFullscreenConfiguration::EnableImmersiveFullscreenForTest(); 14557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_TRUE(ImmersiveFullscreenConfiguration::UseImmersiveFullscreen()); 14567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 14577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Add another tab. 14587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AddTabAndResetBrowser(browser()); 14597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TabStrip* tab_strip = GetTabStripForBrowser(browser()); 14607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 14617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Create another browser. 14627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Browser* browser2 = CreateBrowser(browser()->profile()); 14637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) TabStrip* tab_strip2 = GetTabStripForBrowser(browser2); 14647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ResetIDs(browser2->tab_strip_model(), 100); 14657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 14667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Move the second browser to the second display. 14677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::vector<aura::RootWindow*> roots(ash::Shell::GetAllRootWindows()); 14687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_EQ(2u, roots.size()); 14697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) aura::RootWindow* second_root = roots[1]; 14707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Rect work_area = gfx::Screen::GetNativeScreen()->GetDisplayNearestWindow( 14717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) second_root).work_area(); 14727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) browser2->window()->SetBounds(work_area); 14737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(second_root, 14747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) browser2->window()->GetNativeWindow()->GetRootWindow()); 14757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 14767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Put the second browser into immersive fullscreen. 14777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) BrowserView* browser_view2 = BrowserView::GetBrowserViewForBrowser(browser2); 14787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ImmersiveModeControllerAsh* immersive_controller2 = 14797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) static_cast<ImmersiveModeControllerAsh*>( 14807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) browser_view2->immersive_mode_controller()); 14817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) immersive_controller2->DisableAnimationsForTest(); 14827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) chrome::ToggleFullscreenMode(browser2); 14837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_TRUE(immersive_controller2->IsEnabled()); 14847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_FALSE(immersive_controller2->IsRevealed()); 14857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_TRUE(tab_strip2->IsImmersiveStyle()); 14867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 14877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Move to the first tab and drag it enough so that it detaches, but not 14887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // enough that it attaches to browser2. 14897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) gfx::Point tab_0_center(GetCenterInScreenCoordinates(tab_strip->tab_at(0))); 14907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_TRUE(PressInput(tab_0_center)); 14917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_TRUE(DragInputToNotifyWhenDone( 14927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) tab_0_center.x(), tab_0_center.y() + GetDetachY(tab_strip), 14937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Bind(&DragTabToWindowInSeparateDisplayStep2, 14947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) this, tab_strip, tab_strip2))); 14957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) QuitWhenNotDragging(); 14967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 14977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Should now be attached to tab_strip2. 14987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_TRUE(tab_strip2->IsDragSessionActive()); 14997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_FALSE(tab_strip->IsDragSessionActive()); 15007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_TRUE(TabDragController::IsActive()); 15017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 15027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // browser2's top chrome should be revealed and the tab strip should be 15037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // at normal height while user is tragging tabs_strip2's tabs. 15047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_TRUE(immersive_controller2->IsRevealed()); 15057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_FALSE(tab_strip2->IsImmersiveStyle()); 15067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 15077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Release the mouse, stopping the drag session. 15087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_TRUE(ReleaseInput()); 15097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_FALSE(tab_strip2->IsDragSessionActive()); 15107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_FALSE(tab_strip->IsDragSessionActive()); 15117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_FALSE(TabDragController::IsActive()); 15127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ("0 100", IDString(browser2->tab_strip_model())); 15137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ("1", IDString(browser()->tab_strip_model())); 15147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 15157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // The first browser window should not be in immersive fullscreen. 15167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // browser2 should still be in immersive fullscreen, but the top chrome should 15177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // no longer be revealed. 15187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser()); 15197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(browser_view->immersive_mode_controller()->IsEnabled()); 15207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 15217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_TRUE(immersive_controller2->IsEnabled()); 15227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_FALSE(immersive_controller2->IsRevealed()); 15237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_TRUE(tab_strip2->IsImmersiveStyle()); 15247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 15257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif // OS_CHROMEOS 15267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DifferentDeviceScaleFactorDisplayTabDragControllerTest 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public DetachToBrowserTabDragControllerTest { 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DifferentDeviceScaleFactorDisplayTabDragControllerTest() {} 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DetachToBrowserTabDragControllerTest::SetUpCommandLine(command_line); 15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line->AppendSwitchASCII("ash-host-window-bounds", 15357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "400x400,0+400-800x800*2"); 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float GetCursorDeviceScaleFactor() const { 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::test::CursorManagerTestApi cursor_test_api( 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::Shell::GetInstance()->cursor_manager()); 15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return cursor_test_api.GetDisplay().device_scale_factor(); 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN( 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DifferentDeviceScaleFactorDisplayTabDragControllerTest); 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The points where a tab is dragged in CursorDeviceScaleFactorStep. 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const struct DragPoint { 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x; 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y; 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} kDragPoints[] = { 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {300, 200}, 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {399, 200}, 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {500, 200}, 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {400, 200}, 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {300, 200}, 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The expected device scale factors before the cursor is moved to the 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// corresponding kDragPoints in CursorDeviceScaleFactorStep. 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const float kDeviceScaleFactorExpectations[] = { 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1.0f, 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1.0f, 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2.0f, 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2.0f, 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1.0f, 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT( 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arraysize(kDragPoints) == arraysize(kDeviceScaleFactorExpectations), 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDragPoints_and_kDeviceScaleFactorExpectations_must_have_same_size); 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Drags tab to |kDragPoints[index]|, then calls the next step function. 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CursorDeviceScaleFactorStep( 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DifferentDeviceScaleFactorDisplayTabDragControllerTest* test, 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* not_attached_tab_strip, 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t index) { 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(not_attached_tab_strip->IsDragSessionActive()); 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(TabDragController::IsActive()); 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index < arraysize(kDragPoints)) { 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDeviceScaleFactorExpectations[index], 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test->GetCursorDeviceScaleFactor()); 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DragPoint p = kDragPoints[index]; 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test->DragInputToNotifyWhenDone( 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p.x, p.y, base::Bind(&CursorDeviceScaleFactorStep, 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test, not_attached_tab_strip, index + 1))); 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finishes a serise of CursorDeviceScaleFactorStep calls and ends drag. 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1.0f, test->GetCursorDeviceScaleFactor()); 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ui_test_utils::SendMouseEventsSync( 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_controls::LEFT, ui_controls::UP)); 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies cursor's device scale factor is updated when a tab is moved across 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// displays with different device scale factors (http://crbug.com/154183). 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(DifferentDeviceScaleFactorDisplayTabDragControllerTest, 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CursorDeviceScaleFactor) { 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add another tab. 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddTabAndResetBrowser(browser()); 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip = GetTabStripForBrowser(browser()); 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move the second browser to the second display. 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::RootWindow*> roots(ash::Shell::GetAllRootWindows()); 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, roots.size()); 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to the first tab and drag it enough so that it detaches. 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point tab_0_center(GetCenterInScreenCoordinates(tab_strip->tab_at(0))); 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PressInput(tab_0_center)); 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(DragInputToNotifyWhenDone( 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_0_center.x(), tab_0_center.y() + GetDetachY(tab_strip), 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&CursorDeviceScaleFactorStep, 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this, tab_strip, 0))); 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuitWhenNotDragging(); 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DetachToBrowserInSeparateDisplayAndCancelTabDragControllerTest 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public TabDragControllerTest { 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DetachToBrowserInSeparateDisplayAndCancelTabDragControllerTest() {} 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabDragControllerTest::SetUpCommandLine(command_line); 16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line->AppendSwitchASCII("ash-host-window-bounds", 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "0+0-250x250,251+0-250x250"); 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Press(const gfx::Point& position) { 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui_test_utils::SendMouseMoveSync(position) && 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::SendMouseEventsSync(ui_controls::LEFT, 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_controls::DOWN); 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool DragTabAndExecuteTaskWhenDone(const gfx::Point& position, 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& task) { 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui_controls::SendMouseMoveNotifyWhenDone( 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) position.x(), position.y(), task); 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void QuitWhenNotDragging() { 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test::QuitWhenNotDraggingImpl(); 1651b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::current()->Run(); 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN( 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DetachToBrowserInSeparateDisplayAndCancelTabDragControllerTest); 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Invoked from the nested message loop. 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CancelDragTabToWindowInSeparateDisplayStep3( 16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TabStrip* tab_strip, 16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BrowserList* browser_list) { 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip->IsDragSessionActive()); 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(TabDragController::IsActive()); 16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2u, browser_list->size()); 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Switching display mode should cancel the drag operation. 166890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ash::internal::DisplayManager* display_manager = 166990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ash::Shell::GetInstance()->display_manager(); 167090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) display_manager->AddRemoveDisplay(); 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Invoked from the nested message loop. 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CancelDragTabToWindowInSeparateDisplayStep2( 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DetachToBrowserInSeparateDisplayAndCancelTabDragControllerTest* test, 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip, 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::RootWindow* current_root, 16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point final_destination, 16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BrowserList* browser_list) { 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip->IsDragSessionActive()); 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(TabDragController::IsActive()); 16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2u, browser_list->size()); 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* new_browser = browser_list->get(1); 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(current_root, 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_browser->window()->GetNativeWindow()->GetRootWindow()); 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(test->DragTabAndExecuteTaskWhenDone( 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final_destination, 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&CancelDragTabToWindowInSeparateDisplayStep3, 16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_strip, browser_list))); 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Drags from browser to a second display and releases input. 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F( 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DetachToBrowserInSeparateDisplayAndCancelTabDragControllerTest, 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelDragTabToWindowIn2ndDisplay) { 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add another tab. 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddTabAndResetBrowser(browser()); 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip = GetTabStripForBrowser(browser()); 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0 1", IDString(browser()->tab_strip_model())); 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move the second browser to the second display. 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::RootWindow*> roots(ash::Shell::GetAllRootWindows()); 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, roots.size()); 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point final_destination = 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Screen::GetNativeScreen()->GetDisplayNearestWindow( 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) roots[1]).work_area().CenterPoint(); 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to the first tab and drag it enough so that it detaches, but not 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enough to move to another display. 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point tab_0_dst(GetCenterInScreenCoordinates(tab_strip->tab_at(0))); 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Press(tab_0_dst)); 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_0_dst.Offset(0, GetDetachY(tab_strip)); 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(DragTabAndExecuteTaskWhenDone( 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_0_dst, base::Bind(&CancelDragTabToWindowInSeparateDisplayStep2, 17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, tab_strip, roots[0], final_destination, 17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) native_browser_list))); 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuitWhenNotDragging(); 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1u, native_browser_list->size()); 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip->IsDragSessionActive()); 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(TabDragController::IsActive()); 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0 1", IDString(browser()->tab_strip_model())); 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Release the mouse 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ui_test_utils::SendMouseEventsSync( 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_controls::LEFT, ui_controls::UP)); 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Drags from browser from a second display to primary and releases input. 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F( 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DetachToBrowserInSeparateDisplayAndCancelTabDragControllerTest, 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelDragTabToWindowIn1stDisplay) { 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::RootWindow*> roots(ash::Shell::GetAllRootWindows()); 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, roots.size()); 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add another tab. 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddTabAndResetBrowser(browser()); 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabStrip* tab_strip = GetTabStripForBrowser(browser()); 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0 1", IDString(browser()->tab_strip_model())); 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(roots[0], browser()->window()->GetNativeWindow()->GetRootWindow()); 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect work_area = gfx::Screen::GetNativeScreen()-> 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetDisplayNearestWindow(roots[1]).work_area(); 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->window()->SetBounds(work_area); 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(roots[1], browser()->window()->GetNativeWindow()->GetRootWindow()); 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move the second browser to the display. 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point final_destination = 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Screen::GetNativeScreen()->GetDisplayNearestWindow( 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) roots[0]).work_area().CenterPoint(); 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move to the first tab and drag it enough so that it detaches, but not 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enough to move to another display. 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point tab_0_dst(GetCenterInScreenCoordinates(tab_strip->tab_at(0))); 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(Press(tab_0_dst)); 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_0_dst.Offset(0, GetDetachY(tab_strip)); 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(DragTabAndExecuteTaskWhenDone( 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_0_dst, base::Bind(&CancelDragTabToWindowInSeparateDisplayStep2, 17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, tab_strip, roots[1], final_destination, 17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) native_browser_list))); 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuitWhenNotDragging(); 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1u, native_browser_list->size()); 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(tab_strip->IsDragSessionActive()); 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(TabDragController::IsActive()); 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("0 1", IDString(browser()->tab_strip_model())); 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Release the mouse 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ui_test_utils::SendMouseEventsSync( 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_controls::LEFT, ui_controls::UP)); 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_ASH) && !defined(OS_WIN) // TODO(win_ash) 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(TabDragging, 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DetachToBrowserInSeparateDisplayTabDragControllerTest, 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::testing::Values("mouse", "touch")); 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(TabDragging, 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DifferentDeviceScaleFactorDisplayTabDragControllerTest, 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::testing::Values("mouse")); 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(TabDragging, 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DetachToBrowserTabDragControllerTest, 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::testing::Values("mouse", "touch")); 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(TabDragging, 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DetachToBrowserTabDragControllerTest, 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::testing::Values("mouse")); 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1796