Index: content/browser/renderer_host/browser_compositor_view_mac.mm |
diff --git a/content/browser/renderer_host/browser_compositor_view_mac.mm b/content/browser/renderer_host/browser_compositor_view_mac.mm |
index 1c83ace84b3719eb8889cb4531f9e8249759b9d5..0593c725a0f9c61b3315c9d478838ea4adfd3d5e 100644 |
--- a/content/browser/renderer_host/browser_compositor_view_mac.mm |
+++ b/content/browser/renderer_host/browser_compositor_view_mac.mm |
@@ -11,6 +11,7 @@ |
#include "base/lazy_instance.h" |
#include "base/trace_event/trace_event.h" |
#include "content/browser/compositor/image_transport_factory.h" |
+#include "content/browser/renderer_host/resize_lock.h" |
#include "content/public/browser/context_factory.h" |
#include "ui/accelerated_widget_mac/accelerated_widget_mac.h" |
#include "ui/accelerated_widget_mac/window_resize_helper_mac.h" |
@@ -149,33 +150,29 @@ void OnCompositingShuttingDown(ui::Compositor* compositor) override {} |
BrowserCompositorMac::BrowserCompositorMac( |
ui::AcceleratedWidgetMacNSView* accelerated_widget_mac_ns_view, |
- DelegatedFrameHostClient* delegated_frame_host_client, |
+ BrowserCompositorMacClient* client, |
bool render_widget_host_is_hidden, |
bool ns_view_attached_to_window) |
- : accelerated_widget_mac_ns_view_(accelerated_widget_mac_ns_view), |
+ : client_(client), |
+ accelerated_widget_mac_ns_view_(accelerated_widget_mac_ns_view), |
weak_factory_(this) { |
g_browser_compositor_count += 1; |
root_layer_.reset(new ui::Layer(ui::LAYER_SOLID_COLOR)); |
- delegated_frame_host_.reset( |
- new DelegatedFrameHost(delegated_frame_host_client)); |
+ delegated_frame_host_.reset(new DelegatedFrameHost(this)); |
SetRenderWidgetHostIsHidden(render_widget_host_is_hidden); |
SetNSViewAttachedToWindow(ns_view_attached_to_window); |
} |
BrowserCompositorMac::~BrowserCompositorMac() { |
- DCHECK(has_been_destroyed_); |
-} |
- |
-void BrowserCompositorMac::Destroy() { |
- if (has_been_destroyed_) |
- return; |
+ // Ensure that copy callbacks completed or cancelled during further tear-down |
+ // do not call back into this. |
+ weak_factory_.InvalidateWeakPtrs(); |
TransitionToState(HasNoCompositor); |
delegated_frame_host_.reset(); |
root_layer_.reset(); |
- has_been_destroyed_ = true; |
DCHECK_GT(g_browser_compositor_count, 0u); |
g_browser_compositor_count -= 1; |
@@ -192,10 +189,6 @@ void OnCompositingShuttingDown(ui::Compositor* compositor) override {} |
return nullptr; |
} |
-ui::Layer* BrowserCompositorMac::GetRootLayer() { |
- return root_layer_.get(); |
-} |
- |
DelegatedFrameHost* BrowserCompositorMac::GetDelegatedFrameHost() { |
DCHECK(delegated_frame_host_); |
return delegated_frame_host_.get(); |
@@ -259,8 +252,6 @@ void OnCompositingShuttingDown(ui::Compositor* compositor) override {} |
void BrowserCompositorMac::SwapCompositorFrame(uint32_t output_surface_id, |
cc::CompositorFrame frame) { |
- DCHECK(!has_been_destroyed_); |
- |
// Compute the frame size based on the root render pass rect size. |
cc::RenderPass* root_pass = |
frame.delegated_frame_data->render_pass_list.back().get(); |
@@ -277,7 +268,6 @@ void OnCompositingShuttingDown(ui::Compositor* compositor) override {} |
} |
void BrowserCompositorMac::SetHasTransparentBackground(bool transparent) { |
- DCHECK(!has_been_destroyed_); |
has_transparent_background_ = transparent; |
if (recyclable_compositor_) { |
recyclable_compositor_->compositor()->SetHostHasTransparentBackground( |
@@ -294,7 +284,6 @@ void OnCompositingShuttingDown(ui::Compositor* compositor) override {} |
void BrowserCompositorMac::UpdateVSyncParameters( |
const base::TimeTicks& timebase, |
const base::TimeDelta& interval) { |
- DCHECK(!has_been_destroyed_); |
if (recyclable_compositor_) { |
recyclable_compositor_->compositor() |
->vsync_manager() |
@@ -313,11 +302,6 @@ void OnCompositingShuttingDown(ui::Compositor* compositor) override {} |
} |
void BrowserCompositorMac::UpdateState() { |
- if (has_been_destroyed_) { |
- DCHECK(state_ == HasNoCompositor); |
- return; |
- } |
- |
if (!render_widget_host_is_hidden_ || outstanding_copy_count_ > 0) |
TransitionToState(HasAttachedCompositor); |
else if (ns_view_attached_to_window_) |
@@ -386,4 +370,105 @@ void OnCompositingShuttingDown(ui::Compositor* compositor) override {} |
g_spare_recyclable_compositor.Get().reset(); |
} |
+void BrowserCompositorMac::SetNeedsBeginFrames(bool needs_begin_frames) { |
+ if (needs_begin_frames_ == needs_begin_frames) |
+ return; |
+ |
+ needs_begin_frames_ = needs_begin_frames; |
+ if (begin_frame_source_) { |
+ if (needs_begin_frames_) |
+ begin_frame_source_->AddObserver(this); |
+ else |
+ begin_frame_source_->RemoveObserver(this); |
+ } |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// DelegatedFrameHost, public: |
+ |
+ui::Layer* BrowserCompositorMac::DelegatedFrameHostGetLayer() const { |
+ return root_layer_.get(); |
+} |
+ |
+bool BrowserCompositorMac::DelegatedFrameHostIsVisible() const { |
+ // TODO(ccameron): This should return the same value as |
+ // |render_widget_host_is_hidden_|, rather than going back to the |
+ // RenderWidgetHostImpl. |
+ return client_->BrowserCompositorMacIsVisible(); |
+} |
+ |
+SkColor BrowserCompositorMac::DelegatedFrameHostGetGutterColor( |
+ SkColor color) const { |
+ return client_->BrowserCompositorMacGetGutterColor(color); |
+} |
+ |
+gfx::Size BrowserCompositorMac::DelegatedFrameHostDesiredSizeInDIP() const { |
+ NSRect bounds = [client_->BrowserCompositorMacGetNSView() bounds]; |
+ return gfx::Size(bounds.size.width, bounds.size.height); |
+} |
+ |
+bool BrowserCompositorMac::DelegatedFrameCanCreateResizeLock() const { |
+ // Mac uses the RenderWidgetResizeHelper instead of a resize lock. |
+ return false; |
+} |
+ |
+std::unique_ptr<ResizeLock> |
+BrowserCompositorMac::DelegatedFrameHostCreateResizeLock( |
+ bool defer_compositor_lock) { |
+ NOTREACHED(); |
+ return std::unique_ptr<ResizeLock>(); |
+} |
+ |
+void BrowserCompositorMac::DelegatedFrameHostResizeLockWasReleased() { |
+ NOTREACHED(); |
+} |
+ |
+void BrowserCompositorMac::DelegatedFrameHostSendCompositorSwapAck( |
+ int output_surface_id, |
+ const cc::CompositorFrameAck& ack) { |
+ client_->BrowserCompositorMacSendCompositorSwapAck(output_surface_id, ack); |
+} |
+ |
+void BrowserCompositorMac::DelegatedFrameHostSendReclaimCompositorResources( |
+ int output_surface_id, |
+ const cc::CompositorFrameAck& ack) { |
+ client_->BrowserCompositorMacSendReclaimCompositorResources(output_surface_id, |
+ ack); |
+} |
+ |
+void BrowserCompositorMac::DelegatedFrameHostOnLostCompositorResources() { |
+ client_->BrowserCompositorMacOnLostCompositorResources(); |
+} |
+ |
+void BrowserCompositorMac::DelegatedFrameHostUpdateVSyncParameters( |
+ const base::TimeTicks& timebase, |
+ const base::TimeDelta& interval) { |
+ client_->BrowserCompositorMacUpdateVSyncParameters(timebase, interval); |
+} |
+ |
+void BrowserCompositorMac::SetBeginFrameSource(cc::BeginFrameSource* source) { |
+ if (begin_frame_source_ && needs_begin_frames_) |
+ begin_frame_source_->RemoveObserver(this); |
+ begin_frame_source_ = source; |
+ if (begin_frame_source_ && needs_begin_frames_) |
+ begin_frame_source_->AddObserver(this); |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// cc::BeginFrameSourceBase, public: |
+ |
+void BrowserCompositorMac::OnBeginFrame(const cc::BeginFrameArgs& args) { |
+ delegated_frame_host_->SetVSyncParameters(args.frame_time, args.interval); |
+ client_->BrowserCompositorMacSendBeginFrame(args); |
+ last_begin_frame_args_ = args; |
+} |
+ |
+const cc::BeginFrameArgs& BrowserCompositorMac::LastUsedBeginFrameArgs() const { |
+ return last_begin_frame_args_; |
+} |
+ |
+void BrowserCompositorMac::OnBeginFrameSourcePausedChanged(bool paused) { |
+ // Only used on Android WebView. |
+} |
+ |
} // namespace content |