Chromium Code Reviews| Index: content/browser/web_contents/aura/overscroll_window_delegate.cc |
| diff --git a/content/browser/web_contents/aura/overscroll_window_delegate.cc b/content/browser/web_contents/aura/overscroll_window_delegate.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..70ffbf3d607e59cf85cec28818c3ce9a73073727 |
| --- /dev/null |
| +++ b/content/browser/web_contents/aura/overscroll_window_delegate.cc |
| @@ -0,0 +1,128 @@ |
| +// Copyright (c) 2015 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "content/browser/web_contents/aura/overscroll_window_delegate.h" |
| + |
| +#include "base/i18n/rtl.h" |
| +#include "content/browser/frame_host/navigation_controller_impl.h" |
| +#include "content/browser/frame_host/navigation_entry_impl.h" |
| +#include "content/browser/renderer_host/overscroll_controller_delegate.h" |
| +#include "content/public/browser/overscroll_configuration.h" |
| +#include "ui/aura/window.h" |
| +#include "ui/gfx/image/image_png_rep.h" |
| + |
| +namespace content { |
| + |
| +OverscrollWindowDelegate::OverscrollWindowDelegate( |
| + OverscrollControllerDelegate* delegate, |
| + const gfx::Image& image) |
| + : delegate_(delegate), |
| + overscroll_mode_(OVERSCROLL_NONE), |
| + delta_x_(0.f), |
| + complete_threshold_ratio_(content::GetOverscrollConfig( |
| + content::OVERSCROLL_CONFIG_HORIZ_THRESHOLD_COMPLETE)) { |
| + SetImage(image); |
| +} |
| + |
| +OverscrollWindowDelegate::~OverscrollWindowDelegate() { |
| +} |
| + |
| +void OverscrollWindowDelegate::StartOverscroll() { |
| + LOG(ERROR) << "OWD: StartOverscroll"; |
| + OverscrollMode old_mode = overscroll_mode_; |
| + // TODO take into account RTL here? |
| + if (delta_x_ > 0) |
| + overscroll_mode_ = OVERSCROLL_EAST; |
| + else |
| + overscroll_mode_ = OVERSCROLL_WEST; |
| + delegate_->OnOverscrollModeChange(old_mode, overscroll_mode_); |
| +} |
| + |
| +void OverscrollWindowDelegate::ResetOverscroll() { |
| + LOG(ERROR) << "OWD: ResetOverscroll"; |
| + delegate_->OnOverscrollModeChange(overscroll_mode_, OVERSCROLL_NONE); |
| + overscroll_mode_ = OVERSCROLL_NONE; |
| + delta_x_ = 0; |
| +} |
| + |
| +void OverscrollWindowDelegate::CompleteOrResetOverscroll() { |
| + LOG(ERROR) << "OWD: CompleteOrResetOverscroll"; |
| + if (overscroll_mode_ == OVERSCROLL_NONE) |
| + return; |
| + int width = delegate_->GetVisibleBounds().width(); |
| + float ratio = (fabs(delta_x_)) / width; |
| + if (ratio < complete_threshold_ratio_) { |
| + ResetOverscroll(); |
| + return; |
| + } |
| + delegate_->OnOverscrollComplete(overscroll_mode_); |
| + overscroll_mode_ = OVERSCROLL_NONE; |
| +} |
| + |
| +void OverscrollWindowDelegate::UpdateOverscroll(float delta_x) { |
| + LOG(ERROR) << "OWD: UpdateOverscroll"; |
| + delta_x_ += delta_x; |
| + if (overscroll_mode_ == OVERSCROLL_NONE) |
| + StartOverscroll(); |
| + delegate_->OnOverscrollUpdate(delta_x_, 0.f); |
| +} |
| + |
| +void OverscrollWindowDelegate::OnKeyEvent(ui::KeyEvent* event) { |
| + ResetOverscroll(); |
| +} |
| + |
| +void OverscrollWindowDelegate::OnMouseEvent(ui::MouseEvent* event) { |
| + LOG(ERROR) << "OWD: OnMouseEvent"; |
| + // TODO is this a hack or something? |
| + if (!(event->flags() & ui::EF_IS_SYNTHESIZED)) |
| + ResetOverscroll(); |
| +} |
| + |
| +void OverscrollWindowDelegate::OnScrollEvent(ui::ScrollEvent* event) { |
| + // TODO dafuq this does? |
|
mfomitchev
2015/02/19 19:05:00
Thresholds on how much you need to drag before the
Nina
2015/02/27 19:32:51
Acknowledged.
|
| + // active_start_threshold_ = start_threshold_touchpad_; |
| + LOG(ERROR) << "OWD: OnScrollEvent"; |
| + if (event->type() == ui::ET_SCROLL) |
| + UpdateOverscroll(event->x_offset_ordinal()); |
| + else if (event->type() == ui::ET_SCROLL_FLING_START) |
| + CompleteOrResetOverscroll(); |
| + else |
| + ResetOverscroll(); |
| + event->SetHandled(); |
| +} |
| + |
| +void OverscrollWindowDelegate::OnGestureEvent(ui::GestureEvent* event) { |
| + LOG(ERROR) << "OWD: OnGestureEvent"; |
| + // active_start_threshold_ = start_threshold_touchscreen_; |
| + switch (event->type()) { |
| + case ui::ET_GESTURE_SCROLL_BEGIN: |
| + // StartOverscroll(); |
| + break; |
| + |
| + case ui::ET_GESTURE_SCROLL_UPDATE: |
| + UpdateOverscroll(event->details().scroll_x()); |
| + break; |
| + |
| + case ui::ET_GESTURE_SCROLL_END: |
| + CompleteOrResetOverscroll(); |
| + break; |
| + |
| + case ui::ET_SCROLL_FLING_START: |
| + CompleteOrResetOverscroll(); |
| + break; |
| + |
| + case ui::ET_GESTURE_PINCH_BEGIN: |
| + case ui::ET_GESTURE_PINCH_UPDATE: |
| + case ui::ET_GESTURE_PINCH_END: |
| + ResetOverscroll(); |
| + break; |
| + |
| + default: |
| + break; |
| + } |
| + |
| + event->SetHandled(); |
| +} |
| + |
| +} // namespace content |