Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / cc / resources / tile_manager_unittest.cc
index 889a758..030f8ab 100644 (file)
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "cc/resources/eviction_tile_priority_queue.h"
+#include "cc/resources/raster_tile_priority_queue.h"
 #include "cc/resources/tile.h"
 #include "cc/resources/tile_priority.h"
 #include "cc/test/fake_impl_proxy.h"
@@ -32,8 +34,7 @@ class TileManagerTest : public testing::TestWithParam<bool>,
 
   void Initialize(int max_tiles,
                   TileMemoryLimitPolicy memory_limit_policy,
-                  TreePriority tree_priority,
-                  bool allow_on_demand_raster = true) {
+                  TreePriority tree_priority) {
     output_surface_ = FakeOutputSurface::Create3d();
     CHECK(output_surface_->BindToClient(&output_surface_client_));
 
@@ -43,8 +44,8 @@ class TileManagerTest : public testing::TestWithParam<bool>,
         false);
     resource_pool_ = ResourcePool::Create(
         resource_provider_.get(), GL_TEXTURE_2D, RGBA_8888);
-    tile_manager_ = make_scoped_ptr(new FakeTileManager(
-        this, resource_pool_.get(), allow_on_demand_raster));
+    tile_manager_ =
+        make_scoped_ptr(new FakeTileManager(this, resource_pool_.get()));
 
     memory_limit_policy_ = memory_limit_policy;
     max_tiles_ = max_tiles;
@@ -84,8 +85,16 @@ class TileManagerTest : public testing::TestWithParam<bool>,
   }
 
   // TileManagerClient implementation.
+  virtual const std::vector<PictureLayerImpl*>& GetPictureLayers()
+      const OVERRIDE {
+    return picture_layers_;
+  }
   virtual void NotifyReadyToActivate() OVERRIDE { ready_to_activate_ = true; }
-  virtual void NotifyTileInitialized(const Tile* tile) OVERRIDE {}
+  virtual void NotifyTileStateChanged(const Tile* tile) OVERRIDE {}
+  virtual void BuildRasterQueue(RasterTilePriorityQueue* queue,
+                                TreePriority priority) OVERRIDE {}
+  virtual void BuildEvictionQueue(EvictionTilePriorityQueue* queue,
+                                  TreePriority priority) OVERRIDE {}
 
   TileVector CreateTilesWithSize(int count,
                                  TilePriority active_priority,
@@ -100,7 +109,7 @@ class TileManagerTest : public testing::TestWithParam<bool>,
                                                            1.0,
                                                            0,
                                                            0,
-                                                           Tile::USE_LCD_TEXT);
+                                                           0);
       tile->SetPriority(ACTIVE_TREE, active_priority);
       tile->SetPriority(PENDING_TREE, pending_priority);
       tiles.push_back(tile);
@@ -115,6 +124,14 @@ class TileManagerTest : public testing::TestWithParam<bool>,
         count, active_priority, pending_priority, settings_.default_tile_size);
   }
 
+  void ReleaseTiles(TileVector* tiles) {
+    for (TileVector::iterator it = tiles->begin(); it != tiles->end(); it++) {
+      Tile* tile = *it;
+      tile->SetPriority(ACTIVE_TREE, TilePriority());
+      tile->SetPriority(PENDING_TREE, TilePriority());
+    }
+  }
+
   FakeTileManager* tile_manager() { return tile_manager_.get(); }
 
   int AssignedMemoryCount(const TileVector& tiles) {
@@ -127,16 +144,6 @@ class TileManagerTest : public testing::TestWithParam<bool>,
     return has_memory_count;
   }
 
-  int TilesWithLCDCount(const TileVector& tiles) {
-    int has_lcd_count = 0;
-    for (TileVector::const_iterator it = tiles.begin(); it != tiles.end();
-         ++it) {
-      if ((*it)->GetRasterModeForTesting() == HIGH_QUALITY_RASTER_MODE)
-        ++has_lcd_count;
-    }
-    return has_lcd_count;
-  }
-
   bool ready_to_activate() const { return ready_to_activate_; }
 
   // The parametrization specifies whether the max tile limit should
@@ -159,6 +166,7 @@ class TileManagerTest : public testing::TestWithParam<bool>,
   TileMemoryLimitPolicy memory_limit_policy_;
   int max_tiles_;
   bool ready_to_activate_;
