slide_out_controller_unittest.cc 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547
  1. // Copyright 2018 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. #include "ui/views/animation/slide_out_controller.h"
  5. #include <memory>
  6. #include <utility>
  7. #include "base/memory/raw_ptr.h"
  8. #include "base/time/time.h"
  9. #include "ui/compositor/layer.h"
  10. #include "ui/views/animation/slide_out_controller_delegate.h"
  11. #include "ui/views/test/views_test_base.h"
  12. #include "ui/views/view.h"
  13. namespace views {
  14. namespace {
  15. constexpr int kSwipeControlWidth = 30; // px
  16. constexpr int kTargetWidth = 200; // px
  17. } // namespace
  18. class TestSlideOutControllerDelegate : public SlideOutControllerDelegate {
  19. public:
  20. explicit TestSlideOutControllerDelegate(View* target) : target_(target) {}
  21. ~TestSlideOutControllerDelegate() override = default;
  22. ui::Layer* GetSlideOutLayer() override { return target_->layer(); }
  23. void OnSlideStarted() override { ++slide_started_count_; }
  24. void OnSlideChanged(bool in_progress) override {
  25. slide_changed_last_value_ = in_progress;
  26. ++slide_changed_count_;
  27. }
  28. bool IsOnSlideChangedCalled() const { return (slide_changed_count_ > 0); }
  29. void OnSlideOut() override { ++slide_out_count_; }
  30. void reset() {
  31. slide_started_count_ = 0;
  32. slide_changed_count_ = 0;
  33. slide_out_count_ = 0;
  34. slide_changed_last_value_ = absl::nullopt;
  35. }
  36. absl::optional<bool> slide_changed_last_value_;
  37. int slide_started_count_ = 0;
  38. int slide_changed_count_ = 0;
  39. int slide_out_count_ = 0;
  40. private:
  41. const raw_ptr<View> target_;
  42. };
  43. class SlideOutControllerTest : public ViewsTestBase {
  44. public:
  45. SlideOutControllerTest() = default;
  46. ~SlideOutControllerTest() override = default;
  47. void SetUp() override {
  48. ViewsTestBase::SetUp();
  49. widget_ = std::make_unique<Widget>();
  50. Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
  51. params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
  52. params.bounds = gfx::Rect(50, 50, 650, 650);
  53. widget_->Init(std::move(params));
  54. View* root = widget_->GetRootView();
  55. View* target_ = new View();
  56. target_->SetPaintToLayer(ui::LAYER_TEXTURED);
  57. target_->SetSize(gfx::Size(kTargetWidth, 50));
  58. root->AddChildView(target_);
  59. widget_->Show();
  60. delegate_ = std::make_unique<TestSlideOutControllerDelegate>(target_);
  61. slide_out_controller_ =
  62. std::make_unique<SlideOutController>(target_, delegate_.get());
  63. }
  64. void TearDown() override {
  65. slide_out_controller_.reset();
  66. delegate_.reset();
  67. widget_.reset();
  68. ViewsTestBase::TearDown();
  69. }
  70. protected:
  71. SlideOutController* slide_out_controller() {
  72. return slide_out_controller_.get();
  73. }
  74. TestSlideOutControllerDelegate* delegate() { return delegate_.get(); }
  75. void PostSequentialGestureEvent(const ui::GestureEventDetails& details) {
  76. // Set the timestamp ahead one microsecond.
  77. sequential_event_timestamp_ += base::Microseconds(1);
  78. ui::GestureEvent gesture_event(
  79. 0, 0, ui::EF_NONE, base::TimeTicks() + sequential_event_timestamp_,
  80. details);
  81. slide_out_controller()->OnGestureEvent(&gesture_event);
  82. }
  83. void PostSequentialSwipeEvent(int swipe_amount) {
  84. PostSequentialGestureEvent(
  85. ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN));
  86. PostSequentialGestureEvent(
  87. ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_UPDATE, swipe_amount, 0));
  88. PostSequentialGestureEvent(
  89. ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_END));
  90. }
  91. private:
  92. std::unique_ptr<Widget> widget_;
  93. std::unique_ptr<SlideOutController> slide_out_controller_;
  94. std::unique_ptr<TestSlideOutControllerDelegate> delegate_;
  95. base::TimeDelta sequential_event_timestamp_;
  96. };
  97. TEST_F(SlideOutControllerTest, OnGestureEventAndDelegate) {
  98. PostSequentialGestureEvent(
  99. ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN));
  100. EXPECT_EQ(1, delegate()->slide_started_count_);
  101. EXPECT_FALSE(delegate()->IsOnSlideChangedCalled());
  102. EXPECT_EQ(0, delegate()->slide_out_count_);
  103. delegate()->reset();
  104. PostSequentialGestureEvent(
  105. ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_UPDATE));
  106. EXPECT_EQ(0, delegate()->slide_started_count_);
  107. EXPECT_TRUE(delegate()->IsOnSlideChangedCalled());
  108. EXPECT_TRUE(delegate()->slide_changed_last_value_.value());
  109. EXPECT_EQ(0, delegate()->slide_out_count_);
  110. delegate()->reset();
  111. PostSequentialGestureEvent(
  112. ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_END));
  113. EXPECT_EQ(0, delegate()->slide_started_count_);
  114. EXPECT_TRUE(delegate()->IsOnSlideChangedCalled());
  115. EXPECT_FALSE(delegate()->slide_changed_last_value_.value());
  116. EXPECT_EQ(0, delegate()->slide_out_count_);
  117. }
  118. TEST_F(SlideOutControllerTest, SlideOutAndClose) {
  119. // Place a finger on notification.
  120. PostSequentialGestureEvent(
  121. ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN));
  122. EXPECT_EQ(1, delegate()->slide_started_count_);
  123. EXPECT_EQ(0, delegate()->slide_changed_count_);
  124. EXPECT_EQ(0, delegate()->slide_out_count_);
  125. delegate()->reset();
  126. // Move the finger horizontally by 101 px. (101 px is more than half of the
  127. // target width 200 px)
  128. PostSequentialGestureEvent(ui::GestureEventDetails(
  129. ui::ET_GESTURE_SCROLL_UPDATE, kTargetWidth / 2 + 1, 0));
  130. EXPECT_EQ(0, delegate()->slide_started_count_);
  131. EXPECT_TRUE(delegate()->IsOnSlideChangedCalled());
  132. EXPECT_TRUE(delegate()->slide_changed_last_value_.value());
  133. EXPECT_EQ(0, delegate()->slide_out_count_);
  134. delegate()->reset();
  135. // Release the finger.
  136. PostSequentialGestureEvent(
  137. ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_END));
  138. EXPECT_EQ(0, delegate()->slide_started_count_);
  139. EXPECT_TRUE(delegate()->IsOnSlideChangedCalled());
  140. EXPECT_FALSE(delegate()->slide_changed_last_value_.value());
  141. EXPECT_EQ(0, delegate()->slide_out_count_);
  142. // The target has been scrolled out and the current location is moved by the
  143. // width (200px).
  144. EXPECT_EQ(kTargetWidth,
  145. delegate()->GetSlideOutLayer()->transform().To2dTranslation().x());
  146. delegate()->reset();
  147. // Ensure a deferred OnSlideOut handler is called.
  148. base::RunLoop().RunUntilIdle();
  149. EXPECT_FALSE(delegate()->IsOnSlideChangedCalled());
  150. EXPECT_EQ(1, delegate()->slide_out_count_);
  151. }
  152. TEST_F(SlideOutControllerTest, SlideLittleAmountAndNotClose) {
  153. // Place a finger on notification.
  154. PostSequentialGestureEvent(
  155. ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN));
  156. EXPECT_EQ(1, delegate()->slide_started_count_);
  157. EXPECT_FALSE(delegate()->IsOnSlideChangedCalled());
  158. EXPECT_EQ(0, delegate()->slide_out_count_);
  159. delegate()->reset();
  160. // Move the finger horizontally by 99 px. (99 px is less than half of the
  161. // target width 200 px)
  162. PostSequentialGestureEvent(
  163. ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_UPDATE, 99, 0));
  164. EXPECT_EQ(0, delegate()->slide_started_count_);
  165. EXPECT_TRUE(delegate()->IsOnSlideChangedCalled());
  166. EXPECT_TRUE(delegate()->slide_changed_last_value_.value());
  167. EXPECT_EQ(0, delegate()->slide_out_count_);
  168. delegate()->reset();
  169. // Release the finger.
  170. PostSequentialGestureEvent(
  171. ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_END));
  172. EXPECT_EQ(0, delegate()->slide_started_count_);
  173. EXPECT_TRUE(delegate()->IsOnSlideChangedCalled());
  174. EXPECT_FALSE(delegate()->slide_changed_last_value_.value());
  175. EXPECT_EQ(0, delegate()->slide_out_count_);
  176. // The target has been moved back to the origin.
  177. EXPECT_EQ(0.f,
  178. delegate()->GetSlideOutLayer()->transform().To2dTranslation().x());
  179. delegate()->reset();
  180. // Ensure no deferred SlideOut handler.
  181. base::RunLoop().RunUntilIdle();
  182. EXPECT_FALSE(delegate()->IsOnSlideChangedCalled());
  183. EXPECT_EQ(0, delegate()->slide_out_count_);
  184. }
  185. class SwipeControlTest
  186. : public SlideOutControllerTest,
  187. public testing::WithParamInterface<SlideOutController::SlideMode> {
  188. public:
  189. SwipeControlTest() = default;
  190. SwipeControlTest(const SwipeControlTest&) = delete;
  191. SwipeControlTest& operator=(const SwipeControlTest&) = delete;
  192. ~SwipeControlTest() override = default;
  193. void SetUp() override {
  194. SlideOutControllerTest::SetUp();
  195. slide_out_controller()->set_slide_mode(GetParam());
  196. }
  197. };
  198. INSTANTIATE_TEST_SUITE_P(
  199. All,
  200. SwipeControlTest,
  201. ::testing::Values(SlideOutController::SlideMode::kFull,
  202. SlideOutController::SlideMode::kPartial));
  203. TEST_P(SwipeControlTest, SetSwipeControlWidth_SwipeLessThanControlWidth) {
  204. // Set the width of swipe control.
  205. slide_out_controller()->SetSwipeControlWidth(kSwipeControlWidth);
  206. // Place a finger on notification.
  207. PostSequentialGestureEvent(
  208. ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN));
  209. EXPECT_EQ(1, delegate()->slide_started_count_);
  210. EXPECT_FALSE(delegate()->IsOnSlideChangedCalled());
  211. EXPECT_EQ(0, delegate()->slide_out_count_);
  212. delegate()->reset();
  213. // Move the finger horizontally by 29 px. (29 px is less than the swipe
  214. // control width).
  215. PostSequentialGestureEvent(ui::GestureEventDetails(
  216. ui::ET_GESTURE_SCROLL_UPDATE, kSwipeControlWidth - 1, 0));
  217. EXPECT_EQ(0, delegate()->slide_started_count_);
  218. EXPECT_TRUE(delegate()->IsOnSlideChangedCalled());
  219. EXPECT_TRUE(delegate()->slide_changed_last_value_.value());
  220. EXPECT_EQ(0, delegate()->slide_out_count_);
  221. delegate()->reset();
  222. // Release the finger.
  223. PostSequentialGestureEvent(
  224. ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_END));
  225. EXPECT_EQ(0, delegate()->slide_started_count_);
  226. EXPECT_TRUE(delegate()->IsOnSlideChangedCalled());
  227. EXPECT_FALSE(delegate()->slide_changed_last_value_.value());
  228. EXPECT_EQ(0, delegate()->slide_out_count_);
  229. // The target has been moved back to the origin.
  230. EXPECT_EQ(0.f,
  231. delegate()->GetSlideOutLayer()->transform().To2dTranslation().x());
  232. delegate()->reset();
  233. // Ensure no deferred SlideOut handler.
  234. base::RunLoop().RunUntilIdle();
  235. EXPECT_FALSE(delegate()->IsOnSlideChangedCalled());
  236. EXPECT_EQ(0, delegate()->slide_out_count_);
  237. }
  238. TEST_P(SwipeControlTest, SwipeControlWidth_SwipeMoreThanControlWidth) {
  239. // Set the width of swipe control.
  240. slide_out_controller()->SetSwipeControlWidth(kSwipeControlWidth);
  241. // Place a finger on notification.
  242. PostSequentialGestureEvent(
  243. ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN));
  244. EXPECT_EQ(1, delegate()->slide_started_count_);
  245. EXPECT_FALSE(delegate()->IsOnSlideChangedCalled());
  246. EXPECT_EQ(0, delegate()->slide_out_count_);
  247. delegate()->reset();
  248. // Move the finger horizontally by 31 px. (31 px is more than the swipe
  249. // control width).
  250. PostSequentialGestureEvent(ui::GestureEventDetails(
  251. ui::ET_GESTURE_SCROLL_UPDATE, kSwipeControlWidth + 1, 0));
  252. EXPECT_EQ(0, delegate()->slide_started_count_);
  253. EXPECT_TRUE(delegate()->IsOnSlideChangedCalled());
  254. EXPECT_TRUE(delegate()->slide_changed_last_value_.value());
  255. EXPECT_EQ(0, delegate()->slide_out_count_);
  256. delegate()->reset();
  257. // Release the finger.
  258. PostSequentialGestureEvent(
  259. ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_END));
  260. EXPECT_EQ(0, delegate()->slide_started_count_);
  261. // Slide is in progress.
  262. EXPECT_TRUE(delegate()->IsOnSlideChangedCalled());
  263. EXPECT_TRUE(delegate()->slide_changed_last_value_.value());
  264. EXPECT_EQ(0, delegate()->slide_out_count_);
  265. // Swipe amount is the swipe control width.
  266. EXPECT_EQ(kSwipeControlWidth,
  267. delegate()->GetSlideOutLayer()->transform().To2dTranslation().x());
  268. delegate()->reset();
  269. // Ensure no deferred SlideOut handler.
  270. base::RunLoop().RunUntilIdle();
  271. EXPECT_FALSE(delegate()->IsOnSlideChangedCalled());
  272. EXPECT_EQ(0, delegate()->slide_out_count_);
  273. }
  274. TEST_P(SwipeControlTest, SetSwipeControlWidth_SwipeOut) {
  275. const bool swipe_out_supported =
  276. slide_out_controller()->mode() == SlideOutController::SlideMode::kFull;
  277. // Set the width of swipe control.
  278. slide_out_controller()->SetSwipeControlWidth(kSwipeControlWidth);
  279. // Place a finger on notification.
  280. PostSequentialGestureEvent(
  281. ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN));
  282. EXPECT_EQ(1, delegate()->slide_started_count_);
  283. EXPECT_FALSE(delegate()->IsOnSlideChangedCalled());
  284. EXPECT_EQ(0, delegate()->slide_out_count_);
  285. delegate()->reset();
  286. // Move the finger horizontally by 101 px. (101 px is more than the half of
  287. // the target width).
  288. PostSequentialGestureEvent(ui::GestureEventDetails(
  289. ui::ET_GESTURE_SCROLL_UPDATE, kTargetWidth / 2 + 1, 0));
  290. EXPECT_EQ(0, delegate()->slide_started_count_);
  291. EXPECT_TRUE(delegate()->IsOnSlideChangedCalled());
  292. EXPECT_TRUE(delegate()->slide_changed_last_value_.value());
  293. EXPECT_EQ(0, delegate()->slide_out_count_);
  294. delegate()->reset();
  295. // Release the finger.
  296. PostSequentialGestureEvent(
  297. ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_END));
  298. // ... and it is automatically slided out if |swipe_out_supported|.
  299. EXPECT_EQ(0, delegate()->slide_started_count_);
  300. EXPECT_TRUE(delegate()->IsOnSlideChangedCalled());
  301. EXPECT_EQ(delegate()->slide_changed_last_value_.value(),
  302. !swipe_out_supported);
  303. EXPECT_EQ(0, delegate()->slide_out_count_);
  304. EXPECT_EQ(swipe_out_supported ? kTargetWidth : kSwipeControlWidth,
  305. delegate()->GetSlideOutLayer()->transform().To2dTranslation().x());
  306. delegate()->reset();
  307. // Ensure a deferred SlideOut handler is called once.
  308. base::RunLoop().RunUntilIdle();
  309. EXPECT_FALSE(delegate()->IsOnSlideChangedCalled());
  310. EXPECT_EQ(swipe_out_supported ? 1 : 0, delegate()->slide_out_count_);
  311. }
  312. TEST_P(SwipeControlTest, SwipeControlWidth_SnapAndSwipeOut) {
  313. const bool swipe_out_supported =
  314. slide_out_controller()->mode() == SlideOutController::SlideMode::kFull;
  315. // Set the width of swipe control.
  316. slide_out_controller()->SetSwipeControlWidth(kSwipeControlWidth);
  317. // Snap to the swipe control.
  318. PostSequentialGestureEvent(
  319. ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN));
  320. PostSequentialGestureEvent(ui::GestureEventDetails(
  321. ui::ET_GESTURE_SCROLL_UPDATE, kSwipeControlWidth, 0));
  322. PostSequentialGestureEvent(
  323. ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_END));
  324. EXPECT_EQ(1, delegate()->slide_started_count_);
  325. EXPECT_TRUE(delegate()->IsOnSlideChangedCalled());
  326. EXPECT_TRUE(delegate()->slide_changed_last_value_.value());
  327. EXPECT_EQ(0, delegate()->slide_out_count_);
  328. EXPECT_EQ(kSwipeControlWidth,
  329. delegate()->GetSlideOutLayer()->transform().To2dTranslation().x());
  330. delegate()->reset();
  331. // Swipe horizontally by 70 px.
  332. PostSequentialGestureEvent(
  333. ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_BEGIN));
  334. PostSequentialGestureEvent(
  335. ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_UPDATE, 70, 0));
  336. PostSequentialGestureEvent(
  337. ui::GestureEventDetails(ui::ET_GESTURE_SCROLL_END));
  338. // ... and it is automatically slided out if if |swipe_out_supported|.
  339. EXPECT_EQ(1, delegate()->slide_started_count_);
  340. EXPECT_TRUE(delegate()->IsOnSlideChangedCalled());
  341. EXPECT_EQ(delegate()->slide_changed_last_value_.value(),
  342. !swipe_out_supported);
  343. EXPECT_EQ(0, delegate()->slide_out_count_);
  344. EXPECT_EQ(swipe_out_supported ? kTargetWidth : kSwipeControlWidth,
  345. delegate()->GetSlideOutLayer()->transform().To2dTranslation().x());
  346. delegate()->reset();
  347. // Ensure a deferred OnSlideOut handler is called.
  348. base::RunLoop().RunUntilIdle();
  349. EXPECT_FALSE(delegate()->IsOnSlideChangedCalled());
  350. EXPECT_EQ(swipe_out_supported ? 1 : 0, delegate()->slide_out_count_);
  351. }
  352. TEST_P(SwipeControlTest, SwipeControlWidth_SnapAndSnapToControl) {
  353. // Set the width of swipe control.
  354. slide_out_controller()->SetSwipeControlWidth(kSwipeControlWidth);
  355. // Snap to the swipe control.
  356. PostSequentialSwipeEvent(kSwipeControlWidth + 10);
  357. EXPECT_EQ(1, delegate()->slide_started_count_);
  358. EXPECT_TRUE(delegate()->IsOnSlideChangedCalled());
  359. EXPECT_TRUE(delegate()->slide_changed_last_value_.value());
  360. EXPECT_EQ(0, delegate()->slide_out_count_);
  361. EXPECT_EQ(kSwipeControlWidth,
  362. delegate()->GetSlideOutLayer()->transform().To2dTranslation().x());
  363. delegate()->reset();
  364. // Swipe horizontally by 40 px for the same direction.
  365. PostSequentialSwipeEvent(40);
  366. // Snap automatically back to the swipe control.
  367. EXPECT_EQ(1, delegate()->slide_started_count_);
  368. EXPECT_TRUE(delegate()->IsOnSlideChangedCalled());
  369. EXPECT_TRUE(delegate()->slide_changed_last_value_.value());
  370. EXPECT_EQ(0, delegate()->slide_out_count_);
  371. EXPECT_EQ(kSwipeControlWidth,
  372. delegate()->GetSlideOutLayer()->transform().To2dTranslation().x());
  373. delegate()->reset();
  374. // Ensure no deferred OnSlideOut handler.
  375. base::RunLoop().RunUntilIdle();
  376. EXPECT_FALSE(delegate()->IsOnSlideChangedCalled());
  377. EXPECT_EQ(0, delegate()->slide_out_count_);
  378. }
  379. TEST_P(SwipeControlTest, SwipeControlWidth_SnapAndBackToOrigin) {
  380. // Set the width of swipe control.
  381. slide_out_controller()->SetSwipeControlWidth(kSwipeControlWidth);
  382. // Snap to the swipe control.
  383. PostSequentialSwipeEvent(kSwipeControlWidth + 20);
  384. EXPECT_EQ(1, delegate()->slide_started_count_);
  385. EXPECT_TRUE(delegate()->IsOnSlideChangedCalled());
  386. EXPECT_TRUE(delegate()->slide_changed_last_value_.value());
  387. EXPECT_EQ(0, delegate()->slide_out_count_);
  388. EXPECT_EQ(kSwipeControlWidth,
  389. delegate()->GetSlideOutLayer()->transform().To2dTranslation().x());
  390. delegate()->reset();
  391. // Swipe to the reversed direction by -1 px.
  392. PostSequentialSwipeEvent(-1);
  393. // Snap automatically back to the origin.
  394. EXPECT_EQ(1, delegate()->slide_started_count_);
  395. EXPECT_TRUE(delegate()->IsOnSlideChangedCalled());
  396. EXPECT_FALSE(delegate()->slide_changed_last_value_.value());
  397. EXPECT_EQ(0, delegate()->slide_out_count_);
  398. EXPECT_EQ(0,
  399. delegate()->GetSlideOutLayer()->transform().To2dTranslation().x());
  400. delegate()->reset();
  401. // Ensure no deferred OnSlideOut handler.
  402. base::RunLoop().RunUntilIdle();
  403. EXPECT_FALSE(delegate()->IsOnSlideChangedCalled());
  404. EXPECT_EQ(0, delegate()->slide_out_count_);
  405. }
  406. TEST_P(SwipeControlTest, SwipeControlWidth_NotSnapAndBackToOrigin) {
  407. // Set the width of swipe control.
  408. slide_out_controller()->SetSwipeControlWidth(kSwipeControlWidth);
  409. // Swipe partially but it's not enough to snap to the swipe control. So it is
  410. // back to the origin
  411. PostSequentialSwipeEvent(kSwipeControlWidth - 1);
  412. EXPECT_EQ(1, delegate()->slide_started_count_);
  413. EXPECT_TRUE(delegate()->IsOnSlideChangedCalled());
  414. EXPECT_FALSE(delegate()->slide_changed_last_value_.value());
  415. EXPECT_EQ(0, delegate()->slide_out_count_);
  416. EXPECT_EQ(0,
  417. delegate()->GetSlideOutLayer()->transform().To2dTranslation().x());
  418. delegate()->reset();
  419. // Ensure no deferred OnSlideOut handler.
  420. base::RunLoop().RunUntilIdle();
  421. EXPECT_FALSE(delegate()->IsOnSlideChangedCalled());
  422. EXPECT_EQ(0, delegate()->slide_out_count_);
  423. }
  424. } // namespace views