1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/command_line.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_util.h"
7513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/app/chrome_command_ids.h"
821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/view_ids.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_paths.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/automation/tab_proxy.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/automation/browser_proxy.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/automation/window_proxy.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/ui/ui_test.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_util.h"
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/rect.h"
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/events/event.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#if defined(OS_LINUX)
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This test doesn't make sense on chromeos as chromeos doesn't allow dragging
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// tabs out.
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define MAYBE_Tab2OutOfTabStrip DISABLED_Tab2OutOfTabStrip
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
24513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Flaky, http://crbug.com/62311.
25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#define MAYBE_Tab2OutOfTabStrip FLAKY_Tab2OutOfTabStrip
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_LINUX)
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Disabled on Toolkit views bot. See http://crbug.com/42614
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define MAYBE_Tab1Tab3Escape DISABLED_Tab1Tab3Escape
31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#elif defined(OS_WIN)
32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Disabled on Windows. See http://crbug.com/57687
33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#define MAYBE_Tab1Tab3Escape DISABLED_Tab1Tab3Escape
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#define MAYBE_Tab1Tab3Escape Tab1Tab3Escape
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// These tests fail on Linux because we haven't implemented all of tab dragging
393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// (it's not needed on chromeos). See http://crbug.com/10941
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_LINUX)
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#define MAYBE_Tab1Tab2 DISABLED_Tab1Tab2
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#define MAYBE_Tab1Tab3 DISABLED_Tab1Tab3
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
44513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Flaky, http://crbug.com/62311.
45513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#define MAYBE_Tab1Tab2 FLAKY_Tab1Tab2
46513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#define MAYBE_Tab1Tab3 FLAKY_Tab1Tab3
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TabDraggingTest : public UITest {
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabDraggingTest() {
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    show_window_ = true;
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Automated UI test to open three tabs in a new window, and drag Tab_1 into
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the position of Tab_2.
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TabDraggingTest, MAYBE_Tab1Tab2) {
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0));
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser.get());
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<WindowProxy> window(browser->GetWindow());
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window.get());
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get initial tab count.
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int initial_tab_count = 0;
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser->GetTabCount(&initial_tab_count));
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(1 == initial_tab_count);
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get Tab_1 which comes with the browser window.
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> tab1(browser->GetTab(0));
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab1.get());
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL tab1_url;
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab1->GetCurrentURL(&tab1_url));
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add Tab_2.
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL tab2_url("about:");
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser->AppendTab(tab2_url));
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> tab2(browser->GetTab(1));
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab2.get());
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add Tab_3.
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL tab3_url("about:plugins");
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser->AppendTab(tab3_url));
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> tab3(browser->GetTab(2));
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab3.get());
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure 3 tabs are open.
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(browser->WaitForTabCountToBecome(initial_tab_count + 2));
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get bounds for the tabs.
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect bounds1;
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window->GetViewBounds(VIEW_ID_TAB_0, &bounds1, false));
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds1.x());
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds1.width());
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds1.height());
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect bounds2;
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window->GetViewBounds(VIEW_ID_TAB_1, &bounds2, false));
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds2.width());
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds2.height());
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(bounds1.x(), bounds2.x());
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(bounds2.y(), bounds1.y());
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect bounds3;
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window->GetViewBounds(VIEW_ID_TAB_2, &bounds3, false));
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds3.width());
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds3.height());
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(bounds2.x(), bounds3.x());
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(bounds3.y(), bounds2.y());
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get url Bar bounds.
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect urlbar_bounds;
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window->GetViewBounds(VIEW_ID_LOCATION_BAR, &urlbar_bounds,
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    false));
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, urlbar_bounds.x());
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, urlbar_bounds.y());
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, urlbar_bounds.width());
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, urlbar_bounds.height());
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /*
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    TEST: Move Tab_1 to the position of Tab_2
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     ____________   ____________   ____________
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    /            \ /            \ /            \
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   |    Tab_1     |     Tab_2    |    Tab_3     |
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ---- ---- ---- ---- ---- ---- ---- ---- ----
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           x---- ---->
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                ____________
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               /     X      \
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              |    Tab_1     |
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               ---- ---- ----
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  */
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Point start(bounds1.x() + bounds1.width() / 2,
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   bounds1.y() + bounds1.height() / 2);
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Point end(start.x() + 2 * bounds1.width() / 3, start.y());
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser->SimulateDrag(start, end,
13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                    ui::EF_LEFT_BUTTON_DOWN,
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    false));
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now check for expected results.
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab1 = browser->GetTab(0);
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab1.get());
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL tab1_new_url;
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab1->GetCurrentURL(&tab1_new_url));
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab2 = browser->GetTab(1);
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab2.get());
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL tab2_new_url;
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab2->GetCurrentURL(&tab2_new_url));
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(tab1_url.spec(), tab2_new_url.spec());
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(tab2_url.spec(), tab1_new_url.spec());
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Drag Tab_1 into the position of Tab_3.
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TabDraggingTest, MAYBE_Tab1Tab3) {
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0));
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser.get());
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<WindowProxy> window(browser->GetWindow());
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window.get());
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get initial tab count.
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int initial_tab_count = 0;
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser->GetTabCount(&initial_tab_count));
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(1 == initial_tab_count);
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get Tab_1 which comes with the browser window.
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> tab1(browser->GetTab(0));
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab1.get());
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL tab1_url;
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab1->GetCurrentURL(&tab1_url));
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add Tab_2.
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL tab2_url("about:");
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser->AppendTab(tab2_url));
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> tab2(browser->GetTab(1));
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab2.get());
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add Tab_3.
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL tab3_url("about:plugins");
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser->AppendTab(tab3_url));
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> tab3(browser->GetTab(2));
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab3.get());
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure 3 tabs are open.
1863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(browser->WaitForTabCountToBecome(initial_tab_count + 2));
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get bounds for the tabs.
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect bounds1;
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window->GetViewBounds(VIEW_ID_TAB_0, &bounds1, false));
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds1.x());
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds1.width());
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds1.height());
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect bounds2;
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window->GetViewBounds(VIEW_ID_TAB_1, &bounds2, false));
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds2.width());
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds2.height());
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(bounds1.x(), bounds2.x());
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(bounds2.y(), bounds1.y());
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect bounds3;
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window->GetViewBounds(VIEW_ID_TAB_2, &bounds3, false));
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds3.width());
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds3.height());
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(bounds2.x(), bounds3.x());
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(bounds3.y(), bounds2.y());
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get url Bar bounds.
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect urlbar_bounds;
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window->GetViewBounds(VIEW_ID_LOCATION_BAR, &urlbar_bounds,
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    false));
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, urlbar_bounds.x());
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, urlbar_bounds.y());
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, urlbar_bounds.width());
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, urlbar_bounds.height());
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /*
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   TEST: Move Tab_1 to the middle position of Tab_3
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     ____________   ____________   ____________
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    /            \ /            \ /            \
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   |    Tab_1     |     Tab_2    |    Tab_3     |
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ---- ---- ---- ---- ---- ---- ---- ---- ----
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           x---- ---- ---- ---- ---- ---->
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    ____________
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   /     X      \
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  |    Tab_1     |
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   ---- ---- ----
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  */
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Point start(bounds1.x() + bounds1.width() / 2,
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   bounds1.y() + bounds1.height() / 2);
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Point end(start.x() + bounds1.width() / 2 + bounds2.width() +
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     bounds3.width() / 2,
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 start.y());
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser->SimulateDrag(start, end,
23772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                    ui::EF_LEFT_BUTTON_DOWN,
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    false));
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now check for expected results.
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab1 = browser->GetTab(0);
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab1.get());
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL tab1_new_url;
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab1->GetCurrentURL(&tab1_new_url));
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab2 = browser->GetTab(1);
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab2.get());
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL tab2_new_url;
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab2->GetCurrentURL(&tab2_new_url));
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab3 = browser->GetTab(2);
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab3.get());
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL tab3_new_url;
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab3->GetCurrentURL(&tab3_new_url));
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(tab1_new_url.spec(), tab2_url.spec());
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(tab2_new_url.spec(), tab3_url.spec());
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(tab3_new_url.spec(), tab1_url.spec());
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Drag Tab_1 into the position of Tab_3, and press ESCAPE before releasing the
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// left mouse button.
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TabDraggingTest, MAYBE_Tab1Tab3Escape) {
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0));
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser.get());
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<WindowProxy> window(browser->GetWindow());
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window.get());
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get initial tab count.
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int initial_tab_count = 0;
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser->GetTabCount(&initial_tab_count));
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(1 == initial_tab_count);
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get Tab_1 which comes with the browser window.
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> tab1(browser->GetTab(0));
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab1.get());
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL tab1_url;
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab1->GetCurrentURL(&tab1_url));
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add Tab_2.
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL tab2_url("about:blank");
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser->AppendTab(tab2_url));
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> tab2(browser->GetTab(1));
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab2.get());
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add Tab_3.
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL tab3_url("about:plugins");
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser->AppendTab(tab3_url));
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> tab3(browser->GetTab(2));
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab3.get());
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure 3 tabs are open.
2933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(browser->WaitForTabCountToBecome(initial_tab_count + 2));
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get bounds for the tabs.
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect bounds1;
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window->GetViewBounds(VIEW_ID_TAB_0, &bounds1, false));
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds1.x());
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds1.width());
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds1.height());
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect bounds2;
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window->GetViewBounds(VIEW_ID_TAB_1, &bounds2, false));
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds2.width());
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds2.height());
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(bounds1.x(), bounds2.x());
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(bounds2.y(), bounds1.y());
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect bounds3;
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window->GetViewBounds(VIEW_ID_TAB_2, &bounds3, false));
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds3.width());
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds3.height());
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(bounds2.x(), bounds3.x());
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(bounds3.y(), bounds2.y());
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get url Bar bounds.
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect urlbar_bounds;
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window->GetViewBounds(VIEW_ID_LOCATION_BAR, &urlbar_bounds,
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    false));
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, urlbar_bounds.x());
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, urlbar_bounds.y());
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, urlbar_bounds.width());
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, urlbar_bounds.height());
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /*
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   TEST: Move Tab_1 to the middle position of Tab_3
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     ____________   ____________   ____________
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    /            \ /            \ /            \
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   |    Tab_1     |     Tab_2    |    Tab_3     |
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ---- ---- ---- ---- ---- ---- ---- ---- ----
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           x---- ---- ---- ---- ---- ----> + ESCAPE
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    ____________
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   /     X      \
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  |    Tab_1     |
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   ---- ---- ----
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  */
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Point start(bounds1.x() + bounds1.width() / 2,
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   bounds1.y() + bounds1.height() / 2);
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Point end(start.x() + bounds1.width() / 2 + bounds2.width() +
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     bounds3.width() / 2,
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 start.y());
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Simulate drag with 'true' as the last parameter. This will interrupt
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // in-flight with Escape.
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser->SimulateDrag(start, end,
34772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                    ui::EF_LEFT_BUTTON_DOWN,
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    true));
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now check for expected results.
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab1 = browser->GetTab(0);
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab1.get());
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL tab1_new_url;
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab1->GetCurrentURL(&tab1_new_url));
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab2 = browser->GetTab(1);
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab2.get());
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL tab2_new_url;
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab2->GetCurrentURL(&tab2_new_url));
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab3 = browser->GetTab(2);
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab3.get());
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL tab3_new_url;
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab3->GetCurrentURL(&tab3_new_url));
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The tabs should be in their original positions.
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(tab1_new_url.spec(), tab1_url.spec());
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(tab2_new_url.spec(), tab2_url.spec());
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(tab3_new_url.spec(), tab3_url.spec());
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Drag Tab_2 out of the Tab strip. A new window should open with this tab.
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(TabDraggingTest, MAYBE_Tab2OutOfTabStrip) {
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0));
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser.get());
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<WindowProxy> window(browser->GetWindow());
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window.get());
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get initial tab count.
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int initial_tab_count = 0;
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser->GetTabCount(&initial_tab_count));
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(1 == initial_tab_count);
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get Tab_1 which comes with the browser window.
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> tab1(browser->GetTab(0));
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab1.get());
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL tab1_url;
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab1->GetCurrentURL(&tab1_url));
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add Tab_2.
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL tab2_url("about:version");
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser->AppendTab(tab2_url));
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> tab2(browser->GetTab(1));
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab2.get());
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add Tab_3.
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL tab3_url("about:plugins");
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser->AppendTab(tab3_url));
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> tab3(browser->GetTab(2));
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab3.get());
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure 3 tabs are opened.
4033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(browser->WaitForTabCountToBecome(initial_tab_count + 2));
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure all the tab URL specs are different.
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab1_url != tab2_url);
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab1_url != tab3_url);
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab2_url != tab3_url);
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get bounds for the tabs.
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect bounds1;
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window->GetViewBounds(VIEW_ID_TAB_0, &bounds1, false));
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds1.x());
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds1.width());
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds1.height());
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect bounds2;
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window->GetViewBounds(VIEW_ID_TAB_1, &bounds2, false));
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds2.width());
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds2.height());
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(bounds1.x(), bounds2.x());
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(bounds2.y(), bounds1.y());
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect bounds3;
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window->GetViewBounds(VIEW_ID_TAB_2, &bounds3, false));
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds3.width());
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, bounds3.height());
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(bounds2.x(), bounds3.x());
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(bounds3.y(), bounds2.y());
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get url Bar bounds.
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Rect urlbar_bounds;
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window->GetViewBounds(VIEW_ID_LOCATION_BAR, &urlbar_bounds,
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    false));
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, urlbar_bounds.x());
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, urlbar_bounds.y());
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, urlbar_bounds.width());
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_LT(0, urlbar_bounds.height());
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  /*
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   TEST: Move Tab_2 down, out of the tab strip.
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   This should result in the following:
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    1- Tab_3 shift left in place of Tab_2 in Window 1
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    2- Tab_1 to remain in its place
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    3- Tab_2 openes in a new window
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     ____________   ____________   ____________
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    /            \ /            \ /            \
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    |    Tab_1     |     Tab_2    |    Tab_3     |
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ---- ---- ---- ---- ---- ---- ---- ---- ----
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         x
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         |
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         |  (Drag this below, out of tab strip)
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         V
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    ____________
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   /     X      \
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  |    Tab_2     |   (New Window)
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  ---- ---- ---- ---- ---- ---- ----
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  */
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Point start(bounds2.x() + bounds2.width() / 2,
462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   bounds2.y() + bounds2.height() / 2);
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Point end(start.x(),
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 start.y() + 3 * urlbar_bounds.height());
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Simulate tab drag.
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser->SimulateDrag(start, end,
46872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                    ui::EF_LEFT_BUTTON_DOWN,
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    false));
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now, first make sure that the old window has only two tabs remaining.
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int new_tab_count = 0;
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser->GetTabCount(&new_tab_count));
474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(2, new_tab_count);
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get the two tabs - they are called Tab_1 and Tab_2 in the old window.
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab1 = browser->GetTab(0);
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab1.get());
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL tab1_new_url;
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab1->GetCurrentURL(&tab1_new_url));
481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab2 = browser->GetTab(1);
483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab2.get());
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL tab2_new_url;
485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab2->GetCurrentURL(&tab2_new_url));
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now check for proper shifting of tabs; i.e., Tab_3 in window 1 should
488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // shift left to the position of Tab_2; Tab_1 should stay where it was.
489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(tab1_new_url.spec(), tab1_url.spec());
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(tab2_new_url.spec(), tab3_url.spec());
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now check to make sure a new window has opened.
493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowserProxy> browser2(automation()->GetBrowserWindow(1));
494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser2.get());
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<WindowProxy> window2(browser2->GetWindow());
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window2.get());
497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure that the new window has only one tab.
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int tab_count_window_2 = 0;
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser2->GetTabCount(&tab_count_window_2));
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, tab_count_window_2);
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get Tab_1_2 which should be Tab_1 in Window 2.
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> tab1_2(browser2->GetTab(0));
505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab1_2.get());
506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL tab1_2_url;
507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab1_2->GetCurrentURL(&tab1_2_url));
508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Tab_1_2 of Window 2 should essentially be Tab_2 of Window 1.
510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(tab1_2_url.spec(), tab2_url.spec());
511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NE(tab1_2_url.spec(), tab1_url.spec());
512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NE(tab1_2_url.spec(), tab3_url.spec());
513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
514