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

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

Issue 684343002: Mac: Use Mavericks occlusion APIs for power savings. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Retry upload Created 6 years, 2 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
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 964af70950fd317c6cae5be9480859c29253accf..4933da0bbf979bf7dcb48a16b2f9379d2c1f6265 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -116,15 +116,6 @@ BOOL EventIsReservedBySystem(NSEvent* event) {
- (BOOL)isSpeaking;
@end
-// Declare things that are part of the 10.7 SDK.
-#if !defined(MAC_OS_X_VERSION_10_7) || \
- MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7
-
-static NSString* const NSWindowDidChangeBackingPropertiesNotification =
- @"NSWindowDidChangeBackingPropertiesNotification";
-
-#endif // 10.7
-
// This method will return YES for OS X versions 10.7.3 and later, and NO
// otherwise.
// Used to prevent a crash when building with the 10.7 SDK and accessing the
@@ -519,6 +510,7 @@ RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget,
: render_widget_host_(RenderWidgetHostImpl::From(widget)),
text_input_type_(ui::TEXT_INPUT_TYPE_NONE),
can_compose_inline_(true),
+ browser_compositor_state_(BrowserCompositorDestroyed),
browser_compositor_view_placeholder_(
new BrowserCompositorViewPlaceholderMac),
is_loading_(false),
@@ -588,29 +580,66 @@ void RenderWidgetHostViewMac::SetAllowPauseForResizeOrRepaint(bool allow) {
// RenderWidgetHostViewMac, RenderWidgetHostView implementation:
void RenderWidgetHostViewMac::EnsureBrowserCompositorView() {
- if (browser_compositor_view_)
- return;
-
TRACE_EVENT0("browser",
"RenderWidgetHostViewMac::EnsureBrowserCompositorView");
- browser_compositor_view_.reset(
- new BrowserCompositorViewMac(this, cocoa_view_, root_layer_.get()));
- delegated_frame_host_->AddedToWindow();
- delegated_frame_host_->WasShown(ui::LatencyInfo());
+ // Create the view, to transition from Destroyed -> Suspended.
+ if (browser_compositor_state_ == BrowserCompositorDestroyed) {
+ browser_compositor_view_.reset(
+ new BrowserCompositorViewMac(this, cocoa_view_, root_layer_.get()));
+ browser_compositor_state_ = BrowserCompositorSuspended;
+ }
+
+ // Show the DelegatedFrameHost to transition from Suspended -> Active.
+ if (browser_compositor_state_ == BrowserCompositorSuspended) {
+ delegated_frame_host_->AddedToWindow();
+ delegated_frame_host_->WasShown(ui::LatencyInfo());
+ browser_compositor_state_ = BrowserCompositorActive;
+ }
+}
+
+void RenderWidgetHostViewMac::SuspendBrowserCompositorView() {
+ TRACE_EVENT0("browser",
+ "RenderWidgetHostViewMac::SuspendBrowserCompositorView");
+
+ // Hide the DelegatedFrameHost to transition from Active -> Suspended.
+ if (browser_compositor_state_ == BrowserCompositorActive) {
+ // Marking the DelegatedFrameHost as removed from the window hierarchy is
+ // necessary to remove all connections to its old ui::Compositor.
+ delegated_frame_host_->WasHidden();
+ delegated_frame_host_->RemovingFromWindow();
+ browser_compositor_state_ = BrowserCompositorSuspended;
+ }
}
void RenderWidgetHostViewMac::DestroyBrowserCompositorView() {
TRACE_EVENT0("browser",
"RenderWidgetHostViewMac::DestroyBrowserCompositorView");
- if (!browser_compositor_view_)
+
+ // Transition from Active -> Suspended if need be.
+ SuspendBrowserCompositorView();
+
+ // Destroy the BrowserCompositorView to transition Suspended -> Destroyed.
+ if (browser_compositor_state_ == BrowserCompositorSuspended) {
+ browser_compositor_view_.reset();
+ browser_compositor_state_ = BrowserCompositorDestroyed;
+ }
+}
+
+void RenderWidgetHostViewMac::DestroySuspendedBrowserCompositorViewIfNeeded() {
+ if (browser_compositor_state_ != BrowserCompositorSuspended)
+ return;
+
+ // If this view is in a window that is visible, keep around the suspended
+ // BrowserCompositorView in case |cocoa_view_| is suddenly revealed (so that
+ // we don't flash white).
+ NSWindow* window = [cocoa_view_ window];
+ if (window)
return;
- // Marking the DelegatedFrameHost as removed from the window hierarchy is
- // necessary to remove all connections to its old ui::Compositor.
- delegated_frame_host_->WasHidden();
- delegated_frame_host_->RemovingFromWindow();
- browser_compositor_view_.reset();
+ // This should only be reached if |render_widget_host_| is hidden, destroyed,
+ // or in the process of being destroyed.
+ DestroyBrowserCompositorView();
}
bool RenderWidgetHostViewMac::OnMessageReceived(const IPC::Message& message) {
@@ -796,11 +825,12 @@ void RenderWidgetHostViewMac::WasHidden() {
if (render_widget_host_->is_hidden())
return;
- DestroyBrowserCompositorView();
-
// If we have a renderer, then inform it that we are being hidden so it can
// reduce its resource utilization.
render_widget_host_->WasHidden();
+
+ SuspendBrowserCompositorView();
+ DestroySuspendedBrowserCompositorViewIfNeeded();
}
void RenderWidgetHostViewMac::SetSize(const gfx::Size& size) {
@@ -3053,8 +3083,13 @@ extern NSString *NSTextInputReplacementRangeAttributeName;
}
- (void)viewDidMoveToWindow {
- if ([self window])
+ if ([self window]) {
[self updateScreenProperties];
+ } else {
+ // If the RenderWidgetHostViewCocoa is being removed its window, tear down
Avi (use Gerrit) 2014/10/30 19:32:52 s/removed its/removed from its/
ccameron 2014/10/30 19:52:10 Done.
+ // its browser compositor resources, if needed.
+ renderWidgetHostView_->DestroySuspendedBrowserCompositorViewIfNeeded();
+ }
if (canBeKeyView_) {
NSWindow* newWindow = [self window];

Powered by Google App Engine
This is Rietveld 408576698