| Index: content/common/gpu/gpu_memory_manager_unittest.cc
 | 
| diff --git a/content/common/gpu/gpu_memory_manager_unittest.cc b/content/common/gpu/gpu_memory_manager_unittest.cc
 | 
| index 501e481c7cf05bc3d36c76b3dc5c270f37ba989d..3e562031a2776821942c69b98c6b8d6c272769c4 100644
 | 
| --- a/content/common/gpu/gpu_memory_manager_unittest.cc
 | 
| +++ b/content/common/gpu/gpu_memory_manager_unittest.cc
 | 
| @@ -23,6 +23,9 @@ class FakeCommandBufferStub : public GpuCommandBufferStubBase {
 | 
|        : surface_state_(surface_id, visible, last_used_time) {
 | 
|    }
 | 
|  
 | 
| +  virtual bool client_has_memory_allocation_changed_callback() const {
 | 
| +    return true;
 | 
| +  }
 | 
|    virtual bool has_surface_state() const {
 | 
|      return surface_state_.surface_id != 0;
 | 
|    }
 | 
| @@ -49,6 +52,9 @@ class FakeCommandBufferStubWithoutSurface : public GpuCommandBufferStubBase {
 | 
|    FakeCommandBufferStubWithoutSurface() {
 | 
|    }
 | 
|  
 | 
| +  virtual bool client_has_memory_allocation_changed_callback() const {
 | 
| +    return true;
 | 
| +  }
 | 
|    virtual bool has_surface_state() const {
 | 
|      return false;
 | 
|    }
 | 
| @@ -100,11 +106,51 @@ class GpuMemoryManagerTest : public testing::Test {
 | 
|      return surface_id_++;
 | 
|    }
 | 
|  
 | 
| -  static bool is_more_important(GpuCommandBufferStubBase* lhs,
 | 
| -                                GpuCommandBufferStubBase* rhs) {
 | 
| +  static bool IsMoreImportant(GpuCommandBufferStubBase* lhs,
 | 
| +                              GpuCommandBufferStubBase* rhs) {
 | 
|      return GpuMemoryManager::StubWithSurfaceComparator()(lhs, rhs);
 | 
|    }
 | 
|  
 | 
| +  static bool IsAllocationForegroundForSurfaceYes(
 | 
| +      const GpuMemoryAllocation& alloc) {
 | 
| +    return alloc.suggest_have_frontbuffer &&
 | 
| +           alloc.suggest_have_backbuffer &&
 | 
| +           alloc.gpu_resource_size_in_bytes >=
 | 
| +               GpuMemoryManager::kMinimumAllocationForTab;
 | 
| +  }
 | 
| +  static bool IsAllocationBackgroundForSurfaceYes(
 | 
| +      const GpuMemoryAllocation& alloc) {
 | 
| +    return alloc.suggest_have_frontbuffer &&
 | 
| +           !alloc.suggest_have_backbuffer &&
 | 
| +           alloc.gpu_resource_size_in_bytes == 0;
 | 
| +  }
 | 
| +  static bool IsAllocationHibernatedForSurfaceYes(
 | 
| +      const GpuMemoryAllocation& alloc) {
 | 
| +    return !alloc.suggest_have_frontbuffer &&
 | 
| +           !alloc.suggest_have_backbuffer &&
 | 
| +           alloc.gpu_resource_size_in_bytes == 0;
 | 
| +  }
 | 
| +  static bool IsAllocationForegroundForSurfaceNo(
 | 
| +      const GpuMemoryAllocation& alloc) {
 | 
| +    return !alloc.suggest_have_frontbuffer &&
 | 
| +           !alloc.suggest_have_backbuffer &&
 | 
| +           alloc.gpu_resource_size_in_bytes ==
 | 
| +               GpuMemoryManager::kMinimumAllocationForTab;
 | 
| +  }
 | 
| +  static bool IsAllocationBackgroundForSurfaceNo(
 | 
| +      const GpuMemoryAllocation& alloc) {
 | 
| +    return !alloc.suggest_have_frontbuffer &&
 | 
| +           !alloc.suggest_have_backbuffer &&
 | 
| +           alloc.gpu_resource_size_in_bytes ==
 | 
| +               GpuMemoryManager::kMinimumAllocationForTab;
 | 
| +  }
 | 
| +  static bool IsAllocationHibernatedForSurfaceNo(
 | 
| +      const GpuMemoryAllocation& alloc) {
 | 
| +    return !alloc.suggest_have_frontbuffer &&
 | 
| +           !alloc.suggest_have_backbuffer &&
 | 
| +           alloc.gpu_resource_size_in_bytes == 0;
 | 
| +  }
 | 
| +
 | 
|    void Manage() {
 | 
|      memory_manager_.Manage();
 | 
|    }
 | 
| @@ -126,50 +172,50 @@ TEST_F(GpuMemoryManagerTest, ComparatorTests) {
 | 
|                          stub_false3(GenerateUniqueSurfaceId(), false, newest_);
 | 
|  
 | 
|    // Should never be more important than self:
 | 
| -  EXPECT_FALSE(is_more_important(&stub_true1, &stub_true1));
 | 
| -  EXPECT_FALSE(is_more_important(&stub_true2, &stub_true2));
 | 
| -  EXPECT_FALSE(is_more_important(&stub_true3, &stub_true3));
 | 
| -  EXPECT_FALSE(is_more_important(&stub_false1, &stub_false1));
 | 
| -  EXPECT_FALSE(is_more_important(&stub_false2, &stub_false2));
 | 
| -  EXPECT_FALSE(is_more_important(&stub_false3, &stub_false3));
 | 
| +  EXPECT_FALSE(IsMoreImportant(&stub_true1, &stub_true1));
 | 
| +  EXPECT_FALSE(IsMoreImportant(&stub_true2, &stub_true2));
 | 
| +  EXPECT_FALSE(IsMoreImportant(&stub_true3, &stub_true3));
 | 
| +  EXPECT_FALSE(IsMoreImportant(&stub_false1, &stub_false1));
 | 
| +  EXPECT_FALSE(IsMoreImportant(&stub_false2, &stub_false2));
 | 
| +  EXPECT_FALSE(IsMoreImportant(&stub_false3, &stub_false3));
 | 
|  
 | 
|    // Visible should always be more important than non visible:
 | 
| -  EXPECT_TRUE(is_more_important(&stub_true1, &stub_false1));
 | 
| -  EXPECT_TRUE(is_more_important(&stub_true1, &stub_false2));
 | 
| -  EXPECT_TRUE(is_more_important(&stub_true1, &stub_false3));
 | 
| -  EXPECT_TRUE(is_more_important(&stub_true2, &stub_false1));
 | 
| -  EXPECT_TRUE(is_more_important(&stub_true2, &stub_false2));
 | 
| -  EXPECT_TRUE(is_more_important(&stub_true2, &stub_false3));
 | 
| -  EXPECT_TRUE(is_more_important(&stub_true3, &stub_false1));
 | 
| -  EXPECT_TRUE(is_more_important(&stub_true3, &stub_false2));
 | 
| -  EXPECT_TRUE(is_more_important(&stub_true3, &stub_false3));
 | 
| +  EXPECT_TRUE(IsMoreImportant(&stub_true1, &stub_false1));
 | 
| +  EXPECT_TRUE(IsMoreImportant(&stub_true1, &stub_false2));
 | 
| +  EXPECT_TRUE(IsMoreImportant(&stub_true1, &stub_false3));
 | 
| +  EXPECT_TRUE(IsMoreImportant(&stub_true2, &stub_false1));
 | 
| +  EXPECT_TRUE(IsMoreImportant(&stub_true2, &stub_false2));
 | 
| +  EXPECT_TRUE(IsMoreImportant(&stub_true2, &stub_false3));
 | 
| +  EXPECT_TRUE(IsMoreImportant(&stub_true3, &stub_false1));
 | 
| +  EXPECT_TRUE(IsMoreImportant(&stub_true3, &stub_false2));
 | 
| +  EXPECT_TRUE(IsMoreImportant(&stub_true3, &stub_false3));
 | 
|  
 | 
|    // Not visible should never be more important than visible:
 | 
| -  EXPECT_FALSE(is_more_important(&stub_false1, &stub_true1));
 | 
| -  EXPECT_FALSE(is_more_important(&stub_false1, &stub_true2));
 | 
| -  EXPECT_FALSE(is_more_important(&stub_false1, &stub_true3));
 | 
| -  EXPECT_FALSE(is_more_important(&stub_false2, &stub_true1));
 | 
| -  EXPECT_FALSE(is_more_important(&stub_false2, &stub_true2));
 | 
| -  EXPECT_FALSE(is_more_important(&stub_false2, &stub_true3));
 | 
| -  EXPECT_FALSE(is_more_important(&stub_false3, &stub_true1));
 | 
| -  EXPECT_FALSE(is_more_important(&stub_false3, &stub_true2));
 | 
| -  EXPECT_FALSE(is_more_important(&stub_false3, &stub_true3));
 | 
| +  EXPECT_FALSE(IsMoreImportant(&stub_false1, &stub_true1));
 | 
| +  EXPECT_FALSE(IsMoreImportant(&stub_false1, &stub_true2));
 | 
| +  EXPECT_FALSE(IsMoreImportant(&stub_false1, &stub_true3));
 | 
| +  EXPECT_FALSE(IsMoreImportant(&stub_false2, &stub_true1));
 | 
| +  EXPECT_FALSE(IsMoreImportant(&stub_false2, &stub_true2));
 | 
| +  EXPECT_FALSE(IsMoreImportant(&stub_false2, &stub_true3));
 | 
| +  EXPECT_FALSE(IsMoreImportant(&stub_false3, &stub_true1));
 | 
| +  EXPECT_FALSE(IsMoreImportant(&stub_false3, &stub_true2));
 | 
| +  EXPECT_FALSE(IsMoreImportant(&stub_false3, &stub_true3));
 | 
|  
 | 
|    // Newer should always be more important than older:
 | 
| -  EXPECT_TRUE(is_more_important(&stub_true2, &stub_true1));
 | 
| -  EXPECT_TRUE(is_more_important(&stub_true3, &stub_true1));
 | 
| -  EXPECT_TRUE(is_more_important(&stub_true3, &stub_true2));
 | 
| -  EXPECT_TRUE(is_more_important(&stub_false2, &stub_false1));
 | 
| -  EXPECT_TRUE(is_more_important(&stub_false3, &stub_false1));
 | 
| -  EXPECT_TRUE(is_more_important(&stub_false3, &stub_false2));
 | 
| +  EXPECT_TRUE(IsMoreImportant(&stub_true2, &stub_true1));
 | 
| +  EXPECT_TRUE(IsMoreImportant(&stub_true3, &stub_true1));
 | 
| +  EXPECT_TRUE(IsMoreImportant(&stub_true3, &stub_true2));
 | 
| +  EXPECT_TRUE(IsMoreImportant(&stub_false2, &stub_false1));
 | 
| +  EXPECT_TRUE(IsMoreImportant(&stub_false3, &stub_false1));
 | 
| +  EXPECT_TRUE(IsMoreImportant(&stub_false3, &stub_false2));
 | 
|  
 | 
|    // Older should never be more important than newer:
 | 
| -  EXPECT_FALSE(is_more_important(&stub_true1, &stub_true2));
 | 
| -  EXPECT_FALSE(is_more_important(&stub_true1, &stub_true3));
 | 
| -  EXPECT_FALSE(is_more_important(&stub_true2, &stub_true3));
 | 
| -  EXPECT_FALSE(is_more_important(&stub_false1, &stub_false2));
 | 
| -  EXPECT_FALSE(is_more_important(&stub_false1, &stub_false3));
 | 
| -  EXPECT_FALSE(is_more_important(&stub_false2, &stub_false3));
 | 
| +  EXPECT_FALSE(IsMoreImportant(&stub_true1, &stub_true2));
 | 
| +  EXPECT_FALSE(IsMoreImportant(&stub_true1, &stub_true3));
 | 
| +  EXPECT_FALSE(IsMoreImportant(&stub_true2, &stub_true3));
 | 
| +  EXPECT_FALSE(IsMoreImportant(&stub_false1, &stub_false2));
 | 
| +  EXPECT_FALSE(IsMoreImportant(&stub_false1, &stub_false3));
 | 
| +  EXPECT_FALSE(IsMoreImportant(&stub_false2, &stub_false3));
 | 
|  }
 | 
|  
 | 
|  // Test GpuMemoryManager::Manage basic functionality.
 | 
| @@ -185,10 +231,8 @@ TEST_F(GpuMemoryManagerTest, TestManageBasicFunctionality) {
 | 
|    client_.stubs_.push_back(&stub2);
 | 
|  
 | 
|    Manage();
 | 
| -  EXPECT_EQ(stub1.allocation_.suggest_have_frontbuffer, true);
 | 
| -  EXPECT_EQ(stub1.allocation_.suggest_have_backbuffer, true);
 | 
| -  EXPECT_EQ(stub2.allocation_.suggest_have_frontbuffer, true);
 | 
| -  EXPECT_EQ(stub2.allocation_.suggest_have_backbuffer, false);
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub1.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub2.allocation_));
 | 
|  
 | 
|    // Test stubs without surface, with share group of 1 stub.
 | 
|    FakeCommandBufferStubWithoutSurface stub3, stub4;
 | 
| @@ -198,8 +242,10 @@ TEST_F(GpuMemoryManagerTest, TestManageBasicFunctionality) {
 | 
|    client_.stubs_.push_back(&stub4);
 | 
|  
 | 
|    Manage();
 | 
| -  EXPECT_EQ(stub1.allocation_, stub3.allocation_);
 | 
| -  EXPECT_EQ(stub2.allocation_, stub4.allocation_);
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub1.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub2.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceNo(stub3.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub4.allocation_));
 | 
|  
 | 
|    // Test stub without surface, with share group of multiple stubs.
 | 
|    FakeCommandBufferStubWithoutSurface stub5;
 | 
| @@ -208,7 +254,7 @@ TEST_F(GpuMemoryManagerTest, TestManageBasicFunctionality) {
 | 
|    client_.stubs_.push_back(&stub5);
 | 
|  
 | 
|    Manage();
 | 
| -  EXPECT_EQ(stub1.allocation_, stub5.allocation_);
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceNo(stub4.allocation_));
 | 
|  }
 | 
|  
 | 
|  // Test GpuMemoryManager::Manage functionality: changing visibility.
 | 
| @@ -234,25 +280,21 @@ TEST_F(GpuMemoryManagerTest, TestManageChangingVisibility) {
 | 
|    client_.stubs_.push_back(&stub5);
 | 
|  
 | 
|    Manage();
 | 
| -  EXPECT_EQ(stub1.allocation_.suggest_have_frontbuffer, true);
 | 
| -  EXPECT_EQ(stub1.allocation_.suggest_have_backbuffer, true);
 | 
| -  EXPECT_EQ(stub2.allocation_.suggest_have_frontbuffer, true);
 | 
| -  EXPECT_EQ(stub2.allocation_.suggest_have_backbuffer, false);
 | 
| -  EXPECT_EQ(stub1.allocation_, stub3.allocation_);
 | 
| -  EXPECT_EQ(stub2.allocation_, stub4.allocation_);
 | 
| -  EXPECT_EQ(stub1.allocation_, stub5.allocation_);
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub1.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub2.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceNo(stub3.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub4.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceNo(stub5.allocation_));
 | 
|  
 | 
|    stub1.surface_state_.visible = false;
 | 
|    stub2.surface_state_.visible = true;
 | 
|  
 | 
|    Manage();
 | 
| -  EXPECT_EQ(stub1.allocation_.suggest_have_frontbuffer, true);
 | 
| -  EXPECT_EQ(stub1.allocation_.suggest_have_backbuffer, false);
 | 
| -  EXPECT_EQ(stub2.allocation_.suggest_have_frontbuffer, true);
 | 
| -  EXPECT_EQ(stub2.allocation_.suggest_have_backbuffer, true);
 | 
| -  EXPECT_EQ(stub1.allocation_, stub3.allocation_);
 | 
| -  EXPECT_EQ(stub2.allocation_, stub4.allocation_);
 | 
| -  EXPECT_EQ(stub2.allocation_, stub5.allocation_);
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub1.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub2.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub3.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceNo(stub4.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceNo(stub5.allocation_));
 | 
|  }
 | 
|  
 | 
|  // Test GpuMemoryManager::Manage functionality: Test more than threshold number
 | 
| @@ -280,17 +322,13 @@ TEST_F(GpuMemoryManagerTest, TestManageManyVisibleStubs) {
 | 
|    client_.stubs_.push_back(&stub7);
 | 
|  
 | 
|    Manage();
 | 
| -  EXPECT_EQ(stub1.allocation_.suggest_have_frontbuffer, true);
 | 
| -  EXPECT_EQ(stub1.allocation_.suggest_have_backbuffer, true);
 | 
| -  EXPECT_EQ(stub2.allocation_.suggest_have_frontbuffer, true);
 | 
| -  EXPECT_EQ(stub2.allocation_.suggest_have_backbuffer, true);
 | 
| -  EXPECT_EQ(stub3.allocation_.suggest_have_frontbuffer, true);
 | 
| -  EXPECT_EQ(stub3.allocation_.suggest_have_backbuffer, true);
 | 
| -  EXPECT_EQ(stub4.allocation_.suggest_have_frontbuffer, true);
 | 
| -  EXPECT_EQ(stub4.allocation_.suggest_have_backbuffer, true);
 | 
| -  EXPECT_EQ(stub5.allocation_, stub1.allocation_);
 | 
| -  EXPECT_EQ(stub6.allocation_, stub2.allocation_);
 | 
| -  EXPECT_EQ(stub7.allocation_, stub1.allocation_);
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub1.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub2.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub3.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub4.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceNo(stub5.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceNo(stub6.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceNo(stub7.allocation_));
 | 
|  }
 | 
|  
 | 
|  // Test GpuMemoryManager::Manage functionality: Test more than threshold number
 | 
| @@ -318,17 +356,13 @@ TEST_F(GpuMemoryManagerTest, TestManageManyNotVisibleStubs) {
 | 
|    client_.stubs_.push_back(&stub7);
 | 
|  
 | 
|    Manage();
 | 
| -  EXPECT_EQ(stub1.allocation_.suggest_have_frontbuffer, true);
 | 
| -  EXPECT_EQ(stub1.allocation_.suggest_have_backbuffer, false);
 | 
| -  EXPECT_EQ(stub2.allocation_.suggest_have_frontbuffer, true);
 | 
| -  EXPECT_EQ(stub2.allocation_.suggest_have_backbuffer, false);
 | 
| -  EXPECT_EQ(stub3.allocation_.suggest_have_frontbuffer, true);
 | 
| -  EXPECT_EQ(stub3.allocation_.suggest_have_backbuffer, false);
 | 
| -  EXPECT_EQ(stub4.allocation_.suggest_have_frontbuffer, false);
 | 
| -  EXPECT_EQ(stub4.allocation_.suggest_have_backbuffer, false);
 | 
| -  EXPECT_EQ(stub5.allocation_, stub1.allocation_);
 | 
| -  EXPECT_EQ(stub6.allocation_, stub4.allocation_);
 | 
| -  EXPECT_EQ(stub7.allocation_, stub1.allocation_);
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub1.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub2.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub3.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationHibernatedForSurfaceYes(stub4.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub5.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationHibernatedForSurfaceNo(stub6.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub7.allocation_));
 | 
|  }
 | 
|  
 | 
|  // Test GpuMemoryManager::Manage functionality: Test changing the last used
 | 
| @@ -356,25 +390,25 @@ TEST_F(GpuMemoryManagerTest, TestManageChangingLastUsedTime) {
 | 
|    client_.stubs_.push_back(&stub7);
 | 
|  
 | 
|    Manage();
 | 
| -  EXPECT_EQ(stub3.allocation_.suggest_have_frontbuffer, true);
 | 
| -  EXPECT_EQ(stub3.allocation_.suggest_have_backbuffer, false);
 | 
| -  EXPECT_EQ(stub4.allocation_.suggest_have_frontbuffer, false);
 | 
| -  EXPECT_EQ(stub4.allocation_.suggest_have_backbuffer, false);
 | 
| -  EXPECT_EQ(stub5.allocation_, stub3.allocation_);
 | 
| -  EXPECT_EQ(stub6.allocation_, stub4.allocation_);
 | 
| -  EXPECT_EQ(stub7.allocation_, stub3.allocation_);
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub1.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub2.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub3.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationHibernatedForSurfaceYes(stub4.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub5.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationHibernatedForSurfaceNo(stub6.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub7.allocation_));
 | 
|  
 | 
|    stub3.surface_state_.last_used_time = older_;
 | 
|    stub4.surface_state_.last_used_time = newer_;
 | 
|  
 | 
|    Manage();
 | 
| -  EXPECT_EQ(stub3.allocation_.suggest_have_frontbuffer, false);
 | 
| -  EXPECT_EQ(stub3.allocation_.suggest_have_backbuffer, false);
 | 
| -  EXPECT_EQ(stub4.allocation_.suggest_have_frontbuffer, true);
 | 
| -  EXPECT_EQ(stub4.allocation_.suggest_have_backbuffer, false);
 | 
| -  EXPECT_EQ(stub5.allocation_, stub3.allocation_);
 | 
| -  EXPECT_EQ(stub6.allocation_, stub4.allocation_);
 | 
| -  EXPECT_EQ(stub7.allocation_, stub4.allocation_);
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub1.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub2.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationHibernatedForSurfaceYes(stub3.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub4.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationHibernatedForSurfaceNo(stub5.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub6.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub7.allocation_));
 | 
|  }
 | 
|  
 | 
|  // Test GpuMemoryManager::Manage functionality: Test changing importance of
 | 
| @@ -382,14 +416,14 @@ TEST_F(GpuMemoryManagerTest, TestManageChangingLastUsedTime) {
 | 
|  // Expect memory allocation of the stubs without surface to share memory
 | 
|  // allocation with the most visible stub in share group.
 | 
|  TEST_F(GpuMemoryManagerTest, TestManageChangingImportanceShareGroup) {
 | 
| -  FakeCommandBufferStub stubA(GenerateUniqueSurfaceId(), true, newer_),
 | 
| -                        stubB(GenerateUniqueSurfaceId(), false, newer_),
 | 
| -                        stubC(GenerateUniqueSurfaceId(), false, newer_);
 | 
| +  FakeCommandBufferStub stubIgnoreA(GenerateUniqueSurfaceId(), true, newer_),
 | 
| +                        stubIgnoreB(GenerateUniqueSurfaceId(), false, newer_),
 | 
| +                        stubIgnoreC(GenerateUniqueSurfaceId(), false, newer_);
 | 
|    FakeCommandBufferStub stub1(GenerateUniqueSurfaceId(), true, newest_),
 | 
|                          stub2(GenerateUniqueSurfaceId(), true, newest_);
 | 
| -  client_.stubs_.push_back(&stubA);
 | 
| -  client_.stubs_.push_back(&stubB);
 | 
| -  client_.stubs_.push_back(&stubC);
 | 
| +  client_.stubs_.push_back(&stubIgnoreA);
 | 
| +  client_.stubs_.push_back(&stubIgnoreB);
 | 
| +  client_.stubs_.push_back(&stubIgnoreC);
 | 
|    client_.stubs_.push_back(&stub1);
 | 
|    client_.stubs_.push_back(&stub2);
 | 
|  
 | 
| @@ -402,62 +436,91 @@ TEST_F(GpuMemoryManagerTest, TestManageChangingImportanceShareGroup) {
 | 
|    client_.stubs_.push_back(&stub4);
 | 
|  
 | 
|    Manage();
 | 
| -  EXPECT_EQ(stub1.allocation_.suggest_have_frontbuffer, true);
 | 
| -  EXPECT_EQ(stub1.allocation_.suggest_have_backbuffer, true);
 | 
| -  EXPECT_EQ(stub2.allocation_.suggest_have_frontbuffer, true);
 | 
| -  EXPECT_EQ(stub2.allocation_.suggest_have_backbuffer, true);
 | 
| -  EXPECT_EQ(stub3.allocation_, stub1.allocation_);
 | 
| -  EXPECT_EQ(stub3.allocation_, stub2.allocation_);
 | 
| -  EXPECT_EQ(stub4.allocation_, stub1.allocation_);
 | 
| -  EXPECT_EQ(stub4.allocation_, stub2.allocation_);
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub1.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub2.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceNo(stub3.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceNo(stub4.allocation_));
 | 
|  
 | 
|    stub1.surface_state_.visible = false;
 | 
|  
 | 
|    Manage();
 | 
| -  EXPECT_EQ(stub1.allocation_.suggest_have_frontbuffer, true);
 | 
| -  EXPECT_EQ(stub1.allocation_.suggest_have_backbuffer, false);
 | 
| -  EXPECT_EQ(stub2.allocation_.suggest_have_frontbuffer, true);
 | 
| -  EXPECT_EQ(stub2.allocation_.suggest_have_backbuffer, true);
 | 
| -  EXPECT_NE(stub3.allocation_, stub1.allocation_);
 | 
| -  EXPECT_EQ(stub3.allocation_, stub2.allocation_);
 | 
| -  EXPECT_NE(stub4.allocation_, stub1.allocation_);
 | 
| -  EXPECT_EQ(stub4.allocation_, stub2.allocation_);
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub1.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub2.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub3.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceNo(stub4.allocation_));
 | 
|  
 | 
|    stub2.surface_state_.visible = false;
 | 
|  
 | 
|    Manage();
 | 
| -  EXPECT_EQ(stub1.allocation_.suggest_have_frontbuffer, true);
 | 
| -  EXPECT_EQ(stub1.allocation_.suggest_have_backbuffer, false);
 | 
| -  EXPECT_EQ(stub2.allocation_.suggest_have_frontbuffer, true);
 | 
| -  EXPECT_EQ(stub2.allocation_.suggest_have_backbuffer, false);
 | 
| -  EXPECT_EQ(stub3.allocation_, stub1.allocation_);
 | 
| -  EXPECT_EQ(stub3.allocation_, stub2.allocation_);
 | 
| -  EXPECT_EQ(stub4.allocation_, stub1.allocation_);
 | 
| -  EXPECT_EQ(stub4.allocation_, stub2.allocation_);
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub1.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub2.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub3.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub4.allocation_));
 | 
|  
 | 
|    stub1.surface_state_.last_used_time = older_;
 | 
|  
 | 
|    Manage();
 | 
| -  EXPECT_EQ(stub1.allocation_.suggest_have_frontbuffer, false);
 | 
| -  EXPECT_EQ(stub1.allocation_.suggest_have_backbuffer, false);
 | 
| -  EXPECT_EQ(stub2.allocation_.suggest_have_frontbuffer, true);
 | 
| -  EXPECT_EQ(stub2.allocation_.suggest_have_backbuffer, false);
 | 
| -  EXPECT_NE(stub3.allocation_, stub1.allocation_);
 | 
| -  EXPECT_EQ(stub3.allocation_, stub2.allocation_);
 | 
| -  EXPECT_NE(stub4.allocation_, stub1.allocation_);
 | 
| -  EXPECT_EQ(stub4.allocation_, stub2.allocation_);
 | 
| +  EXPECT_TRUE(IsAllocationHibernatedForSurfaceYes(stub1.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub2.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub3.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub4.allocation_));
 | 
|  
 | 
|    stub2.surface_state_.last_used_time = older_;
 | 
|  
 | 
|    Manage();
 | 
| -  EXPECT_EQ(stub1.allocation_.suggest_have_frontbuffer, false);
 | 
| -  EXPECT_EQ(stub1.allocation_.suggest_have_backbuffer, false);
 | 
| -  EXPECT_EQ(stub2.allocation_.suggest_have_frontbuffer, false);
 | 
| -  EXPECT_EQ(stub2.allocation_.suggest_have_backbuffer, false);
 | 
| -  EXPECT_EQ(stub3.allocation_, stub1.allocation_);
 | 
| -  EXPECT_EQ(stub3.allocation_, stub2.allocation_);
 | 
| -  EXPECT_EQ(stub4.allocation_, stub1.allocation_);
 | 
| -  EXPECT_EQ(stub4.allocation_, stub2.allocation_);
 | 
| +  EXPECT_TRUE(IsAllocationHibernatedForSurfaceYes(stub1.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationHibernatedForSurfaceYes(stub2.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationHibernatedForSurfaceNo(stub3.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationHibernatedForSurfaceNo(stub4.allocation_));
 | 
| +}
 | 
| +
 | 
| +// Test GpuMemoryAllocation memory allocation bonuses:
 | 
| +// When the number of visible tabs is small, each tab should get a
 | 
| +// gpu_resource_size_in_bytes allocation value that is greater than
 | 
| +// kMinimumAllocationForTab, and when the number of tabs is large, each should
 | 
| +// get exactly kMinimumAllocationForTab and not less.
 | 
| +TEST_F(GpuMemoryManagerTest, TestForegroundStubsGetBonusAllocation) {
 | 
| +  FakeCommandBufferStub stub1(GenerateUniqueSurfaceId(), true, older_),
 | 
| +                        stub2(GenerateUniqueSurfaceId(), true, older_),
 | 
| +                        stub3(GenerateUniqueSurfaceId(), true, older_);
 | 
| +  client_.stubs_.push_back(&stub1);
 | 
| +  client_.stubs_.push_back(&stub2);
 | 
| +  client_.stubs_.push_back(&stub3);
 | 
| +
 | 
| +  Manage();
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub1.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub2.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub3.allocation_));
 | 
| +  EXPECT_GT(stub1.allocation_.gpu_resource_size_in_bytes,
 | 
| +            static_cast<size_t>(GpuMemoryManager::kMinimumAllocationForTab));
 | 
| +  EXPECT_GT(stub2.allocation_.gpu_resource_size_in_bytes,
 | 
| +            static_cast<size_t>(GpuMemoryManager::kMinimumAllocationForTab));
 | 
| +  EXPECT_GT(stub3.allocation_.gpu_resource_size_in_bytes,
 | 
| +            static_cast<size_t>(GpuMemoryManager::kMinimumAllocationForTab));
 | 
| +
 | 
| +  FakeCommandBufferStub stub4(GenerateUniqueSurfaceId(), true, older_),
 | 
| +                        stub5(GenerateUniqueSurfaceId(), true, older_),
 | 
| +                        stub6(GenerateUniqueSurfaceId(), true, older_),
 | 
| +                        stub7(GenerateUniqueSurfaceId(), true, older_),
 | 
| +                        stub8(GenerateUniqueSurfaceId(), true, older_),
 | 
| +                        stub9(GenerateUniqueSurfaceId(), true, older_);
 | 
| +  client_.stubs_.push_back(&stub4);
 | 
| +  client_.stubs_.push_back(&stub5);
 | 
| +  client_.stubs_.push_back(&stub6);
 | 
| +  client_.stubs_.push_back(&stub7);
 | 
| +  client_.stubs_.push_back(&stub8);
 | 
| +  client_.stubs_.push_back(&stub9);
 | 
| +
 | 
| +  Manage();
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub1.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub2.allocation_));
 | 
| +  EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub3.allocation_));
 | 
