Chromium Code Reviews| 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 2761280179240222e5640a2b0341a65e5fd182e3..e7f67902a230629f01f0e50c6926587b73015ee2 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,20 @@ RenderWidgetHostImpl* RenderWidgetHostViewMac::GetHost() { |
| void RenderWidgetHostViewMac::SchedulePaintInRect( |
| const gfx::Rect& damage_rect_in_dip) { |
| + // 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_view_->GetCompositor()->ScheduleFullRedraw(); |
| + browser_compositor_has_pending_paint_= true; |
|
piman
2014/07/07 18:27:43
nit: space before =
ccameron
2014/07/07 18:45:23
Done.
|
| + base::MessageLoop::current()->PostTask(FROM_HERE, |
|
piman
2014/07/07 18:27:43
It's better to avoid posting the task if:
- browse
ccameron
2014/07/07 18:45:23
Ah -- good point -- removed the redundant post tas
|
| + base::Bind(&RenderWidgetHostViewMac::DoBrowserCompositorPendingPaint, |
| + weak_factory_.GetWeakPtr())); |
| +} |
| + |
| +void RenderWidgetHostViewMac::DoBrowserCompositorPendingPaint() { |
| + if (browser_compositor_has_pending_paint_) { |
| + browser_compositor_view_->GetCompositor()->Draw(); |
|
piman
2014/07/07 18:27:43
You'll need to check with enne wrt the interaction
ccameron
2014/07/07 18:45:23
Yeah, we had an email thread about this ... adding
|
| + browser_compositor_has_pending_paint_ = false; |
| + } |
| } |
| bool RenderWidgetHostViewMac::IsVisible() { |
| @@ -493,6 +505,10 @@ ui::Layer* RenderWidgetHostViewMac::BrowserCompositorRootLayer() { |
| return root_layer_.get(); |
| } |
| +bool RenderWidgetHostViewMac::BrowserCompositorShouldDrawImmediately() { |
| + return is_paused_for_resize_or_repaint_; |
| +} |
| + |
| /////////////////////////////////////////////////////////////////////////////// |
| // RenderWidgetHostViewBase, public: |
| @@ -509,12 +525,14 @@ 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), |
| pending_latency_info_delay_(0), |
| pending_latency_info_delay_weak_ptr_factory_(this), |
| 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), |
| @@ -640,6 +658,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() { |
| @@ -650,7 +672,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() { |
| @@ -1831,6 +1856,8 @@ bool RenderWidgetHostViewMac::HasAcceleratedSurface( |
| software_frame_manager_->GetCurrentFrameSizeInDIP() == |
| desired_size); |
| } |
| + if (browser_compositor_view_) |
| + return browser_compositor_view_->HasFrameWithSizeInDIP(desired_size); |
| return false; |
| } |
| @@ -1856,6 +1883,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, |
| @@ -2269,11 +2298,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. |
| @@ -2286,7 +2310,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. |