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 871f1f2819761863c55c4760ef1c4cde55bbcd4e..b36c44179024ca170f0da1e13ab2f7cd73fe4dd2 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_android.cc |
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc |
@@ -7,6 +7,7 @@ |
#include <android/bitmap.h> |
#include "base/bind.h" |
+#include "base/command_line.h" |
#include "base/logging.h" |
#include "base/message_loop.h" |
#include "base/utf_string_conversions.h" |
@@ -15,6 +16,7 @@ |
#include "cc/output/compositor_frame.h" |
#include "cc/output/compositor_frame_ack.h" |
#include "content/browser/android/content_view_core_impl.h" |
+#include "content/browser/android/overscroll_glow.h" |
#include "content/browser/gpu/gpu_surface_tracker.h" |
#include "content/browser/renderer_host/compositor_impl_android.h" |
#include "content/browser/renderer_host/image_transport_factory_android.h" |
@@ -23,6 +25,7 @@ |
#include "content/common/gpu/client/gl_helper.h" |
#include "content/common/gpu/gpu_messages.h" |
#include "content/common/view_messages.h" |
+#include "content/public/common/content_switches.h" |
#include "third_party/WebKit/Source/Platform/chromium/public/Platform.h" |
#include "third_party/WebKit/Source/Platform/chromium/public/WebExternalTextureLayer.h" |
#include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h" |
@@ -73,12 +76,15 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
RenderWidgetHostImpl* widget_host, |
ContentViewCoreImpl* content_view_core) |
: host_(widget_host), |
- is_layer_attached_(true), |
+ are_layers_attached_(true), |
content_view_core_(NULL), |
ime_adapter_android_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
cached_background_color_(SK_ColorWHITE), |
texture_id_in_layer_(0), |
- consumed_current_texture_(true) { |
+ consumed_current_texture_(true), |
+ vsync_notifications_enabled_(false), |
+ animation_vsync_notifications_enabled_(false), |
+ renderer_vsync_notifications_enabled_(false) { |
if (CompositorImpl::UsesDirectGL()) { |
surface_texture_transport_.reset(new SurfaceTextureTransportClient()); |
layer_ = surface_texture_transport_->Initialize(); |
@@ -90,6 +96,11 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
layer_->SetContentsOpaque(true); |
+ if (CommandLine::ForCurrentProcess()-> |
+ HasSwitch(switches::kEnableOverscrollEdgeEffect)) { |
+ overscroll_effect_ = OverscrollGlow::Create(); |
+ } |
+ |
host_->SetView(this); |
SetContentViewCore(content_view_core); |
} |
@@ -283,6 +294,9 @@ void RenderWidgetHostViewAndroid::Blur() { |
host_->GetRoutingID(), "Unselect", "")); |
host_->SetInputMethodActive(false); |
host_->Blur(); |
+ |
+ if (overscroll_effect_) |
+ overscroll_effect_->Finish(); |
} |
bool RenderWidgetHostViewAndroid::HasFocus() const { |
@@ -298,28 +312,26 @@ bool RenderWidgetHostViewAndroid::IsSurfaceAvailableForCopy() const { |
} |
void RenderWidgetHostViewAndroid::Show() { |
- if (is_layer_attached_) |
+ if (are_layers_attached_) |
return; |
- is_layer_attached_ = true; |
- if (content_view_core_) |
- content_view_core_->AttachLayer(layer_); |
+ are_layers_attached_ = true; |
+ AttachLayers(); |
} |
void RenderWidgetHostViewAndroid::Hide() { |
- if (!is_layer_attached_) |
+ if (!are_layers_attached_) |
return; |
- is_layer_attached_ = false; |
- if (content_view_core_) |
- content_view_core_->RemoveLayer(layer_); |
+ are_layers_attached_ = false; |
+ RemoveLayers(); |
} |
bool RenderWidgetHostViewAndroid::IsShowing() { |
// ContentViewCoreImpl represents the native side of the Java |
// ContentViewCore. It being NULL means that it is not attached |
// to the View system yet, so we treat this RWHVA as hidden. |
- return is_layer_attached_ && content_view_core_; |
+ return are_layers_attached_ && content_view_core_; |
} |
gfx::Rect RenderWidgetHostViewAndroid::GetViewBounds() const { |
@@ -395,12 +407,25 @@ void RenderWidgetHostViewAndroid::OnDidChangeBodyBackgroundColor( |
} |
void RenderWidgetHostViewAndroid::SendVSync(base::TimeTicks frame_time) { |
- host_->Send(new ViewMsg_DidVSync(host_->GetRoutingID(), frame_time)); |
+ if (renderer_vsync_notifications_enabled_) |
+ host_->Send(new ViewMsg_DidVSync(host_->GetRoutingID(), frame_time)); |
+ if (animation_vsync_notifications_enabled_) |
+ Animate(); |
} |
void RenderWidgetHostViewAndroid::OnSetVSyncNotificationEnabled(bool enabled) { |
- if (content_view_core_) |
- content_view_core_->SetVSyncNotificationEnabled(enabled); |
+ renderer_vsync_notifications_enabled_ = enabled; |
+ RequestVSyncNotificationsIfNecessary(); |
+} |
+ |
+void RenderWidgetHostViewAndroid::RequestVSyncNotificationsIfNecessary() { |
+ bool notifications_enabled = animation_vsync_notifications_enabled_ || |
+ renderer_vsync_notifications_enabled_; |
+ if (notifications_enabled != vsync_notifications_enabled_) { |
+ if (content_view_core_) |
+ content_view_core_->SetVSyncNotificationEnabled(notifications_enabled); |
+ vsync_notifications_enabled_ = notifications_enabled; |
+ } |
} |
void RenderWidgetHostViewAndroid::OnStartContentIntent( |
@@ -431,10 +456,8 @@ void RenderWidgetHostViewAndroid::RenderViewGone( |
} |
void RenderWidgetHostViewAndroid::Destroy() { |
- if (content_view_core_) { |
- content_view_core_->RemoveLayer(layer_); |
- content_view_core_ = NULL; |
- } |
+ RemoveLayers(); |
+ content_view_core_ = NULL; |
// The RenderWidgetHost's destruction led here, so don't call it. |
host_ = NULL; |
@@ -565,6 +588,15 @@ void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( |
content_size, |
callback); |
+ if (overscroll_effect_) { |
+ // Disable edge effects for axes on which scrolling is impossible. |
+ const cc::CompositorFrameMetadata& metadata = frame->metadata; |
+ overscroll_effect_->set_horizontal_overscroll_enabled( |
+ metadata.root_layer_size.width() != metadata.viewport_size.width()); |
+ overscroll_effect_->set_vertical_overscroll_enabled( |
+ metadata.root_layer_size.height() != metadata.viewport_size.height()); |
+ overscroll_effect_->set_size(content_size); |
+ } |
} |
void RenderWidgetHostViewAndroid::AcceleratedSurfaceBuffersSwapped( |
@@ -642,6 +674,40 @@ void RenderWidgetHostViewAndroid::BuffersSwapped( |
consumed_current_texture_ = false; |
} |
+void RenderWidgetHostViewAndroid::AttachLayers() { |
+ if (!content_view_core_) |
+ return; |
+ |
+ content_view_core_->AttachLayer(layer_); |
+ |
+ if (overscroll_effect_) |
+ overscroll_effect_->set_parent_layer(content_view_core_->GetLayer()); |
+} |
+ |
+void RenderWidgetHostViewAndroid::RemoveLayers() { |
+ if (!content_view_core_) |
+ return; |
+ |
+ if (overscroll_effect_) |
+ overscroll_effect_->set_parent_layer(NULL); |
+ |
+ content_view_core_->RemoveLayer(layer_); |
+} |
+ |
+void RenderWidgetHostViewAndroid::Animate() { |
+ if (!overscroll_effect_) |
+ return; |
+ overscroll_effect_->Animate(base::TimeTicks::Now()); |
+ ScheduleAnimation(); |
+} |
+ |
+void RenderWidgetHostViewAndroid::ScheduleAnimation() { |
+ animation_vsync_notifications_enabled_ = overscroll_effect_ && |
+ overscroll_effect_->IsAnimating() && |
+ HasFocus(); |
+ RequestVSyncNotificationsIfNecessary(); |
+} |
+ |
void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer( |
const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params, |
int gpu_host_id) { |
@@ -780,16 +846,28 @@ SkColor RenderWidgetHostViewAndroid::GetCachedBackgroundColor() const { |
return cached_background_color_; |
} |
+void RenderWidgetHostViewAndroid::OnOverscrolled( |
+ const gfx::Vector2dF& accumulated_overscroll, |
+ const gfx::Vector2dF& current_fling_velocity) { |
+ if (overscroll_effect_) { |
+ overscroll_effect_->OnOverscrolled(base::TimeTicks::Now(), |
+ accumulated_overscroll, |
+ current_fling_velocity); |
+ ScheduleAnimation(); |
+ } |
+} |
+ |
void RenderWidgetHostViewAndroid::SetContentViewCore( |
ContentViewCoreImpl* content_view_core) { |
RunAckCallbacks(); |
- if (content_view_core_ && is_layer_attached_) |
- content_view_core_->RemoveLayer(layer_); |
+ if (are_layers_attached_) |
+ RemoveLayers(); |
content_view_core_ = content_view_core; |
- if (content_view_core_ && is_layer_attached_) |
- content_view_core_->AttachLayer(layer_); |
+ |
+ if (are_layers_attached_) |
+ AttachLayers(); |
} |
void RenderWidgetHostViewAndroid::RunAckCallbacks() { |