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 62b98a736ba704483d65ce39502ad9049c317703..6f9ccf2d24c177c0e5c3e8bad1ba6f3b81b7e457 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. |
@@ -137,72 +134,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) { |
@@ -273,7 +204,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,8 +406,8 @@ void RenderWidgetHostViewAndroid::MovePluginWindows( |
void RenderWidgetHostViewAndroid::Focus() { |
host_->Focus(); |
host_->SetInputMethodActive(true); |
- if (overscroll_effect_) |
- overscroll_effect_->Enable(); |
+ if (overscroll_controller_) |
+ overscroll_controller_->Enable(); |
if (selection_controller_) |
selection_controller_->SetTemporarilyHidden(false); |
} |
@@ -484,8 +415,8 @@ void RenderWidgetHostViewAndroid::Focus() { |
void RenderWidgetHostViewAndroid::Blur() { |
host_->SetInputMethodActive(false); |
host_->Blur(); |
- if (overscroll_effect_) |
- overscroll_effect_->Disable(); |
+ if (overscroll_controller_) |
+ overscroll_controller_->Disable(); |
if (selection_controller_) |
selection_controller_->SetTemporarilyHidden(true); |
} |
@@ -1032,10 +963,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( |
@@ -1226,6 +1153,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); |
@@ -1262,8 +1192,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_); |
} |
@@ -1275,8 +1205,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) { |
@@ -1335,8 +1265,9 @@ 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); |
if (selection_controller_) |
needs_animate |= selection_controller_->Animate(frame_time); |
return needs_animate; |
@@ -1394,6 +1325,9 @@ void RenderWidgetHostViewAndroid::GestureEventAck( |
DidOverscroll(DidOverscrollParams()); |
} |
+ if (overscroll_controller_) |
+ overscroll_controller_->OnGestureEventAck(event, ack_result); |
+ |
if (content_view_core_) |
content_view_core_->OnGestureEventAck(event, ack_result); |
} |
@@ -1413,6 +1347,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; |
@@ -1497,8 +1438,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)); |
@@ -1545,23 +1486,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() { |
@@ -1576,7 +1502,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; |
@@ -1607,9 +1533,11 @@ 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_.reset( |
+ new OverscrollControllerAndroid(content_view_core_)); |
+ } |
} |
void RenderWidgetHostViewAndroid::RunAckCallbacks() { |
@@ -1630,15 +1558,17 @@ 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_.reset( |
+ new OverscrollControllerAndroid(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, |