Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "base/command_line.h" | |
| 6 #include "base/message_loop.h" | |
| 7 #include "base/message_loop_proxy.h" | |
| 8 #include "chrome/browser/ui/tabs/tab_strip_model.h" | |
| 9 #include "chrome/browser/ui/tabs/tab_strip_model_observer.h" | |
| 10 #include "chrome/browser/ui/views/ash/tab_scrubber.h" | |
|
sky
2013/01/28 19:25:29
nit: this should be your first include (same order
DaveMoore
2013/01/29 01:11:41
Done.
| |
| 11 #include "chrome/browser/ui/views/frame/browser_view.h" | |
| 12 #include "chrome/browser/ui/views/tabs/tab.h" | |
| 13 #include "chrome/browser/ui/views/tabs/tab_strip.h" | |
| 14 #include "chrome/common/chrome_switches.h" | |
| 15 #include "chrome/test/base/in_process_browser_test.h" | |
| 16 #include "chrome/test/base/ui_test_utils.h" | |
| 17 #include "content/public/browser/browser_thread.h" | |
| 18 #include "content/public/test/test_utils.h" | |
| 19 #include "ui/aura/test/event_generator.h" | |
| 20 #include "ui/aura/window.h" | |
| 21 | |
| 22 namespace { | |
| 23 | |
| 24 class TabScrubberTest : public InProcessBrowserTest, | |
| 25 public TabStripModelObserver { | |
| 26 public: | |
| 27 TabScrubberTest() | |
| 28 : tab_strip_(NULL), | |
| 29 event_generator_(NULL), | |
| 30 target_index_(-1) { | |
| 31 } | |
| 32 | |
| 33 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { | |
| 34 command_line->AppendSwitch(switches::kNaturalScrollDefault); | |
| 35 command_line->AppendSwitch(switches::kAshEnableTabScrubbing); | |
| 36 } | |
| 37 | |
| 38 virtual void SetUpOnMainThread() OVERRIDE { | |
| 39 aura::Window* window = browser()->window()->GetNativeWindow(); | |
| 40 BrowserView* browser_view = | |
| 41 BrowserView::GetBrowserViewForNativeWindow(window); | |
| 42 tab_strip_ = browser_view->tabstrip(); | |
| 43 browser()->tab_strip_model()->AddObserver(this); | |
|
sky
2013/01/28 19:25:29
You never remove this.
DaveMoore
2013/01/29 01:11:41
Done.
| |
| 44 aura::RootWindow* root = window->GetRootWindow(); | |
| 45 event_generator_ = new aura::test::EventGenerator(root, window); | |
| 46 event_generator_->set_post_events(true); | |
| 47 TabScrubber::GetInstance()->set_activation_delay( | |
| 48 base::TimeDelta::FromMilliseconds(0)); | |
| 49 } | |
| 50 | |
| 51 int GetStartX(int index, TabScrubber::Direction direction) { | |
| 52 return TabScrubber::GetStartPoint(tab_strip_, index, direction).x(); | |
| 53 } | |
| 54 | |
| 55 enum ScrubType { | |
| 56 EACH_TAB, | |
| 57 SKIP_TABS, | |
| 58 REPEAT_TABS, | |
| 59 }; | |
| 60 | |
| 61 void Scrub(int index, ScrubType scrub_type) { | |
| 62 activation_order_.clear(); | |
| 63 int active_index = browser()->tab_strip_model()->active_index(); | |
| 64 DCHECK(index - active_index != 0); | |
|
sky
2013/01/28 19:25:29
Don't use DCHECKs in tests, use EXPECT/ASSERT
DaveMoore
2013/01/29 01:11:41
Done.
| |
| 65 DCHECK(scrub_type != SKIP_TABS || ((index - active_index) % 2) == 0); | |
| 66 TabScrubber::Direction direction; | |
| 67 int increment; | |
| 68 if (index < active_index) { | |
| 69 direction = TabScrubber::LEFT; | |
| 70 increment = -1; | |
| 71 } else { | |
| 72 direction = TabScrubber::RIGHT; | |
| 73 increment = 1; | |
| 74 } | |
| 75 if (scrub_type == SKIP_TABS) | |
| 76 increment *= 2; | |
| 77 int last = GetStartX(active_index, direction); | |
| 78 std::vector<gfx::Point> offsets; | |
| 79 for (int i = active_index + increment; i != (index + increment); | |
| 80 i += increment) { | |
| 81 int tab_center = tab_strip_->tab_at(i)->bounds().CenterPoint().x(); | |
| 82 offsets.push_back(gfx::Point(tab_center - last, 0)); | |
| 83 last = GetStartX(i, direction); | |
| 84 if (scrub_type == REPEAT_TABS) { | |
| 85 offsets.push_back(gfx::Point(increment, 0)); | |
| 86 last += increment; | |
| 87 } | |
| 88 } | |
| 89 event_generator_->ScrollSequence(gfx::Point(0, 0), | |
| 90 base::TimeDelta::FromMilliseconds(100), | |
| 91 offsets, | |
| 92 3); | |
| 93 } | |
| 94 | |
| 95 void AddTabs(int num_tabs) { | |
| 96 for (int i = 0; i < num_tabs; ++i) | |
| 97 AddBlankTabAndShow(browser()); | |
| 98 ASSERT_EQ(num_tabs + 1, browser()->tab_strip_model()->count()); | |
| 99 ASSERT_EQ(num_tabs, browser()->tab_strip_model()->active_index()); | |
| 100 } | |
| 101 | |
| 102 void RunUntilTabActive(int target) { | |
| 103 base::RunLoop run_loop; | |
| 104 quit_closure_ = content::GetQuitTaskForRunLoop(&run_loop); | |
| 105 target_index_ = target; | |
| 106 content::RunThisRunLoop(&run_loop); | |
| 107 target_index_ = -1; | |
| 108 } | |
| 109 | |
| 110 // TabStripModelObserver overrides. | |
| 111 virtual void TabInsertedAt(content::WebContents* contents, | |
| 112 int index, | |
| 113 bool foreground) {} | |
| 114 virtual void TabClosingAt(TabStripModel* tab_strip_model, | |
| 115 content::WebContents* contents, | |
| 116 int index) {} | |
| 117 virtual void TabDetachedAt(content::WebContents* contents, int index) {} | |
| 118 virtual void TabDeactivated(content::WebContents* contents) {} | |
| 119 virtual void ActiveTabChanged(content::WebContents* old_contents, | |
| 120 content::WebContents* new_contents, | |
| 121 int index, | |
| 122 bool user_gesture) { | |
| 123 activation_order_.push_back(index); | |
| 124 if (index == target_index_) | |
| 125 quit_closure_.Run(); | |
| 126 } | |
| 127 | |
| 128 virtual void TabSelectionChanged(TabStripModel* tab_strip_model, | |
| 129 const ui::ListSelectionModel& old_model) {} | |
| 130 virtual void TabMoved(content::WebContents* contents, | |
| 131 int from_index, | |
| 132 int to_index) {} | |
| 133 virtual void TabChangedAt(content::WebContents* contents, | |
| 134 int index, | |
| 135 TabChangeType change_type) {} | |
| 136 virtual void TabReplacedAt(TabStripModel* tab_strip_model, | |
| 137 content::WebContents* old_contents, | |
| 138 content::WebContents* new_contents, | |
| 139 int index) {} | |
| 140 virtual void TabPinnedStateChanged(content::WebContents* contents, | |
| 141 int index) {} | |
| 142 virtual void TabMiniStateChanged(content::WebContents* contents, int index) {} | |
| 143 virtual void TabBlockedStateChanged(content::WebContents* contents, | |
| 144 int index) {} | |
| 145 virtual void TabStripEmpty() {} | |
| 146 virtual void TabStripModelDeleted() {} | |
| 147 | |
| 148 TabStrip* tab_strip_; | |
| 149 std::vector<int> activation_order_; | |
|
sky
2013/01/28 19:25:29
Would be nice to have a description for some of th
DaveMoore
2013/01/29 01:11:41
Done.
| |
| 150 aura::test::EventGenerator* event_generator_; | |
|
sky
2013/01/28 19:25:29
scoped_ptr?
DaveMoore
2013/01/29 01:11:41
Done.
| |
| 151 | |
| 152 private: | |
| 153 base::Closure quit_closure_; | |
| 154 int target_index_; | |
| 155 }; | |
|
sky
2013/01/28 19:25:29
DISALLOW_...
DaveMoore
2013/01/29 01:11:41
Done.
| |
| 156 | |
| 157 } // namespace | |
| 158 | |
| 159 // Swipe a single tab in each direction. | |
| 160 IN_PROC_BROWSER_TEST_F(TabScrubberTest, Single) { | |
| 161 AddTabs(1); | |
| 162 | |
| 163 Scrub(0, EACH_TAB); | |
| 164 RunUntilTabActive(0); | |
| 165 EXPECT_EQ(1U, activation_order_.size()); | |
| 166 EXPECT_EQ(0, activation_order_[0]); | |
| 167 EXPECT_EQ(0, browser()->tab_strip_model()->active_index()); | |
| 168 | |
| 169 Scrub(1, EACH_TAB); | |
| 170 RunUntilTabActive(1); | |
| 171 EXPECT_EQ(1U, activation_order_.size()); | |
| 172 EXPECT_EQ(1, activation_order_[0]); | |
| 173 EXPECT_EQ(1, browser()->tab_strip_model()->active_index()); | |
| 174 } | |
| 175 | |
| 176 // Swipe 4 tabs in each direction. Each of the tabs should become active. | |
| 177 IN_PROC_BROWSER_TEST_F(TabScrubberTest, Multi) { | |
| 178 AddTabs(4); | |
| 179 | |
| 180 Scrub(0, EACH_TAB); | |
| 181 RunUntilTabActive(0); | |
| 182 ASSERT_EQ(4U, activation_order_.size()); | |
| 183 EXPECT_EQ(3, activation_order_[0]); | |
| 184 EXPECT_EQ(2, activation_order_[1]); | |
| 185 EXPECT_EQ(1, activation_order_[2]); | |
| 186 EXPECT_EQ(0, activation_order_[3]); | |
| 187 EXPECT_EQ(0, browser()->tab_strip_model()->active_index()); | |
| 188 | |
| 189 Scrub(4, EACH_TAB); | |
| 190 RunUntilTabActive(4); | |
| 191 ASSERT_EQ(4U, activation_order_.size()); | |
| 192 EXPECT_EQ(1, activation_order_[0]); | |
| 193 EXPECT_EQ(2, activation_order_[1]); | |
| 194 EXPECT_EQ(3, activation_order_[2]); | |
| 195 EXPECT_EQ(4, activation_order_[3]); | |
| 196 EXPECT_EQ(4, browser()->tab_strip_model()->active_index()); | |
| 197 } | |
| 198 | |
| 199 // Swipe 4 tabs in each direction with an extra swipe within each. The same | |
| 200 // 4 tabs should become active. | |
| 201 IN_PROC_BROWSER_TEST_F(TabScrubberTest, Repeated) { | |
| 202 AddTabs(4); | |
| 203 | |
| 204 Scrub(0, REPEAT_TABS); | |
| 205 RunUntilTabActive(0); | |
| 206 ASSERT_EQ(4U, activation_order_.size()); | |
| 207 EXPECT_EQ(3, activation_order_[0]); | |
| 208 EXPECT_EQ(2, activation_order_[1]); | |
| 209 EXPECT_EQ(1, activation_order_[2]); | |
| 210 EXPECT_EQ(0, activation_order_[3]); | |
| 211 EXPECT_EQ(0, browser()->tab_strip_model()->active_index()); | |
| 212 | |
| 213 Scrub(4, REPEAT_TABS); | |
| 214 RunUntilTabActive(4); | |
| 215 ASSERT_EQ(4U, activation_order_.size()); | |
| 216 EXPECT_EQ(1, activation_order_[0]); | |
| 217 EXPECT_EQ(2, activation_order_[1]); | |
| 218 EXPECT_EQ(3, activation_order_[2]); | |
| 219 EXPECT_EQ(4, activation_order_[3]); | |
| 220 EXPECT_EQ(4, browser()->tab_strip_model()->active_index()); | |
| 221 } | |
| 222 | |
| 223 // Confirm that we get the last tab made active when we skip tabs. | |
| 224 // These tests have 5 total tabs. We will only received scroll events | |
| 225 // on tabs 0, 2 and 4. | |
| 226 IN_PROC_BROWSER_TEST_F(TabScrubberTest, Skipped) { | |
| 227 AddTabs(4); | |
| 228 | |
| 229 Scrub(0, SKIP_TABS); | |
| 230 RunUntilTabActive(0); | |
| 231 EXPECT_EQ(2U, activation_order_.size()); | |
| 232 EXPECT_EQ(2, activation_order_[0]); | |
| 233 EXPECT_EQ(0, activation_order_[1]); | |
| 234 EXPECT_EQ(0, browser()->tab_strip_model()->active_index()); | |
| 235 | |
| 236 Scrub(4, SKIP_TABS); | |
| 237 RunUntilTabActive(4); | |
| 238 EXPECT_EQ(2U, activation_order_.size()); | |
| 239 EXPECT_EQ(2, activation_order_[0]); | |
| 240 EXPECT_EQ(4, activation_order_[1]); | |
| 241 EXPECT_EQ(4, browser()->tab_strip_model()->active_index()); | |
| 242 } | |
| 243 | |
| 244 // Confirm that nothing happens when the swipe is small. | |
| 245 IN_PROC_BROWSER_TEST_F(TabScrubberTest, NoChange) { | |
| 246 AddTabs(1); | |
| 247 | |
| 248 event_generator_->ScrollSequence(gfx::Point(0, 0), | |
| 249 base::TimeDelta::FromMilliseconds(100), | |
| 250 -1, | |
| 251 0, | |
| 252 1, | |
| 253 3); | |
| 254 EXPECT_EQ(1, browser()->tab_strip_model()->active_index()); | |
| 255 | |
| 256 event_generator_->ScrollSequence(gfx::Point(0, 0), | |
| 257 base::TimeDelta::FromMilliseconds(100), | |
| 258 1, | |
| 259 0, | |
| 260 1, | |
| 261 3); | |
| 262 EXPECT_EQ(1, browser()->tab_strip_model()->active_index()); | |
| 263 } | |
| 264 | |
| 265 // Confirm that very large swipes go to the beginning and and of the tabstrip. | |
| 266 IN_PROC_BROWSER_TEST_F(TabScrubberTest, Bounds) { | |
| 267 AddTabs(1); | |
| 268 | |
| 269 event_generator_->ScrollSequence(gfx::Point(0, 0), | |
| 270 base::TimeDelta::FromMilliseconds(100), | |
| 271 -10000, | |
| 272 0, | |
| 273 1, | |
| 274 3); | |
| 275 RunUntilTabActive(0); | |
| 276 EXPECT_EQ(0, browser()->tab_strip_model()->active_index()); | |
| 277 | |
| 278 event_generator_->ScrollSequence(gfx::Point(0, 0), | |
| 279 base::TimeDelta::FromMilliseconds(100), | |
| 280 10000, | |
| 281 0, | |
| 282 1, | |
| 283 3); | |
| 284 RunUntilTabActive(1); | |
| 285 EXPECT_EQ(1, browser()->tab_strip_model()->active_index()); | |
| 286 } | |
| 287 | |
| 288 | |
| OLD | NEW |