// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CONTENT_BROWSER_COMPOSITOR_BROWSER_COMPOSITOR_VIEW_MAC_H_ #define CONTENT_BROWSER_COMPOSITOR_BROWSER_COMPOSITOR_VIEW_MAC_H_ #include "base/macros.h" #include "ui/accelerated_widget_mac/accelerated_widget_mac.h" #include "ui/compositor/compositor.h" #include "ui/compositor/compositor_observer.h" namespace content { // A ui::Compositor and a gfx::AcceleratedWidget (and helper) that it draws // into. This structure is used to efficiently recycle these structures across // tabs (because creating a new ui::Compositor for each tab would be expensive // in terms of time and resources). class BrowserCompositorMac : public ui::CompositorObserver { public: virtual ~BrowserCompositorMac(); // Create a compositor, or recycle a preexisting one. static scoped_ptr Create(); // Delete a compositor, or allow it to be recycled. static void Recycle(scoped_ptr compositor); // Indicate that the recyclable compositor should be destroyed, and no future // compositors should be recycled. static void DisableRecyclingForShutdown(); ui::Compositor* compositor() { return &compositor_; } ui::AcceleratedWidgetMac* accelerated_widget_mac() { return accelerated_widget_mac_.get(); } // Suspend will prevent the compositor from producing new frames. This should // be called to avoid creating spurious frames while changing state. // Compositors are created as suspended. void Suspend(); void Unsuspend(); private: BrowserCompositorMac(); // ui::CompositorObserver implementation: void OnCompositingDidCommit(ui::Compositor* compositor) override; void OnCompositingStarted(ui::Compositor* compositor, base::TimeTicks start_time) override {} void OnCompositingEnded(ui::Compositor* compositor) override {} void OnCompositingAborted(ui::Compositor* compositor) override {} void OnCompositingLockStateChanged(ui::Compositor* compositor) override {} void OnCompositingShuttingDown(ui::Compositor* compositor) override {} scoped_ptr accelerated_widget_mac_; ui::Compositor compositor_; scoped_refptr compositor_suspended_lock_; DISALLOW_COPY_AND_ASSIGN(BrowserCompositorMac); }; // A class to keep around whenever a BrowserCompositorMac may be created. // While at least one instance of this class exists, a spare // BrowserCompositorViewCocoa will be kept around to be recycled so that the // next BrowserCompositorMac to be created will be be created quickly. class BrowserCompositorMacPlaceholder { public: BrowserCompositorMacPlaceholder(); ~BrowserCompositorMacPlaceholder(); private: DISALLOW_COPY_AND_ASSIGN(BrowserCompositorMacPlaceholder); }; } // namespace content #endif // CONTENT_BROWSER_COMPOSITOR_BROWSER_COMPOSITOR_VIEW_MAC_H_