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 <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 923 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 934 DCHECK(HasValidFrame()); | 934 DCHECK(HasValidFrame()); |
| 935 RetainFrame(output_surface_id, std::move(frame)); | 935 RetainFrame(output_surface_id, std::move(frame)); |
| 936 return; | 936 return; |
| 937 } | 937 } |
| 938 | 938 |
| 939 DCHECK(!frame.delegated_frame_data->render_pass_list.empty()); | 939 DCHECK(!frame.delegated_frame_data->render_pass_list.empty()); |
| 940 | 940 |
| 941 cc::RenderPass* root_pass = | 941 cc::RenderPass* root_pass = |
| 942 frame.delegated_frame_data->render_pass_list.back().get(); | 942 frame.delegated_frame_data->render_pass_list.back().get(); |
| 943 current_surface_size_ = root_pass->output_rect.size(); | 943 current_surface_size_ = root_pass->output_rect.size(); |
| 944 bool is_transparent = root_pass->has_transparent_background; | |
| 944 | 945 |
| 945 cc::CompositorFrameMetadata metadata = frame.metadata.Clone(); | 946 cc::CompositorFrameMetadata metadata = frame.metadata.Clone(); |
| 946 | 947 |
| 947 CheckOutputSurfaceChanged(output_surface_id); | 948 CheckOutputSurfaceChanged(output_surface_id); |
| 948 bool has_content = !current_surface_size_.IsEmpty(); | 949 bool has_content = !current_surface_size_.IsEmpty(); |
| 949 | 950 |
| 950 base::Closure ack_callback = | 951 base::Closure ack_callback = |
| 951 base::Bind(&RenderWidgetHostViewAndroid::SendReclaimCompositorResources, | 952 base::Bind(&RenderWidgetHostViewAndroid::SendReclaimCompositorResources, |
| 952 weak_ptr_factory_.GetWeakPtr(), output_surface_id, | 953 weak_ptr_factory_.GetWeakPtr(), output_surface_id, |
| 953 true /* is_swap_ack */); | 954 true /* is_swap_ack */); |
| 954 | 955 |
| 955 ack_callbacks_.push(ack_callback); | 956 ack_callbacks_.push(ack_callback); |
| 956 | 957 |
| 957 if (!has_content) { | 958 if (!has_content) { |
| 958 DestroyDelegatedContent(); | 959 DestroyDelegatedContent(); |
| 959 } else { | 960 } else { |
| 960 cc::SurfaceFactory::DrawCallback ack_callback = | 961 cc::SurfaceFactory::DrawCallback ack_callback = |
| 961 base::Bind(&RenderWidgetHostViewAndroid::RunAckCallbacks, | 962 base::Bind(&RenderWidgetHostViewAndroid::RunAckCallbacks, |
| 962 weak_ptr_factory_.GetWeakPtr()); | 963 weak_ptr_factory_.GetWeakPtr()); |
| 963 delegated_frame_host_->SubmitCompositorFrame(std::move(frame), | 964 delegated_frame_host_->SubmitCompositorFrame(std::move(frame), |
| 964 ack_callback); | 965 ack_callback); |
| 965 frame_evictor_->SwappedFrame(!host_->is_hidden()); | 966 frame_evictor_->SwappedFrame(!host_->is_hidden()); |
| 966 } | 967 } |
| 967 | 968 |
| 968 if (host_->is_hidden()) | 969 if (host_->is_hidden()) |
| 969 RunAckCallbacks(); | 970 RunAckCallbacks(); |
| 970 | 971 |
| 971 // As the metadata update may trigger view invalidation, always call it after | 972 // As the metadata update may trigger view invalidation, always call it after |
| 972 // any potential compositor scheduling. | 973 // any potential compositor scheduling. |
| 973 OnFrameMetadataUpdated(std::move(metadata)); | 974 OnFrameMetadataUpdated(std::move(metadata), is_transparent); |
| 974 } | 975 } |
| 975 | 976 |
| 976 void RenderWidgetHostViewAndroid::DestroyDelegatedContent() { | 977 void RenderWidgetHostViewAndroid::DestroyDelegatedContent() { |
| 977 DCHECK(!delegated_frame_host_ || | 978 DCHECK(!delegated_frame_host_ || |
| 978 delegated_frame_host_->HasDelegatedContent() == | 979 delegated_frame_host_->HasDelegatedContent() == |
| 979 frame_evictor_->HasFrame()); | 980 frame_evictor_->HasFrame()); |
| 980 DCHECK_EQ(locks_on_frame_count_, 0u); | 981 DCHECK_EQ(locks_on_frame_count_, 0u); |
| 981 | 982 |
| 982 if (!delegated_frame_host_) | 983 if (!delegated_frame_host_) |
| 983 return; | 984 return; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1020 new LastFrameInfo(output_surface_id, std::move(frame))); | 1021 new LastFrameInfo(output_surface_id, std::move(frame))); |
| 1021 } | 1022 } |
| 1022 | 1023 |
| 1023 void RenderWidgetHostViewAndroid::SynchronousFrameMetadata( | 1024 void RenderWidgetHostViewAndroid::SynchronousFrameMetadata( |
| 1024 cc::CompositorFrameMetadata frame_metadata) { | 1025 cc::CompositorFrameMetadata frame_metadata) { |
| 1025 if (!content_view_core_) | 1026 if (!content_view_core_) |
| 1026 return; | 1027 return; |
| 1027 | 1028 |
| 1028 // This is a subset of OnSwapCompositorFrame() used in the synchronous | 1029 // This is a subset of OnSwapCompositorFrame() used in the synchronous |
| 1029 // compositor flow. | 1030 // compositor flow. |
| 1030 OnFrameMetadataUpdated(frame_metadata.Clone()); | 1031 OnFrameMetadataUpdated(frame_metadata.Clone(), false); |
|
no sievers
2016/09/02 22:06:52
+Bo for whether WebView needs to worry about this
boliu
2016/09/02 22:52:11
Don't think so. Webview disables video overlays be
| |
| 1031 | 1032 |
| 1032 // DevTools ScreenCast support for Android WebView. | 1033 // DevTools ScreenCast support for Android WebView. |
| 1033 WebContents* web_contents = content_view_core_->GetWebContents(); | 1034 WebContents* web_contents = content_view_core_->GetWebContents(); |
| 1034 if (DevToolsAgentHost::HasFor(web_contents)) { | 1035 if (DevToolsAgentHost::HasFor(web_contents)) { |
| 1035 scoped_refptr<DevToolsAgentHost> dtah = | 1036 scoped_refptr<DevToolsAgentHost> dtah = |
| 1036 DevToolsAgentHost::GetOrCreateFor(web_contents); | 1037 DevToolsAgentHost::GetOrCreateFor(web_contents); |
| 1037 // Unblock the compositor. | 1038 // Unblock the compositor. |
| 1038 BrowserThread::PostTask( | 1039 BrowserThread::PostTask( |
| 1039 BrowserThread::UI, FROM_HERE, | 1040 BrowserThread::UI, FROM_HERE, |
| 1040 base::Bind( | 1041 base::Bind( |
| 1041 &RenderFrameDevToolsAgentHost::SynchronousSwapCompositorFrame, | 1042 &RenderFrameDevToolsAgentHost::SynchronousSwapCompositorFrame, |
| 1042 static_cast<RenderFrameDevToolsAgentHost*>(dtah.get()), | 1043 static_cast<RenderFrameDevToolsAgentHost*>(dtah.get()), |
| 1043 base::Passed(&frame_metadata))); | 1044 base::Passed(&frame_metadata))); |
| 1044 } | 1045 } |
| 1045 } | 1046 } |
| 1046 | 1047 |
| 1047 void RenderWidgetHostViewAndroid::SetOverlayVideoMode(bool enabled) { | |
| 1048 if (delegated_frame_host_) | |
| 1049 delegated_frame_host_->SetContentsOpaque(!enabled); | |
| 1050 } | |
| 1051 | |
| 1052 bool RenderWidgetHostViewAndroid::SupportsAnimation() const { | 1048 bool RenderWidgetHostViewAndroid::SupportsAnimation() const { |
| 1053 // The synchronous (WebView) compositor does not have a proper browser | 1049 // The synchronous (WebView) compositor does not have a proper browser |
| 1054 // compositor with which to drive animations. | 1050 // compositor with which to drive animations. |
| 1055 return using_browser_compositor_; | 1051 return using_browser_compositor_; |
| 1056 } | 1052 } |
| 1057 | 1053 |
| 1058 void RenderWidgetHostViewAndroid::SetNeedsAnimate() { | 1054 void RenderWidgetHostViewAndroid::SetNeedsAnimate() { |
| 1059 DCHECK(content_view_core_ && content_view_core_->GetWindowAndroid()); | 1055 DCHECK(content_view_core_ && content_view_core_->GetWindowAndroid()); |
| 1060 DCHECK(using_browser_compositor_); | 1056 DCHECK(using_browser_compositor_); |
| 1061 content_view_core_->GetWindowAndroid()->SetNeedsAnimate(); | 1057 content_view_core_->GetWindowAndroid()->SetNeedsAnimate(); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1143 kPremul_SkAlphaType)); | 1139 kPremul_SkAlphaType)); |
| 1144 SkCanvas canvas(bitmap); | 1140 SkCanvas canvas(bitmap); |
| 1145 canvas.scale( | 1141 canvas.scale( |
| 1146 (float)output_width / (float)input_size_in_pixel.width(), | 1142 (float)output_width / (float)input_size_in_pixel.width(), |
| 1147 (float)output_height / (float)input_size_in_pixel.height()); | 1143 (float)output_height / (float)input_size_in_pixel.height()); |
| 1148 sync_compositor_->DemandDrawSw(&canvas); | 1144 sync_compositor_->DemandDrawSw(&canvas); |
| 1149 callback.Run(bitmap, READBACK_SUCCESS); | 1145 callback.Run(bitmap, READBACK_SUCCESS); |
| 1150 } | 1146 } |
| 1151 | 1147 |
| 1152 void RenderWidgetHostViewAndroid::OnFrameMetadataUpdated( | 1148 void RenderWidgetHostViewAndroid::OnFrameMetadataUpdated( |
| 1153 const cc::CompositorFrameMetadata& frame_metadata) { | 1149 const cc::CompositorFrameMetadata& frame_metadata, |
| 1150 bool is_transparent) { | |
| 1154 bool is_mobile_optimized = IsMobileOptimizedFrame(frame_metadata); | 1151 bool is_mobile_optimized = IsMobileOptimizedFrame(frame_metadata); |
| 1155 gesture_provider_.SetDoubleTapSupportForPageEnabled(!is_mobile_optimized); | 1152 gesture_provider_.SetDoubleTapSupportForPageEnabled(!is_mobile_optimized); |
| 1156 | 1153 |
| 1157 if (!content_view_core_) | 1154 if (!content_view_core_) |
| 1158 return; | 1155 return; |
| 1159 | 1156 |
| 1160 if (overscroll_controller_) | 1157 if (overscroll_controller_) |
| 1161 overscroll_controller_->OnFrameMetadataUpdated(frame_metadata); | 1158 overscroll_controller_->OnFrameMetadataUpdated(frame_metadata); |
| 1162 | 1159 |
| 1163 if (selection_controller_) { | 1160 if (selection_controller_) { |
| 1164 selection_controller_->OnSelectionEditable( | 1161 selection_controller_->OnSelectionEditable( |
| 1165 frame_metadata.selection.is_editable); | 1162 frame_metadata.selection.is_editable); |
| 1166 selection_controller_->OnSelectionEmpty( | 1163 selection_controller_->OnSelectionEmpty( |
| 1167 frame_metadata.selection.is_empty_text_form_control); | 1164 frame_metadata.selection.is_empty_text_form_control); |
| 1168 selection_controller_->OnSelectionBoundsChanged( | 1165 selection_controller_->OnSelectionBoundsChanged( |
| 1169 frame_metadata.selection.start, frame_metadata.selection.end); | 1166 frame_metadata.selection.start, frame_metadata.selection.end); |
| 1170 | 1167 |
| 1171 // Set parameters for adaptive handle orientation. | 1168 // Set parameters for adaptive handle orientation. |
| 1172 gfx::SizeF viewport_size(frame_metadata.scrollable_viewport_size); | 1169 gfx::SizeF viewport_size(frame_metadata.scrollable_viewport_size); |
| 1173 viewport_size.Scale(frame_metadata.page_scale_factor); | 1170 viewport_size.Scale(frame_metadata.page_scale_factor); |
| 1174 gfx::RectF viewport_rect(0.0f, frame_metadata.top_controls_height * | 1171 gfx::RectF viewport_rect(0.0f, frame_metadata.top_controls_height * |
| 1175 frame_metadata.top_controls_shown_ratio, | 1172 frame_metadata.top_controls_shown_ratio, |
| 1176 viewport_size.width(), viewport_size.height()); | 1173 viewport_size.width(), viewport_size.height()); |
| 1177 selection_controller_->OnViewportChanged(viewport_rect); | 1174 selection_controller_->OnViewportChanged(viewport_rect); |
| 1178 } | 1175 } |
| 1179 | 1176 |
| 1180 UpdateBackgroundColor(frame_metadata.root_background_color); | 1177 UpdateBackgroundColor(is_transparent ? SK_ColorTRANSPARENT |
| 1178 : frame_metadata.root_background_color); | |
| 1181 | 1179 |
| 1182 // All offsets and sizes are in CSS pixels. | 1180 // All offsets and sizes are in CSS pixels. |
| 1183 content_view_core_->UpdateFrameInfo( | 1181 content_view_core_->UpdateFrameInfo( |
| 1184 frame_metadata.root_scroll_offset, | 1182 frame_metadata.root_scroll_offset, |
| 1185 frame_metadata.page_scale_factor, | 1183 frame_metadata.page_scale_factor, |
| 1186 gfx::Vector2dF(frame_metadata.min_page_scale_factor, | 1184 gfx::Vector2dF(frame_metadata.min_page_scale_factor, |
| 1187 frame_metadata.max_page_scale_factor), | 1185 frame_metadata.max_page_scale_factor), |
| 1188 frame_metadata.root_layer_size, | 1186 frame_metadata.root_layer_size, |
| 1189 frame_metadata.scrollable_viewport_size, | 1187 frame_metadata.scrollable_viewport_size, |
| 1190 frame_metadata.top_controls_height, | 1188 frame_metadata.top_controls_height, |
| (...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1870 case ui::MotionEvent::ACTION_UP: | 1868 case ui::MotionEvent::ACTION_UP: |
| 1871 case ui::MotionEvent::ACTION_POINTER_UP: | 1869 case ui::MotionEvent::ACTION_POINTER_UP: |
| 1872 UMA_HISTOGRAM_CUSTOM_COUNTS("Event.Latency.OS.TOUCH_RELEASED", | 1870 UMA_HISTOGRAM_CUSTOM_COUNTS("Event.Latency.OS.TOUCH_RELEASED", |
| 1873 delta.InMicroseconds(), 1, 1000000, 50); | 1871 delta.InMicroseconds(), 1, 1000000, 50); |
| 1874 default: | 1872 default: |
| 1875 return; | 1873 return; |
| 1876 } | 1874 } |
| 1877 } | 1875 } |
| 1878 | 1876 |
| 1879 } // namespace content | 1877 } // namespace content |
| OLD | NEW |