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, &center);
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