Chromium Code Reviews| 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/sys_utils.h" | 9 #include "base/android/sys_utils.h" |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 141 overscroll_effect_(OverscrollGlow::Create(overscroll_effect_enabled_)), | 141 overscroll_effect_(OverscrollGlow::Create(overscroll_effect_enabled_)), |
| 142 flush_input_requested_(false), | 142 flush_input_requested_(false), |
| 143 accelerated_surface_route_id_(0), | 143 accelerated_surface_route_id_(0), |
| 144 using_synchronous_compositor_(SynchronousCompositorImpl::FromID( | 144 using_synchronous_compositor_(SynchronousCompositorImpl::FromID( |
| 145 widget_host->GetProcess()->GetID(), | 145 widget_host->GetProcess()->GetID(), |
| 146 widget_host->GetRoutingID()) != NULL), | 146 widget_host->GetRoutingID()) != NULL), |
| 147 frame_evictor_(new DelegatedFrameEvictor(this)), | 147 frame_evictor_(new DelegatedFrameEvictor(this)), |
| 148 using_delegated_renderer_(CommandLine::ForCurrentProcess()->HasSwitch( | 148 using_delegated_renderer_(CommandLine::ForCurrentProcess()->HasSwitch( |
| 149 switches::kEnableDelegatedRenderer) && | 149 switches::kEnableDelegatedRenderer) && |
| 150 !CommandLine::ForCurrentProcess()->HasSwitch( | 150 !CommandLine::ForCurrentProcess()->HasSwitch( |
| 151 switches::kDisableDelegatedRenderer)) { | 151 switches::kDisableDelegatedRenderer)), |
| 152 locks_on_frame_count_(0) { | |
| 152 if (!using_delegated_renderer_) { | 153 if (!using_delegated_renderer_) { |
| 153 texture_layer_ = cc::TextureLayer::Create(NULL); | 154 texture_layer_ = cc::TextureLayer::Create(NULL); |
| 154 layer_ = texture_layer_; | 155 layer_ = texture_layer_; |
| 155 } | 156 } |
| 156 | 157 |
| 157 host_->SetView(this); | 158 host_->SetView(this); |
| 158 SetContentViewCore(content_view_core); | 159 SetContentViewCore(content_view_core); |
| 159 ImageTransportFactoryAndroid::AddObserver(this); | 160 ImageTransportFactoryAndroid::AddObserver(this); |
| 160 } | 161 } |
| 161 | 162 |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 279 | 280 |
| 280 bool RenderWidgetHostViewAndroid::HasValidFrame() const { | 281 bool RenderWidgetHostViewAndroid::HasValidFrame() const { |
| 281 if (!content_view_core_) | 282 if (!content_view_core_) |
| 282 return false; | 283 return false; |
| 283 if (!layer_) | 284 if (!layer_) |
| 284 return false; | 285 return false; |
| 285 | 286 |
| 286 if (texture_size_in_layer_.IsEmpty()) | 287 if (texture_size_in_layer_.IsEmpty()) |
| 287 return false; | 288 return false; |
| 288 | 289 |
| 290 if (!frame_evictor_->HasFrame()) | |
| 291 return false; | |
| 292 | |
| 289 if (using_delegated_renderer_) { | 293 if (using_delegated_renderer_) { |
| 290 if (!delegated_renderer_layer_.get()) | 294 if (!delegated_renderer_layer_.get()) |
| 291 return false; | 295 return false; |
| 292 } else { | 296 } else { |
| 293 if (texture_id_in_layer_ == 0) | 297 if (texture_id_in_layer_ == 0) |
| 294 return false; | 298 return false; |
| 295 } | 299 } |
| 296 | 300 |
| 297 return true; | 301 return true; |
| 298 } | 302 } |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 369 WasHidden(); | 373 WasHidden(); |
| 370 } | 374 } |
| 371 | 375 |
| 372 bool RenderWidgetHostViewAndroid::IsShowing() { | 376 bool RenderWidgetHostViewAndroid::IsShowing() { |
| 373 // ContentViewCoreImpl represents the native side of the Java | 377 // ContentViewCoreImpl represents the native side of the Java |
| 374 // ContentViewCore. It being NULL means that it is not attached | 378 // ContentViewCore. It being NULL means that it is not attached |
| 375 // to the View system yet, so we treat this RWHVA as hidden. | 379 // to the View system yet, so we treat this RWHVA as hidden. |
| 376 return is_showing_ && content_view_core_; | 380 return is_showing_ && content_view_core_; |
| 377 } | 381 } |
| 378 | 382 |
| 379 void RenderWidgetHostViewAndroid::LockResources() { | 383 void RenderWidgetHostViewAndroid::LockSurface() { |
| 380 DCHECK(HasValidFrame()); | 384 DCHECK(HasValidFrame()); |
| 381 DCHECK(host_); | 385 DCHECK(host_); |
| 382 DCHECK(!host_->is_hidden()); | 386 DCHECK(frame_evictor_->HasFrame()); |
| 383 frame_evictor_->LockFrame(); | 387 frame_evictor_->LockFrame(); |
| 388 locks_on_frame_count_++; | |
| 384 } | 389 } |
| 385 | 390 |
| 386 void RenderWidgetHostViewAndroid::UnlockResources() { | 391 void RenderWidgetHostViewAndroid::UnlockSurface() { |
| 392 if (!frame_evictor_->HasFrame() || locks_on_frame_count_ == 0) | |
| 393 return; | |
| 394 | |
| 387 DCHECK(HasValidFrame()); | 395 DCHECK(HasValidFrame()); |
| 388 frame_evictor_->UnlockFrame(); | 396 frame_evictor_->UnlockFrame(); |
| 397 locks_on_frame_count_--; | |
| 398 | |
| 399 if (locks_on_frame_count_ == 0 && last_frame_info_) { | |
| 400 InternalSwapCompositorFrame(last_frame_info_->output_surface_id, | |
| 401 last_frame_info_->frame.Pass()); | |
| 402 last_frame_info_.reset(); | |
| 403 } | |
| 404 } | |
| 405 | |
| 406 void RenderWidgetHostViewAndroid::ReleaseLocksOnSurface() { | |
| 407 if (!frame_evictor_->HasFrame()) { | |
| 408 DCHECK_EQ(locks_on_frame_count_, 0u); | |
| 409 return; | |
| 410 } | |
| 411 while (locks_on_frame_count_ > 0) { | |
| 412 UnlockSurface(); | |
| 413 } | |
| 389 } | 414 } |
| 390 | 415 |
| 391 gfx::Rect RenderWidgetHostViewAndroid::GetViewBounds() const { | 416 gfx::Rect RenderWidgetHostViewAndroid::GetViewBounds() const { |
| 392 if (!content_view_core_) | 417 if (!content_view_core_) |
| 393 return gfx::Rect(default_size_); | 418 return gfx::Rect(default_size_); |
| 394 | 419 |
| 395 gfx::Size size = content_view_core_->GetViewportSizeDip(); | 420 gfx::Size size = content_view_core_->GetViewportSizeDip(); |
| 396 gfx::Size offset = content_view_core_->GetViewportSizeOffsetDip(); | 421 gfx::Size offset = content_view_core_->GetViewportSizeOffsetDip(); |
| 397 size.Enlarge(-offset.width(), -offset.height()); | 422 size.Enlarge(-offset.width(), -offset.height()); |
| 398 | 423 |
| (...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 748 delegated_renderer_layer_->SetContentsOpaque(true); | 773 delegated_renderer_layer_->SetContentsOpaque(true); |
| 749 delegated_renderer_layer_->SetBounds(content_size_in_layer_); | 774 delegated_renderer_layer_->SetBounds(content_size_in_layer_); |
| 750 delegated_renderer_layer_->SetNeedsDisplay(); | 775 delegated_renderer_layer_->SetNeedsDisplay(); |
| 751 } | 776 } |
| 752 | 777 |
| 753 base::Closure ack_callback = | 778 base::Closure ack_callback = |
| 754 base::Bind(&RenderWidgetHostViewAndroid::SendDelegatedFrameAck, | 779 base::Bind(&RenderWidgetHostViewAndroid::SendDelegatedFrameAck, |
| 755 weak_ptr_factory_.GetWeakPtr(), | 780 weak_ptr_factory_.GetWeakPtr(), |
| 756 output_surface_id); | 781 output_surface_id); |
| 757 | 782 |
| 783 ack_callbacks_.push(ack_callback); | |
| 758 if (host_->is_hidden()) | 784 if (host_->is_hidden()) |
| 759 ack_callback.Run(); | 785 RunAckCallbacks(); |
| 760 else | |
| 761 ack_callbacks_.push(ack_callback); | |
| 762 } | 786 } |
| 763 | 787 |
| 764 void RenderWidgetHostViewAndroid::ComputeContentsSize( | 788 void RenderWidgetHostViewAndroid::ComputeContentsSize( |
| 765 const cc::CompositorFrameMetadata& frame_metadata) { | 789 const cc::CompositorFrameMetadata& frame_metadata) { |
| 766 // Calculate the content size. This should be 0 if the texture_size is 0. | 790 // Calculate the content size. This should be 0 if the texture_size is 0. |
| 767 gfx::Vector2dF offset; | 791 gfx::Vector2dF offset; |
| 768 if (texture_size_in_layer_.GetArea() > 0) | 792 if (texture_size_in_layer_.GetArea() > 0) |
| 769 offset = frame_metadata.location_bar_content_translation; | 793 offset = frame_metadata.location_bar_content_translation; |
| 770 offset.set_y(offset.y() + frame_metadata.overdraw_bottom_height); | 794 offset.set_y(offset.y() + frame_metadata.overdraw_bottom_height); |
| 771 offset.Scale(frame_metadata.device_scale_factor); | 795 offset.Scale(frame_metadata.device_scale_factor); |
| 772 content_size_in_layer_ = | 796 content_size_in_layer_ = |
| 773 gfx::Size(texture_size_in_layer_.width() - offset.x(), | 797 gfx::Size(texture_size_in_layer_.width() - offset.x(), |
| 774 texture_size_in_layer_.height() - offset.y()); | 798 texture_size_in_layer_.height() - offset.y()); |
| 775 // Content size changes should be reflected in associated animation effects. | 799 // Content size changes should be reflected in associated animation effects. |
| 776 UpdateAnimationSize(frame_metadata); | 800 UpdateAnimationSize(frame_metadata); |
| 777 } | 801 } |
| 778 | 802 |
| 779 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( | 803 void RenderWidgetHostViewAndroid::InternalSwapCompositorFrame( |
| 780 uint32 output_surface_id, | 804 uint32 output_surface_id, |
| 781 scoped_ptr<cc::CompositorFrame> frame) { | 805 scoped_ptr<cc::CompositorFrame> frame) { |
| 806 if (locks_on_frame_count_ > 0) { | |
| 807 DCHECK(HasValidFrame()); | |
| 808 RetainFrame(output_surface_id, frame.Pass()); | |
| 809 return; | |
| 810 } | |
| 811 | |
| 782 // Always let ContentViewCore know about the new frame first, so it can decide | 812 // Always let ContentViewCore know about the new frame first, so it can decide |
| 783 // to schedule a Draw immediately when it sees the texture layer invalidation. | 813 // to schedule a Draw immediately when it sees the texture layer invalidation. |
| 784 UpdateContentViewCoreFrameMetadata(frame->metadata); | 814 UpdateContentViewCoreFrameMetadata(frame->metadata); |
| 785 | 815 |
| 786 if (layer_ && layer_->layer_tree_host()) { | 816 if (layer_ && layer_->layer_tree_host()) { |
| 787 for (size_t i = 0; i < frame->metadata.latency_info.size(); i++) { | 817 for (size_t i = 0; i < frame->metadata.latency_info.size(); i++) { |
| 788 scoped_ptr<cc::SwapPromise> swap_promise( | 818 scoped_ptr<cc::SwapPromise> swap_promise( |
| 789 new cc::LatencyInfoSwapPromise(frame->metadata.latency_info[i])); | 819 new cc::LatencyInfoSwapPromise(frame->metadata.latency_info[i])); |
| 790 layer_->layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); | 820 layer_->layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); |
| 791 } | 821 } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 826 ImageTransportFactoryAndroid::GetInstance()->WaitSyncPoint( | 856 ImageTransportFactoryAndroid::GetInstance()->WaitSyncPoint( |
| 827 frame->gl_frame_data->sync_point); | 857 frame->gl_frame_data->sync_point); |
| 828 | 858 |
| 829 texture_size_in_layer_ = frame->gl_frame_data->size; | 859 texture_size_in_layer_ = frame->gl_frame_data->size; |
| 830 ComputeContentsSize(frame->metadata); | 860 ComputeContentsSize(frame->metadata); |
| 831 | 861 |
| 832 BuffersSwapped(frame->gl_frame_data->mailbox, output_surface_id, callback); | 862 BuffersSwapped(frame->gl_frame_data->mailbox, output_surface_id, callback); |
| 833 frame_evictor_->SwappedFrame(!host_->is_hidden()); | 863 frame_evictor_->SwappedFrame(!host_->is_hidden()); |
| 834 } | 864 } |
| 835 | 865 |
| 866 void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( | |
| 867 uint32 output_surface_id, | |
| 868 scoped_ptr<cc::CompositorFrame> frame) { | |
| 869 InternalSwapCompositorFrame(output_surface_id, frame.Pass()); | |
| 870 } | |
| 871 | |
| 872 void RenderWidgetHostViewAndroid::RetainFrame( | |
| 873 uint32 output_surface_id, | |
| 874 scoped_ptr<cc::CompositorFrame> frame) { | |
| 875 DCHECK(locks_on_frame_count_); | |
| 876 | |
| 877 // Store the incoming frame so that it can be swapped when all the locks have | |
| 878 // been released. If there is already a stored frame, then send | |
| 879 // acknowledgement and drop it. | |
|
no sievers
2014/03/19 19:22:26
nit: comment, 'If there is already a stored frame,
powei
2014/03/19 21:14:08
Done.
| |
| 880 if (last_frame_info_) { | |
| 881 base::Closure ack_callback = | |
| 882 base::Bind(&RenderWidgetHostViewAndroid::SendDelegatedFrameAck, | |
| 883 weak_ptr_factory_.GetWeakPtr(), | |
| 884 last_frame_info_->output_surface_id); | |
| 885 | |
| 886 ack_callbacks_.push(ack_callback); | |
| 887 } | |
| 888 | |
| 889 last_frame_info_.reset(new LastFrameInfo(output_surface_id, frame.Pass())); | |
| 890 } | |
| 891 | |
| 836 void RenderWidgetHostViewAndroid::SynchronousFrameMetadata( | 892 void RenderWidgetHostViewAndroid::SynchronousFrameMetadata( |
| 837 const cc::CompositorFrameMetadata& frame_metadata) { | 893 const cc::CompositorFrameMetadata& frame_metadata) { |
| 838 // This is a subset of OnSwapCompositorFrame() used in the synchronous | 894 // This is a subset of OnSwapCompositorFrame() used in the synchronous |
| 839 // compositor flow. | 895 // compositor flow. |
| 840 UpdateContentViewCoreFrameMetadata(frame_metadata); | 896 UpdateContentViewCoreFrameMetadata(frame_metadata); |
| 841 ComputeContentsSize(frame_metadata); | 897 ComputeContentsSize(frame_metadata); |
| 842 | 898 |
| 843 // DevTools ScreenCast support for Android WebView. | 899 // DevTools ScreenCast support for Android WebView. |
| 844 if (DevToolsAgentHost::HasFor(RenderViewHost::From(GetRenderWidgetHost()))) { | 900 if (DevToolsAgentHost::HasFor(RenderViewHost::From(GetRenderWidgetHost()))) { |
| 845 scoped_refptr<DevToolsAgentHost> dtah = | 901 scoped_refptr<DevToolsAgentHost> dtah = |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 925 texture_layer_->SetIsDrawable(true); | 981 texture_layer_->SetIsDrawable(true); |
| 926 texture_layer_->SetContentsOpaque(true); | 982 texture_layer_->SetContentsOpaque(true); |
| 927 } | 983 } |
| 928 | 984 |
| 929 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( | 985 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( |
| 930 texture_id_in_layer_, mailbox.name); | 986 texture_id_in_layer_, mailbox.name); |
| 931 | 987 |
| 932 current_mailbox_ = mailbox; | 988 current_mailbox_ = mailbox; |
| 933 last_output_surface_id_ = output_surface_id; | 989 last_output_surface_id_ = output_surface_id; |
| 934 | 990 |
| 991 ack_callbacks_.push(ack_callback); | |
| 935 if (host_->is_hidden()) | 992 if (host_->is_hidden()) |
| 936 ack_callback.Run(); | 993 RunAckCallbacks(); |
| 937 else | |
| 938 ack_callbacks_.push(ack_callback); | |
| 939 } | 994 } |
| 940 | 995 |
| 941 void RenderWidgetHostViewAndroid::AttachLayers() { | 996 void RenderWidgetHostViewAndroid::AttachLayers() { |
| 942 if (!content_view_core_) | 997 if (!content_view_core_) |
| 943 return; | 998 return; |
| 944 if (!layer_.get()) | 999 if (!layer_.get()) |
| 945 return; | 1000 return; |
| 946 | 1001 |
| 947 content_view_core_->AttachLayer(layer_); | 1002 content_view_core_->AttachLayer(layer_); |
| 948 if (overscroll_effect_enabled_) | 1003 if (overscroll_effect_enabled_) |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1242 } | 1297 } |
| 1243 | 1298 |
| 1244 void RenderWidgetHostViewAndroid::SetContentViewCore( | 1299 void RenderWidgetHostViewAndroid::SetContentViewCore( |
| 1245 ContentViewCoreImpl* content_view_core) { | 1300 ContentViewCoreImpl* content_view_core) { |
| 1246 RunAckCallbacks(); | 1301 RunAckCallbacks(); |
| 1247 | 1302 |
| 1248 RemoveLayers(); | 1303 RemoveLayers(); |
| 1249 if (content_view_core_ && !using_synchronous_compositor_) | 1304 if (content_view_core_ && !using_synchronous_compositor_) |
| 1250 content_view_core_->GetWindowAndroid()->RemoveObserver(this); | 1305 content_view_core_->GetWindowAndroid()->RemoveObserver(this); |
| 1251 | 1306 |
| 1307 if (content_view_core != content_view_core_) | |
| 1308 ReleaseLocksOnSurface(); | |
| 1309 | |
| 1252 content_view_core_ = content_view_core; | 1310 content_view_core_ = content_view_core; |
| 1253 | 1311 |
| 1254 if (GetBrowserAccessibilityManager()) { | 1312 if (GetBrowserAccessibilityManager()) { |
| 1255 base::android::ScopedJavaLocalRef<jobject> obj; | 1313 base::android::ScopedJavaLocalRef<jobject> obj; |
| 1256 if (content_view_core_) | 1314 if (content_view_core_) |
| 1257 obj = content_view_core_->GetJavaObject(); | 1315 obj = content_view_core_->GetJavaObject(); |
| 1258 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> | 1316 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> |
| 1259 SetContentViewCore(obj); | 1317 SetContentViewCore(obj); |
| 1260 } | 1318 } |
| 1261 | 1319 |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 1275 RunAckCallbacks(); | 1333 RunAckCallbacks(); |
| 1276 } | 1334 } |
| 1277 | 1335 |
| 1278 void RenderWidgetHostViewAndroid::OnDetachCompositor() { | 1336 void RenderWidgetHostViewAndroid::OnDetachCompositor() { |
| 1279 DCHECK(content_view_core_); | 1337 DCHECK(content_view_core_); |
| 1280 DCHECK(!using_synchronous_compositor_); | 1338 DCHECK(!using_synchronous_compositor_); |
| 1281 RunAckCallbacks(); | 1339 RunAckCallbacks(); |
| 1282 } | 1340 } |
| 1283 | 1341 |
| 1284 void RenderWidgetHostViewAndroid::OnLostResources() { | 1342 void RenderWidgetHostViewAndroid::OnLostResources() { |
| 1343 ReleaseLocksOnSurface(); | |
| 1285 if (texture_layer_.get()) | 1344 if (texture_layer_.get()) |
| 1286 texture_layer_->SetIsDrawable(false); | 1345 texture_layer_->SetIsDrawable(false); |
| 1287 if (delegated_renderer_layer_.get()) | 1346 if (delegated_renderer_layer_.get()) |
| 1288 DestroyDelegatedContent(); | 1347 DestroyDelegatedContent(); |
| 1289 texture_id_in_layer_ = 0; | 1348 texture_id_in_layer_ = 0; |
| 1290 RunAckCallbacks(); | 1349 RunAckCallbacks(); |
| 1291 } | 1350 } |
| 1292 | 1351 |
| 1293 // static | 1352 // static |
| 1294 void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult( | 1353 void RenderWidgetHostViewAndroid::PrepareTextureCopyOutputResult( |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1421 // RenderWidgetHostView, public: | 1480 // RenderWidgetHostView, public: |
| 1422 | 1481 |
| 1423 // static | 1482 // static |
| 1424 RenderWidgetHostView* | 1483 RenderWidgetHostView* |
| 1425 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { | 1484 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { |
| 1426 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); | 1485 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); |
| 1427 return new RenderWidgetHostViewAndroid(rwhi, NULL); | 1486 return new RenderWidgetHostViewAndroid(rwhi, NULL); |
| 1428 } | 1487 } |
| 1429 | 1488 |
| 1430 } // namespace content | 1489 } // namespace content |
| OLD | NEW |