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

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: Created 7 years, 8 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/logging.h" 10 #include "base/logging.h"
11 #include "base/message_loop.h" 11 #include "base/message_loop.h"
12 #include "base/utf_string_conversions.h" 12 #include "base/utf_string_conversions.h"
13 #include "cc/layers/layer.h" 13 #include "cc/layers/layer.h"
14 #include "cc/layers/texture_layer.h" 14 #include "cc/layers/texture_layer.h"
15 #include "cc/output/compositor_frame.h" 15 #include "cc/output/compositor_frame.h"
16 #include "cc/output/compositor_frame_ack.h" 16 #include "cc/output/compositor_frame_ack.h"
17 #include "content/browser/android/content_view_core_impl.h" 17 #include "content/browser/android/content_view_core_impl.h"
18 #include "content/browser/android/overscroll_glow.h"
18 #include "content/browser/gpu/gpu_surface_tracker.h" 19 #include "content/browser/gpu/gpu_surface_tracker.h"
19 #include "content/browser/renderer_host/compositor_impl_android.h" 20 #include "content/browser/renderer_host/compositor_impl_android.h"
20 #include "content/browser/renderer_host/image_transport_factory_android.h" 21 #include "content/browser/renderer_host/image_transport_factory_android.h"
21 #include "content/browser/renderer_host/render_widget_host_impl.h" 22 #include "content/browser/renderer_host/render_widget_host_impl.h"
22 #include "content/browser/renderer_host/surface_texture_transport_client_android .h" 23 #include "content/browser/renderer_host/surface_texture_transport_client_android .h"
23 #include "content/common/gpu/client/gl_helper.h" 24 #include "content/common/gpu/client/gl_helper.h"
24 #include "content/common/gpu/gpu_messages.h" 25 #include "content/common/gpu/gpu_messages.h"
25 #include "content/common/view_messages.h" 26 #include "content/common/view_messages.h"
26 #include "third_party/WebKit/Source/Platform/chromium/public/Platform.h" 27 #include "third_party/WebKit/Source/Platform/chromium/public/Platform.h"
27 #include "third_party/WebKit/Source/Platform/chromium/public/WebExternalTextureL ayer.h" 28 #include "third_party/WebKit/Source/Platform/chromium/public/WebExternalTextureL ayer.h"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 if (!return_mailbox.IsZero()) { 61 if (!return_mailbox.IsZero()) {
61 ack.gl_frame_data->mailbox = return_mailbox; 62 ack.gl_frame_data->mailbox = return_mailbox;
62 ack.gl_frame_data->size = return_size; 63 ack.gl_frame_data->size = return_size;
63 ack.gl_frame_data->sync_point = 64 ack.gl_frame_data->sync_point =
64 ImageTransportFactoryAndroid::GetInstance()->InsertSyncPoint(); 65 ImageTransportFactoryAndroid::GetInstance()->InsertSyncPoint();
65 } 66 }
66 RenderWidgetHostImpl::SendSwapCompositorFrameAck( 67 RenderWidgetHostImpl::SendSwapCompositorFrameAck(
67 route_id, renderer_host_id, ack); 68 route_id, renderer_host_id, ack);
68 } 69 }
69 70
71 scoped_ptr<OverscrollGlow> CreateOverscrollEffect(
72 ContentViewCoreImpl* content_view_core){
73 if (content_view_core != NULL &&
74 !content_view_core->get_overscroll_edge().isNull() &&
75 !content_view_core->get_overscroll_glow().isNull()) {
76 return make_scoped_ptr(
77 new OverscrollGlow(content_view_core->get_overscroll_edge(),
78 content_view_core->get_overscroll_glow()));
79 }
80 return scoped_ptr<OverscrollGlow>();
81 }
82
70 } // anonymous namespace 83 } // anonymous namespace
71 84
72 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( 85 RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid(
73 RenderWidgetHostImpl* widget_host, 86 RenderWidgetHostImpl* widget_host,
74 ContentViewCoreImpl* content_view_core) 87 ContentViewCoreImpl* content_view_core)
75 : host_(widget_host), 88 : host_(widget_host),
76 is_layer_attached_(true), 89 are_layers_attached_(true),
77 content_view_core_(NULL), 90 content_view_core_(NULL),
78 ime_adapter_android_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), 91 ime_adapter_android_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
79 cached_background_color_(SK_ColorWHITE), 92 cached_background_color_(SK_ColorWHITE),
80 texture_id_in_layer_(0) { 93 texture_id_in_layer_(0),
94 overscroll_resources_updated_(true) {
81 if (CompositorImpl::UsesDirectGL()) { 95 if (CompositorImpl::UsesDirectGL()) {
82 surface_texture_transport_.reset(new SurfaceTextureTransportClient()); 96 surface_texture_transport_.reset(new SurfaceTextureTransportClient());
83 layer_ = surface_texture_transport_->Initialize(); 97 layer_ = surface_texture_transport_->Initialize();
84 } else { 98 } else {
85 texture_layer_ = cc::TextureLayer::Create(NULL); 99 texture_layer_ = cc::TextureLayer::Create(NULL);
86 layer_ = texture_layer_; 100 layer_ = texture_layer_;
87 } 101 }
88 102
89 layer_->SetContentsOpaque(true); 103 layer_->SetContentsOpaque(true);
90 layer_->SetIsDrawable(true); 104 layer_->SetIsDrawable(true);
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 296
283 return content_view_core_->HasFocus(); 297 return content_view_core_->HasFocus();
284 } 298 }
285 299
286 bool RenderWidgetHostViewAndroid::IsSurfaceAvailableForCopy() const { 300 bool RenderWidgetHostViewAndroid::IsSurfaceAvailableForCopy() const {
287 NOTIMPLEMENTED(); 301 NOTIMPLEMENTED();
288 return false; 302 return false;
289 } 303 }
290 304
291 void RenderWidgetHostViewAndroid::Show() { 305 void RenderWidgetHostViewAndroid::Show() {
292 if (is_layer_attached_) 306 if (are_layers_attached_)
293 return; 307 return;
294 308
295 is_layer_attached_ = true; 309 are_layers_attached_ = true;
296 if (content_view_core_) 310 AttachLayers();
297 content_view_core_->AttachLayer(layer_);
298 } 311 }
299 312
300 void RenderWidgetHostViewAndroid::Hide() { 313 void RenderWidgetHostViewAndroid::Hide() {
301 if (!is_layer_attached_) 314 if (!are_layers_attached_)
302 return; 315 return;
303 316
304 is_layer_attached_ = false; 317 are_layers_attached_ = false;
305 if (content_view_core_) 318 RemoveLayers();
306 content_view_core_->RemoveLayer(layer_);
307 } 319 }
308 320
309 bool RenderWidgetHostViewAndroid::IsShowing() { 321 bool RenderWidgetHostViewAndroid::IsShowing() {
310 // ContentViewCoreImpl represents the native side of the Java 322 // ContentViewCoreImpl represents the native side of the Java
311 // ContentViewCore. It being NULL means that it is not attached 323 // ContentViewCore. It being NULL means that it is not attached
312 // to the View system yet, so we treat this RWHVA as hidden. 324 // to the View system yet, so we treat this RWHVA as hidden.
313 return is_layer_attached_ && content_view_core_; 325 return are_layers_attached_ && content_view_core_;
314 } 326 }
315 327
316 gfx::Rect RenderWidgetHostViewAndroid::GetViewBounds() const { 328 gfx::Rect RenderWidgetHostViewAndroid::GetViewBounds() const {
317 if (!content_view_core_) 329 if (!content_view_core_)
318 return gfx::Rect(); 330 return gfx::Rect();
319 331
320 // If the backing hasn't been initialized yet, report empty view bounds 332 // If the backing hasn't been initialized yet, report empty view bounds
321 // as well. Otherwise, we may end up stuck in a white-screen state because 333 // as well. Otherwise, we may end up stuck in a white-screen state because
322 // the resize ack is sent after swapbuffers. 334 // the resize ack is sent after swapbuffers.
323 if (GetPhysicalBackingSize().IsEmpty()) 335 if (GetPhysicalBackingSize().IsEmpty())
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
384 if (content_view_core_) 396 if (content_view_core_)
385 content_view_core_->OnBackgroundColorChanged(color); 397 content_view_core_->OnBackgroundColorChanged(color);
386 } 398 }
387 399
388 void RenderWidgetHostViewAndroid::OnStartContentIntent( 400 void RenderWidgetHostViewAndroid::OnStartContentIntent(
389 const GURL& content_url) { 401 const GURL& content_url) {
390 if (content_view_core_) 402 if (content_view_core_)
391 content_view_core_->StartContentIntent(content_url); 403 content_view_core_->StartContentIntent(content_url);
392 } 404 }
393 405
406 void RenderWidgetHostViewAndroid::OnSetOverscrollResources() {
407 overscroll_resources_updated_ = true;
408 }
409
394 void RenderWidgetHostViewAndroid::ImeCancelComposition() { 410 void RenderWidgetHostViewAndroid::ImeCancelComposition() {
395 ime_adapter_android_.CancelComposition(); 411 ime_adapter_android_.CancelComposition();
396 } 412 }
397 413
398 void RenderWidgetHostViewAndroid::ImeCompositionRangeChanged( 414 void RenderWidgetHostViewAndroid::ImeCompositionRangeChanged(
399 const ui::Range& range, 415 const ui::Range& range,
400 const std::vector<gfx::Rect>& character_bounds) { 416 const std::vector<gfx::Rect>& character_bounds) {
401 } 417 }
402 418
403 void RenderWidgetHostViewAndroid::DidUpdateBackingStore( 419 void RenderWidgetHostViewAndroid::DidUpdateBackingStore(
404 const gfx::Rect& scroll_rect, 420 const gfx::Rect& scroll_rect,
405 const gfx::Vector2d& scroll_delta, 421 const gfx::Vector2d& scroll_delta,
406 const std::vector<gfx::Rect>& copy_rects) { 422 const std::vector<gfx::Rect>& copy_rects) {
407 NOTIMPLEMENTED(); 423 NOTIMPLEMENTED();
408 } 424 }
409 425
410 void RenderWidgetHostViewAndroid::RenderViewGone( 426 void RenderWidgetHostViewAndroid::RenderViewGone(
411 base::TerminationStatus status, int error_code) { 427 base::TerminationStatus status, int error_code) {
412 Destroy(); 428 Destroy();
413 } 429 }
414 430
415 void RenderWidgetHostViewAndroid::Destroy() { 431 void RenderWidgetHostViewAndroid::Destroy() {
416 if (content_view_core_) { 432 RemoveLayers();
417 content_view_core_->RemoveLayer(layer_); 433 content_view_core_ = NULL;
418 content_view_core_ = NULL; 434
419 } 435 overscroll_effect_.reset();
420 436
421 // The RenderWidgetHost's destruction led here, so don't call it. 437 // The RenderWidgetHost's destruction led here, so don't call it.
422 host_ = NULL; 438 host_ = NULL;
423 439
424 delete this; 440 delete this;
425 } 441 }
426 442
427 void RenderWidgetHostViewAndroid::SetTooltipText( 443 void RenderWidgetHostViewAndroid::SetTooltipText(
428 const string16& tooltip_text) { 444 const string16& tooltip_text) {
429 // Tooltips don't makes sense on Android. 445 // Tooltips don't makes sense on Android.
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
588 // We need to tell ContentViewCore about the new frame before calling 604 // We need to tell ContentViewCore about the new frame before calling
589 // setNeedsDisplay() below so that it has the needed information schedule the 605 // setNeedsDisplay() below so that it has the needed information schedule the
590 // next compositor frame. 606 // next compositor frame.
591 if (content_view_core_) 607 if (content_view_core_)
592 content_view_core_->DidProduceRendererFrame(); 608 content_view_core_->DidProduceRendererFrame();
593 609
594 texture_layer_->SetNeedsDisplay(); 610 texture_layer_->SetNeedsDisplay();
595 texture_layer_->SetBounds(gfx::Size(content_size.width(), 611 texture_layer_->SetBounds(gfx::Size(content_size.width(),
596 content_size.height())); 612 content_size.height()));
597 613
614 if (overscroll_resources_updated_) {
615 SetOverscrollEffect(CreateOverscrollEffect(content_view_core_));
616 overscroll_resources_updated_ = false;
617 }
618 if (overscroll_effect_)
619 overscroll_effect_->set_size(content_size);
620
598 // Calculate the uv_max based on the content size relative to the texture 621 // Calculate the uv_max based on the content size relative to the texture
599 // size. 622 // size.
600 gfx::PointF uv_max; 623 gfx::PointF uv_max;
601 if (texture_size.GetArea() > 0) { 624 if (texture_size.GetArea() > 0) {
602 uv_max.SetPoint(content_size.width() / texture_size.width(), 625 uv_max.SetPoint(content_size.width() / texture_size.width(),
603 content_size.height() / texture_size.height()); 626 content_size.height() / texture_size.height());
604 } 627 }
605 texture_layer_->SetUV(gfx::PointF(0, 0), uv_max); 628 texture_layer_->SetUV(gfx::PointF(0, 0), uv_max);
606 texture_size_in_layer_ = texture_size; 629 texture_size_in_layer_ = texture_size;
607 current_mailbox_ = mailbox; 630 current_mailbox_ = mailbox;
608 ack_callback.Run(); 631 ack_callback.Run();
609 } 632 }
610 633
634 void RenderWidgetHostViewAndroid::AttachLayers() {
635 if (!content_view_core_)
636 return;
637
638 content_view_core_->AttachLayer(layer_);
639
640 if (overscroll_effect_)
641 overscroll_effect_->set_parent_layer(content_view_core_->GetLayer());
642 }
643
644 void RenderWidgetHostViewAndroid::RemoveLayers() {
645 if (!content_view_core_)
646 return;
647
648 if (overscroll_effect_)
649 overscroll_effect_->set_parent_layer(NULL);
650
651 content_view_core_->RemoveLayer(layer_);
652 }
653
654 void RenderWidgetHostViewAndroid::SetOverscrollEffect(
655 scoped_ptr<OverscrollGlow> overscroll_effect) {
656 animation_timer_.Stop();
657 overscroll_effect_.swap(overscroll_effect);
658 if (content_view_core_ && are_layers_attached_)
659 overscroll_effect_->set_parent_layer(content_view_core_->GetLayer());
660 }
661
662 void RenderWidgetHostViewAndroid::AnimationCallback() {
663 if (overscroll_effect_ && overscroll_effect_->Animate(base::TimeTicks::Now()))
664 AnimateIfNeeded();
665 }
666
667 void RenderWidgetHostViewAndroid::AnimateIfNeeded() {
668 if (animation_timer_.IsRunning() || !overscroll_effect_)
669 return;
670
671 const base::TimeDelta animationInterval
672 = base::TimeDelta::FromMilliseconds(kDesiredAnimationIntervalInMs);
673
674 animation_timer_.Start(FROM_HERE, animationInterval, this,
675 &RenderWidgetHostViewAndroid::AnimationCallback);
676 }
677
611 void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer( 678 void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer(
612 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params, 679 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params,
613 int gpu_host_id) { 680 int gpu_host_id) {
614 NOTREACHED(); 681 NOTREACHED();
615 } 682 }
616 683
617 void RenderWidgetHostViewAndroid::AcceleratedSurfaceSuspend() { 684 void RenderWidgetHostViewAndroid::AcceleratedSurfaceSuspend() {
618 NOTREACHED(); 685 NOTREACHED();
619 } 686 }
620 687
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
754 const gfx::Vector2dF& controls_offset, 821 const gfx::Vector2dF& controls_offset,
755 const gfx::Vector2dF& content_offset, 822 const gfx::Vector2dF& content_offset,
756 float overdraw_bottom_height) { 823 float overdraw_bottom_height) {
757 if (content_view_core_) { 824 if (content_view_core_) {
758 // All offsets and sizes are in CSS pixels. 825 // All offsets and sizes are in CSS pixels.
759 content_view_core_->UpdateFrameInfo( 826 content_view_core_->UpdateFrameInfo(
760 scroll_offset, page_scale_factor, page_scale_factor_limits, 827 scroll_offset, page_scale_factor, page_scale_factor_limits,
761 content_size, viewport_size, controls_offset, content_offset, 828 content_size, viewport_size, controls_offset, content_offset,
762 overdraw_bottom_height); 829 overdraw_bottom_height);
763 } 830 }
831
832 if (overscroll_effect_)
833 overscroll_effect_->set_horizontal_overscroll_enabled(
834 content_size.width() != viewport_size.width());
835
836 }
837
838 void RenderWidgetHostViewAndroid::OnOverscrolled(
839 const gfx::Vector2dF& accumulated_overscroll,
840 const gfx::Vector2dF& current_fling_velocity) {
841 if (overscroll_effect_) {
842 overscroll_effect_->OnOverscrolled(base::TimeTicks::Now(),
843 accumulated_overscroll,
844 current_fling_velocity);
845 AnimateIfNeeded();
846 }
764 } 847 }
765 848
766 void RenderWidgetHostViewAndroid::SetContentViewCore( 849 void RenderWidgetHostViewAndroid::SetContentViewCore(
767 ContentViewCoreImpl* content_view_core) { 850 ContentViewCoreImpl* content_view_core) {
768 if (content_view_core_ && is_layer_attached_) 851 if (are_layers_attached_)
769 content_view_core_->RemoveLayer(layer_); 852 RemoveLayers();
770 853
771 content_view_core_ = content_view_core; 854 content_view_core_ = content_view_core;
772 if (content_view_core_ && is_layer_attached_) 855 if (are_layers_attached_)
773 content_view_core_->AttachLayer(layer_); 856 AttachLayers();
774 } 857 }
775 858
776 void RenderWidgetHostViewAndroid::HasTouchEventHandlers( 859 void RenderWidgetHostViewAndroid::HasTouchEventHandlers(
777 bool need_touch_events) { 860 bool need_touch_events) {
778 if (content_view_core_) 861 if (content_view_core_)
779 content_view_core_->HasTouchEventHandlers(need_touch_events); 862 content_view_core_->HasTouchEventHandlers(need_touch_events);
780 } 863 }
781 864
782 // static 865 // static
783 void RenderWidgetHostViewPort::GetDefaultScreenInfo( 866 void RenderWidgetHostViewPort::GetDefaultScreenInfo(
(...skipping 14 matching lines...) Expand all
798 // RenderWidgetHostView, public: 881 // RenderWidgetHostView, public:
799 882
800 // static 883 // static
801 RenderWidgetHostView* 884 RenderWidgetHostView*
802 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { 885 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) {
803 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); 886 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget);
804 return new RenderWidgetHostViewAndroid(rwhi, NULL); 887 return new RenderWidgetHostViewAndroid(rwhi, NULL);
805 } 888 }
806 889
807 } // namespace content 890 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698