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 541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 552 RenderWidgetHostView* reference_host_view) { | 552 RenderWidgetHostView* reference_host_view) { |
| 553 NOTIMPLEMENTED(); | 553 NOTIMPLEMENTED(); |
| 554 } | 554 } |
| 555 | 555 |
| 556 RenderWidgetHost* | 556 RenderWidgetHost* |
| 557 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const { | 557 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const { |
| 558 return host_; | 558 return host_; |
| 559 } | 559 } |
| 560 | 560 |
| 561 void RenderWidgetHostViewAndroid::WasResized() { | 561 void RenderWidgetHostViewAndroid::WasResized() { |
| 562 // If we're entering a fullscreen transition, show black until the transition | |
| 563 // is completed. | |
|
mlamouri (slow - plz ping)
2017/06/05 12:57:44
We should probably have a content or cc Feature in
steimel
2017/06/06 03:07:54
Good idea. I don't know much about hiding features
| |
| 564 if (content_view_core_ && | |
| 565 view_.GetPhysicalBackingSize() != prev_physical_backing_size_) { | |
| 566 bool is_fullscreen = content_view_core_->GetWebContents()->IsFullscreen(); | |
| 567 if (is_fullscreen || was_fullscreen_) { | |
| 568 fullscreen_transitioning_ = true; | |
| 569 | |
| 570 // TODO update this comment. Immediately queue a black frame to hide jank while we wait to receive a | |
| 571 // "good" frame via SubmitCompositorFrame. | |
| 572 TRACE_EVENT_BEGIN0("frame_eviction", "RenderWidgetHostViewAndroid::WasResi zed Eviction"); | |
| 573 EvictDelegatedFrame(); | |
| 574 TRACE_EVENT_END0("frame_eviction", "RenderWidgetHostViewAndroid::WasResize d Eviction"); | |
| 575 UpdateBackgroundColor(SK_ColorBLACK); | |
| 576 } | |
| 577 // TODO change logic to not require these variables. | |
| 578 was_fullscreen_ = is_fullscreen; | |
| 579 prev_physical_backing_size_ = view_.GetPhysicalBackingSize(); | |
| 580 } | |
| 562 host_->WasResized(); | 581 host_->WasResized(); |
| 563 } | 582 } |
| 564 | 583 |
| 565 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) { | 584 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) { |
| 566 // Ignore the given size as only the Java code has the power to | 585 // Ignore the given size as only the Java code has the power to |
| 567 // resize the view on Android. | 586 // resize the view on Android. |
| 568 default_bounds_ = gfx::Rect(default_bounds_.origin(), size); | 587 default_bounds_ = gfx::Rect(default_bounds_.origin(), size); |
| 569 } | 588 } |
| 570 | 589 |
| 571 void RenderWidgetHostViewAndroid::SetBounds(const gfx::Rect& rect) { | 590 void RenderWidgetHostViewAndroid::SetBounds(const gfx::Rect& rect) { |
| (...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1174 bad_message::RWH_BAD_FRAME_SINK_REQUEST); | 1193 bad_message::RWH_BAD_FRAME_SINK_REQUEST); |
| 1175 return; | 1194 return; |
| 1176 } | 1195 } |
| 1177 delegated_frame_host_->CompositorFrameSinkChanged(); | 1196 delegated_frame_host_->CompositorFrameSinkChanged(); |
| 1178 renderer_compositor_frame_sink_ = renderer_compositor_frame_sink; | 1197 renderer_compositor_frame_sink_ = renderer_compositor_frame_sink; |
| 1179 // Accumulated resources belong to the old RendererCompositorFrameSink and | 1198 // Accumulated resources belong to the old RendererCompositorFrameSink and |
| 1180 // should not be returned. | 1199 // should not be returned. |
| 1181 surface_returned_resources_.clear(); | 1200 surface_returned_resources_.clear(); |
| 1182 } | 1201 } |
| 1183 | 1202 |
| 1203 bool RenderWidgetHostViewAndroid::CheckForFullscreenTransitionJank( | |
| 1204 const cc::CompositorFrameMetadata& metadata) { | |
| 1205 // TODO simplify this logic. | |
| 1206 if (content_view_core_ && | |
| 1207 content_view_core_->GetWebContents()->IsFullscreen() != was_fullscreen_) { | |
| 1208 was_fullscreen_ = !was_fullscreen_; | |
|
mlamouri (slow - plz ping)
2017/06/05 12:57:44
Here and below, it is fairly confusing that a meth
steimel
2017/06/06 03:07:54
I'm assuming you mean "ends up modifying state". I
| |
| 1209 fullscreen_transitioning_ = true; | |
| 1210 return true; | |
| 1211 } | |
| 1212 | |
| 1213 // We only check for fullscreen jank during a fullscreen transition. | |
| 1214 if (fullscreen_transitioning_) { | |
| 1215 bool mismatched_fullscreen_states = | |
| 1216 content_view_core_ && | |
| 1217 (content_view_core_->GetWebContents()->IsFullscreen() != | |
| 1218 metadata.is_fullscreen); | |
| 1219 bool mismatched_layer_sizes = | |
| 1220 view_.GetPhysicalBackingSize() != metadata.device_viewport_size; | |
| 1221 if (mismatched_fullscreen_states || mismatched_layer_sizes) { | |
| 1222 return true; | |
| 1223 } else { | |
| 1224 // Done with current fullscreen transition. | |
| 1225 fullscreen_transitioning_ = false; | |
| 1226 } | |
| 1227 } | |
| 1228 | |
| 1229 return false; | |
| 1230 } | |
| 1231 | |
| 1184 void RenderWidgetHostViewAndroid::SubmitCompositorFrame( | 1232 void RenderWidgetHostViewAndroid::SubmitCompositorFrame( |
| 1185 const cc::LocalSurfaceId& local_surface_id, | 1233 const cc::LocalSurfaceId& local_surface_id, |
| 1186 cc::CompositorFrame frame) { | 1234 cc::CompositorFrame frame) { |
| 1187 if (!delegated_frame_host_) { | 1235 if (!delegated_frame_host_) { |
| 1188 DCHECK(!using_browser_compositor_); | 1236 DCHECK(!using_browser_compositor_); |
| 1189 return; | 1237 return; |
| 1190 } | 1238 } |
| 1191 | 1239 |
| 1240 bool has_jank = CheckForFullscreenTransitionJank(frame.metadata); | |
| 1241 | |
| 1192 last_scroll_offset_ = frame.metadata.root_scroll_offset; | 1242 last_scroll_offset_ = frame.metadata.root_scroll_offset; |
| 1193 DCHECK(!frame.render_pass_list.empty()); | 1243 DCHECK(!frame.render_pass_list.empty()); |
| 1194 | 1244 |
| 1195 cc::RenderPass* root_pass = frame.render_pass_list.back().get(); | 1245 cc::RenderPass* root_pass = frame.render_pass_list.back().get(); |
| 1196 current_surface_size_ = root_pass->output_rect.size(); | 1246 current_surface_size_ = root_pass->output_rect.size(); |
| 1197 bool is_transparent = root_pass->has_transparent_background; | 1247 bool is_transparent = root_pass->has_transparent_background; |
| 1198 | 1248 |
| 1199 cc::CompositorFrameMetadata metadata = frame.metadata.Clone(); | 1249 cc::CompositorFrameMetadata metadata = frame.metadata.Clone(); |
| 1200 | 1250 |
| 1201 bool has_content = !current_surface_size_.IsEmpty(); | 1251 bool has_content = !current_surface_size_.IsEmpty(); |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 1218 frame_evictor_->SwappedFrame(!host_->is_hidden()); | 1268 frame_evictor_->SwappedFrame(!host_->is_hidden()); |
| 1219 AcknowledgeBeginFrame(ack); | 1269 AcknowledgeBeginFrame(ack); |
| 1220 } | 1270 } |
| 1221 | 1271 |
| 1222 if (host_->is_hidden()) | 1272 if (host_->is_hidden()) |
| 1223 RunAckCallbacks(); | 1273 RunAckCallbacks(); |
| 1224 | 1274 |
| 1225 // As the metadata update may trigger view invalidation, always call it after | 1275 // As the metadata update may trigger view invalidation, always call it after |
| 1226 // any potential compositor scheduling. | 1276 // any potential compositor scheduling. |
| 1227 OnFrameMetadataUpdated(std::move(metadata), is_transparent); | 1277 OnFrameMetadataUpdated(std::move(metadata), is_transparent); |
| 1278 | |
| 1279 if (has_jank) { | |
| 1280 TRACE_EVENT_BEGIN0("frame_eviction", "RenderWidgetHostViewAndroid::SubmitCom positorFrame Eviction"); | |
| 1281 EvictDelegatedFrame(); | |
| 1282 TRACE_EVENT_END0("frame_eviction", "RenderWidgetHostViewAndroid::SubmitCompo sitorFrame Eviction"); | |
| 1283 UpdateBackgroundColor(SK_ColorBLACK); | |
| 1284 } | |
|
mlamouri (slow - plz ping)
2017/06/05 12:57:44
For my culture, why do we have to repeat the logic
steimel
2017/06/06 03:07:54
I have fixed this in my cleanup. It was separate h
| |
| 1228 } | 1285 } |
| 1229 | 1286 |
| 1230 void RenderWidgetHostViewAndroid::DestroyDelegatedContent() { | 1287 void RenderWidgetHostViewAndroid::DestroyDelegatedContent() { |
| 1231 DCHECK(!delegated_frame_host_ || | 1288 DCHECK(!delegated_frame_host_ || |
| 1232 delegated_frame_host_->HasDelegatedContent() == | 1289 delegated_frame_host_->HasDelegatedContent() == |
| 1233 frame_evictor_->HasFrame()); | 1290 frame_evictor_->HasFrame()); |
| 1234 | 1291 |
| 1235 if (!delegated_frame_host_) | 1292 if (!delegated_frame_host_) |
| 1236 return; | 1293 return; |
| 1237 | 1294 |
| (...skipping 1000 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2238 | 2295 |
| 2239 ui::WindowAndroidCompositor* compositor = window_android->GetCompositor(); | 2296 ui::WindowAndroidCompositor* compositor = window_android->GetCompositor(); |
| 2240 if (!compositor) | 2297 if (!compositor) |
| 2241 return; | 2298 return; |
| 2242 | 2299 |
| 2243 overscroll_controller_ = base::MakeUnique<OverscrollControllerAndroid>( | 2300 overscroll_controller_ = base::MakeUnique<OverscrollControllerAndroid>( |
| 2244 overscroll_refresh_handler, compositor, view_.GetDipScale()); | 2301 overscroll_refresh_handler, compositor, view_.GetDipScale()); |
| 2245 } | 2302 } |
| 2246 | 2303 |
| 2247 } // namespace content | 2304 } // namespace content |
| OLD | NEW |