+  std::vector<PictureLayerImpl*> picture_layers_;
 };
 
 TEST_P(TileManagerTest, EnoughMemoryAllowAnything) {
@@ -179,6 +187,11 @@ TEST_P(TileManagerTest, EnoughMemoryAllowAnything) {
   EXPECT_EQ(3, AssignedMemoryCount(pending_now));
   EXPECT_EQ(3, AssignedMemoryCount(active_pending_soon));
   EXPECT_EQ(0, AssignedMemoryCount(never_bin));
+
+  ReleaseTiles(&active_now);
+  ReleaseTiles(&pending_now);
+  ReleaseTiles(&active_pending_soon);
+  ReleaseTiles(&never_bin);
 }
 
 TEST_P(TileManagerTest, EnoughMemoryAllowPrepaintOnly) {
@@ -200,6 +213,25 @@ TEST_P(TileManagerTest, EnoughMemoryAllowPrepaintOnly) {
   EXPECT_EQ(3, AssignedMemoryCount(pending_now));
   EXPECT_EQ(3, AssignedMemoryCount(active_pending_soon));
   EXPECT_EQ(0, AssignedMemoryCount(never_bin));
+
+  ReleaseTiles(&active_now);
+  ReleaseTiles(&pending_now);
+  ReleaseTiles(&active_pending_soon);
+  ReleaseTiles(&never_bin);
+}
+
+TEST_P(TileManagerTest, EnoughMemoryPendingLowResAllowAbsoluteMinimum) {
+  // A few low-res tiles required for activation, with enough memory for all
+  // tiles.
+
+  Initialize(5, ALLOW_ABSOLUTE_MINIMUM, SAME_PRIORITY_FOR_BOTH_TREES);
+  TileVector pending_low_res =
+      CreateTiles(5, TilePriority(), TilePriorityLowRes());
+
+  tile_manager()->AssignMemoryToTiles(global_state_);
+
+  EXPECT_EQ(5, AssignedMemoryCount(pending_low_res));
+  ReleaseTiles(&pending_low_res);
 }
 
 TEST_P(TileManagerTest, EnoughMemoryAllowAbsoluteMinimum) {
@@ -221,6 +253,11 @@ TEST_P(TileManagerTest, EnoughMemoryAllowAbsoluteMinimum) {
   EXPECT_EQ(3, AssignedMemoryCount(pending_now));
   EXPECT_EQ(0, AssignedMemoryCount(active_pending_soon));
   EXPECT_EQ(0, AssignedMemoryCount(never_bin));
+
+  ReleaseTiles(&active_now);
+  ReleaseTiles(&pending_now);
+  ReleaseTiles(&active_pending_soon);
+  ReleaseTiles(&never_bin);
 }
 
 TEST_P(TileManagerTest, EnoughMemoryAllowNothing) {
@@ -242,6 +279,11 @@ TEST_P(TileManagerTest, EnoughMemoryAllowNothing) {
   EXPECT_EQ(0, AssignedMemoryCount(pending_now));
   EXPECT_EQ(0, AssignedMemoryCount(active_pending_soon));
   EXPECT_EQ(0, AssignedMemoryCount(never_bin));
+
+  ReleaseTiles(&active_now);
+  ReleaseTiles(&pending_now);
+  ReleaseTiles(&active_pending_soon);
+  ReleaseTiles(&never_bin);
 }
 
 TEST_P(TileManagerTest, PartialOOMMemoryToPending) {
@@ -266,6 +308,9 @@ TEST_P(TileManagerTest, PartialOOMMemoryToPending) {
 
   EXPECT_EQ(3, AssignedMemoryCount(active_tree_tiles));
   EXPECT_EQ(5, AssignedMemoryCount(pending_tree_tiles));
+
+  ReleaseTiles(&active_tree_tiles);
+  ReleaseTiles(&pending_tree_tiles);
 }
 
 TEST_P(TileManagerTest, PartialOOMMemoryToActive) {
@@ -285,6 +330,9 @@ TEST_P(TileManagerTest, PartialOOMMemoryToActive) {
 
   EXPECT_EQ(5, AssignedMemoryCount(active_tree_tiles));
   EXPECT_EQ(3, AssignedMemoryCount(pending_tree_tiles));
+
+  ReleaseTiles(&active_tree_tiles);
+  ReleaseTiles(&pending_tree_tiles);
 }
 
 TEST_P(TileManagerTest, TotalOOMMemoryToPending) {
@@ -316,6 +364,9 @@ TEST_P(TileManagerTest, TotalOOMMemoryToPending) {
     EXPECT_EQ(0, AssignedMemoryCount(active_tree_tiles));
     EXPECT_EQ(8, AssignedMemoryCount(pending_tree_tiles));
   }
+
+  ReleaseTiles(&active_tree_tiles);
+  ReleaseTiles(&pending_tree_tiles);
 }
 
 TEST_P(TileManagerTest, TotalOOMActiveSoonMemoryToPending) {
@@ -347,6 +398,9 @@ TEST_P(TileManagerTest, TotalOOMActiveSoonMemoryToPending) {
     EXPECT_EQ(0, AssignedMemoryCount(active_tree_tiles));
     EXPECT_EQ(8, AssignedMemoryCount(pending_tree_tiles));
   }
+
+  ReleaseTiles(&active_tree_tiles);
+  ReleaseTiles(&pending_tree_tiles);
 }
 
 TEST_P(TileManagerTest, TotalOOMMemoryToActive) {
@@ -371,6 +425,9 @@ TEST_P(TileManagerTest, TotalOOMMemoryToActive) {
     EXPECT_EQ(8, AssignedMemoryCount(active_tree_tiles));
     EXPECT_EQ(0, AssignedMemoryCount(pending_tree_tiles));
   }
+
+  ReleaseTiles(&active_tree_tiles);
+  ReleaseTiles(&pending_tree_tiles);
 }
 
 TEST_P(TileManagerTest, TotalOOMMemoryToNewContent) {
@@ -410,229 +467,9 @@ TEST_P(TileManagerTest, TotalOOMMemoryToNewContent) {
   tile_manager()->AssignMemoryToTiles(global_state_);
   EXPECT_EQ(0, AssignedMemoryCount(active_tree_tiles));
   EXPECT_EQ(10, AssignedMemoryCount(pending_tree_tiles));
-}
-
-TEST_P(TileManagerTest, RasterAsLCD) {
-  Initialize(20, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
-  TileVector active_tree_tiles =
-      CreateTiles(5, TilePriorityForNowBin(), TilePriority());
-  TileVector pending_tree_tiles =
-      CreateTiles(5, TilePriority(), TilePriorityForNowBin());
-
-  tile_manager()->AssignMemoryToTiles(global_state_);
-
-  EXPECT_EQ(5, TilesWithLCDCount(active_tree_tiles));
-  EXPECT_EQ(5, TilesWithLCDCount(pending_tree_tiles));
-}
-
-TEST_P(TileManagerTest, RasterAsNoLCD) {
-  Initialize(20, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
-  TileVector active_tree_tiles =
-      CreateTiles(5, TilePriorityForNowBin(), TilePriority());
-  TileVector pending_tree_tiles =
-      CreateTiles(5, TilePriority(), TilePriorityForNowBin());
-
-  for (TileVector::iterator it = active_tree_tiles.begin();
-       it != active_tree_tiles.end();
-       ++it) {
-    (*it)->set_can_use_lcd_text(false);
-  }
-  for (TileVector::iterator it = pending_tree_tiles.begin();
-       it != pending_tree_tiles.end();
-       ++it) {
-    (*it)->set_can_use_lcd_text(false);
-  }
-
-  tile_manager()->AssignMemoryToTiles(global_state_);
-
-  EXPECT_EQ(0, TilesWithLCDCount(active_tree_tiles));
-  EXPECT_EQ(0, TilesWithLCDCount(pending_tree_tiles));
-}
-
-TEST_P(TileManagerTest, ReRasterAsNoLCD) {
-  Initialize(20, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
-  TileVector active_tree_tiles =
-      CreateTiles(5, TilePriorityForNowBin(), TilePriority());
-  TileVector pending_tree_tiles =
-      CreateTiles(5, TilePriority(), TilePriorityForNowBin());
-
-  tile_manager()->AssignMemoryToTiles(global_state_);
-
-  EXPECT_EQ(5, TilesWithLCDCount(active_tree_tiles));
-  EXPECT_EQ(5, TilesWithLCDCount(pending_tree_tiles));
-
-  for (TileVector::iterator it = active_tree_tiles.begin();
-       it != active_tree_tiles.end();
-       ++it) {
-    (*it)->set_can_use_lcd_text(false);
-  }
-  for (TileVector::iterator it = pending_tree_tiles.begin();
-       it != pending_tree_tiles.end();
-       ++it) {
-    (*it)->set_can_use_lcd_text(false);
-  }
-
-  tile_manager()->AssignMemoryToTiles(global_state_);
 
-  EXPECT_EQ(0, TilesWithLCDCount(active_tree_tiles));
-  EXPECT_EQ(0, TilesWithLCDCount(pending_tree_tiles));
-}
-
-TEST_P(TileManagerTest, NoTextDontReRasterAsNoLCD) {
-  Initialize(20, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
-  TileVector active_tree_tiles =
-      CreateTiles(5, TilePriorityForNowBin(), TilePriority());
-  TileVector pending_tree_tiles =
-      CreateTiles(5, TilePriority(), TilePriorityForNowBin());
-
-  tile_manager()->AssignMemoryToTiles(global_state_);
-
-  EXPECT_EQ(5, TilesWithLCDCount(active_tree_tiles));
-  EXPECT_EQ(5, TilesWithLCDCount(pending_tree_tiles));
-
-  for (TileVector::iterator it = active_tree_tiles.begin();
-       it != active_tree_tiles.end();
-       ++it) {
-    ManagedTileState::TileVersion& tile_version =
-        (*it)->GetTileVersionForTesting(HIGH_QUALITY_RASTER_MODE);
-    tile_version.SetSolidColorForTesting(SkColorSetARGB(0, 0, 0, 0));
-    (*it)->set_can_use_lcd_text(false);
-    EXPECT_TRUE((*it)->IsReadyToDraw());
-  }
-  for (TileVector::iterator it = pending_tree_tiles.begin();
-       it != pending_tree_tiles.end();
-       ++it) {
-    ManagedTileState::TileVersion& tile_version =
-        (*it)->GetTileVersionForTesting(HIGH_QUALITY_RASTER_MODE);
-    tile_version.SetSolidColorForTesting(SkColorSetARGB(0, 0, 0, 0));
-    (*it)->set_can_use_lcd_text(false);
-    EXPECT_TRUE((*it)->IsReadyToDraw());
-  }
-
-  tile_manager()->AssignMemoryToTiles(global_state_);
-
-  EXPECT_EQ(5, TilesWithLCDCount(active_tree_tiles));
-  EXPECT_EQ(5, TilesWithLCDCount(pending_tree_tiles));
-}
-
-TEST_P(TileManagerTest, TextReRasterAsNoLCD) {
-  Initialize(20, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
-  TileVector active_tree_tiles =
-      CreateTiles(5, TilePriorityForNowBin(), TilePriority());
-  TileVector pending_tree_tiles =
-      CreateTiles(5, TilePriority(), TilePriorityForNowBin());
-
-  tile_manager()->AssignMemoryToTiles(global_state_);
-
-  EXPECT_EQ(5, TilesWithLCDCount(active_tree_tiles));
-  EXPECT_EQ(5, TilesWithLCDCount(pending_tree_tiles));
-
-  for (TileVector::iterator it = active_tree_tiles.begin();
-       it != active_tree_tiles.end();
-       ++it) {
-    ManagedTileState::TileVersion& tile_version =
-        (*it)->GetTileVersionForTesting(HIGH_QUALITY_RASTER_MODE);
-    tile_version.SetSolidColorForTesting(SkColorSetARGB(0, 0, 0, 0));
-    tile_version.SetHasTextForTesting(true);
-    (*it)->set_can_use_lcd_text(false);
-
-    EXPECT_TRUE((*it)->IsReadyToDraw());
-  }
-  for (TileVector::iterator it = pending_tree_tiles.begin();
-       it != pending_tree_tiles.end();
-       ++it) {
-    ManagedTileState::TileVersion& tile_version =
-        (*it)->GetTileVersionForTesting(HIGH_QUALITY_RASTER_MODE);
-    tile_version.SetSolidColorForTesting(SkColorSetARGB(0, 0, 0, 0));
-    tile_version.SetHasTextForTesting(true);
-    (*it)->set_can_use_lcd_text(false);
-
-    EXPECT_TRUE((*it)->IsReadyToDraw());
-  }
-
-  tile_manager()->AssignMemoryToTiles(global_state_);
-
-  EXPECT_EQ(0, TilesWithLCDCount(active_tree_tiles));
-  EXPECT_EQ(0, TilesWithLCDCount(pending_tree_tiles));
-}
-
-TEST_P(TileManagerTest, RespectMemoryLimit) {
-  if (UsingResourceLimit())
-    return;
-
-  Initialize(5, ALLOW_ANYTHING, SMOOTHNESS_TAKES_PRIORITY);
-
-  // We use double the tiles since the hard-limit is double.
-  TileVector large_tiles =
-      CreateTiles(10, TilePriorityForNowBin(), TilePriority());
-
-  size_t memory_required_bytes;
-  size_t memory_nice_to_have_bytes;
-  size_t memory_allocated_bytes;
-  size_t memory_used_bytes;
-
-  tile_manager()->AssignMemoryToTiles(global_state_);
-  tile_manager()->GetMemoryStats(&memory_required_bytes,
-                                 &memory_nice_to_have_bytes,
-                                 &memory_allocated_bytes,
-                                 &memory_used_bytes);
-  // Allocated bytes should never be more than the memory limit.
-  EXPECT_LE(memory_allocated_bytes, global_state_.hard_memory_limit_in_bytes);
-
-  // Finish raster of large tiles.
-  tile_manager()->UpdateVisibleTiles();
-
-  // Remove all large tiles. This will leave the memory currently
-  // used by these tiles as unused when AssignMemoryToTiles() is called.
-  large_tiles.clear();
-
-  // Create a new set of tiles using a different size. These tiles
-  // can use the memory currently assigned to the large tiles but
-  // they can't use the same resources as the size doesn't match.
-  TileVector small_tiles = CreateTilesWithSize(
-      10, TilePriorityForNowBin(), TilePriority(), gfx::Size(128, 128));
-
-  tile_manager()->AssignMemoryToTiles(global_state_);
-  tile_manager()->GetMemoryStats(&memory_required_bytes,
-                                 &memory_nice_to_have_bytes,
-                                 &memory_allocated_bytes,
-                                 &memory_used_bytes);
-  // Allocated bytes should never be more than the memory limit.
-  EXPECT_LE(memory_allocated_bytes, global_state_.hard_memory_limit_in_bytes);
-}
-
-TEST_P(TileManagerTest, AllowRasterizeOnDemand) {
-  // Not enough memory to initialize tiles required for activation.
-  Initialize(0, ALLOW_ANYTHING, SAME_PRIORITY_FOR_BOTH_TREES);
-  TileVector tiles =
-      CreateTiles(2, TilePriority(), TilePriorityRequiredForActivation());
-
-  tile_manager()->AssignMemoryToTiles(global_state_);
-
-  // This should make required tiles ready to draw by marking them as
-  // required tiles for on-demand raster.
-  tile_manager()->DidFinishRunningTasksForTesting();
-
-  EXPECT_TRUE(ready_to_activate());
-  for (TileVector::iterator it = tiles.begin(); it != tiles.end(); ++it)
-    EXPECT_TRUE((*it)->IsReadyToDraw());
-}
-
-TEST_P(TileManagerTest, PreventRasterizeOnDemand) {
-  // Not enough memory to initialize tiles required for activation.
-  Initialize(0, ALLOW_ANYTHING, SAME_PRIORITY_FOR_BOTH_TREES, false);
-  TileVector tiles =
-      CreateTiles(2, TilePriority(), TilePriorityRequiredForActivation());
-
-  tile_manager()->AssignMemoryToTiles(global_state_);
-
-  // This should make required tiles ready to draw by marking them as
-  // required tiles for on-demand raster.
-  tile_manager()->DidFinishRunningTasksForTesting();
-
-  EXPECT_TRUE(ready_to_activate());
-  for (TileVector::iterator it = tiles.begin(); it != tiles.end(); ++it)
-    EXPECT_FALSE((*it)->IsReadyToDraw());
+  ReleaseTiles(&active_tree_tiles);
+  ReleaseTiles(&pending_tree_tiles);
 }
 
 // If true, the max tile limit should be applied as bytes; if false,
@@ -641,10 +478,9 @@ INSTANTIATE_TEST_CASE_P(TileManagerTests,
                         TileManagerTest,
                         ::testing::Values(true, false));
 
-class TileManagerTileIteratorTest : public testing::Test,
-                                    public TileManagerClient {
+class TileManagerTilePriorityQueueTest : public testing::Test {
  public:
-  TileManagerTileIteratorTest()
+  TileManagerTilePriorityQueueTest()
       : memory_limit_policy_(ALLOW_ANYTHING),
         max_tiles_(10000),
         ready_to_activate_(false),
@@ -694,7 +530,7 @@ class TileManagerTileIteratorTest : public testing::Test,
   }
 
   void ActivateTree() {
-    host_impl_.ActivatePendingTree();
+    host_impl_.ActivateSyncTree();
     CHECK(!host_impl_.pending_tree());
     pending_layer_ = NULL;
     active_layer_ = static_cast<FakePictureLayerImpl*>(
@@ -739,10 +575,6 @@ class TileManagerTileIteratorTest : public testing::Test,
     pending_layer_->SetAllTilesVisible();
   }
 
-  // TileManagerClient implementation.
-  virtual void NotifyReadyToActivate() OVERRIDE { ready_to_activate_ = true; }
-  virtual void NotifyTileInitialized(const Tile* tile) OVERRIDE {}
-
   TileManager* tile_manager() { return host_impl_.tile_manager(); }
 
  protected:
@@ -759,84 +591,23 @@ class TileManagerTileIteratorTest : public testing::Test,
   FakePictureLayerImpl* active_layer_;
 };
 
-TEST_F(TileManagerTileIteratorTest, PairedPictureLayers) {
-  FakeImplProxy proxy;
-  TestSharedBitmapManager shared_bitmap_manager;
-  FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager);
-  host_impl.CreatePendingTree();
-  host_impl.ActivatePendingTree();
-  host_impl.CreatePendingTree();
-
-  LayerTreeImpl* active_tree = host_impl.active_tree();
-  LayerTreeImpl* pending_tree = host_impl.pending_tree();
-  EXPECT_NE(active_tree, pending_tree);
-
-  scoped_ptr<FakePictureLayerImpl> active_layer =
-      FakePictureLayerImpl::Create(active_tree, 10);
-  scoped_ptr<FakePictureLayerImpl> pending_layer =
-      FakePictureLayerImpl::Create(pending_tree, 10);
-
-  TileManager* tile_manager = TileManagerTileIteratorTest::tile_manager();
-  EXPECT_TRUE(tile_manager);
-
-  tile_manager->RegisterPictureLayerImpl(active_layer.get());
-  tile_manager->RegisterPictureLayerImpl(pending_layer.get());
-
-  std::vector<TileManager::PairedPictureLayer> paired_layers;
-  tile_manager->GetPairedPictureLayers(&paired_layers);
-
-  EXPECT_EQ(2u, paired_layers.size());
-  if (paired_layers[0].active_layer) {
-    EXPECT_EQ(active_layer.get(), paired_layers[0].active_layer);
-    EXPECT_EQ(NULL, paired_layers[0].pending_layer);
-  } else {
-    EXPECT_EQ(pending_layer.get(), paired_layers[0].pending_layer);
-    EXPECT_EQ(NULL, paired_layers[0].active_layer);
-  }
-
-  if (paired_layers[1].active_layer) {
-    EXPECT_EQ(active_layer.get(), paired_layers[1].active_layer);
-    EXPECT_EQ(NULL, paired_layers[1].pending_layer);
-  } else {
-    EXPECT_EQ(pending_layer.get(), paired_layers[1].pending_layer);
-    EXPECT_EQ(NULL, paired_layers[1].active_layer);
-  }
-
-  active_layer->set_twin_layer(pending_layer.get());
-  pending_layer->set_twin_layer(active_layer.get());
-
-  tile_manager->GetPairedPictureLayers(&paired_layers);
-  EXPECT_EQ(1u, paired_layers.size());
-
-  EXPECT_EQ(active_layer.get(), paired_layers[0].active_layer);
-  EXPECT_EQ(pending_layer.get(), paired_layers[0].pending_layer);
-
-  tile_manager->UnregisterPictureLayerImpl(active_layer.get());
-  tile_manager->UnregisterPictureLayerImpl(pending_layer.get());
-}
-
-TEST_F(TileManagerTileIteratorTest, RasterTileIterator) {
+TEST_F(TileManagerTilePriorityQueueTest, RasterTilePriorityQueue) {
   SetupDefaultTrees(gfx::Size(1000, 1000));
-  TileManager* tile_manager = TileManagerTileIteratorTest::tile_manager();
-  EXPECT_TRUE(tile_manager);
 
   active_layer_->CreateDefaultTilingsAndTiles();
   pending_layer_->CreateDefaultTilingsAndTiles();
 
-  std::vector<TileManager::PairedPictureLayer> paired_layers;
-  tile_manager->GetPairedPictureLayers(&paired_layers);
-  EXPECT_EQ(1u, paired_layers.size());
-
-  TileManager::RasterTileIterator it(tile_manager,
-                                     SAME_PRIORITY_FOR_BOTH_TREES);
-  EXPECT_TRUE(it);
+  RasterTilePriorityQueue queue;
+  host_impl_.BuildRasterQueue(&queue, SAME_PRIORITY_FOR_BOTH_TREES);
+  EXPECT_FALSE(queue.IsEmpty());
 
   size_t tile_count = 0;
   std::set<Tile*> all_tiles;
-  for (; it; ++it) {
-    EXPECT_TRUE(*it);
-    all_tiles.insert(*it);
+  while (!queue.IsEmpty()) {
+    EXPECT_TRUE(queue.Top());
+    all_tiles.insert(queue.Top());
     ++tile_count;
+    queue.Pop();
   }
 
   EXPECT_EQ(tile_count, all_tiles.size());
@@ -844,15 +615,15 @@ TEST_F(TileManagerTileIteratorTest, RasterTileIterator) {
 
   // Sanity check, all tiles should be visible.
   std::set<Tile*> smoothness_tiles;
-  for (TileManager::RasterTileIterator it(tile_manager,
-                                          SMOOTHNESS_TAKES_PRIORITY);
-       it;
-       ++it) {
-    Tile* tile = *it;
+  queue.Reset();
+  host_impl_.BuildRasterQueue(&queue, SMOOTHNESS_TAKES_PRIORITY);
+  while (!queue.IsEmpty()) {
+    Tile* tile = queue.Top();
     EXPECT_TRUE(tile);
     EXPECT_EQ(TilePriority::NOW, tile->priority(ACTIVE_TREE).priority_bin);
     EXPECT_EQ(TilePriority::NOW, tile->priority(PENDING_TREE).priority_bin);
     smoothness_tiles.insert(tile);
+    queue.Pop();
   }
   EXPECT_EQ(all_tiles, smoothness_tiles);
 
@@ -860,8 +631,10 @@ TEST_F(TileManagerTileIteratorTest, RasterTileIterator) {
 
   // Invalidate the pending tree.
   pending_layer_->set_invalidation(invalidation);
-  pending_layer_->HighResTiling()->Invalidate(invalidation);
-  pending_layer_->LowResTiling()->Invalidate(invalidation);
+  pending_layer_->HighResTiling()->UpdateTilesToCurrentPile(
+      invalidation, gfx::Size(1000, 1000));
+  pending_layer_->LowResTiling()->UpdateTilesToCurrentPile(
+      invalidation, gfx::Size(1000, 1000));
 
   active_layer_->ResetAllTilesPriorities();
   pending_layer_->ResetAllTilesPriorities();
@@ -869,13 +642,37 @@ TEST_F(TileManagerTileIteratorTest, RasterTileIterator) {
   // Renew all of the tile priorities.
   gfx::Rect viewport(50, 50, 100, 100);
   pending_layer_->HighResTiling()->UpdateTilePriorities(
-      PENDING_TREE, viewport, 1.0f, 1.0);
+      PENDING_TREE,
+      viewport,
+      1.0f,
+      1.0,
+      NULL,
+      pending_layer_->render_target(),
+      pending_layer_->draw_transform());
   pending_layer_->LowResTiling()->UpdateTilePriorities(
-      PENDING_TREE, viewport, 1.0f, 1.0);
+      PENDING_TREE,
+      viewport,
+      1.0f,
+      1.0,
+      NULL,
+      pending_layer_->render_target(),
+      pending_layer_->draw_transform());
   active_layer_->HighResTiling()->UpdateTilePriorities(
-      ACTIVE_TREE, viewport, 1.0f, 1.0);
+      ACTIVE_TREE,
+      viewport,
+      1.0f,
+      1.0,
+      NULL,
+      active_layer_->render_target(),
+      active_layer_->draw_transform());
   active_layer_->LowResTiling()->UpdateTilePriorities(
-      ACTIVE_TREE, viewport, 1.0f, 1.0);
+      ACTIVE_TREE,
+      viewport,
+      1.0f,
+      1.0,
+      NULL,
+      active_layer_->render_target(),
+      active_layer_->draw_transform());
 
   // Populate all tiles directly from the tilings.
   all_tiles.clear();
@@ -904,11 +701,10 @@ TEST_F(TileManagerTileIteratorTest, RasterTileIterator) {
   tile_count = 0;
   size_t increasing_distance_tiles = 0u;
   // Here we expect to get increasing ACTIVE_TREE priority_bin.
-  for (TileManager::RasterTileIterator it(tile_manager,
-                                          SMOOTHNESS_TAKES_PRIORITY);
-       it;
-       ++it) {
-    Tile* tile = *it;
+  queue.Reset();
+  host_impl_.BuildRasterQueue(&queue, SMOOTHNESS_TAKES_PRIORITY);
+  while (!queue.IsEmpty()) {
+    Tile* tile = queue.Top();
     EXPECT_TRUE(tile);
 
     if (!last_tile)
@@ -933,6 +729,7 @@ TEST_F(TileManagerTileIteratorTest, RasterTileIterator) {
     last_tile = tile;
     ++tile_count;
     smoothness_tiles.insert(tile);
+    queue.Pop();
   }
 
   EXPECT_EQ(tile_count, smoothness_tiles.size());
@@ -945,11 +742,10 @@ TEST_F(TileManagerTileIteratorTest, RasterTileIterator) {
   last_tile = NULL;
   increasing_distance_tiles = 0u;
   // Here we expect to get increasing PENDING_TREE priority_bin.
-  for (TileManager::RasterTileIterator it(tile_manager,
-                                          NEW_CONTENT_TAKES_PRIORITY);
-       it;
-       ++it) {
-    Tile* tile = *it;
+  queue.Reset();
+  host_impl_.BuildRasterQueue(&queue, NEW_CONTENT_TAKES_PRIORITY);
+  while (!queue.IsEmpty()) {
+    Tile* tile = queue.Top();
     EXPECT_TRUE(tile);
 
     if (!last_tile)
@@ -973,6 +769,7 @@ TEST_F(TileManagerTileIteratorTest, RasterTileIterator) {
 
     last_tile = tile;
     new_content_tiles.insert(tile);
+    queue.Pop();
   }
 
   EXPECT_EQ(tile_count, new_content_tiles.size());
@@ -982,63 +779,61 @@ TEST_F(TileManagerTileIteratorTest, RasterTileIterator) {
   EXPECT_GT(increasing_distance_tiles, 3 * tile_count / 4);
 }
 
-TEST_F(TileManagerTileIteratorTest, EvictionTileIterator) {
+TEST_F(TileManagerTilePriorityQueueTest, EvictionTilePriorityQueue) {
   SetupDefaultTrees(gfx::Size(1000, 1000));
-  TileManager* tile_manager = TileManagerTileIteratorTest::tile_manager();
-  EXPECT_TRUE(tile_manager);
 
   active_layer_->CreateDefaultTilingsAndTiles();
   pending_layer_->CreateDefaultTilingsAndTiles();
 
-  std::vector<TileManager::PairedPictureLayer> paired_layers;
-  tile_manager->GetPairedPictureLayers(&paired_layers);
-  EXPECT_EQ(1u, paired_layers.size());
-
-  TileManager::EvictionTileIterator empty_it(tile_manager,
-                                             SAME_PRIORITY_FOR_BOTH_TREES);
-  EXPECT_FALSE(empty_it);
+  EvictionTilePriorityQueue empty_queue;
+  host_impl_.BuildEvictionQueue(&empty_queue, SAME_PRIORITY_FOR_BOTH_TREES);
+  EXPECT_TRUE(empty_queue.IsEmpty());
   std::set<Tile*> all_tiles;
   size_t tile_count = 0;
 
-  for (TileManager::RasterTileIterator raster_it(tile_manager,
-                                                 SAME_PRIORITY_FOR_BOTH_TREES);
-       raster_it;
-       ++raster_it) {
+  RasterTilePriorityQueue raster_queue;
+  host_impl_.BuildRasterQueue(&raster_queue, SAME_PRIORITY_FOR_BOTH_TREES);
+  while (!raster_queue.IsEmpty()) {
     ++tile_count;
-    EXPECT_TRUE(*raster_it);
-    all_tiles.insert(*raster_it);
+    EXPECT_TRUE(raster_queue.Top());
+    all_tiles.insert(raster_queue.Top());
+    raster_queue.Pop();
   }
 
   EXPECT_EQ(tile_count, all_tiles.size());
   EXPECT_EQ(17u, tile_count);
 
-  tile_manager->InitializeTilesWithResourcesForTesting(
+  tile_manager()->InitializeTilesWithResourcesForTesting(
       std::vector<Tile*>(all_tiles.begin(), all_tiles.end()));
 
-  TileManager::EvictionTileIterator it(tile_manager, SMOOTHNESS_TAKES_PRIORITY);
-  EXPECT_TRUE(it);
+  EvictionTilePriorityQueue queue;
+  host_impl_.BuildEvictionQueue(&queue, SMOOTHNESS_TAKES_PRIORITY);
+  EXPECT_FALSE(queue.IsEmpty());
 
   // Sanity check, all tiles should be visible.
   std::set<Tile*> smoothness_tiles;
-  for (; it; ++it) {
-    Tile* tile = *it;
+  while (!queue.IsEmpty()) {
+    Tile* tile = queue.Top();
     EXPECT_TRUE(tile);
     EXPECT_EQ(TilePriority::NOW, tile->priority(ACTIVE_TREE).priority_bin);
     EXPECT_EQ(TilePriority::NOW, tile->priority(PENDING_TREE).priority_bin);
     EXPECT_TRUE(tile->HasResources());
     smoothness_tiles.insert(tile);
+    queue.Pop();
   }
   EXPECT_EQ(all_tiles, smoothness_tiles);
 
-  tile_manager->ReleaseTileResourcesForTesting(
+  tile_manager()->ReleaseTileResourcesForTesting(
       std::vector<Tile*>(all_tiles.begin(), all_tiles.end()));
 
   Region invalidation(gfx::Rect(0, 0, 500, 500));
 
   // Invalidate the pending tree.
   pending_layer_->set_invalidation(invalidation);
-  pending_layer_->HighResTiling()->Invalidate(invalidation);
-  pending_layer_->LowResTiling()->Invalidate(invalidation);
+  pending_layer_->HighResTiling()->UpdateTilesToCurrentPile(
+      invalidation, gfx::Size(1000, 1000));
+  pending_layer_->LowResTiling()->UpdateTilesToCurrentPile(
+      invalidation, gfx::Size(1000, 1000));
 
   active_layer_->ResetAllTilesPriorities();
   pending_layer_->ResetAllTilesPriorities();
@@ -1046,13 +841,37 @@ TEST_F(TileManagerTileIteratorTest, EvictionTileIterator) {
   // Renew all of the tile priorities.
   gfx::Rect viewport(50, 50, 100, 100);
   pending_layer_->HighResTiling()->UpdateTilePriorities(
-      PENDING_TREE, viewport, 1.0f, 1.0);
+      PENDING_TREE,
+      viewport,
+      1.0f,
+      1.0,
+      NULL,
+      pending_layer_->render_target(),
+      pending_layer_->draw_transform());
   pending_layer_->LowResTiling()->UpdateTilePriorities(
-      PENDING_TREE, viewport, 1.0f, 1.0);
+      PENDING_TREE,
+      viewport,
+      1.0f,
+      1.0,
+      NULL,
+      pending_layer_->render_target(),
+      pending_layer_->draw_transform());
   active_layer_->HighResTiling()->UpdateTilePriorities(
-      ACTIVE_TREE, viewport, 1.0f, 1.0);
+      ACTIVE_TREE,
+      viewport,
+      1.0f,
+      1.0,
+      NULL,
+      active_layer_->render_target(),
+      active_layer_->draw_transform());
   active_layer_->LowResTiling()->UpdateTilePriorities(
-      ACTIVE_TREE, viewport, 1.0f, 1.0);
+      ACTIVE_TREE,
+      viewport,
+      1.0f,
+      1.0,
+      NULL,
+      active_layer_->render_target(),
+      active_layer_->draw_transform());
 
   // Populate all tiles directly from the tilings.
   all_tiles.clear();
@@ -1076,18 +895,19 @@ TEST_F(TileManagerTileIteratorTest, EvictionTileIterator) {
   for (size_t i = 0; i < active_low_res_tiles.size(); ++i)
     all_tiles.insert(active_low_res_tiles[i]);
 
-  tile_manager->InitializeTilesWithResourcesForTesting(
+  tile_manager()->InitializeTilesWithResourcesForTesting(
       std::vector<Tile*>(all_tiles.begin(), all_tiles.end()));
 
+  pending_layer_->MarkVisibleResourcesAsRequired();
+
   Tile* last_tile = NULL;
   smoothness_tiles.clear();
   tile_count = 0;
   // Here we expect to get increasing ACTIVE_TREE priority_bin.
-  for (TileManager::EvictionTileIterator it(tile_manager,
-                                            SMOOTHNESS_TAKES_PRIORITY);
-       it;
-       ++it) {
-    Tile* tile = *it;
+  queue.Reset();
+  host_impl_.BuildEvictionQueue(&queue, SMOOTHNESS_TAKES_PRIORITY);
+  while (!queue.IsEmpty()) {
+    Tile* tile = queue.Top();
     EXPECT_TRUE(tile);
     EXPECT_TRUE(tile->HasResources());
 
@@ -1098,13 +918,19 @@ TEST_F(TileManagerTileIteratorTest, EvictionTileIterator) {
               tile->priority(ACTIVE_TREE).priority_bin);
     if (last_tile->priority(ACTIVE_TREE).priority_bin ==
         tile->priority(ACTIVE_TREE).priority_bin) {
-      EXPECT_GE(last_tile->priority(ACTIVE_TREE).distance_to_visible,
-                tile->priority(ACTIVE_TREE).distance_to_visible);
+      EXPECT_LE(last_tile->required_for_activation(),
+                tile->required_for_activation());
+      if (last_tile->required_for_activation() ==
+          tile->required_for_activation()) {
+        EXPECT_GE(last_tile->priority(ACTIVE_TREE).distance_to_visible,
+                  tile->priority(ACTIVE_TREE).distance_to_visible);
+      }
     }
 
     last_tile = tile;
     ++tile_count;
     smoothness_tiles.insert(tile);
+    queue.Pop();
   }
 
   EXPECT_EQ(tile_count, smoothness_tiles.size());
@@ -1113,11 +939,10 @@ TEST_F(TileManagerTileIteratorTest, EvictionTileIterator) {
   std::set<Tile*> new_content_tiles;
   last_tile = NULL;
   // Here we expect to get increasing PENDING_TREE priority_bin.
-  for (TileManager::EvictionTileIterator it(tile_manager,
-                                            NEW_CONTENT_TAKES_PRIORITY);
-       it;
-       ++it) {
-    Tile* tile = *it;
+  queue.Reset();
+  host_impl_.BuildEvictionQueue(&queue, NEW_CONTENT_TAKES_PRIORITY);
+  while (!queue.IsEmpty()) {
+    Tile* tile = queue.Top();
     EXPECT_TRUE(tile);
 
     if (!last_tile)
@@ -1127,16 +952,267 @@ TEST_F(TileManagerTileIteratorTest, EvictionTileIterator) {
               tile->priority(PENDING_TREE).priority_bin);
     if (last_tile->priority(PENDING_TREE).priority_bin ==
         tile->priority(PENDING_TREE).priority_bin) {
-      EXPECT_GE(last_tile->priority(PENDING_TREE).distance_to_visible,
-                tile->priority(PENDING_TREE).distance_to_visible);
+      EXPECT_LE(last_tile->required_for_activation(),
+                tile->required_for_activation());
+      if (last_tile->required_for_activation() ==
+          tile->required_for_activation()) {
+        EXPECT_GE(last_tile->priority(PENDING_TREE).distance_to_visible,
+                  tile->priority(PENDING_TREE).distance_to_visible);
+      }
     }
 
     last_tile = tile;
     new_content_tiles.insert(tile);
+    queue.Pop();
   }
 
   EXPECT_EQ(tile_count, new_content_tiles.size());
   EXPECT_EQ(all_tiles, new_content_tiles);
 }
+
+#if defined(OS_WIN)
+#define MAYBE_EvictionTilePriorityQueueWithOcclusion \
+  DISABLED_EvictionTilePriorityQueueWithOcclusion
+#else
+#define MAYBE_EvictionTilePriorityQueueWithOcclusion \
+  EvictionTilePriorityQueueWithOcclusion
+#endif
+TEST_F(TileManagerTilePriorityQueueTest,
+       MAYBE_EvictionTilePriorityQueueWithOcclusion) {
+  gfx::Size tile_size(102, 102);
+  gfx::Size layer_bounds(1000, 1000);
+
+  scoped_refptr<FakePicturePileImpl> pending_pile =
+      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
+  SetupPendingTree(pending_pile);
+  pending_layer_->CreateDefaultTilingsAndTiles();
+
+  scoped_ptr<FakePictureLayerImpl> pending_child =
+      FakePictureLayerImpl::CreateWithPile(
+          host_impl_.pending_tree(), 2, pending_pile);
+  pending_layer_->AddChild(pending_child.PassAs<LayerImpl>());
+
+  FakePictureLayerImpl* pending_child_layer =
+      static_cast<FakePictureLayerImpl*>(pending_layer_->children()[0]);
+  pending_child_layer->SetDrawsContent(true);
+  pending_child_layer->DoPostCommitInitializationIfNeeded();
+  pending_child_layer->CreateDefaultTilingsAndTiles();
+
+  std::set<Tile*> all_tiles;
+  size_t tile_count = 0;
+  RasterTilePriorityQueue raster_queue;
+  host_impl_.BuildRasterQueue(&raster_queue, SAME_PRIORITY_FOR_BOTH_TREES);
+  while (!raster_queue.IsEmpty()) {
+    ++tile_count;
+    EXPECT_TRUE(raster_queue.Top());
+    all_tiles.insert(raster_queue.Top());
+    raster_queue.Pop();
+  }
+  EXPECT_EQ(tile_count, all_tiles.size());
+  EXPECT_EQ(34u, tile_count);
+
+  pending_layer_->ResetAllTilesPriorities();
+
+  // Renew all of the tile priorities.
+  gfx::Rect viewport(layer_bounds);
+  pending_layer_->HighResTiling()->UpdateTilePriorities(
+      PENDING_TREE,
+      viewport,
+      1.0f,
+      1.0,
+      NULL,
+      pending_layer_->render_target(),
+      pending_layer_->draw_transform());
+  pending_layer_->LowResTiling()->UpdateTilePriorities(
+      PENDING_TREE,
+      viewport,
+      1.0f,
+      1.0,
+      NULL,
+      pending_layer_->render_target(),
+      pending_layer_->draw_transform());
+  pending_child_layer->HighResTiling()->UpdateTilePriorities(
+      PENDING_TREE,
+      viewport,
+      1.0f,
+      1.0,
+      NULL,
+      pending_child_layer->render_target(),
+      pending_child_layer->draw_transform());
+  pending_child_layer->LowResTiling()->UpdateTilePriorities(
+      PENDING_TREE,
+      viewport,
+      1.0f,
+      1.0,
+      NULL,
+      pending_child_layer->render_target(),
+      pending_child_layer->draw_transform());
+
+  // Populate all tiles directly from the tilings.
+  all_tiles.clear();
+  std::vector<Tile*> pending_high_res_tiles =
+      pending_layer_->HighResTiling()->AllTilesForTesting();
+  for (size_t i = 0; i < pending_high_res_tiles.size(); ++i)
+    all_tiles.insert(pending_high_res_tiles[i]);
+
+  std::vector<Tile*> pending_low_res_tiles =
+      pending_layer_->LowResTiling()->AllTilesForTesting();
+  for (size_t i = 0; i < pending_low_res_tiles.size(); ++i)
+    all_tiles.insert(pending_low_res_tiles[i]);
+
+  // Set all tiles on the pending_child_layer as occluded on the pending tree.
+  std::vector<Tile*> pending_child_high_res_tiles =
+      pending_child_layer->HighResTiling()->AllTilesForTesting();
+  for (size_t i = 0; i < pending_child_high_res_tiles.size(); ++i) {
+    pending_child_high_res_tiles[i]->set_is_occluded(PENDING_TREE, true);
+    all_tiles.insert(pending_child_high_res_tiles[i]);
+  }
+
+  std::vector<Tile*> pending_child_low_res_tiles =
+      pending_child_layer->LowResTiling()->AllTilesForTesting();
+  for (size_t i = 0; i < pending_child_low_res_tiles.size(); ++i) {
+    pending_child_low_res_tiles[i]->set_is_occluded(PENDING_TREE, true);
+    all_tiles.insert(pending_child_low_res_tiles[i]);
+  }
+
+  tile_manager()->InitializeTilesWithResourcesForTesting(
+      std::vector<Tile*>(all_tiles.begin(), all_tiles.end()));
+
+  // Verify occlusion is considered by EvictionTilePriorityQueue.
+  TreePriority tree_priority = NEW_CONTENT_TAKES_PRIORITY;
+  size_t occluded_count = 0u;
+  Tile* last_tile = NULL;
+  EvictionTilePriorityQueue queue;
+  host_impl_.BuildEvictionQueue(&queue, tree_priority);
+  while (!queue.IsEmpty()) {
+    Tile* tile = queue.Top();
+    if (!last_tile)
+      last_tile = tile;
+
+    bool tile_is_occluded = tile->is_occluded_for_tree_priority(tree_priority);
+
+    // The only way we will encounter an occluded tile after an unoccluded
+    // tile is if the priorty bin decreased, the tile is required for
+    // activation, or the scale changed.
+    if (tile_is_occluded) {
+      occluded_count++;
+
+      bool last_tile_is_occluded =
+          last_tile->is_occluded_for_tree_priority(tree_priority);
+      if (!last_tile_is_occluded) {
+        TilePriority::PriorityBin tile_priority_bin =
+            tile->priority_for_tree_priority(tree_priority).priority_bin;
+        TilePriority::PriorityBin last_tile_priority_bin =
+            last_tile->priority_for_tree_priority(tree_priority).priority_bin;
+
+        EXPECT_TRUE((tile_priority_bin < last_tile_priority_bin) ||
+                    tile->required_for_activation() ||
+                    (tile->contents_scale() != last_tile->contents_scale()));
+      }
+    }
+    last_tile = tile;
+    queue.Pop();
+  }
+  size_t expected_occluded_count =
+      pending_child_high_res_tiles.size() + pending_child_low_res_tiles.size();
+  EXPECT_EQ(expected_occluded_count, occluded_count);
+}
+
+TEST_F(TileManagerTilePriorityQueueTest, RasterTilePriorityQueueEmptyLayers) {
+  SetupDefaultTrees(gfx::Size(1000, 1000));
+
+  active_layer_->CreateDefaultTilingsAndTiles();
+  pending_layer_->CreateDefaultTilingsAndTiles();
+
+  RasterTilePriorityQueue queue;
+  host_impl_.BuildRasterQueue(&queue, SAME_PRIORITY_FOR_BOTH_TREES);
+  EXPECT_FALSE(queue.IsEmpty());
+
+  size_t tile_count = 0;
+  std::set<Tile*> all_tiles;
+  while (!queue.IsEmpty()) {
+    EXPECT_TRUE(queue.Top());
+    all_tiles.insert(queue.Top());
+    ++tile_count;
+    queue.Pop();
+  }
+
+  EXPECT_EQ(tile_count, all_tiles.size());
+  EXPECT_EQ(17u, tile_count);
+
+  queue.Reset();
+  for (int i = 1; i < 10; ++i) {
+    scoped_ptr<FakePictureLayerImpl> pending_layer =
+        FakePictureLayerImpl::Create(host_impl_.pending_tree(), id_ + i);
+    pending_layer->SetDrawsContent(true);
+    pending_layer->DoPostCommitInitializationIfNeeded();
+    pending_layer->set_has_valid_tile_priorities(true);
+    pending_layer_->AddChild(pending_layer.PassAs<LayerImpl>());
+  }
+
+  host_impl_.BuildRasterQueue(&queue, SAME_PRIORITY_FOR_BOTH_TREES);
+  EXPECT_FALSE(queue.IsEmpty());
+
+  tile_count = 0;
+  all_tiles.clear();
+  while (!queue.IsEmpty()) {
+    EXPECT_TRUE(queue.Top());
+    all_tiles.insert(queue.Top());
+    ++tile_count;
+    queue.Pop();
+  }
+  EXPECT_EQ(tile_count, all_tiles.size());
+  EXPECT_EQ(17u, tile_count);
+}
+
+TEST_F(TileManagerTilePriorityQueueTest, EvictionTilePriorityQueueEmptyLayers) {
+  SetupDefaultTrees(gfx::Size(1000, 1000));
+
+  active_layer_->CreateDefaultTilingsAndTiles();
+  pending_layer_->CreateDefaultTilingsAndTiles();
+
+  RasterTilePriorityQueue raster_queue;
+  host_impl_.BuildRasterQueue(&raster_queue, SAME_PRIORITY_FOR_BOTH_TREES);
+  EXPECT_FALSE(raster_queue.IsEmpty());
+
+  size_t tile_count = 0;
+  std::set<Tile*> all_tiles;
+  while (!raster_queue.IsEmpty()) {
+    EXPECT_TRUE(raster_queue.Top());
+    all_tiles.insert(raster_queue.Top());
+    ++tile_count;
+    raster_queue.Pop();
+  }
+  EXPECT_EQ(tile_count, all_tiles.size());
+  EXPECT_EQ(17u, tile_count);
+
+  std::vector<Tile*> tiles(all_tiles.begin(), all_tiles.end());
+  host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(tiles);
+
+  EvictionTilePriorityQueue queue;
+  for (int i = 1; i < 10; ++i) {
+    scoped_ptr<FakePictureLayerImpl> pending_layer =
+        FakePictureLayerImpl::Create(host_impl_.pending_tree(), id_ + i);
+    pending_layer->SetDrawsContent(true);
+    pending_layer->DoPostCommitInitializationIfNeeded();
+    pending_layer->set_has_valid_tile_priorities(true);
+    pending_layer_->AddChild(pending_layer.PassAs<LayerImpl>());
+  }
+
+  host_impl_.BuildEvictionQueue(&queue, SAME_PRIORITY_FOR_BOTH_TREES);
+  EXPECT_FALSE(queue.IsEmpty());
+
+  tile_count = 0;
+  all_tiles.clear();
+  while (!queue.IsEmpty()) {
+    EXPECT_TRUE(queue.Top());
+    all_tiles.insert(queue.Top());
+    ++tile_count;
+    queue.Pop();
+  }
+  EXPECT_EQ(tile_count, all_tiles.size());
+  EXPECT_EQ(17u, tile_count);
+}
+
 }  // namespace
 }  // namespace cc