| Index: content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
|
| diff --git a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
|
| index d96f25f9a4b3c5205f50e263c888b09fdfa7306a..99fe4c241db88041cce607f6f7e4ec55a9b41424 100644
|
| --- a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
|
| +++ b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
|
| @@ -128,13 +128,12 @@ class RenderWidgetHostViewAuraTest : public testing::Test {
|
| aura_test_helper_->SetUp();
|
|
|
| browser_context_.reset(new TestBrowserContext);
|
| - MockRenderProcessHost* process_host =
|
| - new MockRenderProcessHost(browser_context_.get());
|
| + process_host_ = new MockRenderProcessHost(browser_context_.get());
|
|
|
| - sink_ = &process_host->sink();
|
| + sink_ = &process_host_->sink();
|
|
|
| parent_host_ = new RenderWidgetHostImpl(
|
| - &delegate_, process_host, MSG_ROUTING_NONE, false);
|
| + &delegate_, process_host_, MSG_ROUTING_NONE, false);
|
| parent_view_ = static_cast<RenderWidgetHostViewAura*>(
|
| RenderWidgetHostView::CreateViewForWidget(parent_host_));
|
| parent_view_->InitAsChild(NULL);
|
| @@ -143,7 +142,7 @@ class RenderWidgetHostViewAuraTest : public testing::Test {
|
| gfx::Rect());
|
|
|
| widget_host_ = new RenderWidgetHostImpl(
|
| - &delegate_, process_host, MSG_ROUTING_NONE, false);
|
| + &delegate_, process_host_, MSG_ROUTING_NONE, false);
|
| widget_host_->Init();
|
| widget_host_->OnMessageReceived(
|
| ViewHostMsg_DidActivateAcceleratedCompositing(0, true));
|
| @@ -152,6 +151,7 @@ class RenderWidgetHostViewAuraTest : public testing::Test {
|
|
|
| virtual void TearDown() {
|
| sink_ = NULL;
|
| + process_host_ = NULL;
|
| if (view_)
|
| view_->Destroy();
|
| delete widget_host_;
|
| @@ -173,6 +173,7 @@ class RenderWidgetHostViewAuraTest : public testing::Test {
|
| scoped_ptr<aura::test::AuraTestHelper> aura_test_helper_;
|
| scoped_ptr<BrowserContext> browser_context_;
|
| MockRenderWidgetHostDelegate delegate_;
|
| + MockRenderProcessHost* process_host_;
|
|
|
| // Tests should set these to NULL if they've already triggered their
|
| // destruction.
|
| @@ -908,4 +909,103 @@ TEST_F(RenderWidgetHostViewAuraTest, OutputSurfaceIdChange) {
|
| view_->window_->RemoveObserver(&observer);
|
| }
|
|
|
| +TEST_F(RenderWidgetHostViewAuraTest, DiscardDelegatedFrames) {
|
| + size_t max_renderer_frames =
|
| + RendererFrameManager::GetInstance()->max_number_of_saved_frames();
|
| + ASSERT_LE(2u, max_renderer_frames);
|
| + size_t renderer_count = max_renderer_frames + 1;
|
| + gfx::Rect view_rect(100, 100);
|
| + gfx::Size frame_size = view_rect.size();
|
| +
|
| + scoped_ptr<RenderWidgetHostImpl * []> hosts(
|
| + new RenderWidgetHostImpl* [renderer_count]);
|
| + scoped_ptr<FakeRenderWidgetHostViewAura * []> views(
|
| + new FakeRenderWidgetHostViewAura* [renderer_count]);
|
| +
|
| + // Create a bunch of renderers.
|
| + for (size_t i = 0; i < renderer_count; ++i) {
|
| + hosts[i] = new RenderWidgetHostImpl(
|
| + &delegate_, process_host_, MSG_ROUTING_NONE, false);
|
| + hosts[i]->Init();
|
| + hosts[i]->OnMessageReceived(
|
| + ViewHostMsg_DidActivateAcceleratedCompositing(0, true));
|
| + views[i] = new FakeRenderWidgetHostViewAura(hosts[i]);
|
| + views[i]->InitAsChild(NULL);
|
| + aura::client::ParentWindowWithContext(
|
| + views[i]->GetNativeView(),
|
| + parent_view_->GetNativeView()->GetRootWindow(),
|
| + gfx::Rect());
|
| + views[i]->SetSize(view_rect.size());
|
| + }
|
| +
|
| + // Make each renderer visible, and swap a frame on it, then make it invisible.
|
| + for (size_t i = 0; i < renderer_count; ++i) {
|
| + views[i]->WasShown();
|
| + views[i]->OnSwapCompositorFrame(
|
| + 1, MakeDelegatedFrame(1.f, frame_size, view_rect));
|
| + EXPECT_TRUE(views[i]->frame_provider_);
|
| + views[i]->WasHidden();
|
| + }
|
| +
|
| + // There should be max_renderer_frames with a frame in it, and one without it.
|
| + // Since the logic is LRU eviction, the first one should be without.
|
| + EXPECT_FALSE(views[0]->frame_provider_);
|
| + for (size_t i = 1; i < renderer_count; ++i)
|
| + EXPECT_TRUE(views[i]->frame_provider_);
|
| +
|
| + // LRU renderer is [0], make it visible, it shouldn't evict anything yet.
|
| + views[0]->WasShown();
|
| + EXPECT_FALSE(views[0]->frame_provider_);
|
| + EXPECT_TRUE(views[1]->frame_provider_);
|
| +
|
| + // Swap a frame on it, it should evict the next LRU [1].
|
| + views[0]->OnSwapCompositorFrame(
|
| + 1, MakeDelegatedFrame(1.f, frame_size, view_rect));
|
| + EXPECT_TRUE(views[0]->frame_provider_);
|
| + EXPECT_FALSE(views[1]->frame_provider_);
|
| + views[0]->WasHidden();
|
| +
|
| + // LRU renderer is [1], still hidden. Swap a frame on it, it should evict
|
| + // the next LRU [2].
|
| + views[1]->OnSwapCompositorFrame(
|
| + 1, MakeDelegatedFrame(1.f, frame_size, view_rect));
|
| + EXPECT_TRUE(views[0]->frame_provider_);
|
| + EXPECT_TRUE(views[1]->frame_provider_);
|
| + EXPECT_FALSE(views[2]->frame_provider_);
|
| + for (size_t i = 3; i < renderer_count; ++i)
|
| + EXPECT_TRUE(views[i]->frame_provider_);
|
| +
|
| + // Make all renderers but [0] visible and swap a frame on them, keep [0]
|
| + // hidden, it becomes the LRU.
|
| + for (size_t i = 1; i < renderer_count; ++i) {
|
| + views[i]->WasShown();
|
| + views[i]->OnSwapCompositorFrame(
|
| + 1, MakeDelegatedFrame(1.f, frame_size, view_rect));
|
| + EXPECT_TRUE(views[i]->frame_provider_);
|
| + }
|
| + EXPECT_FALSE(views[0]->frame_provider_);
|
| +
|
| + // Swap a frame on [0], it should be evicted immediately.
|
| + views[0]->OnSwapCompositorFrame(
|
| + 1, MakeDelegatedFrame(1.f, frame_size, view_rect));
|
| + EXPECT_FALSE(views[0]->frame_provider_);
|
| +
|
| + // Make [0] visible, and swap a frame on it. Nothing should be evicted
|
| + // although we're above the limit.
|
| + views[0]->WasShown();
|
| + views[0]->OnSwapCompositorFrame(
|
| + 1, MakeDelegatedFrame(1.f, frame_size, view_rect));
|
| + for (size_t i = 0; i < renderer_count; ++i)
|
| + EXPECT_TRUE(views[i]->frame_provider_);
|
| +
|
| + // Make [0] hidden, it should evict its frame.
|
| + views[0]->WasHidden();
|
| + EXPECT_FALSE(views[0]->frame_provider_);
|
| +
|
| + for (size_t i = 0; i < renderer_count; ++i) {
|
| + views[i]->Destroy();
|
| + delete hosts[i];
|
| + }
|
| +}
|
| +
|
| } // namespace content
|
|
|