Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(572)

Unified Diff: content/browser/renderer_host/render_widget_host_view_mac.mm

Issue 370513002: Mac ÜC: Make resize smooth (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@enable_uc_for_reals
Patch Set: Add comments Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_mac.h ('k') | content/common/view_messages.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/renderer_host/render_widget_host_view_mac.mm
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 5fd0b1b2e23be0b57cb740280dfa3cab11645c7b..6c58858272173e65b2e003edfadd07d7efe4b7b7 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -413,8 +413,21 @@ RenderWidgetHostImpl* RenderWidgetHostViewMac::GetHost() {
void RenderWidgetHostViewMac::SchedulePaintInRect(
const gfx::Rect& damage_rect_in_dip) {
- if (browser_compositor_view_)
- browser_compositor_view_->GetCompositor()->ScheduleFullRedraw();
+ // Do not paint immediately because this is being called from deep inside
+ // DelegatedFrameHost, and not all of its state is set up yet.
+ if (browser_compositor_view_ && !browser_compositor_has_pending_paint_) {
+ browser_compositor_has_pending_paint_ = true;
+ base::MessageLoop::current()->PostTask(FROM_HERE,
+ base::Bind(&RenderWidgetHostViewMac::DoBrowserCompositorPendingPaint,
+ weak_factory_.GetWeakPtr()));
+ }
+}
+
+void RenderWidgetHostViewMac::DoBrowserCompositorPendingPaint() {
+ if (browser_compositor_has_pending_paint_) {
+ browser_compositor_view_->GetCompositor()->Draw();
+ browser_compositor_has_pending_paint_ = false;
+ }
}
bool RenderWidgetHostViewMac::IsVisible() {
@@ -468,6 +481,10 @@ ui::Layer* RenderWidgetHostViewMac::BrowserCompositorRootLayer() {
return root_layer_.get();
}
+bool RenderWidgetHostViewMac::BrowserCompositorShouldDrawImmediately() {
+ return is_paused_for_resize_or_repaint_;
+}
+
///////////////////////////////////////////////////////////////////////////////
// RenderWidgetHostViewBase, public:
@@ -484,10 +501,12 @@ RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget)
: render_widget_host_(RenderWidgetHostImpl::From(widget)),
text_input_type_(ui::TEXT_INPUT_TYPE_NONE),
can_compose_inline_(true),
+ browser_compositor_has_pending_paint_(false),
browser_compositor_view_placeholder_(
new BrowserCompositorViewPlaceholderMac),
backing_store_scale_factor_(1),
is_loading_(false),
+ is_paused_for_resize_or_repaint_(false),
weak_factory_(this),
fullscreen_parent_host_view_(NULL),
overlay_view_weak_factory_(this),
@@ -613,6 +632,10 @@ void RenderWidgetHostViewMac::EnsureBrowserCompositorView() {
browser_compositor_view_.reset(new BrowserCompositorViewMac(this));
delegated_frame_host_->AddedToWindow();
delegated_frame_host_->WasShown();
+ RenderWidgetHelper::SetRenderWidgetIDForWidget(
+ browser_compositor_view_->GetView(),
+ render_widget_host_->GetProcess()->GetID(),
+ render_widget_host_->GetRoutingID());
}
void RenderWidgetHostViewMac::DestroyBrowserCompositorView() {
@@ -623,7 +646,10 @@ void RenderWidgetHostViewMac::DestroyBrowserCompositorView() {
delegated_frame_host_->WasHidden();
delegated_frame_host_->RemovingFromWindow();
+ RenderWidgetHelper::ResetRenderWidgetIDForWidget(
+ browser_compositor_view_->GetView());
browser_compositor_view_.reset();
+ browser_compositor_has_pending_paint_ = false;
}
void RenderWidgetHostViewMac::EnsureSoftwareLayer() {
@@ -1804,6 +1830,8 @@ bool RenderWidgetHostViewMac::HasAcceleratedSurface(
software_frame_manager_->GetCurrentFrameSizeInDIP() ==
desired_size);
}
+ if (browser_compositor_view_)
+ return browser_compositor_view_->HasFrameWithSizeInDIP(desired_size);
return false;
}
@@ -1831,6 +1859,8 @@ void RenderWidgetHostViewMac::OnSwapCompositorFrame(
frame->delegated_frame_data.Pass(),
frame->metadata.device_scale_factor,
frame->metadata.latency_info);
+
+ DoBrowserCompositorPendingPaint();
} else if (frame->software_frame_data) {
if (!software_frame_manager_->SwapToNewFrame(
output_surface_id,
@@ -2185,11 +2215,6 @@ void RenderWidgetHostViewMac::PauseForPendingResizeOrRepaintsAndDraw() {
if (!render_widget_host_ || render_widget_host_->is_hidden())
return;
- // Synchronized resizing does not yet work with browser compositor.
- // http://crbug.com/388005
- if (delegated_frame_host_)
- return;
-
// Pausing for the overlay/underlay view prevents the other one from receiving
// frames. This may lead to large delays, causing overlaps.
// See crbug.com/352020.
@@ -2202,7 +2227,9 @@ void RenderWidgetHostViewMac::PauseForPendingResizeOrRepaintsAndDraw() {
SendPendingSwapAck();
// Wait for a frame of the right size to come in.
+ is_paused_for_resize_or_repaint_ = true;
render_widget_host_->PauseForPendingResizeOrRepaints();
+ is_paused_for_resize_or_repaint_ = false;
// Immediately draw any frames that haven't been drawn yet. This is necessary
// to keep the window and the window's contents in sync.
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_mac.h ('k') | content/common/view_messages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698