OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/touch_selection/touch_selection_controller.h" | 5 #include "ui/touch_selection/touch_selection_controller.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "testing/gmock/include/gmock/gmock.h" | 9 #include "testing/gmock/include/gmock/gmock.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
(...skipping 18 matching lines...) Expand all Loading... |
29 void SetOrientation(TouchHandleOrientation orientation) override {} | 29 void SetOrientation(TouchHandleOrientation orientation) override {} |
30 void SetAlpha(float alpha) override {} | 30 void SetAlpha(float alpha) override {} |
31 void SetFocus(const gfx::PointF& position) override {} | 31 void SetFocus(const gfx::PointF& position) override {} |
32 gfx::RectF GetVisibleBounds() const override { | 32 gfx::RectF GetVisibleBounds() const override { |
33 return *intersects_rect_ ? gfx::RectF(-1000, -1000, 2000, 2000) | 33 return *intersects_rect_ ? gfx::RectF(-1000, -1000, 2000, 2000) |
34 : gfx::RectF(-1000, -1000, 0, 0); | 34 : gfx::RectF(-1000, -1000, 0, 0); |
35 } | 35 } |
36 | 36 |
37 private: | 37 private: |
38 bool* intersects_rect_; | 38 bool* intersects_rect_; |
| 39 |
| 40 DISALLOW_COPY_AND_ASSIGN(MockTouchHandleDrawable); |
39 }; | 41 }; |
40 | 42 |
41 } // namespace | 43 } // namespace |
42 | 44 |
43 class TouchSelectionControllerTest : public testing::Test, | 45 class TouchSelectionControllerTest : public testing::Test, |
44 public TouchSelectionControllerClient { | 46 public TouchSelectionControllerClient { |
45 public: | 47 public: |
46 TouchSelectionControllerTest() | 48 TouchSelectionControllerTest() |
47 : caret_moved_(false), | 49 : caret_moved_(false), |
48 selection_moved_(false), | 50 selection_moved_(false), |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 void OnSelectionEvent(SelectionEventType event) override { | 99 void OnSelectionEvent(SelectionEventType event) override { |
98 events_.push_back(event); | 100 events_.push_back(event); |
99 last_event_start_ = controller_->GetStartPosition(); | 101 last_event_start_ = controller_->GetStartPosition(); |
100 last_event_end_ = controller_->GetEndPosition(); | 102 last_event_end_ = controller_->GetEndPosition(); |
101 } | 103 } |
102 | 104 |
103 scoped_ptr<TouchHandleDrawable> CreateDrawable() override { | 105 scoped_ptr<TouchHandleDrawable> CreateDrawable() override { |
104 return make_scoped_ptr(new MockTouchHandleDrawable(&dragging_enabled_)); | 106 return make_scoped_ptr(new MockTouchHandleDrawable(&dragging_enabled_)); |
105 } | 107 } |
106 | 108 |
| 109 void OnScrollStarted() override {} |
| 110 void OnScrollCompleted() override {} |
| 111 |
107 void AllowShowingOnTapForEmptyEditable() { | 112 void AllowShowingOnTapForEmptyEditable() { |
108 bool show_on_tap_for_empty_editable = true; | 113 bool show_on_tap_for_empty_editable = true; |
109 controller_.reset(new TouchSelectionController( | 114 controller_.reset(new TouchSelectionController( |
110 this, | 115 this, |
111 base::TimeDelta::FromMilliseconds(kDefaultTapTimeoutMs), | 116 base::TimeDelta::FromMilliseconds(kDefaultTapTimeoutMs), |
112 kDefaulTapSlop, | 117 kDefaulTapSlop, |
113 show_on_tap_for_empty_editable)); | 118 show_on_tap_for_empty_editable)); |
114 } | 119 } |
115 | 120 |
116 void SetAnimationEnabled(bool enabled) { animation_enabled_ = enabled; } | 121 void SetAnimationEnabled(bool enabled) { animation_enabled_ = enabled; } |
117 void SetDraggingEnabled(bool enabled) { dragging_enabled_ = enabled; } | 122 void SetDraggingEnabled(bool enabled) { dragging_enabled_ = enabled; } |
118 | 123 |
119 void ClearSelection() { | 124 bool ClearSelection() { |
120 controller_->OnSelectionBoundsChanged(SelectionBound(), | 125 return controller_->OnSelectionBoundsUpdated(SelectionBound(), |
121 SelectionBound()); | 126 SelectionBound()); |
122 } | 127 } |
123 | 128 |
124 void ClearInsertion() { ClearSelection(); } | 129 bool ClearInsertion() { return ClearSelection(); } |
125 | 130 |
126 void ChangeInsertion(const gfx::RectF& rect, bool visible) { | 131 bool ChangeInsertion(const gfx::RectF& rect, bool visible) { |
127 SelectionBound bound; | 132 SelectionBound bound; |
128 bound.set_type(SelectionBound::CENTER); | 133 bound.set_type(SelectionBound::CENTER); |
129 bound.SetEdge(rect.origin(), rect.bottom_left()); | 134 bound.SetEdge(rect.origin(), rect.bottom_left()); |
130 bound.set_visible(visible); | 135 bound.set_visible(visible); |
131 controller_->OnSelectionBoundsChanged(bound, bound); | 136 return controller_->OnSelectionBoundsUpdated(bound, bound); |
132 } | 137 } |
133 | 138 |
134 void ChangeSelection(const gfx::RectF& start_rect, | 139 bool ChangeSelection(const gfx::RectF& start_rect, |
135 bool start_visible, | 140 bool start_visible, |
136 const gfx::RectF& end_rect, | 141 const gfx::RectF& end_rect, |
137 bool end_visible) { | 142 bool end_visible) { |
138 SelectionBound start_bound, end_bound; | 143 SelectionBound start_bound, end_bound; |
139 start_bound.set_type(SelectionBound::LEFT); | 144 start_bound.set_type(SelectionBound::LEFT); |
140 end_bound.set_type(SelectionBound::RIGHT); | 145 end_bound.set_type(SelectionBound::RIGHT); |
141 start_bound.SetEdge(start_rect.origin(), start_rect.bottom_left()); | 146 start_bound.SetEdge(start_rect.origin(), start_rect.bottom_left()); |
142 end_bound.SetEdge(end_rect.origin(), end_rect.bottom_left()); | 147 end_bound.SetEdge(end_rect.origin(), end_rect.bottom_left()); |
143 start_bound.set_visible(start_visible); | 148 start_bound.set_visible(start_visible); |
144 end_bound.set_visible(end_visible); | 149 end_bound.set_visible(end_visible); |
145 controller_->OnSelectionBoundsChanged(start_bound, end_bound); | 150 return controller_->OnSelectionBoundsUpdated(start_bound, end_bound); |
146 } | 151 } |
147 | 152 |
148 void Animate() { | 153 void Animate() { |
149 base::TimeTicks now = base::TimeTicks::Now(); | 154 base::TimeTicks now = base::TimeTicks::Now(); |
150 while (needs_animate_) { | 155 while (needs_animate_) { |
151 needs_animate_ = controller_->Animate(now); | 156 needs_animate_ = controller_->Animate(now); |
152 now += base::TimeDelta::FromMilliseconds(16); | 157 now += base::TimeDelta::FromMilliseconds(16); |
153 } | 158 } |
154 } | 159 } |
155 | 160 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 gfx::PointF selection_start_; | 203 gfx::PointF selection_start_; |
199 gfx::PointF selection_end_; | 204 gfx::PointF selection_end_; |
200 std::vector<SelectionEventType> events_; | 205 std::vector<SelectionEventType> events_; |
201 bool caret_moved_; | 206 bool caret_moved_; |
202 bool selection_moved_; | 207 bool selection_moved_; |
203 bool selection_points_swapped_; | 208 bool selection_points_swapped_; |
204 bool needs_animate_; | 209 bool needs_animate_; |
205 bool animation_enabled_; | 210 bool animation_enabled_; |
206 bool dragging_enabled_; | 211 bool dragging_enabled_; |
207 scoped_ptr<TouchSelectionController> controller_; | 212 scoped_ptr<TouchSelectionController> controller_; |
| 213 |
| 214 DISALLOW_COPY_AND_ASSIGN(TouchSelectionControllerTest); |
208 }; | 215 }; |
209 | 216 |
210 TEST_F(TouchSelectionControllerTest, InsertionBasic) { | 217 TEST_F(TouchSelectionControllerTest, InsertionBasic) { |
211 gfx::RectF insertion_rect(5, 5, 0, 10); | 218 gfx::RectF insertion_rect(5, 5, 0, 10); |
212 bool visible = true; | 219 bool visible = true; |
213 | 220 |
214 // Insertion events are ignored until automatic showing is enabled. | 221 // Insertion events are ignored until automatic showing is enabled. |
215 ChangeInsertion(insertion_rect, visible); | 222 EXPECT_FALSE(ChangeInsertion(insertion_rect, visible)); |
216 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 223 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
217 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 224 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
218 controller().OnTapEvent(); | 225 controller().OnTapEvent(); |
219 | 226 |
220 // Insertion events are ignored until the selection region is marked editable. | 227 // Insertion events are ignored until the selection region is marked editable. |
221 ChangeInsertion(insertion_rect, visible); | 228 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
222 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 229 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
223 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 230 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
224 | 231 |
225 controller().OnTapEvent(); | 232 controller().OnTapEvent(); |
226 controller().OnSelectionEditable(true); | 233 controller().OnSelectionEditable(true); |
227 ChangeInsertion(insertion_rect, visible); | 234 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
228 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 235 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
229 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 236 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
230 | 237 |
231 insertion_rect.Offset(1, 0); | 238 insertion_rect.Offset(1, 0); |
232 ChangeInsertion(insertion_rect, visible); | 239 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
233 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); | 240 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); |
234 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 241 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
235 | 242 |
236 insertion_rect.Offset(0, 1); | 243 insertion_rect.Offset(0, 1); |
237 ChangeInsertion(insertion_rect, visible); | 244 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
238 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); | 245 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); |
239 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 246 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
240 | 247 |
241 ClearInsertion(); | 248 EXPECT_TRUE(ClearInsertion()); |
242 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 249 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
243 } | 250 } |
244 | 251 |
245 TEST_F(TouchSelectionControllerTest, InsertionClearedWhenNoLongerEditable) { | 252 TEST_F(TouchSelectionControllerTest, InsertionClearedWhenNoLongerEditable) { |
246 gfx::RectF insertion_rect(5, 5, 0, 10); | 253 gfx::RectF insertion_rect(5, 5, 0, 10); |
247 bool visible = true; | 254 bool visible = true; |
248 controller().OnTapEvent(); | 255 controller().OnTapEvent(); |
249 controller().OnSelectionEditable(true); | 256 controller().OnSelectionEditable(true); |
250 | 257 |
251 ChangeInsertion(insertion_rect, visible); | 258 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
252 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 259 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
253 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 260 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
254 | 261 |
255 controller().OnSelectionEditable(false); | 262 controller().OnSelectionEditable(false); |
256 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 263 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
257 } | 264 } |
258 | 265 |
259 TEST_F(TouchSelectionControllerTest, InsertionWithNoShowOnTapForEmptyEditable) { | 266 TEST_F(TouchSelectionControllerTest, InsertionWithNoShowOnTapForEmptyEditable) { |
260 gfx::RectF insertion_rect(5, 5, 0, 10); | 267 gfx::RectF insertion_rect(5, 5, 0, 10); |
261 bool visible = true; | 268 bool visible = true; |
262 controller().OnSelectionEditable(true); | 269 controller().OnSelectionEditable(true); |
263 | 270 |
264 // Taps on an empty editable region should be ignored if the controller is | 271 // Taps on an empty editable region should be ignored if the controller is |
265 // created with |show_on_tap_for_empty_editable| set to false. | 272 // created with |show_on_tap_for_empty_editable| set to false. |
266 controller().OnTapEvent(); | 273 controller().OnTapEvent(); |
267 controller().OnSelectionEmpty(true); | 274 controller().OnSelectionEmpty(true); |
268 ChangeInsertion(insertion_rect, visible); | 275 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
269 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 276 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
270 | 277 |
271 // Once the region becomes non-empty, taps should show the insertion handle. | 278 // Once the region becomes non-empty, taps should show the insertion handle. |
272 controller().OnTapEvent(); | 279 controller().OnTapEvent(); |
273 controller().OnSelectionEmpty(false); | 280 controller().OnSelectionEmpty(false); |
274 ChangeInsertion(insertion_rect, visible); | 281 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
275 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 282 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
276 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 283 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
277 | 284 |
278 // Reset the selection. | 285 // Reset the selection. |
279 controller().HideAndDisallowShowingAutomatically(); | 286 controller().HideAndDisallowShowingAutomatically(); |
280 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 287 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
281 | 288 |
282 // Long-pressing should show the handle even if the editable region is empty. | 289 // Long-pressing should show the handle even if the editable region is empty. |
283 insertion_rect.Offset(2, -2); | 290 insertion_rect.Offset(2, -2); |
284 controller().OnLongPressEvent(); | 291 controller().OnLongPressEvent(); |
285 controller().OnSelectionEmpty(true); | 292 controller().OnSelectionEmpty(true); |
286 ChangeInsertion(insertion_rect, visible); | 293 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
287 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 294 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
288 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 295 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
289 | 296 |
290 // Single Tap on an empty edit field should clear insertion handle. | 297 // Single Tap on an empty edit field should clear insertion handle. |
291 controller().OnTapEvent(); | 298 controller().OnTapEvent(); |
292 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 299 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
293 } | 300 } |
294 | 301 |
295 TEST_F(TouchSelectionControllerTest, InsertionWithShowOnTapForEmptyEditable) { | 302 TEST_F(TouchSelectionControllerTest, InsertionWithShowOnTapForEmptyEditable) { |
296 AllowShowingOnTapForEmptyEditable(); | 303 AllowShowingOnTapForEmptyEditable(); |
297 | 304 |
298 gfx::RectF insertion_rect(5, 5, 0, 10); | 305 gfx::RectF insertion_rect(5, 5, 0, 10); |
299 bool visible = true; | 306 bool visible = true; |
300 controller().OnSelectionEditable(true); | 307 controller().OnSelectionEditable(true); |
301 | 308 |
302 // Taps on an empty editable region should show the insertion handle if the | 309 // Taps on an empty editable region should show the insertion handle if the |
303 // controller is created with |show_on_tap_for_empty_editable| set to true. | 310 // controller is created with |show_on_tap_for_empty_editable| set to true. |
304 controller().OnTapEvent(); | 311 controller().OnTapEvent(); |
305 controller().OnSelectionEmpty(true); | 312 controller().OnSelectionEmpty(true); |
306 ChangeInsertion(insertion_rect, visible); | 313 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
307 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 314 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
308 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 315 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
309 | 316 |
310 // Additional taps should not hide the insertion handle in this case. | 317 // Additional taps should not hide the insertion handle in this case. |
311 controller().OnTapEvent(); | 318 controller().OnTapEvent(); |
312 ChangeInsertion(insertion_rect, visible); | 319 EXPECT_FALSE(ChangeInsertion(insertion_rect, visible)); |
313 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 320 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
314 } | 321 } |
315 | 322 |
316 TEST_F(TouchSelectionControllerTest, InsertionAppearsAfterTapFollowingTyping) { | 323 TEST_F(TouchSelectionControllerTest, InsertionAppearsAfterTapFollowingTyping) { |
317 gfx::RectF insertion_rect(5, 5, 0, 10); | 324 gfx::RectF insertion_rect(5, 5, 0, 10); |
318 bool visible = true; | 325 bool visible = true; |
319 | 326 |
320 // Simulate the user tapping an empty text field. | 327 // Simulate the user tapping an empty text field. |
321 controller().OnTapEvent(); | 328 controller().OnTapEvent(); |
322 controller().OnSelectionEditable(true); | 329 controller().OnSelectionEditable(true); |
323 controller().OnSelectionEmpty(true); | 330 controller().OnSelectionEmpty(true); |
324 ChangeInsertion(insertion_rect, visible); | 331 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
325 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 332 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
326 | 333 |
327 // Simulate the cursor moving while a user is typing. | 334 // Simulate the cursor moving while a user is typing. |
328 insertion_rect.Offset(10, 0); | 335 insertion_rect.Offset(10, 0); |
329 controller().OnSelectionEmpty(false); | 336 controller().OnSelectionEmpty(false); |
330 ChangeInsertion(insertion_rect, visible); | 337 EXPECT_FALSE(ChangeInsertion(insertion_rect, visible)); |
331 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 338 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
332 | 339 |
333 // If the user taps the *same* position as the cursor at the end of the text | 340 // If the user taps the *same* position as the cursor at the end of the text |
334 // entry, the handle should appear. | 341 // entry, the handle should appear. |
335 controller().OnTapEvent(); | 342 controller().OnTapEvent(); |
336 ChangeInsertion(insertion_rect, visible); | 343 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
337 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 344 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
338 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 345 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
339 } | 346 } |
340 | 347 |
341 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) { | 348 TEST_F(TouchSelectionControllerTest, InsertionToSelectionTransition) { |
342 controller().OnLongPressEvent(); | 349 controller().OnLongPressEvent(); |
343 controller().OnSelectionEditable(true); | 350 controller().OnSelectionEditable(true); |
344 | 351 |
345 gfx::RectF start_rect(5, 5, 0, 10); | 352 gfx::RectF start_rect(5, 5, 0, 10); |
346 gfx::RectF end_rect(50, 5, 0, 10); | 353 gfx::RectF end_rect(50, 5, 0, 10); |
347 bool visible = true; | 354 bool visible = true; |
348 | 355 |
349 ChangeInsertion(start_rect, visible); | 356 EXPECT_TRUE(ChangeInsertion(start_rect, visible)); |
350 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 357 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
351 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 358 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
352 | 359 |
353 ChangeSelection(start_rect, visible, end_rect, visible); | 360 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
354 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 361 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, |
355 SELECTION_SHOWN)); | 362 SELECTION_SHOWN)); |
356 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 363 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
357 | 364 |
358 ChangeInsertion(end_rect, visible); | 365 EXPECT_TRUE(ChangeInsertion(end_rect, visible)); |
359 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED, | 366 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED, |
360 INSERTION_SHOWN)); | 367 INSERTION_SHOWN)); |
361 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); | 368 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); |
362 | 369 |
363 controller().HideAndDisallowShowingAutomatically(); | 370 controller().HideAndDisallowShowingAutomatically(); |
364 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); | 371 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED)); |
365 | 372 |
366 controller().OnTapEvent(); | 373 controller().OnTapEvent(); |
367 ChangeInsertion(end_rect, visible); | 374 EXPECT_TRUE(ChangeInsertion(end_rect, visible)); |
368 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 375 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
369 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); | 376 EXPECT_EQ(end_rect.bottom_left(), GetLastEventStart()); |
370 } | 377 } |
371 | 378 |
372 TEST_F(TouchSelectionControllerTest, InsertionDragged) { | 379 TEST_F(TouchSelectionControllerTest, InsertionDragged) { |
373 base::TimeTicks event_time = base::TimeTicks::Now(); | 380 base::TimeTicks event_time = base::TimeTicks::Now(); |
374 controller().OnTapEvent(); | 381 controller().OnTapEvent(); |
375 controller().OnSelectionEditable(true); | 382 controller().OnSelectionEditable(true); |
376 | 383 |
377 // The touch sequence should not be handled if insertion is not active. | 384 // The touch sequence should not be handled if insertion is not active. |
378 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 385 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
379 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 386 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
380 | 387 |
381 float line_height = 10.f; | 388 float line_height = 10.f; |
382 gfx::RectF start_rect(10, 0, 0, line_height); | 389 gfx::RectF start_rect(10, 0, 0, line_height); |
383 bool visible = true; | 390 bool visible = true; |
384 ChangeInsertion(start_rect, visible); | 391 EXPECT_TRUE(ChangeInsertion(start_rect, visible)); |
385 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 392 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
386 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 393 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
387 | 394 |
388 // The touch sequence should be handled only if the drawable reports a hit. | 395 // The touch sequence should be handled only if the drawable reports a hit. |
389 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 396 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
390 SetDraggingEnabled(true); | 397 SetDraggingEnabled(true); |
391 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 398 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
392 EXPECT_FALSE(GetAndResetCaretMoved()); | 399 EXPECT_FALSE(GetAndResetCaretMoved()); |
393 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); | 400 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); |
394 | 401 |
(...skipping 26 matching lines...) Expand all Loading... |
421 } | 428 } |
422 | 429 |
423 TEST_F(TouchSelectionControllerTest, InsertionTapped) { | 430 TEST_F(TouchSelectionControllerTest, InsertionTapped) { |
424 base::TimeTicks event_time = base::TimeTicks::Now(); | 431 base::TimeTicks event_time = base::TimeTicks::Now(); |
425 controller().OnTapEvent(); | 432 controller().OnTapEvent(); |
426 controller().OnSelectionEditable(true); | 433 controller().OnSelectionEditable(true); |
427 SetDraggingEnabled(true); | 434 SetDraggingEnabled(true); |
428 | 435 |
429 gfx::RectF start_rect(10, 0, 0, 10); | 436 gfx::RectF start_rect(10, 0, 0, 10); |
430 bool visible = true; | 437 bool visible = true; |
431 ChangeInsertion(start_rect, visible); | 438 EXPECT_TRUE(ChangeInsertion(start_rect, visible)); |
432 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 439 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
433 | 440 |
434 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 441 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
435 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 442 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
436 //TODO(AKV): this test case has to be modified once crbug.com/394093 is fixed. | |
437 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); | 443 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); |
438 | 444 |
439 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 445 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
440 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 446 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
441 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, | 447 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, |
442 INSERTION_DRAG_STOPPED)); | 448 INSERTION_DRAG_STOPPED)); |
443 | 449 |
444 // Reset the insertion. | 450 // Reset the insertion. |
445 ClearInsertion(); | 451 EXPECT_TRUE(ClearInsertion()); |
446 controller().OnTapEvent(); | 452 controller().OnTapEvent(); |
447 ChangeInsertion(start_rect, visible); | 453 EXPECT_TRUE(ChangeInsertion(start_rect, visible)); |
448 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 454 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, |
449 INSERTION_SHOWN)); | 455 INSERTION_SHOWN)); |
450 | 456 |
451 // No tap should be signalled if the time between DOWN and UP was too long. | 457 // No tap should be signalled if the time between DOWN and UP was too long. |
452 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 458 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
453 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 459 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
454 event = MockMotionEvent(MockMotionEvent::ACTION_UP, | 460 event = MockMotionEvent(MockMotionEvent::ACTION_UP, |
455 event_time + base::TimeDelta::FromSeconds(1), | 461 event_time + base::TimeDelta::FromSeconds(1), |
456 0, | 462 0, |
457 0); | 463 0); |
458 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 464 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
459 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, | 465 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, |
460 INSERTION_DRAG_STOPPED)); | 466 INSERTION_DRAG_STOPPED)); |
461 | 467 |
462 // Reset the insertion. | 468 // Reset the insertion. |
463 ClearInsertion(); | 469 EXPECT_TRUE(ClearInsertion()); |
464 controller().OnTapEvent(); | 470 controller().OnTapEvent(); |
465 ChangeInsertion(start_rect, visible); | 471 EXPECT_TRUE(ChangeInsertion(start_rect, visible)); |
466 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 472 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, |
467 INSERTION_SHOWN)); | 473 INSERTION_SHOWN)); |
468 | 474 |
469 // No tap should be signalled if the drag was too long. | 475 // No tap should be signalled if the drag was too long. |
470 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 476 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
471 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 477 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
472 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 100, 0); | 478 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, 100, 0); |
473 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 479 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
474 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 100, 0); | 480 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 100, 0); |
475 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 481 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
476 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, | 482 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, |
477 INSERTION_DRAG_STOPPED)); | 483 INSERTION_DRAG_STOPPED)); |
478 | 484 |
479 // Reset the insertion. | 485 // Reset the insertion. |
480 ClearInsertion(); | 486 EXPECT_TRUE(ClearInsertion()); |
481 controller().OnTapEvent(); | 487 controller().OnTapEvent(); |
482 ChangeInsertion(start_rect, visible); | 488 EXPECT_TRUE(ChangeInsertion(start_rect, visible)); |
483 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, | 489 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_CLEARED, |
484 INSERTION_SHOWN)); | 490 INSERTION_SHOWN)); |
485 | 491 |
486 // No tap should be signalled if the touch sequence is cancelled. | 492 // No tap should be signalled if the touch sequence is cancelled. |
487 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 493 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
488 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 494 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
489 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0); | 495 event = MockMotionEvent(MockMotionEvent::ACTION_CANCEL, event_time, 0, 0); |
490 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 496 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
491 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, | 497 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED, |
492 INSERTION_DRAG_STOPPED)); | 498 INSERTION_DRAG_STOPPED)); |
493 } | 499 } |
494 | 500 |
495 TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) { | 501 TEST_F(TouchSelectionControllerTest, InsertionNotResetByRepeatedTapOrPress) { |
496 base::TimeTicks event_time = base::TimeTicks::Now(); | 502 base::TimeTicks event_time = base::TimeTicks::Now(); |
497 controller().OnTapEvent(); | 503 controller().OnTapEvent(); |
498 controller().OnSelectionEditable(true); | 504 controller().OnSelectionEditable(true); |
499 SetDraggingEnabled(true); | 505 SetDraggingEnabled(true); |
500 | 506 |
501 gfx::RectF anchor_rect(10, 0, 0, 10); | 507 gfx::RectF anchor_rect(10, 0, 0, 10); |
502 bool visible = true; | 508 bool visible = true; |
503 ChangeInsertion(anchor_rect, visible); | 509 EXPECT_TRUE(ChangeInsertion(anchor_rect, visible)); |
504 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 510 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
505 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 511 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
506 | 512 |
507 // Tapping again shouldn't reset the active insertion point. | 513 // Tapping again shouldn't reset the active insertion point. |
508 controller().OnTapEvent(); | 514 controller().OnTapEvent(); |
509 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 515 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
510 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 516 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
511 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); | 517 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); |
512 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 518 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
513 | 519 |
514 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 520 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
515 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 521 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
516 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, | 522 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, |
517 INSERTION_DRAG_STOPPED)); | 523 INSERTION_DRAG_STOPPED)); |
518 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 524 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
519 | 525 |
520 anchor_rect.Offset(5, 15); | 526 anchor_rect.Offset(5, 15); |
521 ChangeInsertion(anchor_rect, visible); | 527 EXPECT_TRUE(ChangeInsertion(anchor_rect, visible)); |
522 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); | 528 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_MOVED)); |
523 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 529 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
524 | 530 |
525 // Pressing shouldn't reset the active insertion point. | 531 // Pressing shouldn't reset the active insertion point. |
526 controller().OnLongPressEvent(); | 532 controller().OnLongPressEvent(); |
527 controller().OnSelectionEmpty(true); | 533 controller().OnSelectionEmpty(true); |
528 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 534 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
529 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 535 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
530 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); | 536 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_DRAG_STARTED)); |
531 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 537 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
532 | 538 |
533 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); | 539 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 0, 0); |
534 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 540 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
535 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, | 541 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_TAPPED, |
536 INSERTION_DRAG_STOPPED)); | 542 INSERTION_DRAG_STOPPED)); |
537 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); | 543 EXPECT_EQ(anchor_rect.bottom_left(), GetLastEventStart()); |
538 } | 544 } |
539 | 545 |
540 TEST_F(TouchSelectionControllerTest, SelectionBasic) { | 546 TEST_F(TouchSelectionControllerTest, SelectionBasic) { |
541 gfx::RectF start_rect(5, 5, 0, 10); | 547 gfx::RectF start_rect(5, 5, 0, 10); |
542 gfx::RectF end_rect(50, 5, 0, 10); | 548 gfx::RectF end_rect(50, 5, 0, 10); |
543 bool visible = true; | 549 bool visible = true; |
544 | 550 |
545 // Selection events are ignored until automatic showing is enabled. | 551 // Selection events are ignored until automatic showing is enabled. |
546 ChangeSelection(start_rect, visible, end_rect, visible); | 552 EXPECT_FALSE(ChangeSelection(start_rect, visible, end_rect, visible)); |
547 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 553 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
548 | 554 |
549 controller().OnLongPressEvent(); | 555 controller().OnLongPressEvent(); |
550 ChangeSelection(start_rect, visible, end_rect, visible); | 556 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
551 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 557 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
552 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 558 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
553 | 559 |
554 start_rect.Offset(1, 0); | 560 start_rect.Offset(1, 0); |
555 ChangeSelection(start_rect, visible, end_rect, visible); | 561 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
556 // Selection movement does not currently trigger a separate event. | 562 // Selection movement does not currently trigger a separate event. |
557 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); | 563 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); |
558 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 564 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
559 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 565 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
560 | 566 |
561 ClearSelection(); | 567 EXPECT_TRUE(ClearSelection()); |
562 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 568 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
563 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 569 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
564 } | 570 } |
565 | 571 |
566 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { | 572 TEST_F(TouchSelectionControllerTest, SelectionRepeatedLongPress) { |
567 gfx::RectF start_rect(5, 5, 0, 10); | 573 gfx::RectF start_rect(5, 5, 0, 10); |
568 gfx::RectF end_rect(50, 5, 0, 10); | 574 gfx::RectF end_rect(50, 5, 0, 10); |
569 bool visible = true; | 575 bool visible = true; |
570 | 576 |
571 controller().OnLongPressEvent(); | 577 controller().OnLongPressEvent(); |
572 ChangeSelection(start_rect, visible, end_rect, visible); | 578 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
573 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 579 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
574 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 580 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
575 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 581 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
576 | 582 |
577 // A long press triggering a new selection should re-send the SELECTION_SHOWN | 583 // A long press triggering a new selection should re-send the SELECTION_SHOWN |
578 // event notification. | 584 // event notification. |
579 start_rect.Offset(10, 10); | 585 start_rect.Offset(10, 10); |
580 controller().OnLongPressEvent(); | 586 controller().OnLongPressEvent(); |
581 ChangeSelection(start_rect, visible, end_rect, visible); | 587 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
582 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 588 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
583 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 589 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
584 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); | 590 EXPECT_EQ(end_rect.bottom_left(), GetLastEventEnd()); |
585 } | 591 } |
586 | 592 |
587 TEST_F(TouchSelectionControllerTest, SelectionDragged) { | 593 TEST_F(TouchSelectionControllerTest, SelectionDragged) { |
588 base::TimeTicks event_time = base::TimeTicks::Now(); | 594 base::TimeTicks event_time = base::TimeTicks::Now(); |
589 controller().OnLongPressEvent(); | 595 controller().OnLongPressEvent(); |
590 | 596 |
591 // The touch sequence should not be handled if selection is not active. | 597 // The touch sequence should not be handled if selection is not active. |
592 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); | 598 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, 0, 0); |
593 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 599 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
594 | 600 |
595 float line_height = 10.f; | 601 float line_height = 10.f; |
596 gfx::RectF start_rect(0, 0, 0, line_height); | 602 gfx::RectF start_rect(0, 0, 0, line_height); |
597 gfx::RectF end_rect(50, 0, 0, line_height); | 603 gfx::RectF end_rect(50, 0, 0, line_height); |
598 bool visible = true; | 604 bool visible = true; |
599 ChangeSelection(start_rect, visible, end_rect, visible); | 605 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
600 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 606 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
601 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 607 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
602 | 608 |
603 // The touch sequence should be handled only if the drawable reports a hit. | 609 // The touch sequence should be handled only if the drawable reports a hit. |
604 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); | 610 EXPECT_FALSE(controller().WillHandleTouchEvent(event)); |
605 SetDraggingEnabled(true); | 611 SetDraggingEnabled(true); |
606 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 612 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
607 EXPECT_FALSE(GetAndResetSelectionMoved()); | 613 EXPECT_FALSE(GetAndResetSelectionMoved()); |
608 | 614 |
609 // The SelectBetweenCoordinates() result should reflect the movement. Note | 615 // The SelectBetweenCoordinates() result should reflect the movement. Note |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
643 } | 649 } |
644 | 650 |
645 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { | 651 TEST_F(TouchSelectionControllerTest, SelectionDraggedWithOverlap) { |
646 base::TimeTicks event_time = base::TimeTicks::Now(); | 652 base::TimeTicks event_time = base::TimeTicks::Now(); |
647 controller().OnLongPressEvent(); | 653 controller().OnLongPressEvent(); |
648 | 654 |
649 float line_height = 10.f; | 655 float line_height = 10.f; |
650 gfx::RectF start_rect(0, 0, 0, line_height); | 656 gfx::RectF start_rect(0, 0, 0, line_height); |
651 gfx::RectF end_rect(50, 0, 0, line_height); | 657 gfx::RectF end_rect(50, 0, 0, line_height); |
652 bool visible = true; | 658 bool visible = true; |
653 ChangeSelection(start_rect, visible, end_rect, visible); | 659 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
654 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 660 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
655 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 661 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
656 | 662 |
657 // The ACTION_DOWN should lock to the closest handle. | 663 // The ACTION_DOWN should lock to the closest handle. |
658 gfx::PointF end_offset = end_rect.CenterPoint(); | 664 gfx::PointF end_offset = end_rect.CenterPoint(); |
659 gfx::PointF fixed_offset = start_rect.CenterPoint(); | 665 gfx::PointF fixed_offset = start_rect.CenterPoint(); |
660 float touch_down_x = (end_offset.x() + fixed_offset.x()) / 2 + 1.f; | 666 float touch_down_x = (end_offset.x() + fixed_offset.x()) / 2 + 1.f; |
661 MockMotionEvent event( | 667 MockMotionEvent event( |
662 MockMotionEvent::ACTION_DOWN, event_time, touch_down_x, 0); | 668 MockMotionEvent::ACTION_DOWN, event_time, touch_down_x, 0); |
663 SetDraggingEnabled(true); | 669 SetDraggingEnabled(true); |
(...skipping 17 matching lines...) Expand all Loading... |
681 } | 687 } |
682 | 688 |
683 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { | 689 TEST_F(TouchSelectionControllerTest, SelectionDraggedToSwitchBaseAndExtent) { |
684 base::TimeTicks event_time = base::TimeTicks::Now(); | 690 base::TimeTicks event_time = base::TimeTicks::Now(); |
685 controller().OnLongPressEvent(); | 691 controller().OnLongPressEvent(); |
686 | 692 |
687 float line_height = 10.f; | 693 float line_height = 10.f; |
688 gfx::RectF start_rect(50, line_height, 0, line_height); | 694 gfx::RectF start_rect(50, line_height, 0, line_height); |
689 gfx::RectF end_rect(100, line_height, 0, line_height); | 695 gfx::RectF end_rect(100, line_height, 0, line_height); |
690 bool visible = true; | 696 bool visible = true; |
691 ChangeSelection(start_rect, visible, end_rect, visible); | 697 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
692 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 698 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
693 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 699 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
694 | 700 |
695 SetDraggingEnabled(true); | 701 SetDraggingEnabled(true); |
696 | 702 |
697 // Move the extent, not triggering a swap of points. | 703 // Move the extent, not triggering a swap of points. |
698 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, | 704 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, |
699 end_rect.x(), end_rect.bottom()); | 705 end_rect.x(), end_rect.bottom()); |
700 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 706 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
701 EXPECT_FALSE(GetAndResetSelectionMoved()); | 707 EXPECT_FALSE(GetAndResetSelectionMoved()); |
702 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); | 708 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); |
703 | 709 |
704 gfx::PointF base_offset = start_rect.CenterPoint(); | 710 gfx::PointF base_offset = start_rect.CenterPoint(); |
705 gfx::PointF extent_offset = end_rect.CenterPoint(); | 711 gfx::PointF extent_offset = end_rect.CenterPoint(); |
706 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, | 712 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, |
707 end_rect.x(), end_rect.bottom() + 5); | 713 end_rect.x(), end_rect.bottom() + 5); |
708 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 714 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
709 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); | 715 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); |
710 EXPECT_TRUE(GetAndResetSelectionMoved()); | 716 EXPECT_TRUE(GetAndResetSelectionMoved()); |
711 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); | 717 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); |
712 EXPECT_EQ(base_offset, GetLastSelectionStart()); | 718 EXPECT_EQ(base_offset, GetLastSelectionStart()); |
713 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); | 719 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); |
714 | 720 |
715 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); | 721 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); |
716 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 722 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
717 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 723 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); |
718 EXPECT_FALSE(GetAndResetSelectionMoved()); | 724 EXPECT_FALSE(GetAndResetSelectionMoved()); |
719 | 725 |
720 end_rect += gfx::Vector2dF(0, 5); | 726 end_rect += gfx::Vector2dF(0, 5); |
721 ChangeSelection(start_rect, visible, end_rect, visible); | 727 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
722 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); | 728 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); |
723 | 729 |
724 // Move the base, triggering a swap of points. | 730 // Move the base, triggering a swap of points. |
725 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, | 731 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, |
726 start_rect.x(), start_rect.bottom()); | 732 start_rect.x(), start_rect.bottom()); |
727 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 733 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
728 EXPECT_FALSE(GetAndResetSelectionMoved()); | 734 EXPECT_FALSE(GetAndResetSelectionMoved()); |
729 EXPECT_TRUE(GetAndResetSelectionPointsSwapped()); | 735 EXPECT_TRUE(GetAndResetSelectionPointsSwapped()); |
730 | 736 |
731 base_offset = end_rect.CenterPoint(); | 737 base_offset = end_rect.CenterPoint(); |
732 extent_offset = start_rect.CenterPoint(); | 738 extent_offset = start_rect.CenterPoint(); |
733 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, | 739 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, |
734 start_rect.x(), start_rect.bottom() + 5); | 740 start_rect.x(), start_rect.bottom() + 5); |
735 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 741 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
736 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); | 742 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); |
737 EXPECT_TRUE(GetAndResetSelectionMoved()); | 743 EXPECT_TRUE(GetAndResetSelectionMoved()); |
738 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); | 744 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); |
739 EXPECT_EQ(base_offset, GetLastSelectionStart()); | 745 EXPECT_EQ(base_offset, GetLastSelectionStart()); |
740 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); | 746 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); |
741 | 747 |
742 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); | 748 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); |
743 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 749 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
744 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 750 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); |
745 EXPECT_FALSE(GetAndResetSelectionMoved()); | 751 EXPECT_FALSE(GetAndResetSelectionMoved()); |
746 | 752 |
747 start_rect += gfx::Vector2dF(0, 5); | 753 start_rect += gfx::Vector2dF(0, 5); |
748 ChangeSelection(start_rect, visible, end_rect, visible); | 754 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
749 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); | 755 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); |
750 | 756 |
751 // Move the same point again, not triggering a swap of points. | 757 // Move the same point again, not triggering a swap of points. |
752 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, | 758 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, |
753 start_rect.x(), start_rect.bottom()); | 759 start_rect.x(), start_rect.bottom()); |
754 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 760 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
755 EXPECT_FALSE(GetAndResetSelectionMoved()); | 761 EXPECT_FALSE(GetAndResetSelectionMoved()); |
756 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); | 762 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); |
757 | 763 |
758 base_offset = end_rect.CenterPoint(); | 764 base_offset = end_rect.CenterPoint(); |
759 extent_offset = start_rect.CenterPoint(); | 765 extent_offset = start_rect.CenterPoint(); |
760 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, | 766 event = MockMotionEvent(MockMotionEvent::ACTION_MOVE, event_time, |
761 start_rect.x(), start_rect.bottom() + 5); | 767 start_rect.x(), start_rect.bottom() + 5); |
762 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 768 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
763 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); | 769 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); |
764 EXPECT_TRUE(GetAndResetSelectionMoved()); | 770 EXPECT_TRUE(GetAndResetSelectionMoved()); |
765 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); | 771 EXPECT_FALSE(GetAndResetSelectionPointsSwapped()); |
766 EXPECT_EQ(base_offset, GetLastSelectionStart()); | 772 EXPECT_EQ(base_offset, GetLastSelectionStart()); |
767 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); | 773 EXPECT_EQ(extent_offset + gfx::Vector2dF(0, 5), GetLastSelectionEnd()); |
768 | 774 |
769 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); | 775 event = MockMotionEvent(MockMotionEvent::ACTION_UP, event_time, 10, 5); |
770 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 776 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
771 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); | 777 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STOPPED)); |
772 EXPECT_FALSE(GetAndResetSelectionMoved()); | 778 EXPECT_FALSE(GetAndResetSelectionMoved()); |
773 | 779 |
774 start_rect += gfx::Vector2dF(0, 5); | 780 start_rect += gfx::Vector2dF(0, 5); |
775 ChangeSelection(start_rect, visible, end_rect, visible); | 781 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
776 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); | 782 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_MOVED)); |
777 | 783 |
778 // Move the base, triggering a swap of points. | 784 // Move the base, triggering a swap of points. |
779 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, | 785 event = MockMotionEvent(MockMotionEvent::ACTION_DOWN, event_time, |
780 end_rect.x(), end_rect.bottom()); | 786 end_rect.x(), end_rect.bottom()); |
781 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 787 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
782 EXPECT_FALSE(GetAndResetSelectionMoved()); | 788 EXPECT_FALSE(GetAndResetSelectionMoved()); |
783 EXPECT_TRUE(GetAndResetSelectionPointsSwapped()); | 789 EXPECT_TRUE(GetAndResetSelectionPointsSwapped()); |
784 | 790 |
785 base_offset = start_rect.CenterPoint(); | 791 base_offset = start_rect.CenterPoint(); |
(...skipping 15 matching lines...) Expand all Loading... |
801 | 807 |
802 TEST_F(TouchSelectionControllerTest, SelectionDragExtremeLineSize) { | 808 TEST_F(TouchSelectionControllerTest, SelectionDragExtremeLineSize) { |
803 base::TimeTicks event_time = base::TimeTicks::Now(); | 809 base::TimeTicks event_time = base::TimeTicks::Now(); |
804 controller().OnLongPressEvent(); | 810 controller().OnLongPressEvent(); |
805 | 811 |
806 float small_line_height = 1.f; | 812 float small_line_height = 1.f; |
807 float large_line_height = 50.f; | 813 float large_line_height = 50.f; |
808 gfx::RectF small_line_rect(0, 0, 0, small_line_height); | 814 gfx::RectF small_line_rect(0, 0, 0, small_line_height); |
809 gfx::RectF large_line_rect(50, 50, 0, large_line_height); | 815 gfx::RectF large_line_rect(50, 50, 0, large_line_height); |
810 bool visible = true; | 816 bool visible = true; |
811 ChangeSelection(small_line_rect, visible, large_line_rect, visible); | 817 EXPECT_TRUE( |
| 818 ChangeSelection(small_line_rect, visible, large_line_rect, visible)); |
812 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 819 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
813 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart()); | 820 EXPECT_EQ(small_line_rect.bottom_left(), GetLastEventStart()); |
814 | 821 |
815 // Start dragging the handle on the small line. | 822 // Start dragging the handle on the small line. |
816 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, | 823 MockMotionEvent event(MockMotionEvent::ACTION_DOWN, event_time, |
817 small_line_rect.x(), small_line_rect.y()); | 824 small_line_rect.x(), small_line_rect.y()); |
818 SetDraggingEnabled(true); | 825 SetDraggingEnabled(true); |
819 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); | 826 EXPECT_TRUE(controller().WillHandleTouchEvent(event)); |
820 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); | 827 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_DRAG_STARTED)); |
821 // The drag coordinate for large lines should be capped to a reasonable | 828 // The drag coordinate for large lines should be capped to a reasonable |
(...skipping 12 matching lines...) Expand all Loading... |
834 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); | 841 EXPECT_EQ(small_line_rect.CenterPoint(), GetLastSelectionEnd()); |
835 } | 842 } |
836 | 843 |
837 TEST_F(TouchSelectionControllerTest, Animation) { | 844 TEST_F(TouchSelectionControllerTest, Animation) { |
838 controller().OnTapEvent(); | 845 controller().OnTapEvent(); |
839 controller().OnSelectionEditable(true); | 846 controller().OnSelectionEditable(true); |
840 | 847 |
841 gfx::RectF insertion_rect(5, 5, 0, 10); | 848 gfx::RectF insertion_rect(5, 5, 0, 10); |
842 | 849 |
843 bool visible = true; | 850 bool visible = true; |
844 ChangeInsertion(insertion_rect, visible); | 851 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
845 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 852 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
846 | 853 |
847 visible = false; | 854 visible = false; |
848 ChangeInsertion(insertion_rect, visible); | 855 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
849 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 856 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
850 | 857 |
851 visible = true; | 858 visible = true; |
852 ChangeInsertion(insertion_rect, visible); | 859 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
853 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 860 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
854 | 861 |
855 // If the handles are explicity hidden, no animation should be triggered. | 862 // If the handles are explicity hidden, no animation should be triggered. |
856 controller().HideAndDisallowShowingAutomatically(); | 863 controller().HideAndDisallowShowingAutomatically(); |
857 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 864 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
858 | 865 |
859 // If the client doesn't support animation, no animation should be triggered. | 866 // If the client doesn't support animation, no animation should be triggered. |
860 SetAnimationEnabled(false); | 867 SetAnimationEnabled(false); |
861 controller().OnTapEvent(); | 868 controller().OnTapEvent(); |
862 visible = true; | 869 visible = true; |
863 ChangeInsertion(insertion_rect, visible); | 870 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
864 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 871 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
865 } | 872 } |
866 | 873 |
867 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { | 874 TEST_F(TouchSelectionControllerTest, TemporarilyHidden) { |
868 controller().OnTapEvent(); | 875 controller().OnTapEvent(); |
869 controller().OnSelectionEditable(true); | 876 controller().OnSelectionEditable(true); |
870 | 877 |
871 gfx::RectF insertion_rect(5, 5, 0, 10); | 878 gfx::RectF insertion_rect(5, 5, 0, 10); |
872 | 879 |
873 bool visible = true; | 880 bool visible = true; |
874 ChangeInsertion(insertion_rect, visible); | 881 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
875 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 882 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
876 | 883 |
877 controller().SetTemporarilyHidden(true); | 884 controller().SetTemporarilyHidden(true); |
878 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 885 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
879 | 886 |
880 visible = false; | 887 visible = false; |
881 ChangeInsertion(insertion_rect, visible); | 888 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
882 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 889 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
883 | 890 |
884 visible = true; | 891 visible = true; |
885 ChangeInsertion(insertion_rect, visible); | 892 EXPECT_TRUE(ChangeInsertion(insertion_rect, visible)); |
886 EXPECT_FALSE(GetAndResetNeedsAnimate()); | 893 EXPECT_FALSE(GetAndResetNeedsAnimate()); |
887 | 894 |
888 controller().SetTemporarilyHidden(false); | 895 controller().SetTemporarilyHidden(false); |
889 EXPECT_TRUE(GetAndResetNeedsAnimate()); | 896 EXPECT_TRUE(GetAndResetNeedsAnimate()); |
890 } | 897 } |
891 | 898 |
892 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { | 899 TEST_F(TouchSelectionControllerTest, SelectionClearOnTap) { |
893 gfx::RectF start_rect(5, 5, 0, 10); | 900 gfx::RectF start_rect(5, 5, 0, 10); |
894 gfx::RectF end_rect(50, 5, 0, 10); | 901 gfx::RectF end_rect(50, 5, 0, 10); |
895 bool visible = true; | 902 bool visible = true; |
896 | 903 |
897 controller().OnLongPressEvent(); | 904 controller().OnLongPressEvent(); |
898 ChangeSelection(start_rect, visible, end_rect, visible); | 905 EXPECT_TRUE(ChangeSelection(start_rect, visible, end_rect, visible)); |
899 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 906 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
900 | 907 |
901 // Selection should not be cleared if the selection bounds have not changed. | 908 // Selection should not be cleared if the selection bounds have not changed. |
902 controller().OnTapEvent(); | 909 controller().OnTapEvent(); |
903 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 910 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
904 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 911 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
905 | 912 |
906 controller().OnTapEvent(); | 913 controller().OnTapEvent(); |
907 ClearSelection(); | 914 EXPECT_TRUE(ClearSelection()); |
908 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 915 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
909 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 916 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
910 } | 917 } |
911 | 918 |
912 TEST_F(TouchSelectionControllerTest, AllowShowingFromCurrentSelection) { | 919 TEST_F(TouchSelectionControllerTest, AllowShowingFromCurrentSelection) { |
913 gfx::RectF start_rect(5, 5, 0, 10); | 920 gfx::RectF start_rect(5, 5, 0, 10); |
914 gfx::RectF end_rect(50, 5, 0, 10); | 921 gfx::RectF end_rect(50, 5, 0, 10); |
915 bool visible = true; | 922 bool visible = true; |
916 | 923 |
917 // The selection should not be activated, as it wasn't yet allowed. | 924 // The selection should not be activated, as it wasn't yet allowed. |
918 ChangeSelection(start_rect, visible, end_rect, visible); | 925 EXPECT_FALSE(ChangeSelection(start_rect, visible, end_rect, visible)); |
919 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); | 926 EXPECT_EQ(gfx::PointF(), GetLastEventStart()); |
920 | 927 |
921 // Now explicitly allow showing from the previously supplied bounds. | 928 // Now explicitly allow showing from the previously supplied bounds. |
922 controller().AllowShowingFromCurrentSelection(); | 929 controller().AllowShowingFromCurrentSelection(); |
923 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); | 930 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_SHOWN)); |
924 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 931 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
925 | 932 |
926 // Repeated calls to show from the current selection should be ignored. | 933 // Repeated calls to show from the current selection should be ignored. |
927 controller().AllowShowingFromCurrentSelection(); | 934 controller().AllowShowingFromCurrentSelection(); |
928 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 935 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
929 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); | 936 EXPECT_EQ(start_rect.bottom_left(), GetLastEventStart()); |
930 | 937 |
931 // Trying to show from an empty selection will have no result. | 938 // Trying to show from an empty selection will have no result. |
932 ClearSelection(); | 939 EXPECT_TRUE(ClearSelection()); |
933 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); | 940 EXPECT_THAT(GetAndResetEvents(), ElementsAre(SELECTION_CLEARED)); |
934 controller().AllowShowingFromCurrentSelection(); | 941 controller().AllowShowingFromCurrentSelection(); |
935 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); | 942 EXPECT_THAT(GetAndResetEvents(), IsEmpty()); |
936 | 943 |
937 // Showing the insertion handle should also be supported. | 944 // Showing the insertion handle should also be supported. |
938 controller().OnSelectionEditable(true); | 945 controller().OnSelectionEditable(true); |
939 controller().OnSelectionEmpty(false); | 946 controller().OnSelectionEmpty(false); |
940 controller().HideAndDisallowShowingAutomatically(); | 947 controller().HideAndDisallowShowingAutomatically(); |
941 gfx::RectF insertion_rect(5, 5, 0, 10); | 948 gfx::RectF insertion_rect(5, 5, 0, 10); |
942 ChangeInsertion(insertion_rect, visible); | 949 EXPECT_FALSE(ChangeInsertion(insertion_rect, visible)); |
943 controller().AllowShowingFromCurrentSelection(); | 950 controller().AllowShowingFromCurrentSelection(); |
944 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); | 951 EXPECT_THAT(GetAndResetEvents(), ElementsAre(INSERTION_SHOWN)); |
945 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); | 952 EXPECT_EQ(insertion_rect.bottom_left(), GetLastEventStart()); |
946 } | 953 } |
947 | 954 |
948 } // namespace ui | 955 } // namespace ui |
OLD | NEW |