OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |