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

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

Issue 14268004: Add overscroll edge effect animations for Android. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Use LazyInstance for overscroll resources Created 7 years, 7 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/render_widget_host_view_android.h" 5 #include "content/browser/renderer_host/render_widget_host_view_android.h"
6 6
7 #include <android/bitmap.h> 7 #include <android/bitmap.h>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
11 #include "base/command_line.h" 11 #include "base/command_line.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/message_loop.h" 13 #include "base/message_loop.h"
14 #include "base/utf_string_conversions.h" 14 #include "base/utf_string_conversions.h"
15 #include "cc/layers/delegated_renderer_layer.h" 15 #include "cc/layers/delegated_renderer_layer.h"
16 #include "cc/layers/layer.h" 16 #include "cc/layers/layer.h"
17 #include "cc/layers/texture_layer.h" 17 #include "cc/layers/texture_layer.h"
18 #include "cc/output/compositor_frame.h" 18 #include "cc/output/compositor_frame.h"
19 #include "cc/output/compositor_frame_ack.h" 19 #include "cc/output/compositor_frame_ack.h"
20 #include "content/browser/android/content_view_core_impl.h" 20 #include "content/browser/android/content_view_core_impl.h"
21 #include "content/browser/android/overscroll_glow.h"
21 #include "content/browser/gpu/gpu_surface_tracker.h" 22 #include "content/browser/gpu/gpu_surface_tracker.h"
22 #include "content/browser/renderer_host/compositor_impl_android.h" 23 #include "content/browser/renderer_host/compositor_impl_android.h"
23 #include "content/browser/renderer_host/image_transport_factory_android.h" 24 #include "content/browser/renderer_host/image_transport_factory_android.h"
24 #include "content/browser/renderer_host/render_widget_host_impl.h" 25 #include "content/browser/renderer_host/render_widget_host_impl.h"
25 #include "content/browser/renderer_host/surface_texture_transport_client_android .h" 26 #include "content/browser/renderer_host/surface_texture_transport_client_android .h"
26 #include "content/browser/renderer_host/touch_smooth_scroll_gesture_android.h" 27 #include "content/browser/renderer_host/touch_smooth_scroll_gesture_android.h"
27 #include "content/common/gpu/client/gl_helper.h" 28 #include "content/common/gpu/client/gl_helper.h"
28 #include "content/common/gpu/gpu_messages.h" 29 #include "content/common/gpu/gpu_messages.h"
29 #include "content/common/input_messages.h" 30 #include "content/common/input_messages.h"
30 #include "content/common/view_messages.h" 31 #include "content/common/view_messages.h"
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 RenderWidgetHostImpl::SendSwapCompositorFrameAck( 69 RenderWidgetHostImpl::SendSwapCompositorFrameAck(
69 route_id, renderer_host_id, ack); 70 route_id, renderer_host_id, ack);
70 } 71 }
71 72
72 } // anonymous namespace 73 } // anonymous namespace
73 74
74 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( 75 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid(
75 RenderWidgetHostImpl* widget_host, 76 RenderWidgetHostImpl* widget_host,
76 ContentViewCoreImpl* content_view_core) 77 ContentViewCoreImpl* content_view_core)
77 : host_(widget_host), 78 : host_(widget_host),
78 is_layer_attached_(true), 79 are_layers_attached_(true),
79 content_view_core_(NULL), 80 content_view_core_(NULL),
80 ime_adapter_android_(this), 81 ime_adapter_android_(this),
81 cached_background_color_(SK_ColorWHITE), 82 cached_background_color_(SK_ColorWHITE),
82 texture_id_in_layer_(0), 83 texture_id_in_layer_(0),
83 weak_ptr_factory_(this) { 84 weak_ptr_factory_(this) {
84 if (CompositorImpl::UsesDirectGL()) { 85 if (CompositorImpl::UsesDirectGL()) {
85 surface_texture_transport_.reset(new SurfaceTextureTransportClient()); 86 surface_texture_transport_.reset(new SurfaceTextureTransportClient());
86 layer_ = surface_texture_transport_->Initialize(); 87 layer_ = surface_texture_transport_->Initialize();
87 layer_->SetIsDrawable(true); 88 layer_->SetIsDrawable(true);
88 } else { 89 } else {
89 if (CommandLine::ForCurrentProcess()->HasSwitch( 90 if (CommandLine::ForCurrentProcess()->HasSwitch(
90 switches::kEnableDelegatedRenderer)) { 91 switches::kEnableDelegatedRenderer)) {
91 delegated_renderer_layer_ = cc::DelegatedRendererLayer::Create(this); 92 delegated_renderer_layer_ = cc::DelegatedRendererLayer::Create(this);
92 layer_ = delegated_renderer_layer_; 93 layer_ = delegated_renderer_layer_;
93 } else { 94 } else {
94 texture_layer_ = cc::TextureLayer::Create(this); 95 texture_layer_ = cc::TextureLayer::Create(this);
95 layer_ = texture_layer_; 96 layer_ = texture_layer_;
96 } 97 }
97 } 98 }
98 99
99 layer_->SetContentsOpaque(true); 100 layer_->SetContentsOpaque(true);
100 101
102 if (!CommandLine::ForCurrentProcess()->
103 HasSwitch(switches::kDisableOverscrollEdgeEffect)) {
104 overscroll_effect_ = OverscrollGlow::Create();
105 }
106
101 host_->SetView(this); 107 host_->SetView(this);
102 SetContentViewCore(content_view_core); 108 SetContentViewCore(content_view_core);
103 } 109 }
104 110
105 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { 111 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() {
106 SetContentViewCore(NULL); 112 SetContentViewCore(NULL);
107 DCHECK(ack_callbacks_.empty()); 113 DCHECK(ack_callbacks_.empty());
108 if (texture_id_in_layer_ || !last_mailbox_.IsZero()) { 114 if (texture_id_in_layer_ || !last_mailbox_.IsZero()) {
109 ImageTransportFactoryAndroid* factory = 115 ImageTransportFactoryAndroid* factory =
110 ImageTransportFactoryAndroid::GetInstance(); 116 ImageTransportFactoryAndroid::GetInstance();
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 host_->Focus(); 291 host_->Focus();
286 host_->SetInputMethodActive(true); 292 host_->SetInputMethodActive(true);
287 ResetClipping(); 293 ResetClipping();
288 } 294 }
289 295
290 void RenderWidgetHostViewAndroid::Blur() { 296 void RenderWidgetHostViewAndroid::Blur() {
291 host_->Send(new InputMsg_ExecuteEditCommand( 297 host_->Send(new InputMsg_ExecuteEditCommand(
292 host_->GetRoutingID(), "Unselect", "")); 298 host_->GetRoutingID(), "Unselect", ""));
293 host_->SetInputMethodActive(false); 299 host_->SetInputMethodActive(false);
294 host_->Blur(); 300 host_->Blur();
301
302 if (overscroll_effect_)
303 overscroll_effect_->Finish();
295 } 304 }
296 305
297 bool RenderWidgetHostViewAndroid::HasFocus() const { 306 bool RenderWidgetHostViewAndroid::HasFocus() const {
298 if (!content_view_core_) 307 if (!content_view_core_)
299 return false; // ContentViewCore not created yet. 308 return false; // ContentViewCore not created yet.
300 309
301 return content_view_core_->HasFocus(); 310 return content_view_core_->HasFocus();
302 } 311 }
303 312
304 bool RenderWidgetHostViewAndroid::IsSurfaceAvailableForCopy() const { 313 bool RenderWidgetHostViewAndroid::IsSurfaceAvailableForCopy() const {
305 NOTIMPLEMENTED(); 314 NOTIMPLEMENTED();
306 return false; 315 return false;
307 } 316 }
308 317
309 void RenderWidgetHostViewAndroid::Show() { 318 void RenderWidgetHostViewAndroid::Show() {
310 if (is_layer_attached_) 319 if (are_layers_attached_)
311 return; 320 return;
312 321
313 is_layer_attached_ = true; 322 are_layers_attached_ = true;
314 if (content_view_core_) 323 AttachLayers();
315 content_view_core_->AttachLayer(layer_);
316 } 324 }
317 325
318 void RenderWidgetHostViewAndroid::Hide() { 326 void RenderWidgetHostViewAndroid::Hide() {
319 if (!is_layer_attached_) 327 if (!are_layers_attached_)
320 return; 328 return;
321 329
322 is_layer_attached_ = false; 330 are_layers_attached_ = false;
323 if (content_view_core_) 331 RemoveLayers();
324 content_view_core_->RemoveLayer(layer_);
325 } 332 }
326 333
327 bool RenderWidgetHostViewAndroid::IsShowing() { 334 bool RenderWidgetHostViewAndroid::IsShowing() {
328 // ContentViewCoreImpl represents the native side of the Java 335 // ContentViewCoreImpl represents the native side of the Java
329 // ContentViewCore. It being NULL means that it is not attached 336 // ContentViewCore. It being NULL means that it is not attached
330 // to the View system yet, so we treat this RWHVA as hidden. 337 // to the View system yet, so we treat this RWHVA as hidden.
331 return is_layer_attached_ && content_view_core_; 338 return are_layers_attached_ && content_view_core_;
332 } 339 }
333 340
334 gfx::Rect RenderWidgetHostViewAndroid::GetViewBounds() const { 341 gfx::Rect RenderWidgetHostViewAndroid::GetViewBounds() const {
335 if (!content_view_core_) 342 if (!content_view_core_)
336 return gfx::Rect(); 343 return gfx::Rect();
337 344
338 gfx::Size size = content_view_core_->GetViewportSizeDip(); 345 gfx::Size size = content_view_core_->GetViewportSizeDip();
339 gfx::Size offset = content_view_core_->GetViewportSizeOffsetDip(); 346 gfx::Size offset = content_view_core_->GetViewportSizeOffsetDip();
340 size.Enlarge(-offset.width(), -offset.height()); 347 size.Enlarge(-offset.width(), -offset.height());
341 348
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 SkColor color) { 398 SkColor color) {
392 if (cached_background_color_ == color) 399 if (cached_background_color_ == color)
393 return; 400 return;
394 401
395 cached_background_color_ = color; 402 cached_background_color_ = color;
396 if (content_view_core_) 403 if (content_view_core_)
397 content_view_core_->OnBackgroundColorChanged(color); 404 content_view_core_->OnBackgroundColorChanged(color);
398 } 405 }
399 406
400 void RenderWidgetHostViewAndroid::SendVSync(base::TimeTicks frame_time) { 407 void RenderWidgetHostViewAndroid::SendVSync(base::TimeTicks frame_time) {
401 host_->Send(new ViewMsg_DidVSync(host_->GetRoutingID(), frame_time)); 408 if (host_)
409 host_->Send(new ViewMsg_DidVSync(host_->GetRoutingID(), frame_time));
402 } 410 }
403 411
404 void RenderWidgetHostViewAndroid::OnSetVSyncNotificationEnabled(bool enabled) { 412 void RenderWidgetHostViewAndroid::OnSetVSyncNotificationEnabled(bool enabled) {
405 if (content_view_core_) 413 if (content_view_core_)
406 content_view_core_->SetVSyncNotificationEnabled(enabled); 414 content_view_core_->SetVSyncNotificationEnabled(enabled);
407 } 415 }
408 416
409 void RenderWidgetHostViewAndroid::OnStartContentIntent( 417 void RenderWidgetHostViewAndroid::OnStartContentIntent(
410 const GURL& content_url) { 418 const GURL& content_url) {
411 if (content_view_core_) 419 if (content_view_core_)
(...skipping 15 matching lines...) Expand all
427 const std::vector<gfx::Rect>& copy_rects) { 435 const std::vector<gfx::Rect>& copy_rects) {
428 NOTIMPLEMENTED(); 436 NOTIMPLEMENTED();
429 } 437 }
430 438
431 void RenderWidgetHostViewAndroid::RenderViewGone( 439 void RenderWidgetHostViewAndroid::RenderViewGone(
432 base::TerminationStatus status, int error_code) { 440 base::TerminationStatus status, int error_code) {
433 Destroy(); 441 Destroy();
434 } 442 }
435 443
436 void RenderWidgetHostViewAndroid::Destroy() { 444 void RenderWidgetHostViewAndroid::Destroy() {
437 if (content_view_core_) { 445 RemoveLayers();
438 content_view_core_->RemoveLayer(layer_); 446 content_view_core_ = NULL;
439 content_view_core_ = NULL;
440 }
441 447
442 // The RenderWidgetHost's destruction led here, so don't call it. 448 // The RenderWidgetHost's destruction led here, so don't call it.
443 host_ = NULL; 449 host_ = NULL;
444 450
445 delete this; 451 delete this;
446 } 452 }
447 453
448 void RenderWidgetHostViewAndroid::SetTooltipText( 454 void RenderWidgetHostViewAndroid::SetTooltipText(
449 const string16& tooltip_text) { 455 const string16& tooltip_text) {
450 // Tooltips don't makes sense on Android. 456 // Tooltips don't makes sense on Android.
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
567 const cc::CompositorFrame* frame) { 573 const cc::CompositorFrame* frame) {
568 // Calculate the content size. This should be 0 if the texture_size is 0. 574 // Calculate the content size. This should be 0 if the texture_size is 0.
569 gfx::Vector2dF offset; 575 gfx::Vector2dF offset;
570 if (texture_size_in_layer_.GetArea() > 0) 576 if (texture_size_in_layer_.GetArea() > 0)
571 offset = frame->metadata.location_bar_content_translation; 577 offset = frame->metadata.location_bar_content_translation;
572 offset.set_y(offset.y() + frame->metadata.overdraw_bottom_height); 578 offset.set_y(offset.y() + frame->metadata.overdraw_bottom_height);
573 offset.Scale(frame->metadata.device_scale_factor); 579 offset.Scale(frame->metadata.device_scale_factor);
574 content_size_in_layer_ = 580 content_size_in_layer_ =
575 gfx::Size(texture_size_in_layer_.width() - offset.x(), 581 gfx::Size(texture_size_in_layer_.width() - offset.x(),
576 texture_size_in_layer_.height() - offset.y()); 582 texture_size_in_layer_.height() - offset.y());
583 // Content size changes should be reflected in associated animation effects.
584 UpdateAnimationSize(frame);
577 } 585 }
578 586
579 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( 587 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame(
580 scoped_ptr<cc::CompositorFrame> frame) { 588 scoped_ptr<cc::CompositorFrame> frame) {
581 // Always let ContentViewCore know about the new frame first, so it can decide 589 // Always let ContentViewCore know about the new frame first, so it can decide
582 // to schedule a Draw immediately when it sees the texture layer invalidation. 590 // to schedule a Draw immediately when it sees the texture layer invalidation.
583 if (content_view_core_) { 591 if (content_view_core_) {
584 // All offsets and sizes are in CSS pixels. 592 // All offsets and sizes are in CSS pixels.
585 content_view_core_->UpdateFrameInfo( 593 content_view_core_->UpdateFrameInfo(
586 frame->metadata.root_scroll_offset, 594 frame->metadata.root_scroll_offset,
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
680 ResetClipping(); 688 ResetClipping();
681 689
682 current_mailbox_ = mailbox; 690 current_mailbox_ = mailbox;
683 691
684 if (host_->is_hidden()) 692 if (host_->is_hidden())
685 ack_callback.Run(); 693 ack_callback.Run();
686 else 694 else
687 ack_callbacks_.push(ack_callback); 695 ack_callbacks_.push(ack_callback);
688 } 696 }
689 697
698 void RenderWidgetHostViewAndroid::AttachLayers() {
699 if (!content_view_core_)
700 return;
701
702 content_view_core_->AttachLayer(layer_);
703
704 if (overscroll_effect_)
705 content_view_core_->AttachLayer(overscroll_effect_->root_layer());
706 }
707
708 void RenderWidgetHostViewAndroid::RemoveLayers() {
709 if (!content_view_core_)
710 return;
711
712 if (overscroll_effect_)
713 content_view_core_->RemoveLayer(overscroll_effect_->root_layer());
714
715 content_view_core_->RemoveLayer(layer_);
716 }
717
718 bool RenderWidgetHostViewAndroid::Animate(base::TimeTicks frame_time) {
719 if (!overscroll_effect_ || !HasFocus())
720 return false;
721 return overscroll_effect_->Animate(frame_time);
722 }
723
724 void RenderWidgetHostViewAndroid::UpdateAnimationSize(
725 const cc::CompositorFrame* frame) {
726 if (!overscroll_effect_)
727 return;
728 // Disable edge effects for axes on which scrolling is impossible.
729 const cc::CompositorFrameMetadata& metadata = frame->metadata;
730 overscroll_effect_->set_horizontal_overscroll_enabled(
731 metadata.root_layer_size.width() != metadata.viewport_size.width());
732 overscroll_effect_->set_vertical_overscroll_enabled(
733 metadata.root_layer_size.height() != metadata.viewport_size.height());
734 overscroll_effect_->set_size(content_size_in_layer_);
735 }
736
737 void RenderWidgetHostViewAndroid::ScheduleAnimationIfNecessary() {
738 if (!content_view_core_)
739 return;
740 if (overscroll_effect_ && overscroll_effect_->IsActive())
741 content_view_core_->SetNeedsAnimate();
742 }
743
690 void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer( 744 void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer(
691 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params, 745 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params,
692 int gpu_host_id) { 746 int gpu_host_id) {
693 NOTREACHED(); 747 NOTREACHED();
694 } 748 }
695 749
696 void RenderWidgetHostViewAndroid::AcceleratedSurfaceSuspend() { 750 void RenderWidgetHostViewAndroid::AcceleratedSurfaceSuspend() {
697 NOTREACHED(); 751 NOTREACHED();
698 } 752 }
699 753
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
862 gfx::PointF(offset.x() * uv_scale.x(), 916 gfx::PointF(offset.x() * uv_scale.x(),
863 offset.y() * uv_scale.y()), 917 offset.y() * uv_scale.y()),
864 gfx::PointF((offset.x() + clipped_content.width()) * uv_scale.x(), 918 gfx::PointF((offset.x() + clipped_content.width()) * uv_scale.x(),
865 (offset.y() + clipped_content.height()) * uv_scale.y())); 919 (offset.y() + clipped_content.height()) * uv_scale.y()));
866 } 920 }
867 921
868 SkColor RenderWidgetHostViewAndroid::GetCachedBackgroundColor() const { 922 SkColor RenderWidgetHostViewAndroid::GetCachedBackgroundColor() const {
869 return cached_background_color_; 923 return cached_background_color_;
870 } 924 }
871 925
926 void RenderWidgetHostViewAndroid::OnOverscrolled(
927 gfx::Vector2dF accumulated_overscroll,
928 gfx::Vector2dF current_fling_velocity) {
929 if (!overscroll_effect_ || !HasFocus())
930 return;
931 overscroll_effect_->OnOverscrolled(base::TimeTicks::Now(),
932 accumulated_overscroll,
933 current_fling_velocity);
934 ScheduleAnimationIfNecessary();
935 }
936
872 void RenderWidgetHostViewAndroid::SetContentViewCore( 937 void RenderWidgetHostViewAndroid::SetContentViewCore(
873 ContentViewCoreImpl* content_view_core) { 938 ContentViewCoreImpl* content_view_core) {
874 RunAckCallbacks(); 939 RunAckCallbacks();
875 940
876 if (content_view_core_ && is_layer_attached_) 941 if (are_layers_attached_)
877 content_view_core_->RemoveLayer(layer_); 942 RemoveLayers();
878 943
879 content_view_core_ = content_view_core; 944 content_view_core_ = content_view_core;
880 if (content_view_core_ && is_layer_attached_) 945
881 content_view_core_->AttachLayer(layer_); 946 if (are_layers_attached_)
947 AttachLayers();
882 } 948 }
883 949
884 void RenderWidgetHostViewAndroid::RunAckCallbacks() { 950 void RenderWidgetHostViewAndroid::RunAckCallbacks() {
885 while (!ack_callbacks_.empty()) { 951 while (!ack_callbacks_.empty()) {
886 ack_callbacks_.front().Run(); 952 ack_callbacks_.front().Run();
887 ack_callbacks_.pop(); 953 ack_callbacks_.pop();
888 } 954 }
889 } 955 }
890 956
891 void RenderWidgetHostViewAndroid::HasTouchEventHandlers( 957 void RenderWidgetHostViewAndroid::HasTouchEventHandlers(
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
932 // RenderWidgetHostView, public: 998 // RenderWidgetHostView, public:
933 999
934 // static 1000 // static
935 RenderWidgetHostView* 1001 RenderWidgetHostView*
936 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { 1002 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) {
937 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); 1003 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget);
938 return new RenderWidgetHostViewAndroid(rwhi, NULL); 1004 return new RenderWidgetHostViewAndroid(rwhi, NULL);
939 } 1005 }
940 1006
941 } // namespace content 1007 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_android.h ('k') | content/content_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698