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 |