diff options
author | shrike <shrike@chromium.org> | 2015-11-12 11:41:08 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-11-12 19:42:41 +0000 |
commit | d77a3639f04f83a5c5cf47d88dbac2f0d4345ea5 (patch) | |
tree | 9d72b16d7bd83a018446b8dfa9a27bbbf8e1af6f /content | |
parent | a8c3d89c8fbbb8910665f194efe33747cd5b6d48 (diff) | |
download | chromium_src-d77a3639f04f83a5c5cf47d88dbac2f0d4345ea5.zip chromium_src-d77a3639f04f83a5c5cf47d88dbac2f0d4345ea5.tar.gz chromium_src-d77a3639f04f83a5c5cf47d88dbac2f0d4345ea5.tar.bz2 |
Fix NTP thumbnail generation
This change delays browser compositor view suspention until pending
thumbnail generation has completed.
This solution uses polling to check if it's OK to suspend the
compositor, which is not great. Also, there's a potential race condition
between the user foregrounding the tab and the pending suspension.
Ideally the thumnail generation operation would signal the compositor
that it's OK to proceed with its suspension, and the compositor would only
suspend itself if it has not been reactivated. I'm just not sure of the
best way to approach that.
BUG=530707
Review URL: https://codereview.chromium.org/1348833003
Cr-Commit-Position: refs/heads/master@{#359361}
Diffstat (limited to 'content')
-rw-r--r-- | content/browser/compositor/delegated_frame_host.cc | 10 | ||||
-rw-r--r-- | content/browser/renderer_host/render_widget_host_view_mac.mm | 12 |
2 files changed, 13 insertions, 9 deletions
diff --git a/content/browser/compositor/delegated_frame_host.cc b/content/browser/compositor/delegated_frame_host.cc index 2221c29..c7c0b8e 100644 --- a/content/browser/compositor/delegated_frame_host.cc +++ b/content/browser/compositor/delegated_frame_host.cc @@ -379,7 +379,7 @@ void DelegatedFrameHost::SwapDelegatedFrame( } last_output_surface_id_ = output_surface_id; } - bool immediate_ack = !compositor_; + bool skip_frame_size_mismatch = false; pending_delegated_ack_count_++; if (frame_size.IsEmpty()) { @@ -421,10 +421,10 @@ void DelegatedFrameHost::SwapDelegatedFrame( gfx::Size desired_size = client_->DelegatedFrameHostDesiredSizeInDIP(); if (desired_size != frame_size_in_dip && !desired_size.IsEmpty()) - immediate_ack = true; + skip_frame_size_mismatch = true; cc::SurfaceFactory::DrawCallback ack_callback; - if (compositor_ && !immediate_ack) { + if (compositor_ && !skip_frame_size_mismatch) { ack_callback = base::Bind(&DelegatedFrameHost::SurfaceDrawn, AsWeakPtr(), output_surface_id); } @@ -460,7 +460,9 @@ void DelegatedFrameHost::SwapDelegatedFrame( client_->DelegatedFrameHostGetLayer()->OnDelegatedFrameDamage( damage_rect_in_dip); - if (immediate_ack) { + // Note that |compositor_| may be reset by SetShowSurface or + // SetShowDelegatedContent above. + if (!compositor_ || skip_frame_size_mismatch) { SendDelegatedFrameAck(output_surface_id); } else if (!use_surfaces_) { std::vector<ui::LatencyInfo>::const_iterator it; diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm index 278fa99..ff472ce 100644 --- a/content/browser/renderer_host/render_widget_host_view_mac.mm +++ b/content/browser/renderer_host/render_widget_host_view_mac.mm @@ -653,10 +653,12 @@ void RenderWidgetHostViewMac::DestroyBrowserCompositorView() { // Destroy the BrowserCompositorView to transition Suspended -> Destroyed. if (browser_compositor_state_ == BrowserCompositorSuspended) { - browser_compositor_->accelerated_widget_mac()->ResetNSView(); - browser_compositor_->compositor()->SetScaleAndSize(1.0, gfx::Size(0, 0)); - browser_compositor_->compositor()->SetRootLayer(nullptr); - BrowserCompositorMac::Recycle(browser_compositor_.Pass()); + if (browser_compositor_) { + browser_compositor_->accelerated_widget_mac()->ResetNSView(); + browser_compositor_->compositor()->SetScaleAndSize(1.0, gfx::Size(0, 0)); + browser_compositor_->compositor()->SetRootLayer(nullptr); + BrowserCompositorMac::Recycle(browser_compositor_.Pass()); + } browser_compositor_state_ = BrowserCompositorDestroyed; } } @@ -891,7 +893,7 @@ void RenderWidgetHostViewMac::WasOccluded() { // occur in this specific order. However, because thumbnail generation is // asychronous, that operation won't run before SuspendBrowserCompositorView() // completes. As a result you won't get a thumbnail for the page unless you - // happen to switch back to it. See http://crbug.com/530707 . + // execute these two statements in this specific order. render_widget_host_->WasHidden(); SuspendBrowserCompositorView(); } |