| +  EXPECT_EQ(stub1.allocation_.gpu_resource_size_in_bytes,
 | 
| +            GpuMemoryManager::kMinimumAllocationForTab);
 | 
| +  EXPECT_EQ(stub2.allocation_.gpu_resource_size_in_bytes,
 | 
| +            GpuMemoryManager::kMinimumAllocationForTab);
 | 
| +  EXPECT_EQ(stub3.allocation_.gpu_resource_size_in_bytes,
 | 
| +            GpuMemoryManager::kMinimumAllocationForTab);
 | 
|  }
 | 
|  
 | 
|  // Test GpuMemoryAllocation comparison operators: Iterate over all possible
 | 
| @@ -465,21 +528,35 @@ TEST_F(GpuMemoryManagerTest, TestManageChangingImportanceShareGroup) {
 | 
|  // suggest_have_frontbuffer, and make sure allocations with equal values test
 | 
|  // equal and non equal values test not equal.
 | 
|  TEST_F(GpuMemoryManagerTest, GpuMemoryAllocationCompareTests) {
 | 
| -  int gpu_resource_size_in_bytes_values[] = { 0, 1, 12345678 };
 | 
| -  bool suggest_have_backbuffer_values[] = { false, true };
 | 
| -  bool suggest_have_frontbuffer_values[] = { false, true };
 | 
| -
 | 
| -  for(int* sz = &gpu_resource_size_in_bytes_values[0];
 | 
| -      sz != &gpu_resource_size_in_bytes_values[3]; ++sz) {
 | 
| -    for(bool* shbb = &suggest_have_backbuffer_values[0];
 | 
| -        shbb != &suggest_have_backbuffer_values[2]; ++shbb) {
 | 
| -      for(bool* shfb = &suggest_have_frontbuffer_values[0];
 | 
| -          shfb != &suggest_have_frontbuffer_values[2]; ++shfb) {
 | 
| -        GpuMemoryAllocation allocation(*sz, *shbb, *shfb);
 | 
| -        EXPECT_EQ(allocation, GpuMemoryAllocation(*sz, *shbb, *shfb));
 | 
| -        EXPECT_NE(allocation, GpuMemoryAllocation(*sz+1, *shbb, *shfb));
 | 
| -        EXPECT_NE(allocation, GpuMemoryAllocation(*sz, !*shbb, *shfb));
 | 
| -        EXPECT_NE(allocation, GpuMemoryAllocation(*sz, *shbb, !*shfb));
 | 
| +  std::vector<int> gpu_resource_size_in_bytes_values;
 | 
| +  gpu_resource_size_in_bytes_values.push_back(0);
 | 
| +  gpu_resource_size_in_bytes_values.push_back(1);
 | 
| +  gpu_resource_size_in_bytes_values.push_back(12345678);
 | 
| +
 | 
| +  std::vector<int> suggested_buffer_allocation_values;
 | 
| +  suggested_buffer_allocation_values.push_back(
 | 
| +      GpuMemoryAllocation::kHasFrontbuffer |
 | 
| +      GpuMemoryAllocation::kHasBackbuffer);
 | 
| +  suggested_buffer_allocation_values.push_back(
 | 
| +      GpuMemoryAllocation::kHasFrontbuffer);
 | 
| +  suggested_buffer_allocation_values.push_back(
 | 
| +      GpuMemoryAllocation::kHasBackbuffer);
 | 
| +  suggested_buffer_allocation_values.push_back(
 | 
| +      GpuMemoryAllocation::kHasNoBuffers);
 | 
| +
 | 
| +  for(size_t i = 0; i != gpu_resource_size_in_bytes_values.size(); ++i) {
 | 
| +    for(size_t j = 0; j != suggested_buffer_allocation_values.size(); ++j) {
 | 
| +      int sz = gpu_resource_size_in_bytes_values[i];
 | 
| +      int buffer_allocation = suggested_buffer_allocation_values[j];
 | 
| +      GpuMemoryAllocation allocation(sz, buffer_allocation);
 | 
| +
 | 
| +      EXPECT_EQ(allocation, GpuMemoryAllocation(sz, buffer_allocation));
 | 
| +      EXPECT_NE(allocation, GpuMemoryAllocation(sz+1, buffer_allocation));
 | 
| +
 | 
| +      for(size_t k = 0; k != suggested_buffer_allocation_values.size(); ++k) {
 | 
| +        int buffer_allocation_other = suggested_buffer_allocation_values[k];
 | 
| +        if (buffer_allocation == buffer_allocation_other) continue;
 | 
| +        EXPECT_NE(allocation, GpuMemoryAllocation(sz, buffer_allocation_other));
 | 
|        }
 | 
|      }
 | 
|    }
 | 
| 
 |