Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(343)

Side by Side Diff: content/browser/renderer_host/overscroll_controller.cc

Issue 2698673006: Add User Actions and adding more details to UMA metrics for overscroll navigation (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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 "content/browser/renderer_host/overscroll_controller.h" 5 #include "content/browser/renderer_host/overscroll_controller.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "content/browser/renderer_host/overscroll_controller_delegate.h" 9 #include "content/browser/renderer_host/overscroll_controller_delegate.h"
10 #include "content/public/browser/overscroll_configuration.h" 10 #include "content/public/browser/overscroll_configuration.h"
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 scroll_state_ = STATE_UNKNOWN; 117 scroll_state_ = STATE_UNKNOWN;
118 118
119 if (DispatchEventCompletesAction(event)) { 119 if (DispatchEventCompletesAction(event)) {
120 CompleteAction(); 120 CompleteAction();
121 121
122 // Let the event be dispatched to the renderer. 122 // Let the event be dispatched to the renderer.
123 return false; 123 return false;
124 } 124 }
125 125
126 if (overscroll_mode_ != OVERSCROLL_NONE && DispatchEventResetsState(event)) { 126 if (overscroll_mode_ != OVERSCROLL_NONE && DispatchEventResetsState(event)) {
127 SetOverscrollMode(OVERSCROLL_NONE); 127 SetOverscrollMode(OVERSCROLL_NONE, OVERSCROLL_SOURCE_NONE);
128 128
129 // Let the event be dispatched to the renderer. 129 // Let the event be dispatched to the renderer.
130 return false; 130 return false;
131 } 131 }
132 132
133 if (overscroll_mode_ != OVERSCROLL_NONE) { 133 if (overscroll_mode_ != OVERSCROLL_NONE) {
134 // Consume the event only if it updates the overscroll state. 134 // Consume the event only if it updates the overscroll state.
135 if (ProcessEventForOverscroll(event)) 135 if (ProcessEventForOverscroll(event))
136 return true; 136 return true;
137 } else if (reset_scroll_state) { 137 } else if (reset_scroll_state) {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 } 170 }
171 } 171 }
172 172
173 void OverscrollController::Reset() { 173 void OverscrollController::Reset() {
174 overscroll_mode_ = OVERSCROLL_NONE; 174 overscroll_mode_ = OVERSCROLL_NONE;
175 overscroll_delta_x_ = overscroll_delta_y_ = 0.f; 175 overscroll_delta_x_ = overscroll_delta_y_ = 0.f;
176 scroll_state_ = STATE_UNKNOWN; 176 scroll_state_ = STATE_UNKNOWN;
177 } 177 }
178 178
179 void OverscrollController::Cancel() { 179 void OverscrollController::Cancel() {
180 SetOverscrollMode(OVERSCROLL_NONE); 180 SetOverscrollMode(OVERSCROLL_NONE, OVERSCROLL_SOURCE_NONE);
181 overscroll_delta_x_ = overscroll_delta_y_ = 0.f; 181 overscroll_delta_x_ = overscroll_delta_y_ = 0.f;
182 scroll_state_ = STATE_UNKNOWN; 182 scroll_state_ = STATE_UNKNOWN;
183 } 183 }
184 184
185 bool OverscrollController::DispatchEventCompletesAction ( 185 bool OverscrollController::DispatchEventCompletesAction (
186 const blink::WebInputEvent& event) const { 186 const blink::WebInputEvent& event) const {
187 if (overscroll_mode_ == OVERSCROLL_NONE) 187 if (overscroll_mode_ == OVERSCROLL_NONE)
188 return false; 188 return false;
189 189
190 // Complete the overscroll gesture if there was a mouse move or a scroll-end 190 // Complete the overscroll gesture if there was a mouse move or a scroll-end
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
313 } else if (fabs(velocity_y) > kFlingVelocityThreshold) { 313 } else if (fabs(velocity_y) > kFlingVelocityThreshold) {
314 if ((overscroll_mode_ == OVERSCROLL_NORTH && velocity_y < 0) || 314 if ((overscroll_mode_ == OVERSCROLL_NORTH && velocity_y < 0) ||
315 (overscroll_mode_ == OVERSCROLL_SOUTH && velocity_y > 0)) { 315 (overscroll_mode_ == OVERSCROLL_SOUTH && velocity_y > 0)) {
316 CompleteAction(); 316 CompleteAction();
317 event_processed = true; 317 event_processed = true;
318 break; 318 break;
319 } 319 }
320 } 320 }
321 321
322 // Reset overscroll state if fling didn't complete the overscroll gesture. 322 // Reset overscroll state if fling didn't complete the overscroll gesture.
323 SetOverscrollMode(OVERSCROLL_NONE); 323 SetOverscrollMode(OVERSCROLL_NONE, OVERSCROLL_SOURCE_NONE);
324 break; 324 break;
325 } 325 }
326 326
327 default: 327 default:
328 DCHECK(blink::WebInputEvent::isGestureEventType(event.type()) || 328 DCHECK(blink::WebInputEvent::isGestureEventType(event.type()) ||
329 blink::WebInputEvent::isTouchEventType(event.type())) 329 blink::WebInputEvent::isTouchEventType(event.type()))
330 << "Received unexpected event: " << event.type(); 330 << "Received unexpected event: " << event.type();
331 } 331 }
332 return event_processed; 332 return event_processed;
333 } 333 }
334 334
335 bool OverscrollController::ProcessOverscroll(float delta_x, 335 bool OverscrollController::ProcessOverscroll(float delta_x,
336 float delta_y, 336 float delta_y,
337 bool is_touchpad) { 337 bool is_touchpad) {
338 if (scroll_state_ != STATE_CONTENT_SCROLLING) 338 if (scroll_state_ != STATE_CONTENT_SCROLLING)
339 overscroll_delta_x_ += delta_x; 339 overscroll_delta_x_ += delta_x;
340 overscroll_delta_y_ += delta_y; 340 overscroll_delta_y_ += delta_y;
341 341
342 float horiz_threshold = GetOverscrollConfig( 342 float horiz_threshold = GetOverscrollConfig(
343 is_touchpad ? OVERSCROLL_CONFIG_HORIZ_THRESHOLD_START_TOUCHPAD 343 is_touchpad ? OVERSCROLL_CONFIG_HORIZ_THRESHOLD_START_TOUCHPAD
344 : OVERSCROLL_CONFIG_HORIZ_THRESHOLD_START_TOUCHSCREEN); 344 : OVERSCROLL_CONFIG_HORIZ_THRESHOLD_START_TOUCHSCREEN);
345 float vert_threshold = GetOverscrollConfig( 345 float vert_threshold = GetOverscrollConfig(
346 OVERSCROLL_CONFIG_VERT_THRESHOLD_START); 346 OVERSCROLL_CONFIG_VERT_THRESHOLD_START);
347 if (fabs(overscroll_delta_x_) <= horiz_threshold && 347 if (fabs(overscroll_delta_x_) <= horiz_threshold &&
348 fabs(overscroll_delta_y_) <= vert_threshold) { 348 fabs(overscroll_delta_y_) <= vert_threshold) {
349 SetOverscrollMode(OVERSCROLL_NONE); 349 SetOverscrollMode(OVERSCROLL_NONE, OVERSCROLL_SOURCE_NONE);
350 return true; 350 return true;
351 } 351 }
352 352
353 // Compute the current overscroll direction. If the direction is different 353 // Compute the current overscroll direction. If the direction is different
354 // from the current direction, then always switch to no-overscroll mode first 354 // from the current direction, then always switch to no-overscroll mode first
355 // to make sure that subsequent scroll events go through to the page first. 355 // to make sure that subsequent scroll events go through to the page first.
356 OverscrollMode new_mode = OVERSCROLL_NONE; 356 OverscrollMode new_mode = OVERSCROLL_NONE;
357 const float kMinRatio = 2.5; 357 const float kMinRatio = 2.5;
358 if (fabs(overscroll_delta_x_) > horiz_threshold && 358 if (fabs(overscroll_delta_x_) > horiz_threshold &&
359 fabs(overscroll_delta_x_) > fabs(overscroll_delta_y_) * kMinRatio) 359 fabs(overscroll_delta_x_) > fabs(overscroll_delta_y_) * kMinRatio)
360 new_mode = overscroll_delta_x_ > 0.f ? OVERSCROLL_EAST : OVERSCROLL_WEST; 360 new_mode = overscroll_delta_x_ > 0.f ? OVERSCROLL_EAST : OVERSCROLL_WEST;
361 else if (fabs(overscroll_delta_y_) > vert_threshold && 361 else if (fabs(overscroll_delta_y_) > vert_threshold &&
362 fabs(overscroll_delta_y_) > fabs(overscroll_delta_x_) * kMinRatio) 362 fabs(overscroll_delta_y_) > fabs(overscroll_delta_x_) * kMinRatio)
363 new_mode = overscroll_delta_y_ > 0.f ? OVERSCROLL_SOUTH : OVERSCROLL_NORTH; 363 new_mode = overscroll_delta_y_ > 0.f ? OVERSCROLL_SOUTH : OVERSCROLL_NORTH;
364 364
365 // The vertical oversrcoll currently does not have any UX effects other then 365 // The vertical oversrcoll currently does not have any UX effects other then
366 // for the scroll end effect, so testing if it is enabled. 366 // for the scroll end effect, so testing if it is enabled.
367 if ((new_mode == OVERSCROLL_SOUTH || new_mode == OVERSCROLL_NORTH) && 367 if ((new_mode == OVERSCROLL_SOUTH || new_mode == OVERSCROLL_NORTH) &&
368 !IsScrollEndEffectEnabled()) 368 !IsScrollEndEffectEnabled())
369 new_mode = OVERSCROLL_NONE; 369 new_mode = OVERSCROLL_NONE;
370 370
371 if (overscroll_mode_ == OVERSCROLL_NONE) 371 if (overscroll_mode_ == OVERSCROLL_NONE)
mohsen 2017/02/21 20:47:58 nit: Curly braces for multi-line block.
mfomitchev 2017/02/23 02:59:42 Done.
372 SetOverscrollMode(new_mode); 372 SetOverscrollMode(
373 new_mode, is_touchpad ? OVERSCROLL_TOUCHPAD : OVERSCROLL_TOUCHSCREEN);
mohsen 2017/02/21 20:47:58 Can the new_mode be NONE? If yes, can the source b
mfomitchev 2017/02/23 02:59:42 Yes. The contract only enforces that source is non
mohsen 2017/02/23 19:19:09 Acknowledged.
373 else if (new_mode != overscroll_mode_) 374 else if (new_mode != overscroll_mode_)
374 SetOverscrollMode(OVERSCROLL_NONE); 375 SetOverscrollMode(OVERSCROLL_NONE, OVERSCROLL_SOURCE_NONE);
375 376
376 if (overscroll_mode_ == OVERSCROLL_NONE) 377 if (overscroll_mode_ == OVERSCROLL_NONE)
377 return false; 378 return false;
378 379
379 // Tell the delegate about the overscroll update so that it can update 380 // Tell the delegate about the overscroll update so that it can update
380 // the display accordingly (e.g. show history preview etc.). 381 // the display accordingly (e.g. show history preview etc.).
381 if (delegate_) { 382 if (delegate_) {
382 // Do not include the threshold amount when sending the deltas to the 383 // Do not include the threshold amount when sending the deltas to the
383 // delegate. 384 // delegate.
384 float delegate_delta_x = overscroll_delta_x_; 385 float delegate_delta_x = overscroll_delta_x_;
(...skipping 20 matching lines...) Expand all
405 return false; 406 return false;
406 } 407 }
407 408
408 void OverscrollController::CompleteAction() { 409 void OverscrollController::CompleteAction() {
409 if (delegate_) 410 if (delegate_)
410 delegate_->OnOverscrollComplete(overscroll_mode_); 411 delegate_->OnOverscrollComplete(overscroll_mode_);
411 overscroll_mode_ = OVERSCROLL_NONE; 412 overscroll_mode_ = OVERSCROLL_NONE;
412 overscroll_delta_x_ = overscroll_delta_y_ = 0.f; 413 overscroll_delta_x_ = overscroll_delta_y_ = 0.f;
413 } 414 }
414 415
415 void OverscrollController::SetOverscrollMode(OverscrollMode mode) { 416 void OverscrollController::SetOverscrollMode(OverscrollMode mode,
417 OverscrollSource source) {
416 if (overscroll_mode_ == mode) 418 if (overscroll_mode_ == mode)
417 return; 419 return;
418 OverscrollMode old_mode = overscroll_mode_; 420 OverscrollMode old_mode = overscroll_mode_;
419 overscroll_mode_ = mode; 421 overscroll_mode_ = mode;
420 if (overscroll_mode_ == OVERSCROLL_NONE) 422 if (overscroll_mode_ == OVERSCROLL_NONE)
421 overscroll_delta_x_ = overscroll_delta_y_ = 0.f; 423 overscroll_delta_x_ = overscroll_delta_y_ = 0.f;
422 else 424 else
423 scroll_state_ = STATE_OVERSCROLLING; 425 scroll_state_ = STATE_OVERSCROLLING;
424 if (delegate_) 426 if (delegate_)
425 delegate_->OnOverscrollModeChange(old_mode, overscroll_mode_); 427 delegate_->OnOverscrollModeChange(old_mode, overscroll_mode_, source);
426 } 428 }
427 429
428 } // namespace content 430 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698