| 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.
|
|
|