| Index: content/browser/renderer_host/render_widget_host_view_android.cc
|
| diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
|
| index d0fef97454fb5f168070dc6d90c5eec010a0ff24..10b20780722b4f83f2a24bcb9d2243cdfb3b39ac 100644
|
| --- a/content/browser/renderer_host/render_widget_host_view_android.cc
|
| +++ b/content/browser/renderer_host/render_widget_host_view_android.cc
|
| @@ -34,7 +34,7 @@
|
| #include "content/browser/android/edge_effect.h"
|
| #include "content/browser/android/edge_effect_l.h"
|
| #include "content/browser/android/in_process/synchronous_compositor_impl.h"
|
| -#include "content/browser/android/overscroll_glow.h"
|
| +#include "content/browser/android/overscroll_controller_android.h"
|
| #include "content/browser/devtools/render_view_devtools_agent_host.h"
|
| #include "content/browser/gpu/compositor_util.h"
|
| #include "content/browser/gpu/gpu_data_manager_impl.h"
|
| @@ -88,9 +88,6 @@ const int kUndefinedOutputSurfaceId = -1;
|
| // V1 saw errors of ~0.065 between computed window and content widths.
|
| const float kMobileViewportWidthEpsilon = 0.15f;
|
|
|
| -// Used for conditional creation of EdgeEffect types for overscroll.
|
| -const int kKitKatMR2SDKVersion = 19;
|
| -
|
| static const char kAsyncReadBackString[] = "Compositing.CopyFromSurfaceTime";
|
|
|
| // Sends an acknowledgement to the renderer of a processed IME event.
|
| @@ -138,72 +135,6 @@ ui::LatencyInfo CreateLatencyInfo(const blink::WebInputEvent& event) {
|
| return latency_info;
|
| }
|
|
|
| -OverscrollGlow::DisplayParameters CreateOverscrollDisplayParameters(
|
| - const cc::CompositorFrameMetadata& frame_metadata) {
|
| - const float scale_factor =
|
| - frame_metadata.page_scale_factor * frame_metadata.device_scale_factor;
|
| -
|
| - // Compute the size and offsets for each edge, where each effect is sized to
|
| - // the viewport and offset by the distance of each viewport edge to the
|
| - // respective content edge.
|
| - OverscrollGlow::DisplayParameters params;
|
| - params.size = gfx::ScaleSize(
|
| - frame_metadata.scrollable_viewport_size, scale_factor);
|
| - params.edge_offsets[OverscrollGlow::EDGE_TOP] =
|
| - -frame_metadata.root_scroll_offset.y() * scale_factor;
|
| - params.edge_offsets[OverscrollGlow::EDGE_LEFT] =
|
| - -frame_metadata.root_scroll_offset.x() * scale_factor;
|
| - params.edge_offsets[OverscrollGlow::EDGE_BOTTOM] =
|
| - (frame_metadata.root_layer_size.height() -
|
| - frame_metadata.root_scroll_offset.y() -
|
| - frame_metadata.scrollable_viewport_size.height()) *
|
| - scale_factor;
|
| - params.edge_offsets[OverscrollGlow::EDGE_RIGHT] =
|
| - (frame_metadata.root_layer_size.width() -
|
| - frame_metadata.root_scroll_offset.x() -
|
| - frame_metadata.scrollable_viewport_size.width()) *
|
| - scale_factor;
|
| -
|
| - return params;
|
| -}
|
| -
|
| -bool UseEdgeEffectL() {
|
| - static bool use_edge_effect_l =
|
| - base::android::BuildInfo::GetInstance()->sdk_int() > kKitKatMR2SDKVersion;
|
| - return use_edge_effect_l;
|
| -}
|
| -
|
| -scoped_ptr<EdgeEffectBase> CreateEdgeEffect(
|
| - ui::SystemUIResourceManager* resource_manager,
|
| - float device_scale_factor) {
|
| - DCHECK(resource_manager);
|
| - if (UseEdgeEffectL())
|
| - return scoped_ptr<EdgeEffectBase>(new EdgeEffectL(resource_manager));
|
| -
|
| - return scoped_ptr<EdgeEffectBase>(
|
| - new EdgeEffect(resource_manager, device_scale_factor));
|
| -}
|
| -
|
| -scoped_ptr<OverscrollGlow> CreateOverscrollEffect(
|
| - ContentViewCore* content_view_core) {
|
| - DCHECK(content_view_core);
|
| - ui::WindowAndroidCompositor* compositor =
|
| - content_view_core->GetWindowAndroid()->GetCompositor();
|
| - DCHECK(compositor);
|
| - ui::SystemUIResourceManager* system_resource_manager =
|
| - &compositor->GetSystemUIResourceManager();
|
| -
|
| - if (UseEdgeEffectL())
|
| - EdgeEffectL::PreloadResources(system_resource_manager);
|
| - else
|
| - EdgeEffect::PreloadResources(system_resource_manager);
|
| -
|
| - return make_scoped_ptr(
|
| - new OverscrollGlow(base::Bind(&CreateEdgeEffect,
|
| - system_resource_manager,
|
| - content_view_core->GetDpiScale())));
|
| -}
|
| -
|
| scoped_ptr<TouchSelectionController> CreateSelectionController(
|
| TouchSelectionControllerClient* client,
|
| ContentViewCore* content_view_core) {
|
| @@ -217,6 +148,19 @@ scoped_ptr<TouchSelectionController> CreateSelectionController(
|
| touch_slop_pixels / content_view_core->GetDpiScale()));
|
| }
|
|
|
| +scoped_ptr<OverscrollControllerAndroid> CreateOverscrollController(
|
| + ContentViewCore* content_view_core) {
|
| + DCHECK(content_view_core);
|
| + ui::WindowAndroid* window = content_view_core->GetWindowAndroid();
|
| + DCHECK(window);
|
| + ui::WindowAndroidCompositor* compositor = window->GetCompositor();
|
| + DCHECK(compositor);
|
| + return make_scoped_ptr(new OverscrollControllerAndroid(
|
| + content_view_core->GetWebContents(),
|
| + compositor,
|
| + content_view_core->GetDpiScale()));
|
| +}
|
| +
|
| ui::GestureProvider::Config CreateGestureProviderConfig() {
|
| ui::GestureProvider::Config config = ui::DefaultGestureProviderConfig();
|
| config.disable_click_delay =
|
| @@ -273,7 +217,7 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid(
|
| ime_adapter_android_(this),
|
| cached_background_color_(SK_ColorWHITE),
|
| last_output_surface_id_(kUndefinedOutputSurfaceId),
|
| - overscroll_effect_enabled_(
|
| + overscroll_controller_enabled_(
|
| !base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| switches::kDisableOverscrollEdgeEffect)),
|
| gesture_provider_(CreateGestureProviderConfig(), this),
|
| @@ -475,15 +419,15 @@ void RenderWidgetHostViewAndroid::MovePluginWindows(
|
| void RenderWidgetHostViewAndroid::Focus() {
|
| host_->Focus();
|
| host_->SetInputMethodActive(true);
|
| - if (overscroll_effect_)
|
| - overscroll_effect_->Enable();
|
| + if (overscroll_controller_)
|
| + overscroll_controller_->Enable();
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::Blur() {
|
| host_->SetInputMethodActive(false);
|
| host_->Blur();
|
| - if (overscroll_effect_)
|
| - overscroll_effect_->Disable();
|
| + if (overscroll_controller_)
|
| + overscroll_controller_->Disable();
|
| }
|
|
|
| bool RenderWidgetHostViewAndroid::HasFocus() const {
|
| @@ -1029,10 +973,6 @@ void RenderWidgetHostViewAndroid::ComputeContentsSize(
|
| frame_metadata.scrollable_viewport_size,
|
| frame_metadata.device_scale_factor * frame_metadata.page_scale_factor));
|
|
|
| - if (overscroll_effect_) {
|
| - overscroll_effect_->UpdateDisplayParameters(
|
| - CreateOverscrollDisplayParameters(frame_metadata));
|
| - }
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::InternalSwapCompositorFrame(
|
| @@ -1231,6 +1171,9 @@ void RenderWidgetHostViewAndroid::OnFrameMetadataUpdated(
|
| if (!content_view_core_)
|
| return;
|
|
|
| + if (overscroll_controller_)
|
| + overscroll_controller_->OnFrameMetadataUpdated(frame_metadata);
|
| +
|
| if (selection_controller_) {
|
| selection_controller_->OnSelectionBoundsChanged(
|
| frame_metadata.selection_start, frame_metadata.selection_end);
|
| @@ -1267,8 +1210,8 @@ void RenderWidgetHostViewAndroid::AttachLayers() {
|
| return;
|
|
|
| content_view_core_->AttachLayer(layer_);
|
| - if (overscroll_effect_)
|
| - overscroll_effect_->Enable();
|
| + if (overscroll_controller_)
|
| + overscroll_controller_->Enable();
|
| layer_->SetHideLayerAndSubtree(!is_showing_);
|
| }
|
|
|
| @@ -1280,8 +1223,8 @@ void RenderWidgetHostViewAndroid::RemoveLayers() {
|
| return;
|
|
|
| content_view_core_->RemoveLayer(layer_);
|
| - if (overscroll_effect_)
|
| - overscroll_effect_->Disable();
|
| + if (overscroll_controller_)
|
| + overscroll_controller_->Disable();
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::RequestVSyncUpdate(uint32 requests) {
|
| @@ -1340,8 +1283,11 @@ void RenderWidgetHostViewAndroid::SendBeginFrame(base::TimeTicks frame_time,
|
| }
|
|
|
| bool RenderWidgetHostViewAndroid::Animate(base::TimeTicks frame_time) {
|
| - bool needs_animate =
|
| - overscroll_effect_ ? overscroll_effect_->Animate(frame_time) : false;
|
| + bool needs_animate = false;
|
| + if (overscroll_controller_) {
|
| + needs_animate |= overscroll_controller_->Animate(
|
| + frame_time, content_view_core_->GetLayer().get());
|
| + }
|
| if (selection_controller_)
|
| needs_animate |= selection_controller_->Animate(frame_time);
|
| return needs_animate;
|
| @@ -1392,12 +1338,8 @@ void RenderWidgetHostViewAndroid::ProcessAckedTouchEvent(
|
| void RenderWidgetHostViewAndroid::GestureEventAck(
|
| const blink::WebGestureEvent& event,
|
| InputEventAckState ack_result) {
|
| - // The overscroll effect requires an explicit release signal that may not be
|
| - // sent from the renderer compositor.
|
| - if (event.type == blink::WebInputEvent::GestureScrollEnd ||
|
| - event.type == blink::WebInputEvent::GestureFlingStart) {
|
| - DidOverscroll(DidOverscrollParams());
|
| - }
|
| + if (overscroll_controller_)
|
| + overscroll_controller_->OnGestureEventAck(event, ack_result);
|
|
|
| if (content_view_core_)
|
| content_view_core_->OnGestureEventAck(event, ack_result);
|
| @@ -1418,6 +1360,13 @@ InputEventAckState RenderWidgetHostViewAndroid::FilterInputEvent(
|
| }
|
| }
|
|
|
| + if (overscroll_controller_ &&
|
| + blink::WebInputEvent::isGestureEventType(input_event.type) &&
|
| + overscroll_controller_->WillHandleGestureEvent(
|
| + static_cast<const blink::WebGestureEvent&>(input_event))) {
|
| + return INPUT_EVENT_ACK_STATE_CONSUMED;
|
| + }
|
| +
|
| if (content_view_core_ &&
|
| content_view_core_->FilterInputEvent(input_event))
|
| return INPUT_EVENT_ACK_STATE_CONSUMED;
|
| @@ -1502,8 +1451,8 @@ void RenderWidgetHostViewAndroid::SendMouseWheelEvent(
|
| void RenderWidgetHostViewAndroid::SendGestureEvent(
|
| const blink::WebGestureEvent& event) {
|
| // Sending a gesture that may trigger overscroll should resume the effect.
|
| - if (overscroll_effect_)
|
| - overscroll_effect_->Enable();
|
| + if (overscroll_controller_)
|
| + overscroll_controller_->Enable();
|
|
|
| if (host_)
|
| host_->ForwardGestureEventWithLatencyInfo(event, CreateLatencyInfo(event));
|
| @@ -1555,23 +1504,8 @@ void RenderWidgetHostViewAndroid::DidOverscroll(
|
| if (!content_view_core_ || !layer_.get() || !is_showing_)
|
| return;
|
|
|
| - const float device_scale_factor = content_view_core_->GetDpiScale();
|
| -
|
| - if (overscroll_effect_ &&
|
| - overscroll_effect_->OnOverscrolled(
|
| - content_view_core_->GetLayer().get(),
|
| - base::TimeTicks::Now(),
|
| - gfx::ScaleVector2d(params.accumulated_overscroll,
|
| - device_scale_factor),
|
| - gfx::ScaleVector2d(params.latest_overscroll_delta,
|
| - device_scale_factor),
|
| - gfx::ScaleVector2d(params.current_fling_velocity,
|
| - device_scale_factor),
|
| - gfx::ScaleVector2d(
|
| - params.causal_event_viewport_point.OffsetFromOrigin(),
|
| - device_scale_factor))) {
|
| - SetNeedsAnimate();
|
| - }
|
| + if (overscroll_controller_)
|
| + overscroll_controller_->OnOverscrolled(params);
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::DidStopFlinging() {
|
| @@ -1586,7 +1520,7 @@ void RenderWidgetHostViewAndroid::SetContentViewCore(
|
|
|
| bool resize = false;
|
| if (content_view_core != content_view_core_) {
|
| - overscroll_effect_.reset();
|
| + overscroll_controller_.reset();
|
| selection_controller_.reset();
|
| ReleaseLocksOnSurface();
|
| resize = true;
|
| @@ -1617,9 +1551,10 @@ void RenderWidgetHostViewAndroid::SetContentViewCore(
|
| if (!selection_controller_)
|
| selection_controller_ = CreateSelectionController(this, content_view_core_);
|
|
|
| - if (overscroll_effect_enabled_ && !overscroll_effect_ &&
|
| - content_view_core_->GetWindowAndroid()->GetCompositor())
|
| - overscroll_effect_ = CreateOverscrollEffect(content_view_core_);
|
| + if (overscroll_controller_enabled_ && !overscroll_controller_ &&
|
| + content_view_core_->GetWindowAndroid()->GetCompositor()) {
|
| + overscroll_controller_ = CreateOverscrollController(content_view_core_);
|
| + }
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::RunAckCallbacks() {
|
| @@ -1640,15 +1575,15 @@ void RenderWidgetHostViewAndroid::OnCompositingDidCommit() {
|
|
|
| void RenderWidgetHostViewAndroid::OnAttachCompositor() {
|
| DCHECK(content_view_core_);
|
| - if (overscroll_effect_enabled_ && !overscroll_effect_)
|
| - overscroll_effect_ = CreateOverscrollEffect(content_view_core_);
|
| + if (overscroll_controller_enabled_ && !overscroll_controller_)
|
| + overscroll_controller_ = CreateOverscrollController(content_view_core_);
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::OnDetachCompositor() {
|
| DCHECK(content_view_core_);
|
| DCHECK(!using_synchronous_compositor_);
|
| RunAckCallbacks();
|
| - overscroll_effect_.reset();
|
| + overscroll_controller_.reset();
|
| }
|
|
|
| void RenderWidgetHostViewAndroid::OnVSync(base::TimeTicks frame_time,
|
|
|