| 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_aura.h" | 5 #include "content/browser/renderer_host/render_widget_host_view_aura.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/memory/shared_memory.h" | 8 #include "base/memory/shared_memory.h" |
| 9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
| 10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 public: | 121 public: |
| 122 RenderWidgetHostViewAuraTest() | 122 RenderWidgetHostViewAuraTest() |
| 123 : browser_thread_for_ui_(BrowserThread::UI, &message_loop_) {} | 123 : browser_thread_for_ui_(BrowserThread::UI, &message_loop_) {} |
| 124 | 124 |
| 125 virtual void SetUp() { | 125 virtual void SetUp() { |
| 126 ImageTransportFactory::InitializeForUnitTests(); | 126 ImageTransportFactory::InitializeForUnitTests(); |
| 127 aura_test_helper_.reset(new aura::test::AuraTestHelper(&message_loop_)); | 127 aura_test_helper_.reset(new aura::test::AuraTestHelper(&message_loop_)); |
| 128 aura_test_helper_->SetUp(); | 128 aura_test_helper_->SetUp(); |
| 129 | 129 |
| 130 browser_context_.reset(new TestBrowserContext); | 130 browser_context_.reset(new TestBrowserContext); |
| 131 MockRenderProcessHost* process_host = | 131 process_host_ = new MockRenderProcessHost(browser_context_.get()); |
| 132 new MockRenderProcessHost(browser_context_.get()); | |
| 133 | 132 |
| 134 sink_ = &process_host->sink(); | 133 sink_ = &process_host_->sink(); |
| 135 | 134 |
| 136 parent_host_ = new RenderWidgetHostImpl( | 135 parent_host_ = new RenderWidgetHostImpl( |
| 137 &delegate_, process_host, MSG_ROUTING_NONE, false); | 136 &delegate_, process_host_, MSG_ROUTING_NONE, false); |
| 138 parent_view_ = static_cast<RenderWidgetHostViewAura*>( | 137 parent_view_ = static_cast<RenderWidgetHostViewAura*>( |
| 139 RenderWidgetHostView::CreateViewForWidget(parent_host_)); | 138 RenderWidgetHostView::CreateViewForWidget(parent_host_)); |
| 140 parent_view_->InitAsChild(NULL); | 139 parent_view_->InitAsChild(NULL); |
| 141 aura::client::ParentWindowWithContext(parent_view_->GetNativeView(), | 140 aura::client::ParentWindowWithContext(parent_view_->GetNativeView(), |
| 142 aura_test_helper_->root_window(), | 141 aura_test_helper_->root_window(), |
| 143 gfx::Rect()); | 142 gfx::Rect()); |
| 144 | 143 |
| 145 widget_host_ = new RenderWidgetHostImpl( | 144 widget_host_ = new RenderWidgetHostImpl( |
| 146 &delegate_, process_host, MSG_ROUTING_NONE, false); | 145 &delegate_, process_host_, MSG_ROUTING_NONE, false); |
| 147 widget_host_->Init(); | 146 widget_host_->Init(); |
| 148 widget_host_->OnMessageReceived( | 147 widget_host_->OnMessageReceived( |
| 149 ViewHostMsg_DidActivateAcceleratedCompositing(0, true)); | 148 ViewHostMsg_DidActivateAcceleratedCompositing(0, true)); |
| 150 view_ = new FakeRenderWidgetHostViewAura(widget_host_); | 149 view_ = new FakeRenderWidgetHostViewAura(widget_host_); |
| 151 } | 150 } |
| 152 | 151 |
| 153 virtual void TearDown() { | 152 virtual void TearDown() { |
| 154 sink_ = NULL; | 153 sink_ = NULL; |
| 154 process_host_ = NULL; |
| 155 if (view_) | 155 if (view_) |
| 156 view_->Destroy(); | 156 view_->Destroy(); |
| 157 delete widget_host_; | 157 delete widget_host_; |
| 158 | 158 |
| 159 parent_view_->Destroy(); | 159 parent_view_->Destroy(); |
| 160 delete parent_host_; | 160 delete parent_host_; |
| 161 | 161 |
| 162 browser_context_.reset(); | 162 browser_context_.reset(); |
| 163 aura_test_helper_->TearDown(); | 163 aura_test_helper_->TearDown(); |
| 164 | 164 |
| 165 message_loop_.DeleteSoon(FROM_HERE, browser_context_.release()); | 165 message_loop_.DeleteSoon(FROM_HERE, browser_context_.release()); |
| 166 message_loop_.RunUntilIdle(); | 166 message_loop_.RunUntilIdle(); |
| 167 ImageTransportFactory::Terminate(); | 167 ImageTransportFactory::Terminate(); |
| 168 } | 168 } |
| 169 | 169 |
| 170 protected: | 170 protected: |
| 171 base::MessageLoopForUI message_loop_; | 171 base::MessageLoopForUI message_loop_; |
| 172 BrowserThreadImpl browser_thread_for_ui_; | 172 BrowserThreadImpl browser_thread_for_ui_; |
| 173 scoped_ptr<aura::test::AuraTestHelper> aura_test_helper_; | 173 scoped_ptr<aura::test::AuraTestHelper> aura_test_helper_; |
| 174 scoped_ptr<BrowserContext> browser_context_; | 174 scoped_ptr<BrowserContext> browser_context_; |
| 175 MockRenderWidgetHostDelegate delegate_; | 175 MockRenderWidgetHostDelegate delegate_; |
| 176 MockRenderProcessHost* process_host_; |
| 176 | 177 |
| 177 // Tests should set these to NULL if they've already triggered their | 178 // Tests should set these to NULL if they've already triggered their |
| 178 // destruction. | 179 // destruction. |
| 179 RenderWidgetHostImpl* parent_host_; | 180 RenderWidgetHostImpl* parent_host_; |
| 180 RenderWidgetHostViewAura* parent_view_; | 181 RenderWidgetHostViewAura* parent_view_; |
| 181 | 182 |
| 182 // Tests should set these to NULL if they've already triggered their | 183 // Tests should set these to NULL if they've already triggered their |
| 183 // destruction. | 184 // destruction. |
| 184 RenderWidgetHostImpl* widget_host_; | 185 RenderWidgetHostImpl* widget_host_; |
| 185 FakeRenderWidgetHostViewAura* view_; | 186 FakeRenderWidgetHostViewAura* view_; |
| (...skipping 715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 901 // Swap another frame, with a different surface id. | 902 // Swap another frame, with a different surface id. |
| 902 EXPECT_CALL(observer, OnWindowPaintScheduled(view_->window_, view_rect)); | 903 EXPECT_CALL(observer, OnWindowPaintScheduled(view_->window_, view_rect)); |
| 903 view_->OnSwapCompositorFrame( | 904 view_->OnSwapCompositorFrame( |
| 904 3, MakeDelegatedFrame(1.f, frame_size, view_rect)); | 905 3, MakeDelegatedFrame(1.f, frame_size, view_rect)); |
| 905 testing::Mock::VerifyAndClearExpectations(&observer); | 906 testing::Mock::VerifyAndClearExpectations(&observer); |
| 906 view_->RunOnCompositingDidCommit(); | 907 view_->RunOnCompositingDidCommit(); |
| 907 | 908 |
| 908 view_->window_->RemoveObserver(&observer); | 909 view_->window_->RemoveObserver(&observer); |
| 909 } | 910 } |
| 910 | 911 |
| 912 TEST_F(RenderWidgetHostViewAuraTest, DiscardDelegatedFrames) { |
| 913 size_t max_renderer_frames = |
| 914 RendererFrameManager::GetInstance()->max_number_of_saved_frames(); |
| 915 ASSERT_LE(2u, max_renderer_frames); |
| 916 size_t renderer_count = max_renderer_frames + 1; |
| 917 gfx::Rect view_rect(100, 100); |
| 918 gfx::Size frame_size = view_rect.size(); |
| 919 |
| 920 scoped_ptr<RenderWidgetHostImpl * []> hosts( |
| 921 new RenderWidgetHostImpl* [renderer_count]); |
| 922 scoped_ptr<FakeRenderWidgetHostViewAura * []> views( |
| 923 new FakeRenderWidgetHostViewAura* [renderer_count]); |
| 924 |
| 925 // Create a bunch of renderers. |
| 926 for (size_t i = 0; i < renderer_count; ++i) { |
| 927 hosts[i] = new RenderWidgetHostImpl( |
| 928 &delegate_, process_host_, MSG_ROUTING_NONE, false); |
| 929 hosts[i]->Init(); |
| 930 hosts[i]->OnMessageReceived( |
| 931 ViewHostMsg_DidActivateAcceleratedCompositing(0, true)); |
| 932 views[i] = new FakeRenderWidgetHostViewAura(hosts[i]); |
| 933 views[i]->InitAsChild(NULL); |
| 934 aura::client::ParentWindowWithContext( |
| 935 views[i]->GetNativeView(), |
| 936 parent_view_->GetNativeView()->GetRootWindow(), |
| 937 gfx::Rect()); |
| 938 views[i]->SetSize(view_rect.size()); |
| 939 } |
| 940 |
| 941 // Make each renderer visible, and swap a frame on it, then make it invisible. |
| 942 for (size_t i = 0; i < renderer_count; ++i) { |
| 943 views[i]->WasShown(); |
| 944 views[i]->OnSwapCompositorFrame( |
| 945 1, MakeDelegatedFrame(1.f, frame_size, view_rect)); |
| 946 EXPECT_TRUE(views[i]->frame_provider_); |
| 947 views[i]->WasHidden(); |
| 948 } |
| 949 |
| 950 // There should be max_renderer_frames with a frame in it, and one without it. |
| 951 // Since the logic is LRU eviction, the first one should be without. |
| 952 EXPECT_FALSE(views[0]->frame_provider_); |
| 953 for (size_t i = 1; i < renderer_count; ++i) |
| 954 EXPECT_TRUE(views[i]->frame_provider_); |
| 955 |
| 956 // LRU renderer is [0], make it visible, it shouldn't evict anything yet. |
| 957 views[0]->WasShown(); |
| 958 EXPECT_FALSE(views[0]->frame_provider_); |
| 959 EXPECT_TRUE(views[1]->frame_provider_); |
| 960 |
| 961 // Swap a frame on it, it should evict the next LRU [1]. |
| 962 views[0]->OnSwapCompositorFrame( |
| 963 1, MakeDelegatedFrame(1.f, frame_size, view_rect)); |
| 964 EXPECT_TRUE(views[0]->frame_provider_); |
| 965 EXPECT_FALSE(views[1]->frame_provider_); |
| 966 views[0]->WasHidden(); |
| 967 |
| 968 // LRU renderer is [1], still hidden. Swap a frame on it, it should evict |
| 969 // the next LRU [2]. |
| 970 views[1]->OnSwapCompositorFrame( |
| 971 1, MakeDelegatedFrame(1.f, frame_size, view_rect)); |
| 972 EXPECT_TRUE(views[0]->frame_provider_); |
| 973 EXPECT_TRUE(views[1]->frame_provider_); |
| 974 EXPECT_FALSE(views[2]->frame_provider_); |
| 975 for (size_t i = 3; i < renderer_count; ++i) |
| 976 EXPECT_TRUE(views[i]->frame_provider_); |
| 977 |
| 978 // Make all renderers but [0] visible and swap a frame on them, keep [0] |
| 979 // hidden, it becomes the LRU. |
| 980 for (size_t i = 1; i < renderer_count; ++i) { |
| 981 views[i]->WasShown(); |
| 982 views[i]->OnSwapCompositorFrame( |
| 983 1, MakeDelegatedFrame(1.f, frame_size, view_rect)); |
| 984 EXPECT_TRUE(views[i]->frame_provider_); |
| 985 } |
| 986 EXPECT_FALSE(views[0]->frame_provider_); |
| 987 |
| 988 // Swap a frame on [0], it should be evicted immediately. |
| 989 views[0]->OnSwapCompositorFrame( |
| 990 1, MakeDelegatedFrame(1.f, frame_size, view_rect)); |
| 991 EXPECT_FALSE(views[0]->frame_provider_); |
| 992 |
| 993 // Make [0] visible, and swap a frame on it. Nothing should be evicted |
| 994 // although we're above the limit. |
| 995 views[0]->WasShown(); |
| 996 views[0]->OnSwapCompositorFrame( |
| 997 1, MakeDelegatedFrame(1.f, frame_size, view_rect)); |
| 998 for (size_t i = 0; i < renderer_count; ++i) |
| 999 EXPECT_TRUE(views[i]->frame_provider_); |
| 1000 |
| 1001 // Make [0] hidden, it should evict its frame. |
| 1002 views[0]->WasHidden(); |
| 1003 EXPECT_FALSE(views[0]->frame_provider_); |
| 1004 |
| 1005 for (size_t i = 0; i < renderer_count; ++i) { |
| 1006 views[i]->Destroy(); |
| 1007 delete hosts[i]; |
| 1008 } |
| 1009 } |
| 1010 |
| 911 } // namespace content | 1011 } // namespace content |
| OLD | NEW |