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 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]; |