| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/renderer_host/render_widget_host_view_mac.h" | 5 #include "content/browser/renderer_host/render_widget_host_view_mac.h" |
| 6 | 6 |
| 7 #import <objc/runtime.h> | 7 #import <objc/runtime.h> |
| 8 #include <OpenGL/gl.h> | 8 #include <OpenGL/gl.h> |
| 9 #include <QuartzCore/QuartzCore.h> | 9 #include <QuartzCore/QuartzCore.h> |
| 10 | 10 |
| (...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 590 /////////////////////////////////////////////////////////////////////////////// | 590 /////////////////////////////////////////////////////////////////////////////// |
| 591 // RenderWidgetHostViewMac, RenderWidgetHostView implementation: | 591 // RenderWidgetHostViewMac, RenderWidgetHostView implementation: |
| 592 | 592 |
| 593 void RenderWidgetHostViewMac::EnsureBrowserCompositorView() { | 593 void RenderWidgetHostViewMac::EnsureBrowserCompositorView() { |
| 594 TRACE_EVENT0("browser", | 594 TRACE_EVENT0("browser", |
| 595 "RenderWidgetHostViewMac::EnsureBrowserCompositorView"); | 595 "RenderWidgetHostViewMac::EnsureBrowserCompositorView"); |
| 596 | 596 |
| 597 // Create the view, to transition from Destroyed -> Suspended. | 597 // Create the view, to transition from Destroyed -> Suspended. |
| 598 if (browser_compositor_state_ == BrowserCompositorDestroyed) { | 598 if (browser_compositor_state_ == BrowserCompositorDestroyed) { |
| 599 browser_compositor_ = BrowserCompositorMac::Create(); | 599 browser_compositor_ = BrowserCompositorMac::Create(); |
| 600 browser_compositor_->compositor()->SetRootLayer( | |
| 601 root_layer_.get()); | |
| 602 browser_compositor_->accelerated_widget_mac()->SetNSView(this); | 600 browser_compositor_->accelerated_widget_mac()->SetNSView(this); |
| 603 browser_compositor_state_ = BrowserCompositorSuspended; | 601 browser_compositor_state_ = BrowserCompositorSuspended; |
| 604 } | 602 } |
| 605 | 603 |
| 606 // Show the DelegatedFrameHost to transition from Suspended -> Active. | 604 // Show the DelegatedFrameHost to transition from Suspended -> Active. |
| 607 if (browser_compositor_state_ == BrowserCompositorSuspended) { | 605 if (browser_compositor_state_ == BrowserCompositorSuspended) { |
| 608 delegated_frame_host_->AddedToWindow(); | 606 delegated_frame_host_->AddedToWindow(); |
| 609 delegated_frame_host_->WasShown(ui::LatencyInfo()); | 607 delegated_frame_host_->WasShown(ui::LatencyInfo()); |
| 608 browser_compositor_->compositor()->SetRootLayer( |
| 609 root_layer_.get()); |
| 610 browser_compositor_state_ = BrowserCompositorActive; | 610 browser_compositor_state_ = BrowserCompositorActive; |
| 611 } | 611 } |
| 612 } | 612 } |
| 613 | 613 |
| 614 void RenderWidgetHostViewMac::SuspendBrowserCompositorView() { | 614 void RenderWidgetHostViewMac::SuspendBrowserCompositorView() { |
| 615 TRACE_EVENT0("browser", | 615 TRACE_EVENT0("browser", |
| 616 "RenderWidgetHostViewMac::SuspendBrowserCompositorView"); | 616 "RenderWidgetHostViewMac::SuspendBrowserCompositorView"); |
| 617 | 617 |
| 618 // Hide the DelegatedFrameHost to transition from Active -> Suspended. | 618 // Hide the DelegatedFrameHost to transition from Active -> Suspended. |
| 619 if (browser_compositor_state_ == BrowserCompositorActive) { | 619 if (browser_compositor_state_ == BrowserCompositorActive) { |
| 620 // Disconnect the root layer, which will prevent the compositor from |
| 621 // producing more frames. |
| 622 browser_compositor_->compositor()->SetRootLayer(nullptr); |
| 620 // Marking the DelegatedFrameHost as removed from the window hierarchy is | 623 // Marking the DelegatedFrameHost as removed from the window hierarchy is |
| 621 // necessary to remove all connections to its old ui::Compositor. | 624 // necessary to remove all connections to its old ui::Compositor. |
| 622 delegated_frame_host_->WasHidden(); | 625 delegated_frame_host_->WasHidden(); |
| 623 delegated_frame_host_->RemovingFromWindow(); | 626 delegated_frame_host_->RemovingFromWindow(); |
| 624 browser_compositor_state_ = BrowserCompositorSuspended; | 627 browser_compositor_state_ = BrowserCompositorSuspended; |
| 625 } | 628 } |
| 626 } | 629 } |
| 627 | 630 |
| 628 void RenderWidgetHostViewMac::DestroyBrowserCompositorView() { | 631 void RenderWidgetHostViewMac::DestroyBrowserCompositorView() { |
| 629 TRACE_EVENT0("browser", | 632 TRACE_EVENT0("browser", |
| 630 "RenderWidgetHostViewMac::DestroyBrowserCompositorView"); | 633 "RenderWidgetHostViewMac::DestroyBrowserCompositorView"); |
| 631 | 634 |
| 632 // Transition from Active -> Suspended if need be. | 635 // Transition from Active -> Suspended if need be. |
| 633 SuspendBrowserCompositorView(); | 636 SuspendBrowserCompositorView(); |
| 634 | 637 |
| 635 // Destroy the BrowserCompositorView to transition Suspended -> Destroyed. | 638 // Destroy the BrowserCompositorView to transition Suspended -> Destroyed. |
| 636 if (browser_compositor_state_ == BrowserCompositorSuspended) { | 639 if (browser_compositor_state_ == BrowserCompositorSuspended) { |
| 637 browser_compositor_->accelerated_widget_mac()->ResetNSView(); | 640 browser_compositor_->accelerated_widget_mac()->ResetNSView(); |
| 638 browser_compositor_->compositor()->SetScaleAndSize(1.0, gfx::Size(0, 0)); | 641 browser_compositor_->compositor()->SetScaleAndSize(1.0, gfx::Size(0, 0)); |
| 639 browser_compositor_->compositor()->SetRootLayer(NULL); | |
| 640 BrowserCompositorMac::Recycle(browser_compositor_.Pass()); | 642 BrowserCompositorMac::Recycle(browser_compositor_.Pass()); |
| 641 browser_compositor_state_ = BrowserCompositorDestroyed; | 643 browser_compositor_state_ = BrowserCompositorDestroyed; |
| 642 } | 644 } |
| 643 } | 645 } |
| 644 | 646 |
| 645 void RenderWidgetHostViewMac::DestroySuspendedBrowserCompositorViewIfNeeded() { | 647 void RenderWidgetHostViewMac::DestroySuspendedBrowserCompositorViewIfNeeded() { |
| 646 if (browser_compositor_state_ != BrowserCompositorSuspended) | 648 if (browser_compositor_state_ != BrowserCompositorSuspended) |
| 647 return; | 649 return; |
| 648 | 650 |
| 649 // If this view is in a window that is visible, keep around the suspended | 651 // If this view is in a window that is visible, keep around the suspended |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 816 render_widget_host_->NotifyScreenInfoChanged(); | 818 render_widget_host_->NotifyScreenInfoChanged(); |
| 817 } | 819 } |
| 818 | 820 |
| 819 RenderWidgetHost* RenderWidgetHostViewMac::GetRenderWidgetHost() const { | 821 RenderWidgetHost* RenderWidgetHostViewMac::GetRenderWidgetHost() const { |
| 820 return render_widget_host_; | 822 return render_widget_host_; |
| 821 } | 823 } |
| 822 | 824 |
| 823 | 825 |
| 824 void RenderWidgetHostViewMac::Show() { | 826 void RenderWidgetHostViewMac::Show() { |
| 825 [cocoa_view_ setHidden:NO]; | 827 [cocoa_view_ setHidden:NO]; |
| 826 | |
| 827 if (!render_widget_host_->is_hidden()) | 828 if (!render_widget_host_->is_hidden()) |
| 828 return; | 829 return; |
| 829 | 830 |
| 830 ui::LatencyInfo renderer_latency_info; | 831 WasUnOccluded(); |
| 831 renderer_latency_info.AddLatencyNumber( | |
| 832 ui::TAB_SHOW_COMPONENT, | |
| 833 render_widget_host_->GetLatencyComponentId(), | |
| 834 0); | |
| 835 render_widget_host_->WasShown(renderer_latency_info); | |
| 836 | 832 |
| 837 // If there is not a frame being currently drawn, kick one, so that the below | 833 // If there is not a frame being currently drawn, kick one, so that the below |
| 838 // pause will have a frame to wait on. | 834 // pause will have a frame to wait on. |
| 839 render_widget_host_->ScheduleComposite(); | 835 render_widget_host_->ScheduleComposite(); |
| 840 PauseForPendingResizeOrRepaintsAndDraw(); | 836 PauseForPendingResizeOrRepaintsAndDraw(); |
| 841 } | 837 } |
| 842 | 838 |
| 843 void RenderWidgetHostViewMac::Hide() { | 839 void RenderWidgetHostViewMac::Hide() { |
| 844 [cocoa_view_ setHidden:YES]; | 840 [cocoa_view_ setHidden:YES]; |
| 841 WasOccluded(); |
| 842 DestroySuspendedBrowserCompositorViewIfNeeded(); |
| 843 } |
| 845 | 844 |
| 845 void RenderWidgetHostViewMac::WasUnOccluded() { |
| 846 if (!render_widget_host_->is_hidden()) |
| 847 return; |
| 848 |
| 849 ui::LatencyInfo renderer_latency_info; |
| 850 renderer_latency_info.AddLatencyNumber( |
| 851 ui::TAB_SHOW_COMPONENT, |
| 852 render_widget_host_->GetLatencyComponentId(), |
| 853 0); |
| 854 render_widget_host_->WasShown(renderer_latency_info); |
| 855 } |
| 856 |
| 857 void RenderWidgetHostViewMac::WasOccluded() { |
| 846 if (render_widget_host_->is_hidden()) | 858 if (render_widget_host_->is_hidden()) |
| 847 return; | 859 return; |
| 848 | 860 |
| 849 // If we have a renderer, then inform it that we are being hidden so it can | |
| 850 // reduce its resource utilization. | |
| 851 render_widget_host_->WasHidden(); | 861 render_widget_host_->WasHidden(); |
| 852 | |
| 853 SuspendBrowserCompositorView(); | 862 SuspendBrowserCompositorView(); |
| 854 DestroySuspendedBrowserCompositorViewIfNeeded(); | |
| 855 } | 863 } |
| 856 | 864 |
| 857 void RenderWidgetHostViewMac::SetSize(const gfx::Size& size) { | 865 void RenderWidgetHostViewMac::SetSize(const gfx::Size& size) { |
| 858 gfx::Rect rect = GetViewBounds(); | 866 gfx::Rect rect = GetViewBounds(); |
| 859 rect.set_size(size); | 867 rect.set_size(size); |
| 860 SetBounds(rect); | 868 SetBounds(rect); |
| 861 } | 869 } |
| 862 | 870 |
| 863 void RenderWidgetHostViewMac::SetBounds(const gfx::Rect& rect) { | 871 void RenderWidgetHostViewMac::SetBounds(const gfx::Rect& rect) { |
| 864 // |rect.size()| is view coordinates, |rect.origin| is screen coordinates, | 872 // |rect.size()| is view coordinates, |rect.origin| is screen coordinates, |
| (...skipping 2499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3364 | 3372 |
| 3365 // "-webkit-app-region: drag | no-drag" is implemented on Mac by excluding | 3373 // "-webkit-app-region: drag | no-drag" is implemented on Mac by excluding |
| 3366 // regions that are not draggable. (See ControlRegionView in | 3374 // regions that are not draggable. (See ControlRegionView in |
| 3367 // native_app_window_cocoa.mm). This requires the render host view to be | 3375 // native_app_window_cocoa.mm). This requires the render host view to be |
| 3368 // draggable by default. | 3376 // draggable by default. |
| 3369 - (BOOL)mouseDownCanMoveWindow { | 3377 - (BOOL)mouseDownCanMoveWindow { |
| 3370 return YES; | 3378 return YES; |
| 3371 } | 3379 } |
| 3372 | 3380 |
| 3373 @end | 3381 @end |
| OLD | NEW |