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 |