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) { | |
danakj
2013/10/28 21:39:21
Thanks for test!
| |
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]); | |
danakj
2013/10/28 21:39:21
the extra spaces here seem weird? what would git c
piman
2013/10/28 22:08:38
git cl format did it!
I left as is to avoid noise.
| |
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 as swap a frame on them, keep [0] | |
danakj
2013/10/28 21:39:21
s/as/and/
piman
2013/10/28 22:08:38
Done.
| |
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 |