summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authorshrike <shrike@chromium.org>2015-11-12 11:41:08 -0800
committerCommit bot <commit-bot@chromium.org>2015-11-12 19:42:41 +0000
commitd77a3639f04f83a5c5cf47d88dbac2f0d4345ea5 (patch)
tree9d72b16d7bd83a018446b8dfa9a27bbbf8e1af6f /content
parenta8c3d89c8fbbb8910665f194efe33747cd5b6d48 (diff)
downloadchromium_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.cc10
-rw-r--r--content/browser/renderer_host/render_widget_host_view_mac.mm12
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();
}