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/android/build_info.h" | 9 #include "base/android/build_info.h" |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
411 float device_scale_factor = display.device_scale_factor(); | 411 float device_scale_factor = display.device_scale_factor(); |
412 DCHECK_GT(device_scale_factor, 0); | 412 DCHECK_GT(device_scale_factor, 0); |
413 gfx::Size dst_size( | 413 gfx::Size dst_size( |
414 gfx::ToCeiledSize(gfx::ScaleSize(bounds, scale / device_scale_factor))); | 414 gfx::ToCeiledSize(gfx::ScaleSize(bounds, scale / device_scale_factor))); |
415 CopyFromCompositingSurface( | 415 CopyFromCompositingSurface( |
416 src_subrect, dst_size, result_callback, color_type); | 416 src_subrect, dst_size, result_callback, color_type); |
417 } | 417 } |
418 | 418 |
419 scoped_refptr<cc::DelegatedRendererLayer> | 419 scoped_refptr<cc::DelegatedRendererLayer> |
420 RenderWidgetHostViewAndroid::CreateDelegatedLayerForFrameProvider() const { | 420 RenderWidgetHostViewAndroid::CreateDelegatedLayerForFrameProvider() const { |
421 DCHECK(frame_provider_); | 421 DCHECK(frame_provider_.get()); |
422 | 422 |
423 scoped_refptr<cc::DelegatedRendererLayer> delegated_layer = | 423 scoped_refptr<cc::DelegatedRendererLayer> delegated_layer = |
424 cc::DelegatedRendererLayer::Create(frame_provider_); | 424 cc::DelegatedRendererLayer::Create(frame_provider_); |
425 delegated_layer->SetBounds(content_size_in_layer_); | 425 delegated_layer->SetBounds(content_size_in_layer_); |
426 delegated_layer->SetIsDrawable(true); | 426 delegated_layer->SetIsDrawable(true); |
427 delegated_layer->SetContentsOpaque(true); | 427 delegated_layer->SetContentsOpaque(true); |
428 | 428 |
429 return delegated_layer; | 429 return delegated_layer; |
430 } | 430 } |
431 | 431 |
432 bool RenderWidgetHostViewAndroid::HasValidFrame() const { | 432 bool RenderWidgetHostViewAndroid::HasValidFrame() const { |
433 if (!content_view_core_) | 433 if (!content_view_core_) |
434 return false; | 434 return false; |
435 if (!layer_) | 435 if (!layer_.get()) |
436 return false; | 436 return false; |
437 | 437 |
438 if (texture_size_in_layer_.IsEmpty()) | 438 if (texture_size_in_layer_.IsEmpty()) |
439 return false; | 439 return false; |
440 // This tell us whether a valid frame has arrived or not. | 440 // This tell us whether a valid frame has arrived or not. |
441 if (!frame_evictor_->HasFrame()) | 441 if (!frame_evictor_->HasFrame()) |
442 return false; | 442 return false; |
443 | 443 |
444 return true; | 444 return true; |
445 } | 445 } |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
497 | 497 |
498 bool RenderWidgetHostViewAndroid::IsSurfaceAvailableForCopy() const { | 498 bool RenderWidgetHostViewAndroid::IsSurfaceAvailableForCopy() const { |
499 return HasValidFrame(); | 499 return HasValidFrame(); |
500 } | 500 } |
501 | 501 |
502 void RenderWidgetHostViewAndroid::Show() { | 502 void RenderWidgetHostViewAndroid::Show() { |
503 if (is_showing_) | 503 if (is_showing_) |
504 return; | 504 return; |
505 | 505 |
506 is_showing_ = true; | 506 is_showing_ = true; |
507 if (layer_) | 507 if (layer_.get()) |
508 layer_->SetHideLayerAndSubtree(false); | 508 layer_->SetHideLayerAndSubtree(false); |
509 | 509 |
510 frame_evictor_->SetVisible(true); | 510 frame_evictor_->SetVisible(true); |
511 WasShown(); | 511 WasShown(); |
512 } | 512 } |
513 | 513 |
514 void RenderWidgetHostViewAndroid::Hide() { | 514 void RenderWidgetHostViewAndroid::Hide() { |
515 if (!is_showing_) | 515 if (!is_showing_) |
516 return; | 516 return; |
517 | 517 |
518 is_showing_ = false; | 518 is_showing_ = false; |
519 if (layer_ && locks_on_frame_count_ == 0) | 519 if (layer_.get() && locks_on_frame_count_ == 0) |
520 layer_->SetHideLayerAndSubtree(true); | 520 layer_->SetHideLayerAndSubtree(true); |
521 | 521 |
522 frame_evictor_->SetVisible(false); | 522 frame_evictor_->SetVisible(false); |
523 // We don't know if we will ever get a frame if we are hiding the renderer, so | 523 // We don't know if we will ever get a frame if we are hiding the renderer, so |
524 // we need to cancel all requests | 524 // we need to cancel all requests |
525 AbortPendingReadbackRequests(); | 525 AbortPendingReadbackRequests(); |
526 WasHidden(); | 526 WasHidden(); |
527 } | 527 } |
528 | 528 |
529 bool RenderWidgetHostViewAndroid::IsShowing() { | 529 bool RenderWidgetHostViewAndroid::IsShowing() { |
(...skipping 19 matching lines...) Expand all Loading... |
549 frame_evictor_->UnlockFrame(); | 549 frame_evictor_->UnlockFrame(); |
550 locks_on_frame_count_--; | 550 locks_on_frame_count_--; |
551 | 551 |
552 if (locks_on_frame_count_ == 0) { | 552 if (locks_on_frame_count_ == 0) { |
553 if (last_frame_info_) { | 553 if (last_frame_info_) { |
554 InternalSwapCompositorFrame(last_frame_info_->output_surface_id, | 554 InternalSwapCompositorFrame(last_frame_info_->output_surface_id, |
555 last_frame_info_->frame.Pass()); | 555 last_frame_info_->frame.Pass()); |
556 last_frame_info_.reset(); | 556 last_frame_info_.reset(); |
557 } | 557 } |
558 | 558 |
559 if (!is_showing_ && layer_) | 559 if (!is_showing_ && layer_.get()) |
560 layer_->SetHideLayerAndSubtree(true); | 560 layer_->SetHideLayerAndSubtree(true); |
561 } | 561 } |
562 } | 562 } |
563 | 563 |
564 void RenderWidgetHostViewAndroid::SetTextSurroundingSelectionCallback( | 564 void RenderWidgetHostViewAndroid::SetTextSurroundingSelectionCallback( |
565 const TextSurroundingSelectionCallback& callback) { | 565 const TextSurroundingSelectionCallback& callback) { |
566 // Only one outstanding request is allowed at any given time. | 566 // Only one outstanding request is allowed at any given time. |
567 DCHECK(!callback.is_null()); | 567 DCHECK(!callback.is_null()); |
568 text_surrounding_selection_callback_ = callback; | 568 text_surrounding_selection_callback_ = callback; |
569 } | 569 } |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
848 return; | 848 return; |
849 } | 849 } |
850 | 850 |
851 scoped_ptr<cc::CopyOutputRequest> request; | 851 scoped_ptr<cc::CopyOutputRequest> request; |
852 scoped_refptr<cc::Layer> readback_layer; | 852 scoped_refptr<cc::Layer> readback_layer; |
853 DCHECK(content_view_core_); | 853 DCHECK(content_view_core_); |
854 DCHECK(content_view_core_->GetWindowAndroid()); | 854 DCHECK(content_view_core_->GetWindowAndroid()); |
855 ui::WindowAndroidCompositor* compositor = | 855 ui::WindowAndroidCompositor* compositor = |
856 content_view_core_->GetWindowAndroid()->GetCompositor(); | 856 content_view_core_->GetWindowAndroid()->GetCompositor(); |
857 DCHECK(compositor); | 857 DCHECK(compositor); |
858 DCHECK(frame_provider_); | 858 DCHECK(frame_provider_.get()); |
859 scoped_refptr<cc::DelegatedRendererLayer> delegated_layer = | 859 scoped_refptr<cc::DelegatedRendererLayer> delegated_layer = |
860 CreateDelegatedLayerForFrameProvider(); | 860 CreateDelegatedLayerForFrameProvider(); |
861 delegated_layer->SetHideLayerAndSubtree(true); | 861 delegated_layer->SetHideLayerAndSubtree(true); |
862 compositor->AttachLayerForReadback(delegated_layer); | 862 compositor->AttachLayerForReadback(delegated_layer); |
863 | 863 |
864 readback_layer = delegated_layer; | 864 readback_layer = delegated_layer; |
865 request = cc::CopyOutputRequest::CreateRequest( | 865 request = cc::CopyOutputRequest::CreateRequest( |
866 base::Bind(&RenderWidgetHostViewAndroid:: | 866 base::Bind(&RenderWidgetHostViewAndroid:: |
867 PrepareTextureCopyOutputResultForDelegatedReadback, | 867 PrepareTextureCopyOutputResultForDelegatedReadback, |
868 dst_size_in_pixel, | 868 dst_size_in_pixel, |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
907 if (resource_collection_.get()) | 907 if (resource_collection_.get()) |
908 resource_collection_->TakeUnusedResourcesForChildCompositor(&ack.resources); | 908 resource_collection_->TakeUnusedResourcesForChildCompositor(&ack.resources); |
909 RenderWidgetHostImpl::SendSwapCompositorFrameAck(host_->GetRoutingID(), | 909 RenderWidgetHostImpl::SendSwapCompositorFrameAck(host_->GetRoutingID(), |
910 output_surface_id, | 910 output_surface_id, |
911 host_->GetProcess()->GetID(), | 911 host_->GetProcess()->GetID(), |
912 ack); | 912 ack); |
913 } | 913 } |
914 | 914 |
915 void RenderWidgetHostViewAndroid::SendReturnedDelegatedResources( | 915 void RenderWidgetHostViewAndroid::SendReturnedDelegatedResources( |
916 uint32 output_surface_id) { | 916 uint32 output_surface_id) { |
917 DCHECK(resource_collection_); | 917 DCHECK(resource_collection_.get()); |
918 | 918 |
919 cc::CompositorFrameAck ack; | 919 cc::CompositorFrameAck ack; |
920 resource_collection_->TakeUnusedResourcesForChildCompositor(&ack.resources); | 920 resource_collection_->TakeUnusedResourcesForChildCompositor(&ack.resources); |
921 DCHECK(!ack.resources.empty()); | 921 DCHECK(!ack.resources.empty()); |
922 | 922 |
923 RenderWidgetHostImpl::SendReclaimCompositorResources( | 923 RenderWidgetHostImpl::SendReclaimCompositorResources( |
924 host_->GetRoutingID(), | 924 host_->GetRoutingID(), |
925 output_surface_id, | 925 output_surface_id, |
926 host_->GetProcess()->GetID(), | 926 host_->GetProcess()->GetID(), |
927 ack); | 927 ack); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
969 // http://crbug.com/384134 or http://crbug.com/310763 | 969 // http://crbug.com/384134 or http://crbug.com/310763 |
970 frame_data->device_scale_factor = 1.0f; | 970 frame_data->device_scale_factor = 1.0f; |
971 | 971 |
972 if (!has_content) { | 972 if (!has_content) { |
973 DestroyDelegatedContent(); | 973 DestroyDelegatedContent(); |
974 } else { | 974 } else { |
975 if (!resource_collection_.get()) { | 975 if (!resource_collection_.get()) { |
976 resource_collection_ = new cc::DelegatedFrameResourceCollection; | 976 resource_collection_ = new cc::DelegatedFrameResourceCollection; |
977 resource_collection_->SetClient(this); | 977 resource_collection_->SetClient(this); |
978 } | 978 } |
979 if (!frame_provider_ || | 979 if (!frame_provider_.get() || |
980 texture_size_in_layer_ != frame_provider_->frame_size()) { | 980 texture_size_in_layer_ != frame_provider_->frame_size()) { |
981 RemoveLayers(); | 981 RemoveLayers(); |
982 frame_provider_ = new cc::DelegatedFrameProvider( | 982 frame_provider_ = new cc::DelegatedFrameProvider( |
983 resource_collection_.get(), frame_data.Pass()); | 983 resource_collection_.get(), frame_data.Pass()); |
984 layer_ = cc::DelegatedRendererLayer::Create(frame_provider_); | 984 layer_ = cc::DelegatedRendererLayer::Create(frame_provider_); |
985 AttachLayers(); | 985 AttachLayers(); |
986 } else { | 986 } else { |
987 frame_provider_->SetFrameData(frame_data.Pass()); | 987 frame_provider_->SetFrameData(frame_data.Pass()); |
988 } | 988 } |
989 } | 989 } |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1029 LOG(ERROR) << "Non-delegated renderer path no longer supported"; | 1029 LOG(ERROR) << "Non-delegated renderer path no longer supported"; |
1030 return; | 1030 return; |
1031 } | 1031 } |
1032 | 1032 |
1033 if (locks_on_frame_count_ > 0) { | 1033 if (locks_on_frame_count_ > 0) { |
1034 DCHECK(HasValidFrame()); | 1034 DCHECK(HasValidFrame()); |
1035 RetainFrame(output_surface_id, frame.Pass()); | 1035 RetainFrame(output_surface_id, frame.Pass()); |
1036 return; | 1036 return; |
1037 } | 1037 } |
1038 | 1038 |
1039 if (layer_ && layer_->layer_tree_host()) { | 1039 if (layer_.get() && layer_->layer_tree_host()) { |
1040 for (size_t i = 0; i < frame->metadata.latency_info.size(); i++) { | 1040 for (size_t i = 0; i < frame->metadata.latency_info.size(); i++) { |
1041 scoped_ptr<cc::SwapPromise> swap_promise( | 1041 scoped_ptr<cc::SwapPromise> swap_promise( |
1042 new cc::LatencyInfoSwapPromise(frame->metadata.latency_info[i])); | 1042 new cc::LatencyInfoSwapPromise(frame->metadata.latency_info[i])); |
1043 layer_->layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); | 1043 layer_->layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); |
1044 } | 1044 } |
1045 } | 1045 } |
1046 | 1046 |
1047 DCHECK(!frame->delegated_frame_data->render_pass_list.empty()); | 1047 DCHECK(!frame->delegated_frame_data->render_pass_list.empty()); |
1048 | 1048 |
1049 cc::RenderPass* root_pass = | 1049 cc::RenderPass* root_pass = |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1113 // Unblock the compositor. | 1113 // Unblock the compositor. |
1114 BrowserThread::PostTask( | 1114 BrowserThread::PostTask( |
1115 BrowserThread::UI, FROM_HERE, | 1115 BrowserThread::UI, FROM_HERE, |
1116 base::Bind(&RenderViewDevToolsAgentHost::SynchronousSwapCompositorFrame, | 1116 base::Bind(&RenderViewDevToolsAgentHost::SynchronousSwapCompositorFrame, |
1117 static_cast<RenderViewDevToolsAgentHost*>(dtah.get()), | 1117 static_cast<RenderViewDevToolsAgentHost*>(dtah.get()), |
1118 frame_metadata)); | 1118 frame_metadata)); |
1119 } | 1119 } |
1120 } | 1120 } |
1121 | 1121 |
1122 void RenderWidgetHostViewAndroid::SetOverlayVideoMode(bool enabled) { | 1122 void RenderWidgetHostViewAndroid::SetOverlayVideoMode(bool enabled) { |
1123 if (layer_) | 1123 if (layer_.get()) |
1124 layer_->SetContentsOpaque(!enabled); | 1124 layer_->SetContentsOpaque(!enabled); |
1125 } | 1125 } |
1126 | 1126 |
1127 bool RenderWidgetHostViewAndroid::SupportsAnimation() const { | 1127 bool RenderWidgetHostViewAndroid::SupportsAnimation() const { |
1128 // The synchronous (WebView) compositor does not have a proper browser | 1128 // The synchronous (WebView) compositor does not have a proper browser |
1129 // compositor with which to drive animations. | 1129 // compositor with which to drive animations. |
1130 return !using_synchronous_compositor_; | 1130 return !using_synchronous_compositor_; |
1131 } | 1131 } |
1132 | 1132 |
1133 void RenderWidgetHostViewAndroid::SetNeedsAnimate() { | 1133 void RenderWidgetHostViewAndroid::SetNeedsAnimate() { |
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1504 selection_controller_->OnSelectionBoundsChanged(insertion_bound, | 1504 selection_controller_->OnSelectionBoundsChanged(insertion_bound, |
1505 insertion_bound); | 1505 insertion_bound); |
1506 } | 1506 } |
1507 | 1507 |
1508 SkColor RenderWidgetHostViewAndroid::GetCachedBackgroundColor() const { | 1508 SkColor RenderWidgetHostViewAndroid::GetCachedBackgroundColor() const { |
1509 return cached_background_color_; | 1509 return cached_background_color_; |
1510 } | 1510 } |
1511 | 1511 |
1512 void RenderWidgetHostViewAndroid::DidOverscroll( | 1512 void RenderWidgetHostViewAndroid::DidOverscroll( |
1513 const DidOverscrollParams& params) { | 1513 const DidOverscrollParams& params) { |
1514 if (!content_view_core_ || !layer_ || !is_showing_) | 1514 if (!content_view_core_ || !layer_.get() || !is_showing_) |
1515 return; | 1515 return; |
1516 | 1516 |
1517 const float device_scale_factor = content_view_core_->GetDpiScale(); | 1517 const float device_scale_factor = content_view_core_->GetDpiScale(); |
1518 | 1518 |
1519 if (overscroll_effect_ && | 1519 if (overscroll_effect_ && |
1520 overscroll_effect_->OnOverscrolled( | 1520 overscroll_effect_->OnOverscrolled( |
1521 content_view_core_->GetLayer(), | 1521 content_view_core_->GetLayer(), |
1522 base::TimeTicks::Now(), | 1522 base::TimeTicks::Now(), |
1523 gfx::ScaleVector2d(params.accumulated_overscroll, | 1523 gfx::ScaleVector2d(params.accumulated_overscroll, |
1524 device_scale_factor), | 1524 device_scale_factor), |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1772 results->orientationAngle = display.RotationAsDegree(); | 1772 results->orientationAngle = display.RotationAsDegree(); |
1773 results->orientationType = | 1773 results->orientationType = |
1774 RenderWidgetHostViewBase::GetOrientationTypeForMobile(display); | 1774 RenderWidgetHostViewBase::GetOrientationTypeForMobile(display); |
1775 gfx::DeviceDisplayInfo info; | 1775 gfx::DeviceDisplayInfo info; |
1776 results->depth = info.GetBitsPerPixel(); | 1776 results->depth = info.GetBitsPerPixel(); |
1777 results->depthPerComponent = info.GetBitsPerComponent(); | 1777 results->depthPerComponent = info.GetBitsPerComponent(); |
1778 results->isMonochrome = (results->depthPerComponent == 0); | 1778 results->isMonochrome = (results->depthPerComponent == 0); |
1779 } | 1779 } |
1780 | 1780 |
1781 } // namespace content | 1781 } // namespace content |
OLD | NEW |