| Index: cc/layers/picture_layer_impl_unittest.cc
 | 
| diff --git a/cc/layers/picture_layer_impl_unittest.cc b/cc/layers/picture_layer_impl_unittest.cc
 | 
| index 90a36f7a99881a3ccf5478ed71fa9b2cbeceb23c..7c7c899ff724ba96dfc26eba5712372059ee795d 100644
 | 
| --- a/cc/layers/picture_layer_impl_unittest.cc
 | 
| +++ b/cc/layers/picture_layer_impl_unittest.cc
 | 
| @@ -34,6 +34,18 @@
 | 
|  namespace cc {
 | 
|  namespace {
 | 
|  
 | 
| +#define EXPECT_BOTH_EQ(expression, x)         \
 | 
| +  do {                                        \
 | 
| +    EXPECT_EQ(x, pending_layer_->expression); \
 | 
| +    EXPECT_EQ(x, active_layer_->expression);  \
 | 
| +  } while (false)
 | 
| +
 | 
| +#define EXPECT_BOTH_NE(expression, x)         \
 | 
| +  do {                                        \
 | 
| +    EXPECT_NE(x, pending_layer_->expression); \
 | 
| +    EXPECT_NE(x, active_layer_->expression);  \
 | 
| +  } while (false)
 | 
| +
 | 
|  class MockCanvas : public SkCanvas {
 | 
|   public:
 | 
|    explicit MockCanvas(int w, int h) : SkCanvas(w, h) {}
 | 
| @@ -58,15 +70,21 @@ class PictureLayerImplTest : public testing::Test {
 | 
|    PictureLayerImplTest()
 | 
|        : proxy_(base::MessageLoopProxy::current()),
 | 
|          host_impl_(LowResTilingsSettings(), &proxy_, &shared_bitmap_manager_),
 | 
| +        root_id_(6),
 | 
|          id_(7),
 | 
|          pending_layer_(nullptr),
 | 
|          old_pending_layer_(nullptr),
 | 
| -        active_layer_(nullptr) {}
 | 
| +        active_layer_(nullptr) {
 | 
| +    host_impl_.SetViewportSize(gfx::Size(10000, 10000));
 | 
| +  }
 | 
|  
 | 
|    explicit PictureLayerImplTest(const LayerTreeSettings& settings)
 | 
|        : proxy_(base::MessageLoopProxy::current()),
 | 
|          host_impl_(settings, &proxy_, &shared_bitmap_manager_),
 | 
| -        id_(7) {}
 | 
| +        root_id_(6),
 | 
| +        id_(7) {
 | 
| +    host_impl_.SetViewportSize(gfx::Size(10000, 10000));
 | 
| +  }
 | 
|  
 | 
|    virtual ~PictureLayerImplTest() {
 | 
|    }
 | 
| @@ -88,6 +106,18 @@ class PictureLayerImplTest : public testing::Test {
 | 
|      SetupTrees(pending_pile, active_pile);
 | 
|    }
 | 
|  
 | 
| +  void SetupDefaultTreesWithInvalidation(const gfx::Size& layer_bounds,
 | 
| +                                         const Region& invalidation) {
 | 
| +    gfx::Size tile_size(100, 100);
 | 
| +
 | 
| +    scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
| +        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| +    scoped_refptr<FakePicturePileImpl> active_pile =
 | 
| +        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| +
 | 
| +    SetupTreesWithInvalidation(pending_pile, active_pile, invalidation);
 | 
| +  }
 | 
| +
 | 
|    void ActivateTree() {
 | 
|      host_impl_.ActivateSyncTree();
 | 
|      CHECK(!host_impl_.pending_tree());
 | 
| @@ -96,13 +126,22 @@ class PictureLayerImplTest : public testing::Test {
 | 
|      pending_layer_ = nullptr;
 | 
|      active_layer_ = static_cast<FakePictureLayerImpl*>(
 | 
|          host_impl_.active_tree()->LayerById(id_));
 | 
| +
 | 
| +    host_impl_.active_tree()->UpdateDrawProperties();
 | 
|    }
 | 
|  
 | 
|    void SetupDefaultTreesWithFixedTileSize(const gfx::Size& layer_bounds,
 | 
| -                                          const gfx::Size& tile_size) {
 | 
| -    SetupDefaultTrees(layer_bounds);
 | 
| -    pending_layer_->set_fixed_tile_size(tile_size);
 | 
| -    active_layer_->set_fixed_tile_size(tile_size);
 | 
| +                                          const gfx::Size& tile_size,
 | 
| +                                          const Region& invalidation) {
 | 
| +    gfx::Size pile_tile_size(100, 100);
 | 
| +
 | 
| +    scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
| +        FakePicturePileImpl::CreateFilledPile(pile_tile_size, layer_bounds);
 | 
| +    scoped_refptr<FakePicturePileImpl> active_pile =
 | 
| +        FakePicturePileImpl::CreateFilledPile(pile_tile_size, layer_bounds);
 | 
| +
 | 
| +    SetupTreesWithFixedTileSize(pending_pile, active_pile, tile_size,
 | 
| +                                invalidation);
 | 
|    }
 | 
|  
 | 
|    void SetupTrees(
 | 
| @@ -110,54 +149,80 @@ class PictureLayerImplTest : public testing::Test {
 | 
|        scoped_refptr<PicturePileImpl> active_pile) {
 | 
|      SetupPendingTree(active_pile);
 | 
|      ActivateTree();
 | 
| -    SetupPendingTree(pending_pile);
 | 
| +    SetupPendingTreeInternal(pending_pile, gfx::Size(), Region());
 | 
|    }
 | 
|  
 | 
| -  void CreateHighLowResAndSetAllTilesVisible() {
 | 
| -    // Active layer must get updated first so pending layer can share from it.
 | 
| -    active_layer_->CreateDefaultTilingsAndTiles();
 | 
| -    active_layer_->SetAllTilesVisible();
 | 
| -    pending_layer_->CreateDefaultTilingsAndTiles();
 | 
| -    pending_layer_->SetAllTilesVisible();
 | 
| +  void SetupTreesWithInvalidation(scoped_refptr<PicturePileImpl> pending_pile,
 | 
| +                                  scoped_refptr<PicturePileImpl> active_pile,
 | 
| +                                  const Region& pending_invalidation) {
 | 
| +    SetupPendingTreeInternal(active_pile, gfx::Size(), Region());
 | 
| +    ActivateTree();
 | 
| +    SetupPendingTreeInternal(pending_pile, gfx::Size(), pending_invalidation);
 | 
|    }
 | 
|  
 | 
| -  void AddDefaultTilingsWithInvalidation(const Region& invalidation) {
 | 
| -    active_layer_->AddTiling(2.3f);
 | 
| -    active_layer_->AddTiling(1.0f);
 | 
| -    active_layer_->AddTiling(0.5f);
 | 
| -    for (size_t i = 0; i < active_layer_->tilings()->num_tilings(); ++i)
 | 
| -      active_layer_->tilings()->tiling_at(i)->CreateAllTilesForTesting();
 | 
| -    pending_layer_->set_invalidation(invalidation);
 | 
| -    for (size_t i = 0; i < pending_layer_->tilings()->num_tilings(); ++i)
 | 
| -      pending_layer_->tilings()->tiling_at(i)->CreateAllTilesForTesting();
 | 
| +  void SetupTreesWithFixedTileSize(scoped_refptr<PicturePileImpl> pending_pile,
 | 
| +                                   scoped_refptr<PicturePileImpl> active_pile,
 | 
| +                                   const gfx::Size& tile_size,
 | 
| +                                   const Region& pending_invalidation) {
 | 
| +    SetupPendingTreeInternal(active_pile, tile_size, Region());
 | 
| +    ActivateTree();
 | 
| +    SetupPendingTreeInternal(pending_pile, tile_size, pending_invalidation);
 | 
|    }
 | 
|  
 | 
|    void SetupPendingTree(scoped_refptr<RasterSource> raster_source) {
 | 
| +    SetupPendingTreeInternal(raster_source, gfx::Size(), Region());
 | 
| +  }
 | 
| +
 | 
| +  void SetupPendingTreeWithInvalidation(
 | 
| +      scoped_refptr<RasterSource> raster_source,
 | 
| +      const Region& invalidation) {
 | 
| +    SetupPendingTreeInternal(raster_source, gfx::Size(), invalidation);
 | 
| +  }
 | 
| +
 | 
| +  void SetupPendingTreeWithFixedTileSize(
 | 
| +      scoped_refptr<RasterSource> raster_source,
 | 
| +      const gfx::Size& tile_size,
 | 
| +      const Region& invalidation) {
 | 
| +    SetupPendingTreeInternal(raster_source, tile_size, invalidation);
 | 
| +  }
 | 
| +
 | 
| +  void SetupPendingTreeInternal(scoped_refptr<RasterSource> raster_source,
 | 
| +                                const gfx::Size& tile_size,
 | 
| +                                const Region& invalidation) {
 | 
|      host_impl_.CreatePendingTree();
 | 
|      host_impl_.pending_tree()->PushPageScaleFromMainThread(1.f, 0.25f, 100.f);
 | 
|      LayerTreeImpl* pending_tree = host_impl_.pending_tree();
 | 
|  
 | 
| -    // Steal from the recycled tree.
 | 
| -    scoped_ptr<LayerImpl> old_pending_root = pending_tree->DetachLayerTree();
 | 
| -    DCHECK_IMPLIES(old_pending_root, old_pending_root->id() == id_);
 | 
| -
 | 
| +    // Steal from the recycled tree if possible.
 | 
| +    scoped_ptr<LayerImpl> pending_root = pending_tree->DetachLayerTree();
 | 
|      scoped_ptr<FakePictureLayerImpl> pending_layer;
 | 
| -    if (old_pending_root) {
 | 
| -      pending_layer.reset(
 | 
| -          static_cast<FakePictureLayerImpl*>(old_pending_root.release()));
 | 
| -      pending_layer->SetRasterSource(raster_source);
 | 
| -    } else {
 | 
| -      pending_layer = FakePictureLayerImpl::CreateWithRasterSource(
 | 
| -          pending_tree, id_, raster_source);
 | 
| +    DCHECK_IMPLIES(pending_root, pending_root->id() == root_id_);
 | 
| +    if (!pending_root) {
 | 
| +      pending_root = LayerImpl::Create(pending_tree, root_id_);
 | 
| +      pending_layer = FakePictureLayerImpl::Create(pending_tree, id_);
 | 
| +      if (!tile_size.IsEmpty())
 | 
| +        pending_layer->set_fixed_tile_size(tile_size);
 | 
|        pending_layer->SetDrawsContent(true);
 | 
| +    } else {
 | 
| +      pending_layer.reset(static_cast<FakePictureLayerImpl*>(
 | 
| +          pending_root->RemoveChild(pending_root->children()[0]).release()));
 | 
| +      if (!tile_size.IsEmpty())
 | 
| +        pending_layer->set_fixed_tile_size(tile_size);
 | 
|      }
 | 
|      // The bounds() just mirror the pile size.
 | 
| -    pending_layer->SetBounds(pending_layer->raster_source()->GetSize());
 | 
| -    pending_tree->SetRootLayer(pending_layer.Pass());
 | 
| +    pending_layer->SetBounds(raster_source->GetSize());
 | 
| +    pending_layer->SetContentBounds(raster_source->GetSize());
 | 
| +    pending_layer->SetRasterSourceOnPending(raster_source, invalidation);
 | 
| +
 | 
| +    pending_root->AddChild(pending_layer.Pass());
 | 
| +    pending_tree->SetRootLayer(pending_root.Pass());
 | 
|  
 | 
|      pending_layer_ = static_cast<FakePictureLayerImpl*>(
 | 
|          host_impl_.pending_tree()->LayerById(id_));
 | 
|      pending_layer_->DoPostCommitInitializationIfNeeded();
 | 
| +
 | 
| +    // Add tilings/tiles for the layer.
 | 
| +    host_impl_.pending_tree()->UpdateDrawProperties();
 | 
|    }
 | 
|  
 | 
|    void SetupDrawPropertiesAndUpdateTiles(FakePictureLayerImpl* layer,
 | 
| @@ -213,6 +278,10 @@ class PictureLayerImplTest : public testing::Test {
 | 
|    void ResetTilingsAndRasterScales() {
 | 
|      pending_layer_->ReleaseResources();
 | 
|      active_layer_->ReleaseResources();
 | 
| +    if (pending_layer_)
 | 
| +      EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
 | 
| +    if (active_layer_)
 | 
| +      EXPECT_EQ(0u, active_layer_->tilings()->num_tilings());
 | 
|    }
 | 
|  
 | 
|    void AssertAllTilesRequired(PictureLayerTiling* tiling) {
 | 
| @@ -230,60 +299,12 @@ class PictureLayerImplTest : public testing::Test {
 | 
|    }
 | 
|  
 | 
|   protected:
 | 
| -  void TestTileGridAlignmentCommon() {
 | 
| -    // Layer to span 4 raster tiles in x and in y
 | 
| -    ImplSidePaintingSettings settings;
 | 
| -    gfx::Size layer_size(
 | 
| -        settings.default_tile_size.width() * 7 / 2,
 | 
| -        settings.default_tile_size.height() * 7 / 2);
 | 
| -
 | 
| -    scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
| -        FakePicturePileImpl::CreateFilledPile(layer_size, layer_size);
 | 
| -    scoped_refptr<FakePicturePileImpl> active_pile =
 | 
| -        FakePicturePileImpl::CreateFilledPile(layer_size, layer_size);
 | 
| -
 | 
| -    SetupTrees(pending_pile, active_pile);
 | 
| -
 | 
| -    SetupDrawPropertiesAndUpdateTiles(active_layer_, 1.f, 1.f, 1.f, 1.f, false);
 | 
| -
 | 
| -    // Add 1x1 rects at the centers of each tile, then re-record pile contents
 | 
| -    active_layer_->tilings()->tiling_at(0)->CreateAllTilesForTesting();
 | 
| -    std::vector<Tile*> tiles =
 | 
| -        active_layer_->tilings()->tiling_at(0)->AllTilesForTesting();
 | 
| -    EXPECT_EQ(16u, tiles.size());
 | 
| -    std::vector<SkRect> rects;
 | 
| -    std::vector<Tile*>::const_iterator tile_iter;
 | 
| -    for (tile_iter = tiles.begin(); tile_iter < tiles.end(); tile_iter++) {
 | 
| -      gfx::Point tile_center = (*tile_iter)->content_rect().CenterPoint();
 | 
| -      gfx::Rect rect(tile_center.x(), tile_center.y(), 1, 1);
 | 
| -      active_pile->add_draw_rect(rect);
 | 
| -      rects.push_back(SkRect::MakeXYWH(rect.x(), rect.y(), 1, 1));
 | 
| -    }
 | 
| -    // Force re-record with newly injected content
 | 
| -    active_pile->RemoveRecordingAt(0, 0);
 | 
| -    active_pile->AddRecordingAt(0, 0);
 | 
| -
 | 
| -    std::vector<SkRect>::const_iterator rect_iter = rects.begin();
 | 
| -    for (tile_iter = tiles.begin(); tile_iter < tiles.end(); tile_iter++) {
 | 
| -      MockCanvas mock_canvas(1000, 1000);
 | 
| -      active_pile->PlaybackToSharedCanvas(&mock_canvas,
 | 
| -                                          (*tile_iter)->content_rect(), 1.0f);
 | 
| -
 | 
| -      // This test verifies that when drawing the contents of a specific tile
 | 
| -      // at content scale 1.0, the playback canvas never receives content from
 | 
| -      // neighboring tiles which indicates that the tile grid embedded in
 | 
| -      // SkPicture is perfectly aligned with the compositor's tiles.
 | 
| -      EXPECT_EQ(1u, mock_canvas.rects_.size());
 | 
| -      EXPECT_EQ(*rect_iter, mock_canvas.rects_[0]);
 | 
| -      rect_iter++;
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
|    void TestQuadsForSolidColor(bool test_for_solid);
 | 
|  
 | 
|    FakeImplProxy proxy_;
 | 
|    TestSharedBitmapManager shared_bitmap_manager_;
 | 
|    FakeLayerTreeHostImpl host_impl_;
 | 
| +  int root_id_;
 | 
|    int id_;
 | 
|    FakePictureLayerImpl* pending_layer_;
 | 
|    FakePictureLayerImpl* old_pending_layer_;
 | 
| @@ -293,14 +314,56 @@ class PictureLayerImplTest : public testing::Test {
 | 
|    DISALLOW_COPY_AND_ASSIGN(PictureLayerImplTest);
 | 
|  };
 | 
|  
 | 
| +class NoLowResPictureLayerImplTest : public PictureLayerImplTest {
 | 
| + public:
 | 
| +  NoLowResPictureLayerImplTest()
 | 
| +      : PictureLayerImplTest(NoLowResTilingsSettings()) {}
 | 
| +};
 | 
| +
 | 
|  TEST_F(PictureLayerImplTest, TileGridAlignment) {
 | 
| -  host_impl_.SetDeviceScaleFactor(1.f);
 | 
| -  TestTileGridAlignmentCommon();
 | 
| -}
 | 
| +  // Layer to span 4 raster tiles in x and in y
 | 
| +  ImplSidePaintingSettings settings;
 | 
| +  gfx::Size layer_size(settings.default_tile_size.width() * 7 / 2,
 | 
| +                       settings.default_tile_size.height() * 7 / 2);
 | 
|  
 | 
| -TEST_F(PictureLayerImplTest, TileGridAlignmentHiDPI) {
 | 
| -  host_impl_.SetDeviceScaleFactor(2.f);
 | 
| -  TestTileGridAlignmentCommon();
 | 
| +  scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
| +      FakePicturePileImpl::CreateFilledPile(layer_size, layer_size);
 | 
| +  scoped_refptr<FakePicturePileImpl> active_pile =
 | 
| +      FakePicturePileImpl::CreateFilledPile(layer_size, layer_size);
 | 
| +
 | 
| +  SetupTrees(pending_pile, active_pile);
 | 
| +
 | 
| +  // Add 1x1 rects at the centers of each tile, then re-record pile contents
 | 
| +  active_layer_->tilings()->tiling_at(0)->CreateAllTilesForTesting();
 | 
| +  std::vector<Tile*> tiles =
 | 
| +      active_layer_->tilings()->tiling_at(0)->AllTilesForTesting();
 | 
| +  EXPECT_EQ(16u, tiles.size());
 | 
| +  std::vector<SkRect> rects;
 | 
| +  std::vector<Tile*>::const_iterator tile_iter;
 | 
| +  for (tile_iter = tiles.begin(); tile_iter < tiles.end(); tile_iter++) {
 | 
| +    gfx::Point tile_center = (*tile_iter)->content_rect().CenterPoint();
 | 
| +    gfx::Rect rect(tile_center.x(), tile_center.y(), 1, 1);
 | 
| +    active_pile->add_draw_rect(rect);
 | 
| +    rects.push_back(SkRect::MakeXYWH(rect.x(), rect.y(), 1, 1));
 | 
| +  }
 | 
| +  // Force re-raster with newly injected content
 | 
| +  active_pile->RemoveRecordingAt(0, 0);
 | 
| +  active_pile->AddRecordingAt(0, 0);
 | 
| +
 | 
| +  std::vector<SkRect>::const_iterator rect_iter = rects.begin();
 | 
| +  for (tile_iter = tiles.begin(); tile_iter < tiles.end(); tile_iter++) {
 | 
| +    MockCanvas mock_canvas(1000, 1000);
 | 
| +    active_pile->PlaybackToSharedCanvas(&mock_canvas,
 | 
| +                                        (*tile_iter)->content_rect(), 1.0f);
 | 
| +
 | 
| +    // This test verifies that when drawing the contents of a specific tile
 | 
| +    // at content scale 1.0, the playback canvas never receives content from
 | 
| +    // neighboring tiles which indicates that the tile grid embedded in
 | 
| +    // SkPicture is perfectly aligned with the compositor's tiles.
 | 
| +    EXPECT_EQ(1u, mock_canvas.rects_.size());
 | 
| +    EXPECT_EQ(*rect_iter, mock_canvas.rects_[0]);
 | 
| +    rect_iter++;
 | 
| +  }
 | 
|  }
 | 
|  
 | 
|  TEST_F(PictureLayerImplTest, CloneNoInvalidation) {
 | 
| @@ -312,10 +375,7 @@ TEST_F(PictureLayerImplTest, CloneNoInvalidation) {
 | 
|    scoped_refptr<FakePicturePileImpl> active_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|  
 | 
| -  SetupTrees(pending_pile, active_pile);
 | 
| -
 | 
| -  Region invalidation;
 | 
| -  AddDefaultTilingsWithInvalidation(invalidation);
 | 
| +  SetupTreesWithInvalidation(pending_pile, active_pile, Region());
 | 
|  
 | 
|    EXPECT_EQ(pending_layer_->tilings()->num_tilings(),
 | 
|              active_layer_->tilings()->num_tilings());
 | 
| @@ -323,7 +383,7 @@ TEST_F(PictureLayerImplTest, CloneNoInvalidation) {
 | 
|    const PictureLayerTilingSet* tilings = pending_layer_->tilings();
 | 
|    EXPECT_GT(tilings->num_tilings(), 0u);
 | 
|    for (size_t i = 0; i < tilings->num_tilings(); ++i)
 | 
| -    VerifyAllTilesExistAndHavePile(tilings->tiling_at(i), active_pile.get());
 | 
| +    VerifyAllTilesExistAndHavePile(tilings->tiling_at(i), pending_pile.get());
 | 
|  }
 | 
|  
 | 
|  TEST_F(PictureLayerImplTest, ExternalViewportRectForPrioritizingTiles) {
 | 
| @@ -339,10 +399,8 @@ TEST_F(PictureLayerImplTest, ExternalViewportRectForPrioritizingTiles) {
 | 
|    scoped_refptr<FakePicturePileImpl> active_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|  
 | 
| -  SetupTrees(pending_pile, active_pile);
 | 
| +  SetupTreesWithInvalidation(pending_pile, active_pile, Region());
 | 
|  
 | 
| -  Region invalidation;
 | 
| -  AddDefaultTilingsWithInvalidation(invalidation);
 | 
|    SetupDrawPropertiesAndUpdateTiles(active_layer_, 1.f, 1.f, 1.f, 1.f, false);
 | 
|  
 | 
|    time_ticks += base::TimeDelta::FromMilliseconds(200);
 | 
| @@ -436,10 +494,8 @@ TEST_F(PictureLayerImplTest, InvalidViewportForPrioritizingTiles) {
 | 
|    scoped_refptr<FakePicturePileImpl> active_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|  
 | 
| -  SetupTrees(pending_pile, active_pile);
 | 
| +  SetupTreesWithInvalidation(pending_pile, active_pile, Region());
 | 
|  
 | 
| -  Region invalidation;
 | 
| -  AddDefaultTilingsWithInvalidation(invalidation);
 | 
|    SetupDrawPropertiesAndUpdateTiles(active_layer_, 1.f, 1.f, 1.f, 1.f, false);
 | 
|  
 | 
|    // UpdateTiles with valid viewport. Should update tile viewport.
 | 
| @@ -516,11 +572,20 @@ TEST_F(PictureLayerImplTest, ClonePartialInvalidation) {
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|    scoped_refptr<FakePicturePileImpl> active_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| +  scoped_refptr<FakePicturePileImpl> lost_pile =
 | 
| +      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|  
 | 
| -  SetupTrees(pending_pile, active_pile);
 | 
| +  SetupPendingTreeWithFixedTileSize(lost_pile, gfx::Size(50, 50), Region());
 | 
| +  ActivateTree();
 | 
| +  // Add a non-shared tiling on the active tree.
 | 
| +  PictureLayerTiling* tiling = active_layer_->AddTiling(3.f);
 | 
| +  tiling->CreateAllTilesForTesting();
 | 
| +  // Then setup a new pending tree and activate it.
 | 
| +  SetupTreesWithFixedTileSize(pending_pile, active_pile, gfx::Size(50, 50),
 | 
| +                              layer_invalidation);
 | 
|  
 | 
| -  Region invalidation(layer_invalidation);
 | 
| -  AddDefaultTilingsWithInvalidation(invalidation);
 | 
| +  EXPECT_EQ(2u, pending_layer_->num_tilings());
 | 
| +  EXPECT_EQ(3u, active_layer_->num_tilings());
 | 
|  
 | 
|    const PictureLayerTilingSet* tilings = pending_layer_->tilings();
 | 
|    EXPECT_GT(tilings->num_tilings(), 0u);
 | 
| @@ -537,61 +602,16 @@ TEST_F(PictureLayerImplTest, ClonePartialInvalidation) {
 | 
|           ++iter) {
 | 
|        EXPECT_TRUE(*iter);
 | 
|        EXPECT_FALSE(iter.geometry_rect().IsEmpty());
 | 
| -      if (iter.geometry_rect().Intersects(content_invalidation))
 | 
| -        EXPECT_EQ(pending_pile.get(), iter->raster_source());
 | 
| -      else
 | 
| -        EXPECT_EQ(active_pile.get(), iter->raster_source());
 | 
| +      EXPECT_EQ(pending_pile.get(), iter->raster_source());
 | 
|      }
 | 
|    }
 | 
| -}
 | 
| -
 | 
| -TEST_F(PictureLayerImplTest, CloneFullInvalidation) {
 | 
| -  gfx::Size tile_size(90, 80);
 | 
| -  gfx::Size layer_bounds(300, 500);
 | 
| -
 | 
| -  scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
| -      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| -  scoped_refptr<FakePicturePileImpl> active_pile =
 | 
| -      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| -
 | 
| -  SetupTrees(pending_pile, active_pile);
 | 
| -
 | 
| -  Region invalidation((gfx::Rect(layer_bounds)));
 | 
| -  AddDefaultTilingsWithInvalidation(invalidation);
 | 
| -
 | 
| -  EXPECT_EQ(pending_layer_->tilings()->num_tilings(),
 | 
| -            active_layer_->tilings()->num_tilings());
 | 
| -
 | 
| -  const PictureLayerTilingSet* tilings = pending_layer_->tilings();
 | 
| -  EXPECT_GT(tilings->num_tilings(), 0u);
 | 
| -  for (size_t i = 0; i < tilings->num_tilings(); ++i)
 | 
| -    VerifyAllTilesExistAndHavePile(tilings->tiling_at(i), pending_pile.get());
 | 
| -}
 | 
| -
 | 
| -TEST_F(PictureLayerImplTest, NoInvalidationBoundsChange) {
 | 
| -  gfx::Size tile_size(90, 80);
 | 
| -  gfx::Size active_layer_bounds(300, 500);
 | 
| -  gfx::Size pending_layer_bounds(400, 800);
 | 
| -
 | 
| -  scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
| -      FakePicturePileImpl::CreateFilledPile(tile_size,
 | 
| -                                                pending_layer_bounds);
 | 
| -  scoped_refptr<FakePicturePileImpl> active_pile =
 | 
| -      FakePicturePileImpl::CreateFilledPile(tile_size, active_layer_bounds);
 | 
| -
 | 
| -  SetupTrees(pending_pile, active_pile);
 | 
| -  pending_layer_->set_fixed_tile_size(gfx::Size(100, 100));
 | 
| -
 | 
| -  Region invalidation;
 | 
| -  AddDefaultTilingsWithInvalidation(invalidation);
 | 
|  
 | 
| -  const PictureLayerTilingSet* tilings = pending_layer_->tilings();
 | 
| +  tilings = active_layer_->tilings();
 | 
|    EXPECT_GT(tilings->num_tilings(), 0u);
 | 
|    for (size_t i = 0; i < tilings->num_tilings(); ++i) {
 | 
|      const PictureLayerTiling* tiling = tilings->tiling_at(i);
 | 
| -    gfx::Rect active_content_bounds = gfx::ScaleToEnclosingRect(
 | 
| -        gfx::Rect(active_layer_bounds),
 | 
| -        tiling->contents_scale());
 | 
| +    gfx::Rect content_invalidation =
 | 
| +        gfx::ScaleToEnclosingRect(layer_invalidation, tiling->contents_scale());
 | 
|      for (PictureLayerTiling::CoverageIterator iter(
 | 
|               tiling,
 | 
|               tiling->contents_scale(),
 | 
| @@ -600,94 +620,108 @@ TEST_F(PictureLayerImplTest, NoInvalidationBoundsChange) {
 | 
|           ++iter) {
 | 
|        EXPECT_TRUE(*iter);
 | 
|        EXPECT_FALSE(iter.geometry_rect().IsEmpty());
 | 
| -      std::vector<Tile*> active_tiles =
 | 
| -          active_layer_->tilings()->tiling_at(i)->AllTilesForTesting();
 | 
| -      std::vector<Tile*> pending_tiles = tiling->AllTilesForTesting();
 | 
| -      if (iter.geometry_rect().right() >= active_content_bounds.width() ||
 | 
| -          iter.geometry_rect().bottom() >= active_content_bounds.height() ||
 | 
| -          active_tiles[0]->content_rect().size() !=
 | 
| -              pending_tiles[0]->content_rect().size()) {
 | 
| -        EXPECT_EQ(pending_pile.get(), iter->raster_source());
 | 
| -      } else {
 | 
| +      if (iter.geometry_rect().Intersects(content_invalidation))
 | 
|          EXPECT_EQ(active_pile.get(), iter->raster_source());
 | 
| -      }
 | 
| +      else if (!active_layer_->GetPendingOrActiveTwinTiling(tiling))
 | 
| +        EXPECT_EQ(active_pile.get(), iter->raster_source());
 | 
| +      else
 | 
| +        EXPECT_EQ(pending_pile.get(), iter->raster_source());
 | 
|      }
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -TEST_F(PictureLayerImplTest, AddTilesFromNewRecording) {
 | 
| -  gfx::Size tile_size(400, 400);
 | 
| -  gfx::Size layer_bounds(1300, 1900);
 | 
| +TEST_F(PictureLayerImplTest, CloneFullInvalidation) {
 | 
| +  gfx::Size tile_size(90, 80);
 | 
| +  gfx::Size layer_bounds(300, 500);
 | 
|  
 | 
|    scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
| -      FakePicturePileImpl::CreateEmptyPile(tile_size, layer_bounds);
 | 
| +      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|    scoped_refptr<FakePicturePileImpl> active_pile =
 | 
| -      FakePicturePileImpl::CreateEmptyPile(tile_size, layer_bounds);
 | 
| +      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|  
 | 
| -  // Fill in some of active pile, but more of pending pile.
 | 
| -  int hole_count = 0;
 | 
| -  for (int x = 0; x < active_pile->tiling().num_tiles_x(); ++x) {
 | 
| -    for (int y = 0; y < active_pile->tiling().num_tiles_y(); ++y) {
 | 
| -      if ((x + y) % 2) {
 | 
| -        pending_pile->AddRecordingAt(x, y);
 | 
| -        active_pile->AddRecordingAt(x, y);
 | 
| -      } else {
 | 
| -        hole_count++;
 | 
| -        if (hole_count % 2)
 | 
| -          pending_pile->AddRecordingAt(x, y);
 | 
| -      }
 | 
| -    }
 | 
| -  }
 | 
| +  SetupTreesWithInvalidation(pending_pile, active_pile,
 | 
| +                             gfx::Rect(layer_bounds));
 | 
|  
 | 
| -  SetupTrees(pending_pile, active_pile);
 | 
| -  Region invalidation;
 | 
| -  AddDefaultTilingsWithInvalidation(invalidation);
 | 
| +  EXPECT_EQ(pending_layer_->tilings()->num_tilings(),
 | 
| +            active_layer_->tilings()->num_tilings());
 | 
|  
 | 
|    const PictureLayerTilingSet* tilings = pending_layer_->tilings();
 | 
|    EXPECT_GT(tilings->num_tilings(), 0u);
 | 
| -  for (size_t i = 0; i < tilings->num_tilings(); ++i) {
 | 
| -    const PictureLayerTiling* tiling = tilings->tiling_at(i);
 | 
| -
 | 
| -    for (PictureLayerTiling::CoverageIterator iter(
 | 
| -             tiling,
 | 
| -             tiling->contents_scale(),
 | 
| -             gfx::Rect(tiling->tiling_size()));
 | 
| -         iter;
 | 
| -         ++iter) {
 | 
| -      EXPECT_FALSE(iter.full_tile_geometry_rect().IsEmpty());
 | 
| -      // Ensure there is a recording for this tile.
 | 
| -      bool in_pending = pending_pile->CoversRect(iter.full_tile_geometry_rect(),
 | 
| -                                                 tiling->contents_scale());
 | 
| -      bool in_active = active_pile->CoversRect(iter.full_tile_geometry_rect(),
 | 
| -                                               tiling->contents_scale());
 | 
| -
 | 
| -      if (in_pending && !in_active)
 | 
| -        EXPECT_EQ(pending_pile.get(), iter->raster_source());
 | 
| -      else if (in_active)
 | 
| -        EXPECT_EQ(active_pile.get(), iter->raster_source());
 | 
| -      else
 | 
| -        EXPECT_FALSE(*iter);
 | 
| -    }
 | 
| -  }
 | 
| +  for (size_t i = 0; i < tilings->num_tilings(); ++i)
 | 
| +    VerifyAllTilesExistAndHavePile(tilings->tiling_at(i), pending_pile.get());
 | 
|  }
 | 
|  
 | 
| -TEST_F(PictureLayerImplTest, ManageTilingsWithNoRecording) {
 | 
| +TEST_F(PictureLayerImplTest, ManageTilingsCreatesTilings) {
 | 
|    gfx::Size tile_size(400, 400);
 | 
|    gfx::Size layer_bounds(1300, 1900);
 | 
|  
 | 
|    scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
| -      FakePicturePileImpl::CreateEmptyPile(tile_size, layer_bounds);
 | 
| +      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|    scoped_refptr<FakePicturePileImpl> active_pile =
 | 
| -      FakePicturePileImpl::CreateEmptyPile(tile_size, layer_bounds);
 | 
| +      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|  
 | 
|    SetupTrees(pending_pile, active_pile);
 | 
|  
 | 
| -  SetupDrawPropertiesAndUpdateTiles(pending_layer_, 1.f, 1.f, 1.f, 1.f, false);
 | 
| +  float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
 | 
| +  EXPECT_LT(low_res_factor, 1.f);
 | 
|  
 | 
| -  EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
 | 
| +  active_layer_->ReleaseResources();
 | 
| +  EXPECT_EQ(0u, active_layer_->tilings()->num_tilings());
 | 
| +
 | 
| +  SetupDrawPropertiesAndUpdateTiles(active_layer_,
 | 
| +                                    6.f,  // ideal contents scale
 | 
| +                                    3.f,  // device scale
 | 
| +                                    2.f,  // page scale
 | 
| +                                    1.f,  // maximum animation scale
 | 
| +                                    false);
 | 
| +  ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
 | 
| +  EXPECT_FLOAT_EQ(6.f,
 | 
| +                  active_layer_->tilings()->tiling_at(0)->contents_scale());
 | 
| +  EXPECT_FLOAT_EQ(6.f * low_res_factor,
 | 
| +                  active_layer_->tilings()->tiling_at(1)->contents_scale());
 | 
| +
 | 
| +  // If we change the page scale factor, then we should get new tilings.
 | 
| +  SetupDrawPropertiesAndUpdateTiles(active_layer_,
 | 
| +                                    6.6f,  // ideal contents scale
 | 
| +                                    3.f,   // device scale
 | 
| +                                    2.2f,  // page scale
 | 
| +                                    1.f,   // maximum animation scale
 | 
| +                                    false);
 | 
| +  ASSERT_EQ(4u, active_layer_->tilings()->num_tilings());
 | 
| +  EXPECT_FLOAT_EQ(6.6f,
 | 
| +                  active_layer_->tilings()->tiling_at(0)->contents_scale());
 | 
| +  EXPECT_FLOAT_EQ(6.6f * low_res_factor,
 | 
| +                  active_layer_->tilings()->tiling_at(2)->contents_scale());
 | 
| +
 | 
| +  // If we change the device scale factor, then we should get new tilings.
 | 
| +  SetupDrawPropertiesAndUpdateTiles(active_layer_,
 | 
| +                                    7.26f,  // ideal contents scale
 | 
| +                                    3.3f,   // device scale
 | 
| +                                    2.2f,   // page scale
 | 
| +                                    1.f,    // maximum animation scale
 | 
| +                                    false);
 | 
| +  ASSERT_EQ(6u, active_layer_->tilings()->num_tilings());
 | 
| +  EXPECT_FLOAT_EQ(7.26f,
 | 
| +                  active_layer_->tilings()->tiling_at(0)->contents_scale());
 | 
| +  EXPECT_FLOAT_EQ(7.26f * low_res_factor,
 | 
| +                  active_layer_->tilings()->tiling_at(3)->contents_scale());
 | 
| +
 | 
| +  // If we change the device scale factor, but end up at the same total scale
 | 
| +  // factor somehow, then we don't get new tilings.
 | 
| +  SetupDrawPropertiesAndUpdateTiles(active_layer_,
 | 
| +                                    7.26f,  // ideal contents scale
 | 
| +                                    2.2f,   // device scale
 | 
| +                                    3.3f,   // page scale
 | 
| +                                    1.f,    // maximum animation scale
 | 
| +                                    false);
 | 
| +  ASSERT_EQ(6u, active_layer_->tilings()->num_tilings());
 | 
| +  EXPECT_FLOAT_EQ(7.26f,
 | 
| +                  active_layer_->tilings()->tiling_at(0)->contents_scale());
 | 
| +  EXPECT_FLOAT_EQ(7.26f * low_res_factor,
 | 
| +                  active_layer_->tilings()->tiling_at(3)->contents_scale());
 | 
|  }
 | 
|  
 | 
| -TEST_F(PictureLayerImplTest, ManageTilingsCreatesTilings) {
 | 
| +TEST_F(PictureLayerImplTest, PendingLayerOnlyHasHighAndLowResTiling) {
 | 
|    gfx::Size tile_size(400, 400);
 | 
|    gfx::Size layer_bounds(1300, 1900);
 | 
|  
 | 
| @@ -697,11 +731,13 @@ TEST_F(PictureLayerImplTest, ManageTilingsCreatesTilings) {
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|  
 | 
|    SetupTrees(pending_pile, active_pile);
 | 
| -  EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
 | 
|  
 | 
|    float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
 | 
|    EXPECT_LT(low_res_factor, 1.f);
 | 
|  
 | 
| +  pending_layer_->ReleaseResources();
 | 
| +  EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
 | 
| +
 | 
|    SetupDrawPropertiesAndUpdateTiles(pending_layer_,
 | 
|                                      6.f,  // ideal contents scale
 | 
|                                      3.f,  // device scale
 | 
| @@ -721,11 +757,11 @@ TEST_F(PictureLayerImplTest, ManageTilingsCreatesTilings) {
 | 
|                                      2.2f,  // page scale
 | 
|                                      1.f,   // maximum animation scale
 | 
|                                      false);
 | 
| -  ASSERT_EQ(4u, pending_layer_->tilings()->num_tilings());
 | 
| +  ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings());
 | 
|    EXPECT_FLOAT_EQ(6.6f,
 | 
|                    pending_layer_->tilings()->tiling_at(0)->contents_scale());
 | 
|    EXPECT_FLOAT_EQ(6.6f * low_res_factor,
 | 
| -                  pending_layer_->tilings()->tiling_at(2)->contents_scale());
 | 
| +                  pending_layer_->tilings()->tiling_at(1)->contents_scale());
 | 
|  
 | 
|    // If we change the device scale factor, then we should get new tilings.
 | 
|    SetupDrawPropertiesAndUpdateTiles(pending_layer_,
 | 
| @@ -734,11 +770,11 @@ TEST_F(PictureLayerImplTest, ManageTilingsCreatesTilings) {
 | 
|                                      2.2f,   // page scale
 | 
|                                      1.f,    // maximum animation scale
 | 
|                                      false);
 | 
| -  ASSERT_EQ(6u, pending_layer_->tilings()->num_tilings());
 | 
| +  ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings());
 | 
|    EXPECT_FLOAT_EQ(7.26f,
 | 
|                    pending_layer_->tilings()->tiling_at(0)->contents_scale());
 | 
|    EXPECT_FLOAT_EQ(7.26f * low_res_factor,
 | 
| -                  pending_layer_->tilings()->tiling_at(3)->contents_scale());
 | 
| +                  pending_layer_->tilings()->tiling_at(1)->contents_scale());
 | 
|  
 | 
|    // If we change the device scale factor, but end up at the same total scale
 | 
|    // factor somehow, then we don't get new tilings.
 | 
| @@ -748,11 +784,11 @@ TEST_F(PictureLayerImplTest, ManageTilingsCreatesTilings) {
 | 
|                                      3.3f,   // page scale
 | 
|                                      1.f,    // maximum animation scale
 | 
|                                      false);
 | 
| -  ASSERT_EQ(6u, pending_layer_->tilings()->num_tilings());
 | 
| +  ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings());
 | 
|    EXPECT_FLOAT_EQ(7.26f,
 | 
|                    pending_layer_->tilings()->tiling_at(0)->contents_scale());
 | 
|    EXPECT_FLOAT_EQ(7.26f * low_res_factor,
 | 
| -                  pending_layer_->tilings()->tiling_at(3)->contents_scale());
 | 
| +                  pending_layer_->tilings()->tiling_at(1)->contents_scale());
 | 
|  }
 | 
|  
 | 
|  TEST_F(PictureLayerImplTest, CreateTilingsEvenIfTwinHasNone) {
 | 
| @@ -767,63 +803,22 @@ TEST_F(PictureLayerImplTest, CreateTilingsEvenIfTwinHasNone) {
 | 
|    scoped_refptr<FakePicturePileImpl> valid_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|  
 | 
| -  float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
 | 
| -  EXPECT_LT(low_res_factor, 1.f);
 | 
| -
 | 
| -  float high_res_scale = 1.3f;
 | 
| -  float low_res_scale = high_res_scale * low_res_factor;
 | 
| -  float device_scale = 1.7f;
 | 
| -  float page_scale = 3.2f;
 | 
| -  float maximum_animation_scale = 1.f;
 | 
| -
 | 
|    SetupPendingTree(valid_pile);
 | 
| -  SetupDrawPropertiesAndUpdateTiles(pending_layer_,
 | 
| -                                    high_res_scale,
 | 
| -                                    device_scale,
 | 
| -                                    page_scale,
 | 
| -                                    maximum_animation_scale,
 | 
| -                                    false);
 | 
|    ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings());
 | 
| -  EXPECT_FLOAT_EQ(high_res_scale,
 | 
| -                  pending_layer_->HighResTiling()->contents_scale());
 | 
| -  EXPECT_FLOAT_EQ(low_res_scale,
 | 
| -                  pending_layer_->LowResTiling()->contents_scale());
 | 
|  
 | 
|    ActivateTree();
 | 
|    SetupPendingTree(empty_pile);
 | 
|    EXPECT_FALSE(pending_layer_->CanHaveTilings());
 | 
| -  SetupDrawPropertiesAndUpdateTiles(pending_layer_,
 | 
| -                                    high_res_scale,
 | 
| -                                    device_scale,
 | 
| -                                    page_scale,
 | 
| -                                    maximum_animation_scale,
 | 
| -                                    false);
 | 
|    ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
 | 
|    ASSERT_EQ(0u, pending_layer_->tilings()->num_tilings());
 | 
|  
 | 
|    ActivateTree();
 | 
|    EXPECT_FALSE(active_layer_->CanHaveTilings());
 | 
| -  SetupDrawPropertiesAndUpdateTiles(active_layer_,
 | 
| -                                    high_res_scale,
 | 
| -                                    device_scale,
 | 
| -                                    page_scale,
 | 
| -                                    maximum_animation_scale,
 | 
| -                                    false);
 | 
|    ASSERT_EQ(0u, active_layer_->tilings()->num_tilings());
 | 
|  
 | 
|    SetupPendingTree(valid_pile);
 | 
| -  SetupDrawPropertiesAndUpdateTiles(pending_layer_,
 | 
| -                                    high_res_scale,
 | 
| -                                    device_scale,
 | 
| -                                    page_scale,
 | 
| -                                    maximum_animation_scale,
 | 
| -                                    false);
 | 
|    ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings());
 | 
|    ASSERT_EQ(0u, active_layer_->tilings()->num_tilings());
 | 
| -  EXPECT_FLOAT_EQ(high_res_scale,
 | 
| -                  pending_layer_->HighResTiling()->contents_scale());
 | 
| -  EXPECT_FLOAT_EQ(low_res_scale,
 | 
| -                  pending_layer_->LowResTiling()->contents_scale());
 | 
|  }
 | 
|  
 | 
|  TEST_F(PictureLayerImplTest, ZoomOutCrash) {
 | 
| @@ -837,8 +832,10 @@ TEST_F(PictureLayerImplTest, ZoomOutCrash) {
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|  
 | 
|    SetupTrees(pending_pile, active_pile);
 | 
| +  ResetTilingsAndRasterScales();
 | 
|    EXPECT_EQ(0u, active_layer_->tilings()->num_tilings());
 | 
|    SetContentsScaleOnBothLayers(32.0f, 1.0f, 32.0f, 1.0f, false);
 | 
| +  EXPECT_EQ(32.f, active_layer_->HighResTiling()->contents_scale());
 | 
|    host_impl_.PinchGestureBegin();
 | 
|    SetContentsScaleOnBothLayers(1.0f, 1.0f, 1.0f, 1.0f, false);
 | 
|    SetContentsScaleOnBothLayers(1.0f, 1.0f, 1.0f, 1.0f, false);
 | 
| @@ -849,6 +846,8 @@ TEST_F(PictureLayerImplTest, PinchGestureTilings) {
 | 
|    gfx::Size tile_size(400, 400);
 | 
|    gfx::Size layer_bounds(1300, 1900);
 | 
|  
 | 
| +  float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
 | 
| +
 | 
|    scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|    scoped_refptr<FakePicturePileImpl> active_pile =
 | 
| @@ -856,21 +855,20 @@ TEST_F(PictureLayerImplTest, PinchGestureTilings) {
 | 
|  
 | 
|    // Set up the high and low res tilings before pinch zoom.
 | 
|    SetupTrees(pending_pile, active_pile);
 | 
| -  EXPECT_EQ(0u, active_layer_->tilings()->num_tilings());
 | 
| -  SetContentsScaleOnBothLayers(2.0f, 1.0f, 1.0f, 1.0f, false);
 | 
| -  float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
 | 
| -  EXPECT_EQ(2u, active_layer_->tilings()->num_tilings());
 | 
| -  EXPECT_FLOAT_EQ(2.0f,
 | 
| -                  active_layer_->tilings()->tiling_at(0)->contents_scale());
 | 
| -  EXPECT_FLOAT_EQ(2.0f * low_res_factor,
 | 
| -                  active_layer_->tilings()->tiling_at(1)->contents_scale());
 | 
| +  ResetTilingsAndRasterScales();
 | 
| +
 | 
| +  SetContentsScaleOnBothLayers(2.f, 1.0f, 2.f, 1.0f, false);
 | 
| +  EXPECT_BOTH_EQ(num_tilings(), 2u);
 | 
| +  EXPECT_BOTH_EQ(tilings()->tiling_at(0)->contents_scale(), 2.f);
 | 
| +  EXPECT_BOTH_EQ(tilings()->tiling_at(1)->contents_scale(),
 | 
| +                 2.f * low_res_factor);
 | 
|  
 | 
|    // Start a pinch gesture.
 | 
|    host_impl_.PinchGestureBegin();
 | 
|  
 | 
|    // Zoom out by a small amount. We should create a tiling at half
 | 
|    // the scale (2/kMaxScaleRatioDuringPinch).
 | 
| -  SetContentsScaleOnBothLayers(1.8f, 1.0f, 0.9f, 1.0f, false);
 | 
| +  SetContentsScaleOnBothLayers(1.8f, 1.0f, 1.8f, 1.0f, false);
 | 
|    EXPECT_EQ(3u, active_layer_->tilings()->num_tilings());
 | 
|    EXPECT_FLOAT_EQ(2.0f,
 | 
|                    active_layer_->tilings()->tiling_at(0)->contents_scale());
 | 
| @@ -887,7 +885,7 @@ TEST_F(PictureLayerImplTest, PinchGestureTilings) {
 | 
|  
 | 
|    // Zoom in a lot now. Since we increase by increments of
 | 
|    // kMaxScaleRatioDuringPinch, this will create a new tiling at 4.0.
 | 
| -  SetContentsScaleOnBothLayers(3.8f, 1.0f, 2.1f, 1.f, false);
 | 
| +  SetContentsScaleOnBothLayers(3.8f, 1.0f, 3.8f, 1.f, false);
 | 
|    EXPECT_EQ(4u, active_layer_->tilings()->num_tilings());
 | 
|    EXPECT_FLOAT_EQ(4.0f,
 | 
|                    active_layer_->tilings()->tiling_at(0)->contents_scale());
 | 
| @@ -902,9 +900,12 @@ TEST_F(PictureLayerImplTest, SnappedTilingDuringZoom) {
 | 
|    scoped_refptr<FakePicturePileImpl> active_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|  
 | 
| -  // Set up the high and low res tilings before pinch zoom.
 | 
|    SetupTrees(pending_pile, active_pile);
 | 
| +
 | 
| +  ResetTilingsAndRasterScales();
 | 
|    EXPECT_EQ(0u, active_layer_->tilings()->num_tilings());
 | 
| +
 | 
| +  // Set up the high and low res tilings before pinch zoom.
 | 
|    SetContentsScaleOnBothLayers(0.24f, 1.0f, 0.24f, 1.0f, false);
 | 
|    EXPECT_EQ(2u, active_layer_->tilings()->num_tilings());
 | 
|    EXPECT_FLOAT_EQ(0.24f,
 | 
| @@ -955,31 +956,28 @@ TEST_F(PictureLayerImplTest, CleanUpTilings) {
 | 
|  
 | 
|    std::vector<PictureLayerTiling*> used_tilings;
 | 
|  
 | 
| -  SetupTrees(pending_pile, active_pile);
 | 
| -  EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
 | 
| -
 | 
|    float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
 | 
|    EXPECT_LT(low_res_factor, 1.f);
 | 
|  
 | 
| -  float device_scale = 1.7f;
 | 
| -  float page_scale = 3.2f;
 | 
|    float scale = 1.f;
 | 
| +  float page_scale = 1.f;
 | 
|  
 | 
| -  SetContentsScaleOnBothLayers(scale, device_scale, page_scale, 1.f, false);
 | 
| -  ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
 | 
| +  SetupTrees(pending_pile, active_pile);
 | 
| +  EXPECT_EQ(2u, active_layer_->tilings()->num_tilings());
 | 
| +  EXPECT_EQ(1.f, active_layer_->HighResTiling()->contents_scale());
 | 
|  
 | 
|    // We only have ideal tilings, so they aren't removed.
 | 
|    used_tilings.clear();
 | 
|    active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
 | 
| -  ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
 | 
| +  EXPECT_EQ(2u, active_layer_->tilings()->num_tilings());
 | 
|  
 | 
|    host_impl_.PinchGestureBegin();
 | 
|  
 | 
|    // Changing the ideal but not creating new tilings.
 | 
| -  scale *= 1.5f;
 | 
| -  page_scale *= 1.5f;
 | 
| -  SetContentsScaleOnBothLayers(scale, device_scale, page_scale, 1.f, false);
 | 
| -  ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
 | 
| +  scale = 1.5f;
 | 
| +  page_scale = 1.5f;
 | 
| +  SetContentsScaleOnBothLayers(scale, 1.f, page_scale, 1.f, false);
 | 
| +  EXPECT_EQ(2u, active_layer_->tilings()->num_tilings());
 | 
|  
 | 
|    // The tilings are still our target scale, so they aren't removed.
 | 
|    used_tilings.clear();
 | 
| @@ -989,9 +987,9 @@ TEST_F(PictureLayerImplTest, CleanUpTilings) {
 | 
|    host_impl_.PinchGestureEnd();
 | 
|  
 | 
|    // Create a 1.2 scale tiling. Now we have 1.0 and 1.2 tilings. Ideal = 1.2.
 | 
| -  scale /= 4.f;
 | 
| -  page_scale /= 4.f;
 | 
| -  SetContentsScaleOnBothLayers(1.2f, device_scale, page_scale, 1.f, false);
 | 
| +  scale = 1.2f;
 | 
| +  page_scale = 1.2f;
 | 
| +  SetContentsScaleOnBothLayers(1.2f, 1.f, page_scale, 1.f, false);
 | 
|    ASSERT_EQ(4u, active_layer_->tilings()->num_tilings());
 | 
|    EXPECT_FLOAT_EQ(
 | 
|        1.f,
 | 
| @@ -1008,7 +1006,7 @@ TEST_F(PictureLayerImplTest, CleanUpTilings) {
 | 
|    ASSERT_EQ(4u, active_layer_->tilings()->num_tilings());
 | 
|  
 | 
|    // Now move the ideal scale to 0.5. Our target stays 1.2.
 | 
| -  SetContentsScaleOnBothLayers(0.5f, device_scale, page_scale, 1.f, false);
 | 
| +  SetContentsScaleOnBothLayers(0.5f, 1.f, page_scale, 1.f, false);
 | 
|  
 | 
|    // The high resolution tiling is between target and ideal, so is not
 | 
|    // removed.  The low res tiling for the old ideal=1.0 scale is removed.
 | 
| @@ -1017,7 +1015,7 @@ TEST_F(PictureLayerImplTest, CleanUpTilings) {
 | 
|    ASSERT_EQ(3u, active_layer_->tilings()->num_tilings());
 | 
|  
 | 
|    // Now move the ideal scale to 1.0. Our target stays 1.2.
 | 
| -  SetContentsScaleOnBothLayers(1.f, device_scale, page_scale, 1.f, false);
 | 
| +  SetContentsScaleOnBothLayers(1.f, 1.f, page_scale, 1.f, false);
 | 
|  
 | 
|    // All the tilings are between are target and the ideal, so they are not
 | 
|    // removed.
 | 
| @@ -1026,8 +1024,8 @@ TEST_F(PictureLayerImplTest, CleanUpTilings) {
 | 
|    ASSERT_EQ(3u, active_layer_->tilings()->num_tilings());
 | 
|  
 | 
|    // Now move the ideal scale to 1.1 on the active layer. Our target stays 1.2.
 | 
| -  SetupDrawPropertiesAndUpdateTiles(
 | 
| -      active_layer_, 1.1f, device_scale, page_scale, 1.f, false);
 | 
| +  SetupDrawPropertiesAndUpdateTiles(active_layer_, 1.1f, 1.f, page_scale, 1.f,
 | 
| +                                    false);
 | 
|  
 | 
|    // Because the pending layer's ideal scale is still 1.0, our tilings fall
 | 
|    // in the range [1.0,1.2] and are kept.
 | 
| @@ -1037,8 +1035,8 @@ TEST_F(PictureLayerImplTest, CleanUpTilings) {
 | 
|  
 | 
|    // Move the ideal scale on the pending layer to 1.1 as well. Our target stays
 | 
|    // 1.2 still.
 | 
| -  SetupDrawPropertiesAndUpdateTiles(
 | 
| -      pending_layer_, 1.1f, device_scale, page_scale, 1.f, false);
 | 
| +  SetupDrawPropertiesAndUpdateTiles(pending_layer_, 1.1f, 1.f, page_scale, 1.f,
 | 
| +                                    false);
 | 
|  
 | 
|    // Our 1.0 tiling now falls outside the range between our ideal scale and our
 | 
|    // target raster scale. But it is in our used tilings set, so nothing is
 | 
| @@ -1055,26 +1053,13 @@ TEST_F(PictureLayerImplTest, CleanUpTilings) {
 | 
|    ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
 | 
|  }
 | 
|  
 | 
| -#define EXPECT_BOTH_EQ(expression, x)         \
 | 
| -  do {                                        \
 | 
| -    EXPECT_EQ(x, pending_layer_->expression); \
 | 
| -    EXPECT_EQ(x, active_layer_->expression);  \
 | 
| -  } while (false)
 | 
| -
 | 
| -#define EXPECT_BOTH_NE(expression, x)         \
 | 
| -  do {                                        \
 | 
| -    EXPECT_NE(x, pending_layer_->expression); \
 | 
| -    EXPECT_NE(x, active_layer_->expression);  \
 | 
| -  } while (false)
 | 
| -
 | 
|  TEST_F(PictureLayerImplTest, DontAddLowResDuringAnimation) {
 | 
|    // Make sure this layer covers multiple tiles, since otherwise low
 | 
|    // res won't get created because it is too small.
 | 
|    gfx::Size tile_size(host_impl_.settings().default_tile_size);
 | 
| -  SetupDefaultTrees(gfx::Size(tile_size.width() + 1, tile_size.height() + 1));
 | 
|    // Avoid max untiled layer size heuristics via fixed tile size.
 | 
| -  pending_layer_->set_fixed_tile_size(tile_size);
 | 
| -  active_layer_->set_fixed_tile_size(tile_size);
 | 
| +  gfx::Size layer_bounds(tile_size.width() + 1, tile_size.height() + 1);
 | 
| +  SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size, Region());
 | 
|  
 | 
|    float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
 | 
|    float contents_scale = 1.f;
 | 
| @@ -1083,6 +1068,8 @@ TEST_F(PictureLayerImplTest, DontAddLowResDuringAnimation) {
 | 
|    float maximum_animation_scale = 1.f;
 | 
|    bool animating_transform = true;
 | 
|  
 | 
| +  ResetTilingsAndRasterScales();
 | 
| +
 | 
|    // Animating, so don't create low res even if there isn't one already.
 | 
|    SetContentsScaleOnBothLayers(contents_scale,
 | 
|                                 device_scale,
 | 
| @@ -1104,7 +1091,8 @@ TEST_F(PictureLayerImplTest, DontAddLowResDuringAnimation) {
 | 
|    EXPECT_BOTH_EQ(num_tilings(), 2u);
 | 
|  
 | 
|    // Page scale animation, new high res, but no low res. We still have
 | 
| -  // a tiling at the previous scale, it's just not marked as low res.
 | 
| +  // a tiling at the previous scale, it's just not marked as low res on the
 | 
| +  // active layer. The pending layer drops non-ideal tilings.
 | 
|    contents_scale = 2.f;
 | 
|    page_scale = 2.f;
 | 
|    maximum_animation_scale = 2.f;
 | 
| @@ -1117,7 +1105,8 @@ TEST_F(PictureLayerImplTest, DontAddLowResDuringAnimation) {
 | 
|    EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 2.f);
 | 
|    EXPECT_FALSE(active_layer_->LowResTiling());
 | 
|    EXPECT_FALSE(pending_layer_->LowResTiling());
 | 
| -  EXPECT_BOTH_EQ(num_tilings(), 3u);
 | 
| +  EXPECT_EQ(3u, active_layer_->num_tilings());
 | 
| +  EXPECT_EQ(1u, pending_layer_->num_tilings());
 | 
|  
 | 
|    // Stop animating, new low res gets created for final page scale.
 | 
|    animating_transform = false;
 | 
| @@ -1128,7 +1117,8 @@ TEST_F(PictureLayerImplTest, DontAddLowResDuringAnimation) {
 | 
|                                 animating_transform);
 | 
|    EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 2.f);
 | 
|    EXPECT_BOTH_EQ(LowResTiling()->contents_scale(), 2.f * low_res_factor);
 | 
| -  EXPECT_BOTH_EQ(num_tilings(), 4u);
 | 
| +  EXPECT_EQ(4u, active_layer_->num_tilings());
 | 
| +  EXPECT_EQ(2u, pending_layer_->num_tilings());
 | 
|  }
 | 
|  
 | 
|  TEST_F(PictureLayerImplTest, DontAddLowResForSmallLayers) {
 | 
| @@ -1185,120 +1175,187 @@ TEST_F(PictureLayerImplTest, DontAddLowResForSmallLayers) {
 | 
|                   contents_scale * low_res_factor);
 | 
|    EXPECT_BOTH_EQ(num_tilings(), 2u);
 | 
|  
 | 
| -  ResetTilingsAndRasterScales();
 | 
| -
 | 
|    // Mask layers dont create low res since they always fit on one tile.
 | 
| -  pending_layer_->set_is_mask(true);
 | 
| -  active_layer_->set_is_mask(true);
 | 
| -  SetContentsScaleOnBothLayers(contents_scale,
 | 
| -                               device_scale,
 | 
| -                               page_scale,
 | 
| -                               maximum_animation_scale,
 | 
| -                               animating_transform);
 | 
| -  EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), contents_scale);
 | 
| -  EXPECT_BOTH_EQ(num_tilings(), 1u);
 | 
| +  scoped_ptr<FakePictureLayerImpl> mask =
 | 
| +      FakePictureLayerImpl::CreateMaskWithRasterSource(
 | 
| +          host_impl_.pending_tree(), 3, pending_pile);
 | 
| +  mask->SetBounds(layer_bounds);
 | 
| +  mask->SetContentBounds(layer_bounds);
 | 
| +  mask->SetDrawsContent(true);
 | 
| +
 | 
| +  SetupDrawPropertiesAndUpdateTiles(mask.get(), contents_scale, device_scale,
 | 
| +                                    page_scale, maximum_animation_scale,
 | 
| +                                    animating_transform);
 | 
| +  EXPECT_EQ(mask->HighResTiling()->contents_scale(), contents_scale);
 | 
| +  EXPECT_EQ(mask->num_tilings(), 1u);
 | 
|  }
 | 
|  
 | 
|  TEST_F(PictureLayerImplTest, HugeMasksDontGetTiles) {
 | 
| +  base::TimeTicks time_ticks;
 | 
| +  time_ticks += base::TimeDelta::FromMilliseconds(1);
 | 
| +  host_impl_.SetCurrentBeginFrameArgs(
 | 
| +      CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
 | 
| +
 | 
|    gfx::Size tile_size(100, 100);
 | 
| +  gfx::Size layer_bounds(1000, 1000);
 | 
|  
 | 
|    scoped_refptr<FakePicturePileImpl> valid_pile =
 | 
| -      FakePicturePileImpl::CreateFilledPile(tile_size, gfx::Size(1000, 1000));
 | 
| +      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|    SetupPendingTree(valid_pile);
 | 
| -  pending_layer_->set_is_mask(true);
 | 
|  
 | 
| -  SetupDrawPropertiesAndUpdateTiles(pending_layer_, 1.f, 1.f, 1.f, 1.f, false);
 | 
| -  EXPECT_EQ(1.f, pending_layer_->HighResTiling()->contents_scale());
 | 
| -  EXPECT_EQ(1u, pending_layer_->num_tilings());
 | 
| +  scoped_ptr<FakePictureLayerImpl> mask_ptr =
 | 
| +      FakePictureLayerImpl::CreateMaskWithRasterSource(
 | 
| +          host_impl_.pending_tree(), 3, valid_pile);
 | 
| +  mask_ptr->SetBounds(layer_bounds);
 | 
| +  mask_ptr->SetContentBounds(layer_bounds);
 | 
| +  mask_ptr->SetDrawsContent(true);
 | 
| +  pending_layer_->SetMaskLayer(mask_ptr.Pass());
 | 
| +
 | 
| +  time_ticks += base::TimeDelta::FromMilliseconds(1);
 | 
| +  host_impl_.SetCurrentBeginFrameArgs(
 | 
| +      CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
 | 
| +  host_impl_.pending_tree()->UpdateDrawProperties();
 | 
| +
 | 
| +  FakePictureLayerImpl* pending_mask =
 | 
| +      static_cast<FakePictureLayerImpl*>(pending_layer_->mask_layer());
 | 
| +
 | 
| +  EXPECT_EQ(1.f, pending_mask->HighResTiling()->contents_scale());
 | 
| +  EXPECT_EQ(1u, pending_mask->num_tilings());
 | 
|  
 | 
| -  pending_layer_->HighResTiling()->CreateAllTilesForTesting();
 | 
|    host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(
 | 
| -      pending_layer_->HighResTiling()->AllTilesForTesting());
 | 
| +      pending_mask->HighResTiling()->AllTilesForTesting());
 | 
|  
 | 
|    ActivateTree();
 | 
|  
 | 
| +  FakePictureLayerImpl* active_mask =
 | 
| +      static_cast<FakePictureLayerImpl*>(active_layer_->mask_layer());
 | 
| +
 | 
|    // Mask layers have a tiling with a single tile in it.
 | 
| -  EXPECT_EQ(1u, active_layer_->HighResTiling()->AllTilesForTesting().size());
 | 
| +  EXPECT_EQ(1u, active_mask->HighResTiling()->AllTilesForTesting().size());
 | 
|    // The mask resource exists.
 | 
|    ResourceProvider::ResourceId mask_resource_id;
 | 
|    gfx::Size mask_texture_size;
 | 
| -  active_layer_->GetContentsResourceId(&mask_resource_id, &mask_texture_size);
 | 
| +  active_mask->GetContentsResourceId(&mask_resource_id, &mask_texture_size);
 | 
|    EXPECT_NE(0u, mask_resource_id);
 | 
| -  EXPECT_EQ(mask_texture_size, active_layer_->bounds());
 | 
| +  EXPECT_EQ(mask_texture_size, active_mask->bounds());
 | 
|  
 | 
|    // Drop resources and recreate them, still the same.
 | 
| -  old_pending_layer_->ReleaseResources();
 | 
| -  active_layer_->ReleaseResources();
 | 
| -  SetupDrawPropertiesAndUpdateTiles(active_layer_, 1.f, 1.f, 1.f, 1.f, false);
 | 
| -  active_layer_->HighResTiling()->CreateAllTilesForTesting();
 | 
| -  EXPECT_EQ(1u, active_layer_->HighResTiling()->AllTilesForTesting().size());
 | 
| +  pending_mask->ReleaseResources();
 | 
| +  active_mask->ReleaseResources();
 | 
| +  SetupDrawPropertiesAndUpdateTiles(active_mask, 1.f, 1.f, 1.f, 1.f, false);
 | 
| +  active_mask->HighResTiling()->CreateAllTilesForTesting();
 | 
| +  EXPECT_EQ(1u, active_mask->HighResTiling()->AllTilesForTesting().size());
 | 
|    EXPECT_NE(0u, mask_resource_id);
 | 
|    EXPECT_EQ(mask_texture_size, active_layer_->bounds());
 | 
|  
 | 
| +  // Drop resources and recreate them, still the same.
 | 
| +  pending_mask->ReleaseResources();
 | 
| +  active_mask->ReleaseResources();
 | 
| +  SetupDrawPropertiesAndUpdateTiles(active_mask, 1.f, 1.f, 1.f, 1.f, false);
 | 
| +  active_mask->HighResTiling()->CreateAllTilesForTesting();
 | 
| +  EXPECT_EQ(1u, active_mask->HighResTiling()->AllTilesForTesting().size());
 | 
| +  EXPECT_NE(0u, mask_resource_id);
 | 
| +  EXPECT_EQ(mask_texture_size, active_mask->bounds());
 | 
| +
 | 
|    // Resize larger than the max texture size.
 | 
|    int max_texture_size = host_impl_.GetRendererCapabilities().max_texture_size;
 | 
| +  gfx::Size huge_bounds(max_texture_size + 1, 10);
 | 
|    scoped_refptr<FakePicturePileImpl> huge_pile =
 | 
| -      FakePicturePileImpl::CreateFilledPile(
 | 
| -          tile_size, gfx::Size(max_texture_size + 1, 10));
 | 
| +      FakePicturePileImpl::CreateFilledPile(tile_size, huge_bounds);
 | 
| +
 | 
|    SetupPendingTree(huge_pile);
 | 
| -  pending_layer_->set_is_mask(true);
 | 
| +  pending_mask->SetBounds(huge_bounds);
 | 
| +  pending_mask->SetContentBounds(huge_bounds);
 | 
| +  pending_mask->SetRasterSourceOnPending(huge_pile, Region());
 | 
|  
 | 
| -  SetupDrawPropertiesAndUpdateTiles(pending_layer_, 1.f, 1.f, 1.f, 1.f, false);
 | 
| -  EXPECT_EQ(1.f, pending_layer_->HighResTiling()->contents_scale());
 | 
| -  EXPECT_EQ(1u, pending_layer_->num_tilings());
 | 
| +  time_ticks += base::TimeDelta::FromMilliseconds(1);
 | 
| +  host_impl_.SetCurrentBeginFrameArgs(
 | 
| +      CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
 | 
| +  host_impl_.pending_tree()->UpdateDrawProperties();
 | 
| +
 | 
| +  EXPECT_EQ(1.f, pending_mask->HighResTiling()->contents_scale());
 | 
| +  EXPECT_EQ(1u, pending_mask->num_tilings());
 | 
|  
 | 
| -  pending_layer_->HighResTiling()->CreateAllTilesForTesting();
 | 
|    host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(
 | 
| -      pending_layer_->HighResTiling()->AllTilesForTesting());
 | 
| +      pending_mask->HighResTiling()->AllTilesForTesting());
 | 
|  
 | 
|    ActivateTree();
 | 
|  
 | 
|    // Mask layers have a tiling, but there should be no tiles in it.
 | 
| -  EXPECT_EQ(0u, active_layer_->HighResTiling()->AllTilesForTesting().size());
 | 
| +  EXPECT_EQ(0u, active_mask->HighResTiling()->AllTilesForTesting().size());
 | 
|    // The mask resource is empty.
 | 
|    active_layer_->GetContentsResourceId(&mask_resource_id, &mask_texture_size);
 | 
|    EXPECT_EQ(0u, mask_resource_id);
 | 
|  
 | 
|    // Drop resources and recreate them, still the same.
 | 
| -  old_pending_layer_->ReleaseResources();
 | 
| -  active_layer_->ReleaseResources();
 | 
| -  SetupDrawPropertiesAndUpdateTiles(active_layer_, 1.f, 1.f, 1.f, 1.f, false);
 | 
| -  active_layer_->HighResTiling()->CreateAllTilesForTesting();
 | 
| -  EXPECT_EQ(0u, active_layer_->HighResTiling()->AllTilesForTesting().size());
 | 
| +  pending_mask->ReleaseResources();
 | 
| +  active_mask->ReleaseResources();
 | 
| +  SetupDrawPropertiesAndUpdateTiles(active_mask, 1.f, 1.f, 1.f, 1.f, false);
 | 
| +  active_mask->HighResTiling()->CreateAllTilesForTesting();
 | 
| +  EXPECT_EQ(0u, active_mask->HighResTiling()->AllTilesForTesting().size());
 | 
| +  active_mask->GetContentsResourceId(&mask_resource_id, &mask_texture_size);
 | 
| +  EXPECT_EQ(0u, mask_resource_id);
 | 
| +
 | 
| +  // Do another activate, the same holds.
 | 
| +  SetupPendingTree(huge_pile);
 | 
| +  ActivateTree();
 | 
| +  EXPECT_EQ(0u, active_mask->HighResTiling()->AllTilesForTesting().size());
 | 
|    active_layer_->GetContentsResourceId(&mask_resource_id, &mask_texture_size);
 | 
|    EXPECT_EQ(0u, mask_resource_id);
 | 
|  }
 | 
|  
 | 
|  TEST_F(PictureLayerImplTest, ScaledMaskLayer) {
 | 
| +  base::TimeTicks time_ticks;
 | 
| +  time_ticks += base::TimeDelta::FromMilliseconds(1);
 | 
| +  host_impl_.SetCurrentBeginFrameArgs(
 | 
| +      CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
 | 
| +
 | 
|    gfx::Size tile_size(100, 100);
 | 
| +  gfx::Size layer_bounds(1000, 1000);
 | 
| +
 | 
| +  host_impl_.SetDeviceScaleFactor(1.3f);
 | 
|  
 | 
|    scoped_refptr<FakePicturePileImpl> valid_pile =
 | 
| -      FakePicturePileImpl::CreateFilledPile(tile_size, gfx::Size(1000, 1000));
 | 
| +      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|    SetupPendingTree(valid_pile);
 | 
| -  pending_layer_->set_is_mask(true);
 | 
|  
 | 
| -  float ideal_contents_scale = 1.3f;
 | 
| -  SetupDrawPropertiesAndUpdateTiles(
 | 
| -      pending_layer_, ideal_contents_scale, 1.f, 1.f, 1.f, false);
 | 
| -  EXPECT_EQ(ideal_contents_scale,
 | 
| -            pending_layer_->HighResTiling()->contents_scale());
 | 
| -  EXPECT_EQ(1u, pending_layer_->num_tilings());
 | 
| +  scoped_ptr<FakePictureLayerImpl> mask_ptr =
 | 
| +      FakePictureLayerImpl::CreateMaskWithRasterSource(
 | 
| +          host_impl_.pending_tree(), 3, valid_pile);
 | 
| +  mask_ptr->SetBounds(layer_bounds);
 | 
| +  mask_ptr->SetContentBounds(layer_bounds);
 | 
| +  mask_ptr->SetDrawsContent(true);
 | 
| +  pending_layer_->SetMaskLayer(mask_ptr.Pass());
 | 
| +
 | 
| +  time_ticks += base::TimeDelta::FromMilliseconds(1);
 | 
| +  host_impl_.SetCurrentBeginFrameArgs(
 | 
| +      CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
 | 
| +  host_impl_.pending_tree()->UpdateDrawProperties();
 | 
| +
 | 
| +  FakePictureLayerImpl* pending_mask =
 | 
| +      static_cast<FakePictureLayerImpl*>(pending_layer_->mask_layer());
 | 
| +
 | 
| +  // Masks are scaled, and do not have a low res tiling.
 | 
| +  EXPECT_EQ(1.3f, pending_mask->HighResTiling()->contents_scale());
 | 
| +  EXPECT_EQ(1u, pending_mask->num_tilings());
 | 
|  
 | 
| -  pending_layer_->HighResTiling()->CreateAllTilesForTesting();
 | 
|    host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(
 | 
| -      pending_layer_->HighResTiling()->AllTilesForTesting());
 | 
| +      pending_mask->HighResTiling()->AllTilesForTesting());
 | 
|  
 | 
|    ActivateTree();
 | 
|  
 | 
| +  FakePictureLayerImpl* active_mask =
 | 
| +      static_cast<FakePictureLayerImpl*>(active_layer_->mask_layer());
 | 
| +
 | 
|    // Mask layers have a tiling with a single tile in it.
 | 
| -  EXPECT_EQ(1u, active_layer_->HighResTiling()->AllTilesForTesting().size());
 | 
| +  EXPECT_EQ(1u, active_mask->HighResTiling()->AllTilesForTesting().size());
 | 
|    // The mask resource exists.
 | 
|    ResourceProvider::ResourceId mask_resource_id;
 | 
|    gfx::Size mask_texture_size;
 | 
| -  active_layer_->GetContentsResourceId(&mask_resource_id, &mask_texture_size);
 | 
| +  active_mask->GetContentsResourceId(&mask_resource_id, &mask_texture_size);
 | 
|    EXPECT_NE(0u, mask_resource_id);
 | 
| -  gfx::Size expected_mask_texture_size = gfx::ToCeiledSize(
 | 
| -      gfx::ScaleSize(active_layer_->bounds(), ideal_contents_scale));
 | 
| +  gfx::Size expected_mask_texture_size =
 | 
| +      gfx::ToCeiledSize(gfx::ScaleSize(active_mask->bounds(), 1.3f));
 | 
|    EXPECT_EQ(mask_texture_size, expected_mask_texture_size);
 | 
|  }
 | 
|  
 | 
| @@ -1312,14 +1369,6 @@ TEST_F(PictureLayerImplTest, ReleaseResources) {
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|  
 | 
|    SetupTrees(pending_pile, active_pile);
 | 
| -  EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
 | 
| -
 | 
| -  SetupDrawPropertiesAndUpdateTiles(pending_layer_,
 | 
| -                                    1.3f,  // ideal contents scale
 | 
| -                                    2.7f,  // device scale
 | 
| -                                    3.2f,  // page scale
 | 
| -                                    1.f,   // maximum animation scale
 | 
| -                                    false);
 | 
|    EXPECT_EQ(2u, pending_layer_->tilings()->num_tilings());
 | 
|  
 | 
|    // All tilings should be removed when losing output surface.
 | 
| @@ -1330,10 +1379,10 @@ TEST_F(PictureLayerImplTest, ReleaseResources) {
 | 
|  
 | 
|    // This should create new tilings.
 | 
|    SetupDrawPropertiesAndUpdateTiles(pending_layer_,
 | 
| -                                    1.3f,  // ideal contents scale
 | 
| -                                    2.7f,  // device scale
 | 
| -                                    3.2f,  // page scale
 | 
| -                                    1.f,   // maximum animation scale
 | 
| +                                    1.f,  // ideal contents scale
 | 
| +                                    1.f,  // device scale
 | 
| +                                    1.f,  // page scale
 | 
| +                                    1.f,  // maximum animation scale
 | 
|                                      false);
 | 
|    EXPECT_EQ(2u, pending_layer_->tilings()->num_tilings());
 | 
|  }
 | 
| @@ -1349,10 +1398,7 @@ TEST_F(PictureLayerImplTest, ClampTilesToToMaxTileSize) {
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|  
 | 
|    SetupTrees(pending_pile, active_pile);
 | 
| -  EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
 | 
| -
 | 
| -  SetupDrawPropertiesAndUpdateTiles(pending_layer_, 1.f, 1.f, 1.f, 1.f, false);
 | 
| -  ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings());
 | 
| +  EXPECT_GE(pending_layer_->tilings()->num_tilings(), 1u);
 | 
|  
 | 
|    pending_layer_->tilings()->tiling_at(0)->CreateAllTilesForTesting();
 | 
|  
 | 
| @@ -1364,7 +1410,7 @@ TEST_F(PictureLayerImplTest, ClampTilesToToMaxTileSize) {
 | 
|    EXPECT_EQ(gfx::Size(256, 256).ToString(),
 | 
|              tile->content_rect().size().ToString());
 | 
|  
 | 
| -  pending_layer_->ReleaseResources();
 | 
| +  ResetTilingsAndRasterScales();
 | 
|  
 | 
|    // Change the max texture size on the output surface context.
 | 
|    scoped_ptr<TestWebGraphicsContext3D> context =
 | 
| @@ -1396,10 +1442,7 @@ TEST_F(PictureLayerImplTest, ClampSingleTileToToMaxTileSize) {
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|  
 | 
|    SetupTrees(pending_pile, active_pile);
 | 
| -  EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
 | 
| -
 | 
| -  SetupDrawPropertiesAndUpdateTiles(pending_layer_, 1.f, 1.f, 1.f, 1.f, false);
 | 
| -  ASSERT_LE(1u, pending_layer_->tilings()->num_tilings());
 | 
| +  EXPECT_GE(pending_layer_->tilings()->num_tilings(), 1u);
 | 
|  
 | 
|    pending_layer_->tilings()->tiling_at(0)->CreateAllTilesForTesting();
 | 
|  
 | 
| @@ -1411,7 +1454,7 @@ TEST_F(PictureLayerImplTest, ClampSingleTileToToMaxTileSize) {
 | 
|    PictureLayerTiling* high_res_tiling = pending_layer_->tilings()->tiling_at(0);
 | 
|    EXPECT_EQ(1u, high_res_tiling->AllTilesForTesting().size());
 | 
|  
 | 
| -  pending_layer_->ReleaseResources();
 | 
| +  ResetTilingsAndRasterScales();
 | 
|  
 | 
|    // Change the max texture size on the output surface context.
 | 
|    scoped_ptr<TestWebGraphicsContext3D> context =
 | 
| @@ -1448,15 +1491,12 @@ TEST_F(PictureLayerImplTest, DisallowTileDrawQuads) {
 | 
|    scoped_refptr<FakePicturePileImpl> active_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|  
 | 
| -  SetupTrees(pending_pile, active_pile);
 | 
| +  gfx::Rect layer_invalidation(150, 200, 30, 180);
 | 
| +  SetupTreesWithInvalidation(pending_pile, active_pile, layer_invalidation);
 | 
|  
 | 
|    active_layer_->draw_properties().visible_content_rect =
 | 
|        gfx::Rect(layer_bounds);
 | 
|  
 | 
| -  gfx::Rect layer_invalidation(150, 200, 30, 180);
 | 
| -  Region invalidation(layer_invalidation);
 | 
| -  AddDefaultTilingsWithInvalidation(invalidation);
 | 
| -
 | 
|    AppendQuadsData data;
 | 
|    active_layer_->WillDraw(DRAW_MODE_RESOURCELESS_SOFTWARE, nullptr);
 | 
|    active_layer_->AppendQuads(render_pass.get(), Occlusion(), &data);
 | 
| @@ -1514,33 +1554,20 @@ TEST_F(PictureLayerImplTest, TileScalesWithSolidColorPile) {
 | 
|    pending_pile->set_is_solid_color(false);
 | 
|    active_pile->set_is_solid_color(true);
 | 
|    SetupTrees(pending_pile, active_pile);
 | 
| -  // Solid color layer should not have tilings.
 | 
| -  ASSERT_FALSE(active_layer_->CanHaveTilings());
 | 
| -
 | 
| -  // Update properties with solid color pile should not allow tilings at any
 | 
| -  // scale.
 | 
| -  host_impl_.active_tree()->UpdateDrawProperties();
 | 
| +  // Solid color pile should not allow tilings at any scale.
 | 
|    EXPECT_FALSE(active_layer_->CanHaveTilings());
 | 
|    EXPECT_EQ(0.f, active_layer_->ideal_contents_scale());
 | 
|  
 | 
| -  // Push non-solid-color pending pile makes active layer can have tilings.
 | 
| -  active_layer_->UpdateRasterSource(pending_pile);
 | 
| -  ASSERT_TRUE(active_layer_->CanHaveTilings());
 | 
| -
 | 
| -  // Update properties with non-solid color pile should allow tilings.
 | 
| -  host_impl_.active_tree()->UpdateDrawProperties();
 | 
| +  // Activate non-solid-color pending pile makes active layer can have tilings.
 | 
| +  ActivateTree();
 | 
|    EXPECT_TRUE(active_layer_->CanHaveTilings());
 | 
|    EXPECT_GT(active_layer_->ideal_contents_scale(), 0.f);
 | 
|  }
 | 
|  
 | 
| -TEST_F(PictureLayerImplTest, MarkRequiredOffscreenTiles) {
 | 
| +TEST_F(NoLowResPictureLayerImplTest, MarkRequiredOffscreenTiles) {
 | 
|    gfx::Size tile_size(100, 100);
 | 
|    gfx::Size layer_bounds(200, 200);
 | 
|  
 | 
| -  scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
| -      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| -  SetupPendingTree(pending_pile);
 | 
| -
 | 
|    gfx::Transform transform;
 | 
|    gfx::Transform transform_for_tile_priority;
 | 
|    bool resourceless_software_draw = false;
 | 
| @@ -1552,10 +1579,11 @@ TEST_F(PictureLayerImplTest, MarkRequiredOffscreenTiles) {
 | 
|                                          transform,
 | 
|                                          resourceless_software_draw);
 | 
|  
 | 
| -  pending_layer_->set_fixed_tile_size(tile_size);
 | 
| -  ASSERT_TRUE(pending_layer_->CanHaveTilings());
 | 
| -  PictureLayerTiling* tiling = pending_layer_->AddTiling(1.f);
 | 
| -  host_impl_.pending_tree()->UpdateDrawProperties();
 | 
| +  scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
| +      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| +  SetupPendingTreeWithFixedTileSize(pending_pile, tile_size, Region());
 | 
| +
 | 
| +  EXPECT_EQ(1u, pending_layer_->num_tilings());
 | 
|    EXPECT_EQ(viewport, pending_layer_->visible_rect_for_tile_priority());
 | 
|  
 | 
|    base::TimeTicks time_ticks;
 | 
| @@ -1563,13 +1591,13 @@ TEST_F(PictureLayerImplTest, MarkRequiredOffscreenTiles) {
 | 
|    host_impl_.SetCurrentBeginFrameArgs(
 | 
|        CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
 | 
|    pending_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
 | 
| -  EXPECT_EQ(HIGH_RESOLUTION, tiling->resolution());
 | 
|  
 | 
|    int num_visible = 0;
 | 
|    int num_offscreen = 0;
 | 
|  
 | 
| -  for (PictureLayerTiling::TilingRasterTileIterator iter(tiling); iter;
 | 
| -       ++iter) {
 | 
| +  for (PictureLayerTiling::TilingRasterTileIterator iter(
 | 
| +           pending_layer_->HighResTiling());
 | 
| +       iter; ++iter) {
 | 
|      const Tile* tile = *iter;
 | 
|      DCHECK(tile);
 | 
|      if (tile->priority(PENDING_TREE).distance_to_visible == 0.f) {
 | 
| @@ -1585,7 +1613,8 @@ TEST_F(PictureLayerImplTest, MarkRequiredOffscreenTiles) {
 | 
|    EXPECT_GT(num_offscreen, 0);
 | 
|  }
 | 
|  
 | 
| -TEST_F(PictureLayerImplTest, TileOutsideOfViewportForTilePriorityNotRequired) {
 | 
| +TEST_F(NoLowResPictureLayerImplTest,
 | 
| +       TileOutsideOfViewportForTilePriorityNotRequired) {
 | 
|    base::TimeTicks time_ticks;
 | 
|    time_ticks += base::TimeDelta::FromMilliseconds(1);
 | 
|    host_impl_.SetCurrentBeginFrameArgs(
 | 
| @@ -1600,12 +1629,10 @@ TEST_F(PictureLayerImplTest, TileOutsideOfViewportForTilePriorityNotRequired) {
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|    scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| -  SetupTrees(pending_pile, active_pile);
 | 
| +  SetupTreesWithFixedTileSize(pending_pile, active_pile, tile_size, Region());
 | 
|  
 | 
| -  active_layer_->set_fixed_tile_size(tile_size);
 | 
| -  pending_layer_->set_fixed_tile_size(tile_size);
 | 
| -  ASSERT_TRUE(pending_layer_->CanHaveTilings());
 | 
| -  PictureLayerTiling* tiling = pending_layer_->AddTiling(1.f);
 | 
| +  ASSERT_EQ(1u, pending_layer_->num_tilings());
 | 
| +  ASSERT_EQ(1.f, pending_layer_->HighResTiling()->contents_scale());
 | 
|  
 | 
|    // Set external viewport for tile priority.
 | 
|    gfx::Rect viewport = gfx::Rect(layer_bounds);
 | 
| @@ -1618,6 +1645,9 @@ TEST_F(PictureLayerImplTest, TileOutsideOfViewportForTilePriorityNotRequired) {
 | 
|                                          external_viewport_for_tile_priority,
 | 
|                                          transform_for_tile_priority,
 | 
|                                          resourceless_software_draw);
 | 
| +  time_ticks += base::TimeDelta::FromMilliseconds(1);
 | 
| +  host_impl_.SetCurrentBeginFrameArgs(
 | 
| +      CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
 | 
|    host_impl_.pending_tree()->UpdateDrawProperties();
 | 
|  
 | 
|    // Set visible content rect that is different from
 | 
| @@ -1637,9 +1667,8 @@ TEST_F(PictureLayerImplTest, TileOutsideOfViewportForTilePriorityNotRequired) {
 | 
|    int num_inside = 0;
 | 
|    int num_outside = 0;
 | 
|    for (PictureLayerTiling::CoverageIterator iter(
 | 
| -           tiling, pending_layer_->contents_scale_x(), gfx::Rect(layer_bounds));
 | 
| -       iter;
 | 
| -       ++iter) {
 | 
| +           pending_layer_->HighResTiling(), 1.f, gfx::Rect(layer_bounds));
 | 
| +       iter; ++iter) {
 | 
|      if (!*iter)
 | 
|        continue;
 | 
|      Tile* tile = *iter;
 | 
| @@ -1683,16 +1712,13 @@ TEST_F(PictureLayerImplTest, HighResTileIsComplete) {
 | 
|    gfx::Size tile_size(100, 100);
 | 
|    gfx::Size layer_bounds(200, 200);
 | 
|  
 | 
| -  host_impl_.SetViewportSize(layer_bounds);
 | 
| -
 | 
|    scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| -  SetupPendingTree(pending_pile);
 | 
| +
 | 
| +  SetupPendingTreeWithFixedTileSize(pending_pile, tile_size, Region());
 | 
|    ActivateTree();
 | 
|  
 | 
|    // All high res tiles have resources.
 | 
| -  active_layer_->set_fixed_tile_size(tile_size);
 | 
| -  host_impl_.active_tree()->UpdateDrawProperties();
 | 
|    std::vector<Tile*> tiles =
 | 
|        active_layer_->tilings()->tiling_at(0)->AllTilesForTesting();
 | 
|    host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(tiles);
 | 
| @@ -1719,16 +1745,11 @@ TEST_F(PictureLayerImplTest, HighResTileIsIncomplete) {
 | 
|    gfx::Size tile_size(100, 100);
 | 
|    gfx::Size layer_bounds(200, 200);
 | 
|  
 | 
| -  host_impl_.SetViewportSize(layer_bounds);
 | 
| -
 | 
|    scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| -  SetupPendingTree(pending_pile);
 | 
| +  SetupPendingTreeWithFixedTileSize(pending_pile, tile_size, Region());
 | 
|    ActivateTree();
 | 
|  
 | 
| -  active_layer_->set_fixed_tile_size(tile_size);
 | 
| -  host_impl_.active_tree()->UpdateDrawProperties();
 | 
| -
 | 
|    scoped_ptr<RenderPass> render_pass = RenderPass::Create();
 | 
|    AppendQuadsData data;
 | 
|    active_layer_->WillDraw(DRAW_MODE_SOFTWARE, nullptr);
 | 
| @@ -1750,15 +1771,11 @@ TEST_F(PictureLayerImplTest, HighResTileIsIncompleteLowResComplete) {
 | 
|    gfx::Size tile_size(100, 100);
 | 
|    gfx::Size layer_bounds(200, 200);
 | 
|  
 | 
| -  host_impl_.SetViewportSize(layer_bounds);
 | 
| -
 | 
|    scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| -  SetupPendingTree(pending_pile);
 | 
| +  SetupPendingTreeWithFixedTileSize(pending_pile, tile_size, Region());
 | 
|    ActivateTree();
 | 
|  
 | 
| -  active_layer_->set_fixed_tile_size(tile_size);
 | 
| -  host_impl_.active_tree()->UpdateDrawProperties();
 | 
|    std::vector<Tile*> low_tiles =
 | 
|        active_layer_->tilings()->tiling_at(1)->AllTilesForTesting();
 | 
|    host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(low_tiles);
 | 
| @@ -1784,16 +1801,12 @@ TEST_F(PictureLayerImplTest, LowResTileIsIncomplete) {
 | 
|    gfx::Size tile_size(100, 100);
 | 
|    gfx::Size layer_bounds(200, 200);
 | 
|  
 | 
| -  host_impl_.SetViewportSize(layer_bounds);
 | 
| -
 | 
|    scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| -  SetupPendingTree(pending_pile);
 | 
| +  SetupPendingTreeWithFixedTileSize(pending_pile, tile_size, Region());
 | 
|    ActivateTree();
 | 
|  
 | 
|    // All high res tiles have resources except one.
 | 
| -  active_layer_->set_fixed_tile_size(tile_size);
 | 
| -  host_impl_.active_tree()->UpdateDrawProperties();
 | 
|    std::vector<Tile*> high_tiles =
 | 
|        active_layer_->tilings()->tiling_at(0)->AllTilesForTesting();
 | 
|    high_tiles.erase(high_tiles.begin());
 | 
| @@ -1826,20 +1839,16 @@ TEST_F(PictureLayerImplTest,
 | 
|  
 | 
|    gfx::Size tile_size(100, 100);
 | 
|    gfx::Size layer_bounds(200, 200);
 | 
| +  gfx::Size viewport_size(400, 400);
 | 
|  
 | 
| -  host_impl_.SetViewportSize(layer_bounds);
 | 
| +  host_impl_.SetViewportSize(viewport_size);
 | 
| +  host_impl_.SetDeviceScaleFactor(2.f);
 | 
|  
 | 
|    scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|    scoped_refptr<FakePicturePileImpl> active_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| -  SetupTrees(pending_pile, active_pile);
 | 
| -
 | 
| -  active_layer_->set_fixed_tile_size(tile_size);
 | 
| -
 | 
| -  active_layer_->draw_properties().visible_content_rect =
 | 
| -      gfx::Rect(layer_bounds);
 | 
| -  SetupDrawPropertiesAndUpdateTiles(active_layer_, 2.f, 1.f, 1.f, 1.f, false);
 | 
| +  SetupTreesWithFixedTileSize(pending_pile, active_pile, tile_size, Region());
 | 
|  
 | 
|    // One ideal tile exists, this will get used when drawing.
 | 
|    std::vector<Tile*> ideal_tiles;
 | 
| @@ -1891,14 +1900,9 @@ TEST_F(PictureLayerImplTest, HighResRequiredWhenUnsharedActiveAllReady) {
 | 
|    gfx::Size layer_bounds(400, 400);
 | 
|    gfx::Size tile_size(100, 100);
 | 
|  
 | 
| -  host_impl_.SetViewportSize(layer_bounds);
 | 
| -
 | 
| -  SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
 | 
| -
 | 
|    // No tiles shared.
 | 
| -  pending_layer_->set_invalidation(gfx::Rect(layer_bounds));
 | 
| -
 | 
| -  CreateHighLowResAndSetAllTilesVisible();
 | 
| +  SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size,
 | 
| +                                     gfx::Rect(layer_bounds));
 | 
|  
 | 
|    active_layer_->SetAllTilesReady();
 | 
|  
 | 
| @@ -1915,12 +1919,8 @@ TEST_F(PictureLayerImplTest, HighResRequiredWhenMissingHighResFlagOn) {
 | 
|    gfx::Size layer_bounds(400, 400);
 | 
|    gfx::Size tile_size(100, 100);
 | 
|  
 | 
| -  host_impl_.SetViewportSize(layer_bounds);
 | 
| -
 | 
| -  SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
 | 
| -
 | 
|    // All tiles shared (no invalidation).
 | 
| -  CreateHighLowResAndSetAllTilesVisible();
 | 
| +  SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size, Region());
 | 
|  
 | 
|    // Verify active tree not ready.
 | 
|    Tile* some_active_tile =
 | 
| @@ -1942,11 +1942,7 @@ TEST_F(PictureLayerImplTest, AllHighResRequiredEvenIfShared) {
 | 
|    gfx::Size layer_bounds(400, 400);
 | 
|    gfx::Size tile_size(100, 100);
 | 
|  
 | 
| -  host_impl_.SetViewportSize(layer_bounds);
 | 
| -
 | 
| -  SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
 | 
| -
 | 
| -  CreateHighLowResAndSetAllTilesVisible();
 | 
| +  SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size, Region());
 | 
|  
 | 
|    Tile* some_active_tile =
 | 
|        active_layer_->HighResTiling()->AllTilesForTesting()[0];
 | 
| @@ -1964,9 +1960,8 @@ TEST_F(PictureLayerImplTest, AllHighResRequiredEvenIfShared) {
 | 
|  TEST_F(PictureLayerImplTest, DisallowRequiredForActivation) {
 | 
|    gfx::Size layer_bounds(400, 400);
 | 
|    gfx::Size tile_size(100, 100);
 | 
| -  SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
 | 
|  
 | 
| -  CreateHighLowResAndSetAllTilesVisible();
 | 
| +  SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size, Region());
 | 
|  
 | 
|    Tile* some_active_tile =
 | 
|        active_layer_->HighResTiling()->AllTilesForTesting()[0];
 | 
| @@ -1986,6 +1981,7 @@ TEST_F(PictureLayerImplTest, DisallowRequiredForActivation) {
 | 
|  TEST_F(PictureLayerImplTest, NothingRequiredIfActiveMissingTiles) {
 | 
|    gfx::Size layer_bounds(400, 400);
 | 
|    gfx::Size tile_size(100, 100);
 | 
| +
 | 
|    scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|    // This pile will create tilings, but has no recordings so will not create any
 | 
| @@ -1995,11 +1991,8 @@ TEST_F(PictureLayerImplTest, NothingRequiredIfActiveMissingTiles) {
 | 
|    scoped_refptr<FakePicturePileImpl> active_pile =
 | 
|        FakePicturePileImpl::CreateEmptyPileThatThinksItHasRecordings(
 | 
|            tile_size, layer_bounds);
 | 
| -  SetupTrees(pending_pile, active_pile);
 | 
| -  pending_layer_->set_fixed_tile_size(tile_size);
 | 
| -  active_layer_->set_fixed_tile_size(tile_size);
 | 
|  
 | 
| -  CreateHighLowResAndSetAllTilesVisible();
 | 
| +  SetupTreesWithFixedTileSize(pending_pile, active_pile, tile_size, Region());
 | 
|  
 | 
|    // Active layer has tilings, but no tiles due to missing recordings.
 | 
|    EXPECT_TRUE(active_layer_->CanHaveTilings());
 | 
| @@ -2019,17 +2012,11 @@ TEST_F(PictureLayerImplTest, HighResRequiredIfActiveCantHaveTiles) {
 | 
|    gfx::Size layer_bounds(400, 400);
 | 
|    gfx::Size tile_size(100, 100);
 | 
|  
 | 
| -  host_impl_.SetViewportSize(layer_bounds);
 | 
| -
 | 
|    scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|    scoped_refptr<FakePicturePileImpl> active_pile =
 | 
|        FakePicturePileImpl::CreateEmptyPile(tile_size, layer_bounds);
 | 
| -  SetupTrees(pending_pile, active_pile);
 | 
| -  pending_layer_->set_fixed_tile_size(tile_size);
 | 
| -  active_layer_->set_fixed_tile_size(tile_size);
 | 
| -
 | 
| -  CreateHighLowResAndSetAllTilesVisible();
 | 
| +  SetupTreesWithFixedTileSize(pending_pile, active_pile, tile_size, Region());
 | 
|  
 | 
|    // Active layer can't have tiles.
 | 
|    EXPECT_FALSE(active_layer_->CanHaveTilings());
 | 
| @@ -2046,21 +2033,16 @@ TEST_F(PictureLayerImplTest, HighResRequiredIfActiveCantHaveTiles) {
 | 
|  }
 | 
|  
 | 
|  TEST_F(PictureLayerImplTest, HighResRequiredWhenActiveHasDifferentBounds) {
 | 
| -  gfx::Size layer_bounds(200, 200);
 | 
| -  gfx::Size tile_size(100, 100);
 | 
| -  SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
 | 
| -
 | 
|    gfx::Size pending_layer_bounds(400, 400);
 | 
| -  pending_layer_->SetBounds(pending_layer_bounds);
 | 
| +  gfx::Size active_layer_bounds(200, 200);
 | 
| +  gfx::Size tile_size(100, 100);
 | 
|  
 | 
| -  CreateHighLowResAndSetAllTilesVisible();
 | 
| -  // TODO(vmpstr): This is confusing. Rework the test to create different bounds
 | 
| -  // on different trees instead of fudging tilings.
 | 
| -  pending_layer_->HighResTiling()->ComputeTilePriorityRects(
 | 
| -      gfx::Rect(pending_layer_bounds), 1.f, 1.f, Occlusion());
 | 
| +  scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
| +      FakePicturePileImpl::CreateFilledPile(tile_size, pending_layer_bounds);
 | 
| +  scoped_refptr<FakePicturePileImpl> active_pile =
 | 
| +      FakePicturePileImpl::CreateFilledPile(tile_size, active_layer_bounds);
 | 
|  
 | 
| -  pending_layer_->HighResTiling()->UpdateAllTilePrioritiesForTesting();
 | 
| -  active_layer_->SetAllTilesReady();
 | 
| +  SetupTreesWithFixedTileSize(pending_pile, active_pile, tile_size, Region());
 | 
|  
 | 
|    // Since the active layer has different bounds, the pending layer needs all
 | 
|    // high res tiles in order to activate.
 | 
| @@ -2108,9 +2090,15 @@ TEST_F(PictureLayerImplTest, ActivateUninitializedLayer) {
 | 
|  }
 | 
|  
 | 
|  TEST_F(PictureLayerImplTest, ShareTilesOnNextFrame) {
 | 
| -  SetupDefaultTrees(gfx::Size(1500, 1500));
 | 
| +  gfx::Size layer_bounds(1500, 1500);
 | 
| +  gfx::Size tile_size(100, 100);
 | 
|  
 | 
| -  PictureLayerTiling* tiling = pending_layer_->AddTiling(1.f);
 | 
| +  scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
| +      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| +
 | 
| +  SetupPendingTree(pending_pile);
 | 
| +
 | 
| +  PictureLayerTiling* tiling = pending_layer_->HighResTiling();
 | 
|    gfx::Rect first_invalidate = tiling->TilingDataForTesting().TileBounds(0, 0);
 | 
|    first_invalidate.Inset(tiling->TilingDataForTesting().border_texels(),
 | 
|                           tiling->TilingDataForTesting().border_texels());
 | 
| @@ -2118,22 +2106,20 @@ TEST_F(PictureLayerImplTest, ShareTilesOnNextFrame) {
 | 
|    second_invalidate.Inset(tiling->TilingDataForTesting().border_texels(),
 | 
|                            tiling->TilingDataForTesting().border_texels());
 | 
|  
 | 
| +  ActivateTree();
 | 
| +
 | 
|    // Make a pending tree with an invalidated raster tile 0,0.
 | 
| -  tiling->CreateAllTilesForTesting();
 | 
| -  pending_layer_->set_invalidation(first_invalidate);
 | 
| +  SetupPendingTreeWithInvalidation(pending_pile, first_invalidate);
 | 
|  
 | 
|    // Activate and make a pending tree with an invalidated raster tile 1,1.
 | 
|    ActivateTree();
 | 
|  
 | 
| -  host_impl_.CreatePendingTree();
 | 
| -  pending_layer_ = static_cast<FakePictureLayerImpl*>(
 | 
| -      host_impl_.pending_tree()->root_layer());
 | 
| -  pending_layer_->set_invalidation(second_invalidate);
 | 
| +  SetupPendingTreeWithInvalidation(pending_pile, second_invalidate);
 | 
|  
 | 
|    PictureLayerTiling* pending_tiling = pending_layer_->tilings()->tiling_at(0);
 | 
|    PictureLayerTiling* active_tiling = active_layer_->tilings()->tiling_at(0);
 | 
|  
 | 
| -  pending_tiling->CreateAllTilesForTesting();
 | 
| +  // pending_tiling->CreateAllTilesForTesting();
 | 
|  
 | 
|    // Tile 0,0 should be shared, but tile 1,1 should not be.
 | 
|    EXPECT_EQ(active_tiling->TileAt(0, 0), pending_tiling->TileAt(0, 0));
 | 
| @@ -2162,180 +2148,138 @@ TEST_F(PictureLayerImplTest, ShareTilesOnNextFrame) {
 | 
|    EXPECT_FALSE(pending_tiling->TileAt(1, 1)->is_shared());
 | 
|  }
 | 
|  
 | 
| -TEST_F(PictureLayerImplTest, ShareTilesOnSync) {
 | 
| +TEST_F(PictureLayerImplTest, ShareTilesWithNoInvalidation) {
 | 
|    SetupDefaultTrees(gfx::Size(1500, 1500));
 | 
| -  AddDefaultTilingsWithInvalidation(gfx::Rect());
 | 
|  
 | 
| -  host_impl_.ActivateSyncTree();
 | 
| -  host_impl_.CreatePendingTree();
 | 
| -  active_layer_ = static_cast<FakePictureLayerImpl*>(
 | 
| -      host_impl_.active_tree()->LayerById(id_));
 | 
| +  EXPECT_GE(active_layer_->num_tilings(), 1u);
 | 
| +  EXPECT_GE(pending_layer_->num_tilings(), 1u);
 | 
| +
 | 
| +  // No invalidation, so all tiles are shared.
 | 
| +  PictureLayerTiling* active_tiling = active_layer_->tilings()->tiling_at(0);
 | 
| +  PictureLayerTiling* pending_tiling = pending_layer_->tilings()->tiling_at(0);
 | 
| +  ASSERT_TRUE(active_tiling);
 | 
| +  ASSERT_TRUE(pending_tiling);
 | 
|  
 | 
| -  // Force the active tree to sync to the pending tree "post-commit".
 | 
| -  pending_layer_->DoPostCommitInitializationIfNeeded();
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(0, 0));
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(1, 0));
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(0, 1));
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(1, 1));
 | 
|  
 | 
| -  // Both invalidations should drop tiles from the pending tree.
 | 
| -  EXPECT_EQ(3u, active_layer_->num_tilings());
 | 
| -  EXPECT_EQ(3u, pending_layer_->num_tilings());
 | 
| -  for (size_t i = 0; i < active_layer_->num_tilings(); ++i) {
 | 
| -    PictureLayerTiling* active_tiling = active_layer_->tilings()->tiling_at(i);
 | 
| -    PictureLayerTiling* pending_tiling =
 | 
| -        pending_layer_->tilings()->tiling_at(i);
 | 
| -
 | 
| -    ASSERT_TRUE(active_tiling);
 | 
| -    ASSERT_TRUE(pending_tiling);
 | 
| -
 | 
| -    EXPECT_TRUE(active_tiling->TileAt(0, 0));
 | 
| -    EXPECT_TRUE(active_tiling->TileAt(1, 0));
 | 
| -    EXPECT_TRUE(active_tiling->TileAt(0, 1));
 | 
| -    EXPECT_TRUE(active_tiling->TileAt(1, 1));
 | 
| -
 | 
| -    EXPECT_TRUE(pending_tiling->TileAt(0, 0));
 | 
| -    EXPECT_TRUE(pending_tiling->TileAt(1, 0));
 | 
| -    EXPECT_TRUE(pending_tiling->TileAt(0, 1));
 | 
| -    EXPECT_TRUE(pending_tiling->TileAt(1, 1));
 | 
| -
 | 
| -    EXPECT_EQ(active_tiling->TileAt(0, 0), pending_tiling->TileAt(0, 0));
 | 
| -    EXPECT_TRUE(active_tiling->TileAt(0, 0)->is_shared());
 | 
| -    EXPECT_EQ(active_tiling->TileAt(1, 0), pending_tiling->TileAt(1, 0));
 | 
| -    EXPECT_TRUE(active_tiling->TileAt(1, 0)->is_shared());
 | 
| -    EXPECT_EQ(active_tiling->TileAt(0, 1), pending_tiling->TileAt(0, 1));
 | 
| -    EXPECT_TRUE(active_tiling->TileAt(0, 1)->is_shared());
 | 
| -    EXPECT_EQ(active_tiling->TileAt(1, 1), pending_tiling->TileAt(1, 1));
 | 
| -    EXPECT_TRUE(active_tiling->TileAt(1, 1)->is_shared());
 | 
| -  }
 | 
| +  EXPECT_TRUE(pending_tiling->TileAt(0, 0));
 | 
| +  EXPECT_TRUE(pending_tiling->TileAt(1, 0));
 | 
| +  EXPECT_TRUE(pending_tiling->TileAt(0, 1));
 | 
| +  EXPECT_TRUE(pending_tiling->TileAt(1, 1));
 | 
| +
 | 
| +  EXPECT_EQ(active_tiling->TileAt(0, 0), pending_tiling->TileAt(0, 0));
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(0, 0)->is_shared());
 | 
| +  EXPECT_EQ(active_tiling->TileAt(1, 0), pending_tiling->TileAt(1, 0));
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(1, 0)->is_shared());
 | 
| +  EXPECT_EQ(active_tiling->TileAt(0, 1), pending_tiling->TileAt(0, 1));
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(0, 1)->is_shared());
 | 
| +  EXPECT_EQ(active_tiling->TileAt(1, 1), pending_tiling->TileAt(1, 1));
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(1, 1)->is_shared());
 | 
|  }
 | 
|  
 | 
| -TEST_F(PictureLayerImplTest, ShareInvalidActiveTreeTilesOnSync) {
 | 
| -  SetupDefaultTrees(gfx::Size(1500, 1500));
 | 
| -  AddDefaultTilingsWithInvalidation(gfx::Rect(0, 0, 1, 1));
 | 
| +TEST_F(PictureLayerImplTest, ShareInvalidActiveTreeTiles) {
 | 
| +  gfx::Size tile_size(100, 100);
 | 
| +  gfx::Size layer_bounds(1500, 1500);
 | 
|  
 | 
| -  // This activates the 0,0,1,1 invalidation.
 | 
| -  host_impl_.ActivateSyncTree();
 | 
| -  host_impl_.CreatePendingTree();
 | 
| -  active_layer_ = static_cast<FakePictureLayerImpl*>(
 | 
| -      host_impl_.active_tree()->LayerById(id_));
 | 
| +  scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
| +      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| +  scoped_refptr<FakePicturePileImpl> active_pile =
 | 
| +      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| +  SetupTreesWithInvalidation(pending_pile, active_pile, gfx::Rect(1, 1));
 | 
| +  // Activate the invalidation.
 | 
| +  ActivateTree();
 | 
| +  // Make another pending tree without any invalidation in it.
 | 
| +  scoped_refptr<FakePicturePileImpl> pending_pile2 =
 | 
| +      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| +  SetupPendingTree(pending_pile2);
 | 
|  
 | 
| -  // Force the active tree to sync to the pending tree "post-commit".
 | 
| -  pending_layer_->DoPostCommitInitializationIfNeeded();
 | 
| +  EXPECT_GE(active_layer_->num_tilings(), 1u);
 | 
| +  EXPECT_GE(pending_layer_->num_tilings(), 1u);
 | 
|  
 | 
|    // The active tree invalidation was handled by the active tiles, so they
 | 
|    // can be shared with the pending tree.
 | 
| -  EXPECT_EQ(3u, active_layer_->num_tilings());
 | 
| -  EXPECT_EQ(3u, pending_layer_->num_tilings());
 | 
| -  for (size_t i = 0; i < active_layer_->num_tilings(); ++i) {
 | 
| -    PictureLayerTiling* active_tiling = active_layer_->tilings()->tiling_at(i);
 | 
| -    PictureLayerTiling* pending_tiling =
 | 
| -        pending_layer_->tilings()->tiling_at(i);
 | 
| -
 | 
| -    ASSERT_TRUE(active_tiling);
 | 
| -    ASSERT_TRUE(pending_tiling);
 | 
| -
 | 
| -    EXPECT_TRUE(active_tiling->TileAt(0, 0));
 | 
| -    EXPECT_TRUE(active_tiling->TileAt(1, 0));
 | 
| -    EXPECT_TRUE(active_tiling->TileAt(0, 1));
 | 
| -    EXPECT_TRUE(active_tiling->TileAt(1, 1));
 | 
| -
 | 
| -    EXPECT_TRUE(pending_tiling->TileAt(0, 0));
 | 
| -    EXPECT_TRUE(pending_tiling->TileAt(1, 0));
 | 
| -    EXPECT_TRUE(pending_tiling->TileAt(0, 1));
 | 
| -    EXPECT_TRUE(pending_tiling->TileAt(1, 1));
 | 
| -
 | 
| -    EXPECT_EQ(active_tiling->TileAt(0, 0), pending_tiling->TileAt(0, 0));
 | 
| -    EXPECT_TRUE(active_tiling->TileAt(0, 0)->is_shared());
 | 
| -    EXPECT_EQ(active_tiling->TileAt(1, 0), pending_tiling->TileAt(1, 0));
 | 
| -    EXPECT_TRUE(active_tiling->TileAt(1, 0)->is_shared());
 | 
| -    EXPECT_EQ(active_tiling->TileAt(0, 1), pending_tiling->TileAt(0, 1));
 | 
| -    EXPECT_TRUE(active_tiling->TileAt(0, 1)->is_shared());
 | 
| -    EXPECT_EQ(active_tiling->TileAt(1, 1), pending_tiling->TileAt(1, 1));
 | 
| -    EXPECT_TRUE(active_tiling->TileAt(1, 1)->is_shared());
 | 
| -  }
 | 
| -}
 | 
| +  PictureLayerTiling* active_tiling = active_layer_->tilings()->tiling_at(0);
 | 
| +  PictureLayerTiling* pending_tiling = pending_layer_->tilings()->tiling_at(0);
 | 
| +  ASSERT_TRUE(active_tiling);
 | 
| +  ASSERT_TRUE(pending_tiling);
 | 
|  
 | 
| -TEST_F(PictureLayerImplTest, RemoveInvalidPendingTreeTilesOnSync) {
 | 
| -  SetupDefaultTrees(gfx::Size(1500, 1500));
 | 
| -  AddDefaultTilingsWithInvalidation(gfx::Rect());
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(0, 0));
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(1, 0));
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(0, 1));
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(1, 1));
 | 
|  
 | 
| -  host_impl_.ActivateSyncTree();
 | 
| -  host_impl_.CreatePendingTree();
 | 
| -  active_layer_ = static_cast<FakePictureLayerImpl*>(
 | 
| -      host_impl_.active_tree()->LayerById(id_));
 | 
| +  EXPECT_TRUE(pending_tiling->TileAt(0, 0));
 | 
| +  EXPECT_TRUE(pending_tiling->TileAt(1, 0));
 | 
| +  EXPECT_TRUE(pending_tiling->TileAt(0, 1));
 | 
| +  EXPECT_TRUE(pending_tiling->TileAt(1, 1));
 | 
|  
 | 
| -  // Set some invalidation on the pending tree "during commit". We should
 | 
| -  // replace raster tiles that touch this.
 | 
| -  pending_layer_->set_invalidation(gfx::Rect(1, 1));
 | 
| +  EXPECT_EQ(active_tiling->TileAt(0, 0), pending_tiling->TileAt(0, 0));
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(0, 0)->is_shared());
 | 
| +  EXPECT_EQ(active_tiling->TileAt(1, 0), pending_tiling->TileAt(1, 0));
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(1, 0)->is_shared());
 | 
| +  EXPECT_EQ(active_tiling->TileAt(0, 1), pending_tiling->TileAt(0, 1));
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(0, 1)->is_shared());
 | 
| +  EXPECT_EQ(active_tiling->TileAt(1, 1), pending_tiling->TileAt(1, 1));
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(1, 1)->is_shared());
 | 
| +}
 | 
|  
 | 
| -  // Force the active tree to sync to the pending tree "post-commit".
 | 
| -  pending_layer_->DoPostCommitInitializationIfNeeded();
 | 
| +TEST_F(PictureLayerImplTest, RecreateInvalidPendingTreeTiles) {
 | 
| +  // Set some invalidation on the pending tree. We should replace raster tiles
 | 
| +  // that touch this.
 | 
| +  SetupDefaultTreesWithInvalidation(gfx::Size(1500, 1500), gfx::Rect(1, 1));
 | 
| +
 | 
| +  EXPECT_GE(active_layer_->num_tilings(), 1u);
 | 
| +  EXPECT_GE(pending_layer_->num_tilings(), 1u);
 | 
|  
 | 
|    // The pending tree invalidation means tiles can not be shared with the
 | 
|    // active tree.
 | 
| -  EXPECT_EQ(3u, active_layer_->num_tilings());
 | 
| -  EXPECT_EQ(3u, pending_layer_->num_tilings());
 | 
| -  for (size_t i = 0; i < active_layer_->num_tilings(); ++i) {
 | 
| -    PictureLayerTiling* active_tiling = active_layer_->tilings()->tiling_at(i);
 | 
| -    PictureLayerTiling* pending_tiling =
 | 
| -        pending_layer_->tilings()->tiling_at(i);
 | 
| -
 | 
| -    ASSERT_TRUE(active_tiling);
 | 
| -    ASSERT_TRUE(pending_tiling);
 | 
| -
 | 
| -    EXPECT_TRUE(active_tiling->TileAt(0, 0));
 | 
| -    EXPECT_TRUE(active_tiling->TileAt(1, 0));
 | 
| -    EXPECT_TRUE(active_tiling->TileAt(0, 1));
 | 
| -    EXPECT_TRUE(active_tiling->TileAt(1, 1));
 | 
| -
 | 
| -    EXPECT_TRUE(pending_tiling->TileAt(0, 0));
 | 
| -    EXPECT_TRUE(pending_tiling->TileAt(1, 0));
 | 
| -    EXPECT_TRUE(pending_tiling->TileAt(0, 1));
 | 
| -    EXPECT_TRUE(pending_tiling->TileAt(1, 1));
 | 
| -
 | 
| -    EXPECT_NE(active_tiling->TileAt(0, 0), pending_tiling->TileAt(0, 0));
 | 
| -    EXPECT_FALSE(active_tiling->TileAt(0, 0)->is_shared());
 | 
| -    EXPECT_FALSE(pending_tiling->TileAt(0, 0)->is_shared());
 | 
| -    EXPECT_EQ(active_tiling->TileAt(1, 0), pending_tiling->TileAt(1, 0));
 | 
| -    EXPECT_TRUE(active_tiling->TileAt(1, 0)->is_shared());
 | 
| -    EXPECT_EQ(active_tiling->TileAt(0, 1), pending_tiling->TileAt(0, 1));
 | 
| -    EXPECT_TRUE(active_tiling->TileAt(1, 1)->is_shared());
 | 
| -    EXPECT_EQ(active_tiling->TileAt(1, 1), pending_tiling->TileAt(1, 1));
 | 
| -    EXPECT_TRUE(active_tiling->TileAt(1, 1)->is_shared());
 | 
| -  }
 | 
| +  PictureLayerTiling* active_tiling = active_layer_->tilings()->tiling_at(0);
 | 
| +  PictureLayerTiling* pending_tiling = pending_layer_->tilings()->tiling_at(0);
 | 
| +  ASSERT_TRUE(active_tiling);
 | 
| +  ASSERT_TRUE(pending_tiling);
 | 
| +
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(0, 0));
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(1, 0));
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(0, 1));
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(1, 1));
 | 
| +
 | 
| +  EXPECT_TRUE(pending_tiling->TileAt(0, 0));
 | 
| +  EXPECT_TRUE(pending_tiling->TileAt(1, 0));
 | 
| +  EXPECT_TRUE(pending_tiling->TileAt(0, 1));
 | 
| +  EXPECT_TRUE(pending_tiling->TileAt(1, 1));
 | 
| +
 | 
| +  EXPECT_NE(active_tiling->TileAt(0, 0), pending_tiling->TileAt(0, 0));
 | 
| +  EXPECT_FALSE(active_tiling->TileAt(0, 0)->is_shared());
 | 
| +  EXPECT_FALSE(pending_tiling->TileAt(0, 0)->is_shared());
 | 
| +  EXPECT_EQ(active_tiling->TileAt(1, 0), pending_tiling->TileAt(1, 0));
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(1, 0)->is_shared());
 | 
| +  EXPECT_EQ(active_tiling->TileAt(0, 1), pending_tiling->TileAt(0, 1));
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(1, 1)->is_shared());
 | 
| +  EXPECT_EQ(active_tiling->TileAt(1, 1), pending_tiling->TileAt(1, 1));
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(1, 1)->is_shared());
 | 
|  }
 | 
|  
 | 
| -TEST_F(PictureLayerImplTest, SyncTilingAfterReleaseResource) {
 | 
| -  SetupDefaultTrees(gfx::Size(10, 10));
 | 
| -  host_impl_.active_tree()->UpdateDrawProperties();
 | 
| -  EXPECT_FALSE(host_impl_.active_tree()->needs_update_draw_properties());
 | 
| +TEST_F(PictureLayerImplTest, SyncTilingAfterGpuRasterizationToggles) {
 | 
| +  base::TimeTicks time_ticks;
 | 
| +  time_ticks += base::TimeDelta::FromMilliseconds(1);
 | 
| +  host_impl_.SetCurrentBeginFrameArgs(
 | 
| +      CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
 | 
|  
 | 
| -  // Contrived unit test of a real crash. A layer is transparent during a
 | 
| -  // context loss, and later becomes opaque, causing active layer SyncTiling to
 | 
| -  // be called.
 | 
| -  float new_scale = 1.f;
 | 
| -  active_layer_->ReleaseResources();
 | 
| -  pending_layer_->ReleaseResources();
 | 
| -  EXPECT_FALSE(active_layer_->tilings()->FindTilingWithScale(new_scale));
 | 
| -  pending_layer_->AddTiling(new_scale);
 | 
| -  EXPECT_TRUE(active_layer_->tilings()->FindTilingWithScale(new_scale));
 | 
| -
 | 
| -  // UpdateDrawProperties early-outs if the tree doesn't need it.  It is also
 | 
| -  // responsible for calling ManageTilings.  These checks verify that
 | 
| -  // ReleaseResources has set needs update draw properties so that the
 | 
| -  // new tiling gets the appropriate resolution set in ManageTilings.
 | 
| -  EXPECT_TRUE(host_impl_.active_tree()->needs_update_draw_properties());
 | 
| -  host_impl_.active_tree()->UpdateDrawProperties();
 | 
| -  PictureLayerTiling* high_res =
 | 
| -      active_layer_->tilings()->FindTilingWithScale(new_scale);
 | 
| -  ASSERT_TRUE(!!high_res);
 | 
| -  EXPECT_EQ(HIGH_RESOLUTION, high_res->resolution());
 | 
| -}
 | 
| +  gfx::Size tile_size(100, 100);
 | 
| +  gfx::Size layer_bounds(10, 10);
 | 
|  
 | 
| -TEST_F(PictureLayerImplTest, SyncTilingAfterGpuRasterizationToggles) {
 | 
| -  SetupDefaultTrees(gfx::Size(10, 10));
 | 
| +  scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
| +      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| +  scoped_refptr<FakePicturePileImpl> active_pile =
 | 
| +      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| +
 | 
| +  SetupTrees(pending_pile, active_pile);
 | 
|  
 | 
| -  const float kScale = 1.f;
 | 
| -  pending_layer_->AddTiling(kScale);
 | 
| -  EXPECT_TRUE(pending_layer_->tilings()->FindTilingWithScale(kScale));
 | 
| -  EXPECT_TRUE(active_layer_->tilings()->FindTilingWithScale(kScale));
 | 
| +  EXPECT_TRUE(pending_layer_->tilings()->FindTilingWithScale(1.f));
 | 
| +  EXPECT_TRUE(active_layer_->tilings()->FindTilingWithScale(1.f));
 | 
|  
 | 
|    // Gpu rasterization is disabled by default.
 | 
|    EXPECT_FALSE(host_impl_.use_gpu_rasterization());
 | 
| @@ -2346,9 +2290,17 @@ TEST_F(PictureLayerImplTest, SyncTilingAfterGpuRasterizationToggles) {
 | 
|  
 | 
|    // Make sure that we can still add tiling to the pending layer,
 | 
|    // that gets synced to the active layer.
 | 
| -  pending_layer_->AddTiling(kScale);
 | 
| -  EXPECT_TRUE(pending_layer_->tilings()->FindTilingWithScale(kScale));
 | 
| -  EXPECT_TRUE(active_layer_->tilings()->FindTilingWithScale(kScale));
 | 
| +  time_ticks += base::TimeDelta::FromMilliseconds(1);
 | 
| +  host_impl_.SetCurrentBeginFrameArgs(
 | 
| +      CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
 | 
| +  host_impl_.pending_tree()->UpdateDrawProperties();
 | 
| +  EXPECT_TRUE(pending_layer_->tilings()->FindTilingWithScale(1.f));
 | 
| +
 | 
| +  ActivateTree();
 | 
| +  EXPECT_TRUE(active_layer_->tilings()->FindTilingWithScale(1.f));
 | 
| +
 | 
| +  SetupPendingTree(pending_pile);
 | 
| +  EXPECT_TRUE(pending_layer_->tilings()->FindTilingWithScale(1.f));
 | 
|  
 | 
|    // Toggling the gpu rasterization clears all tilings on both trees.
 | 
|    EXPECT_TRUE(host_impl_.use_gpu_rasterization());
 | 
| @@ -2360,72 +2312,62 @@ TEST_F(PictureLayerImplTest, SyncTilingAfterGpuRasterizationToggles) {
 | 
|  TEST_F(PictureLayerImplTest, HighResCreatedWhenBoundsShrink) {
 | 
|    gfx::Size tile_size(100, 100);
 | 
|  
 | 
| -  scoped_refptr<FakePicturePileImpl> active_pile =
 | 
| -      FakePicturePileImpl::CreateFilledPile(tile_size, gfx::Size(10, 10));
 | 
| -  SetupPendingTree(active_pile);
 | 
| -  ActivateTree();
 | 
| -  host_impl_.active_tree()->UpdateDrawProperties();
 | 
| -  EXPECT_FALSE(host_impl_.active_tree()->needs_update_draw_properties());
 | 
| +  // Put 0.5 as high res.
 | 
| +  host_impl_.SetDeviceScaleFactor(0.5f);
 | 
|  
 | 
| -  SetupDrawPropertiesAndUpdateTiles(
 | 
| -      active_layer_, 0.5f, 0.5f, 0.5f, 0.5f, false);
 | 
| -  active_layer_->tilings()->RemoveAllTilings();
 | 
| -  PictureLayerTiling* tiling = active_layer_->AddTiling(0.5f);
 | 
| -  active_layer_->AddTiling(1.5f);
 | 
| -  active_layer_->AddTiling(0.25f);
 | 
| -  tiling->set_resolution(HIGH_RESOLUTION);
 | 
| +  scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
| +      FakePicturePileImpl::CreateFilledPile(tile_size, gfx::Size(10, 10));
 | 
| +  SetupPendingTree(pending_pile);
 | 
|  
 | 
|    // Sanity checks.
 | 
| -  ASSERT_EQ(3u, active_layer_->tilings()->num_tilings());
 | 
| -  ASSERT_EQ(tiling, active_layer_->tilings()->FindTilingWithScale(0.5f));
 | 
| +  EXPECT_EQ(1u, pending_layer_->tilings()->num_tilings());
 | 
| +  EXPECT_TRUE(pending_layer_->tilings()->FindTilingWithScale(0.5f));
 | 
|  
 | 
| -  // Now, set the bounds to be 1x1 (so that minimum contents scale becomes
 | 
| -  // 1.0f). Note that we should also ensure that the pending layer needs post
 | 
| -  // commit initialization, since this is what would happen during commit. In
 | 
| -  // other words we want the pending layer to sync from the active layer.
 | 
| -  scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
| +  ActivateTree();
 | 
| +
 | 
| +  // Now, set the bounds to be 1x1, so that minimum contents scale becomes 1.
 | 
| +  pending_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, gfx::Size(1, 1));
 | 
|    SetupPendingTree(pending_pile);
 | 
|  
 | 
| -  // Update the draw properties: sync from active tree should happen here.
 | 
| -  host_impl_.pending_tree()->UpdateDrawProperties();
 | 
| -  EXPECT_FALSE(pending_layer_->needs_post_commit_initialization());
 | 
| -
 | 
|    // Another sanity check.
 | 
| -  ASSERT_EQ(1.f, pending_layer_->MinimumContentsScale());
 | 
| +  EXPECT_EQ(1.f, pending_layer_->MinimumContentsScale());
 | 
|  
 | 
| -  // Now we should've synced 1.5f tiling, since that's the only one that doesn't
 | 
| -  // violate minimum contents scale. At the same time, we should've created a
 | 
| -  // new high res tiling at scale 1.0f.
 | 
| -  EXPECT_EQ(2u, pending_layer_->tilings()->num_tilings());
 | 
| -  ASSERT_TRUE(pending_layer_->tilings()->FindTilingWithScale(1.0f));
 | 
| -  EXPECT_EQ(HIGH_RESOLUTION,
 | 
| -            pending_layer_->tilings()->FindTilingWithScale(1.0f)->resolution());
 | 
| -  ASSERT_TRUE(pending_layer_->tilings()->FindTilingWithScale(1.5f));
 | 
| -  EXPECT_EQ(NON_IDEAL_RESOLUTION,
 | 
| -            pending_layer_->tilings()->FindTilingWithScale(1.5f)->resolution());
 | 
| +  // Since the MinContentsScale is 1, the 0.5 tiling should be replaced by a 1.0
 | 
| +  // tiling.
 | 
| +  SetupDrawPropertiesAndUpdateTiles(pending_layer_, 0.5f, 1.f, 1.f, 1.f, false);
 | 
| +
 | 
| +  EXPECT_EQ(1u, pending_layer_->tilings()->num_tilings());
 | 
| +  PictureLayerTiling* tiling =
 | 
| +      pending_layer_->tilings()->FindTilingWithScale(1.0f);
 | 
| +  ASSERT_TRUE(tiling);
 | 
| +  EXPECT_EQ(HIGH_RESOLUTION, tiling->resolution());
 | 
|  }
 | 
|  
 | 
| -TEST_F(PictureLayerImplTest, NoLowResTilingWithGpuRasterization) {
 | 
| +TEST_F(PictureLayerImplTest, LowResTilingWithoutGpuRasterization) {
 | 
|    gfx::Size default_tile_size(host_impl_.settings().default_tile_size);
 | 
|    gfx::Size layer_bounds(default_tile_size.width() * 4,
 | 
|                           default_tile_size.height() * 4);
 | 
|  
 | 
| +  host_impl_.SetUseGpuRasterization(false);
 | 
| +
 | 
|    SetupDefaultTrees(layer_bounds);
 | 
|    EXPECT_FALSE(host_impl_.use_gpu_rasterization());
 | 
| -  EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
 | 
| -  SetupDrawPropertiesAndUpdateTiles(pending_layer_, 1.f, 1.f, 1.f, 1.f, false);
 | 
|    // Should have a low-res and a high-res tiling.
 | 
| -  ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings());
 | 
| +  EXPECT_EQ(2u, pending_layer_->tilings()->num_tilings());
 | 
| +}
 | 
|  
 | 
| -  ResetTilingsAndRasterScales();
 | 
| +TEST_F(PictureLayerImplTest, NoLowResTilingWithGpuRasterization) {
 | 
| +  gfx::Size default_tile_size(host_impl_.settings().default_tile_size);
 | 
| +  gfx::Size layer_bounds(default_tile_size.width() * 4,
 | 
| +                         default_tile_size.height() * 4);
 | 
|  
 | 
|    host_impl_.SetUseGpuRasterization(true);
 | 
| -  EXPECT_TRUE(host_impl_.use_gpu_rasterization());
 | 
| -  SetupDrawPropertiesAndUpdateTiles(pending_layer_, 1.f, 1.f, 1.f, 1.f, false);
 | 
|  
 | 
| +  SetupDefaultTrees(layer_bounds);
 | 
| +  EXPECT_TRUE(host_impl_.use_gpu_rasterization());
 | 
|    // Should only have the high-res tiling.
 | 
| -  ASSERT_EQ(1u, pending_layer_->tilings()->num_tilings());
 | 
| +  EXPECT_EQ(1u, pending_layer_->tilings()->num_tilings());
 | 
|  }
 | 
|  
 | 
|  TEST_F(PictureLayerImplTest, NoTilingIfDoesNotDrawContent) {
 | 
| @@ -2450,31 +2392,38 @@ TEST_F(PictureLayerImplTest, NoTilingIfDoesNotDrawContent) {
 | 
|  
 | 
|  TEST_F(PictureLayerImplTest, FirstTilingDuringPinch) {
 | 
|    SetupDefaultTrees(gfx::Size(10, 10));
 | 
| +
 | 
| +  // We start with a tiling at scale 1.
 | 
| +  EXPECT_EQ(1.f, pending_layer_->HighResTiling()->contents_scale());
 | 
| +
 | 
| +  // When we scale up by 2.3, we get a new tiling that is a power of 2, in this
 | 
| +  // case 4.
 | 
|    host_impl_.PinchGestureBegin();
 | 
|    float high_res_scale = 2.3f;
 | 
|    SetContentsScaleOnBothLayers(high_res_scale, 1.f, 1.f, 1.f, false);
 | 
| -
 | 
| -  ASSERT_GE(pending_layer_->num_tilings(), 0u);
 | 
| -  EXPECT_FLOAT_EQ(high_res_scale,
 | 
| -                  pending_layer_->HighResTiling()->contents_scale());
 | 
| +  EXPECT_EQ(4.f, pending_layer_->HighResTiling()->contents_scale());
 | 
|  }
 | 
|  
 | 
| -TEST_F(PictureLayerImplTest, FirstTilingTooSmall) {
 | 
| +TEST_F(PictureLayerImplTest, PinchingTooSmall) {
 | 
|    SetupDefaultTrees(gfx::Size(10, 10));
 | 
| +
 | 
| +  // We start with a tiling at scale 1.
 | 
| +  EXPECT_EQ(1.f, pending_layer_->HighResTiling()->contents_scale());
 | 
| +
 | 
|    host_impl_.PinchGestureBegin();
 | 
|    float high_res_scale = 0.0001f;
 | 
| -  EXPECT_GT(pending_layer_->MinimumContentsScale(), high_res_scale);
 | 
| -
 | 
| -  SetContentsScaleOnBothLayers(high_res_scale, 1.f, 1.f, 1.f, false);
 | 
| +  EXPECT_LT(high_res_scale, pending_layer_->MinimumContentsScale());
 | 
|  
 | 
| -  ASSERT_GE(pending_layer_->num_tilings(), 0u);
 | 
| +  SetContentsScaleOnBothLayers(high_res_scale, 1.f, high_res_scale, 1.f, false);
 | 
|    EXPECT_FLOAT_EQ(pending_layer_->MinimumContentsScale(),
 | 
|                    pending_layer_->HighResTiling()->contents_scale());
 | 
|  }
 | 
|  
 | 
| -TEST_F(PictureLayerImplTest, PinchingTooSmall) {
 | 
| +TEST_F(PictureLayerImplTest, PinchingTooSmallWithContentsScale) {
 | 
|    SetupDefaultTrees(gfx::Size(10, 10));
 | 
|  
 | 
| +  ResetTilingsAndRasterScales();
 | 
| +
 | 
|    float contents_scale = 0.15f;
 | 
|    SetContentsScaleOnBothLayers(contents_scale, 1.f, 1.f, 1.f, false);
 | 
|  
 | 
| @@ -2542,22 +2491,18 @@ TEST_F(DeferredInitPictureLayerImplTest, PreventUpdateTilesDuringLostContext) {
 | 
|  }
 | 
|  
 | 
|  TEST_F(PictureLayerImplTest, HighResTilingDuringAnimationForCpuRasterization) {
 | 
| -  gfx::Size layer_bounds(100, 100);
 | 
|    gfx::Size viewport_size(1000, 1000);
 | 
| -  SetupDefaultTrees(layer_bounds);
 | 
|    host_impl_.SetViewportSize(viewport_size);
 | 
|  
 | 
| +  gfx::Size layer_bounds(100, 100);
 | 
| +  SetupDefaultTrees(layer_bounds);
 | 
| +
 | 
|    float contents_scale = 1.f;
 | 
| -  float device_scale = 1.3f;
 | 
| -  float page_scale = 1.4f;
 | 
| +  float device_scale = 1.f;
 | 
| +  float page_scale = 1.f;
 | 
|    float maximum_animation_scale = 1.f;
 | 
|    bool animating_transform = false;
 | 
|  
 | 
| -  SetContentsScaleOnBothLayers(contents_scale,
 | 
| -                               device_scale,
 | 
| -                               page_scale,
 | 
| -                               maximum_animation_scale,
 | 
| -                               animating_transform);
 | 
|    EXPECT_BOTH_EQ(HighResTiling()->contents_scale(), 1.f);
 | 
|  
 | 
|    // Since we're CPU-rasterizing, starting an animation should cause tiling
 | 
| @@ -2781,6 +2726,8 @@ TEST_F(PictureLayerImplTest, TilingSetRasterQueue) {
 | 
|    host_impl_.SetCurrentBeginFrameArgs(
 | 
|        CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
 | 
|  
 | 
| +  host_impl_.SetViewportSize(gfx::Size(500, 500));
 | 
| +
 | 
|    gfx::Size tile_size(100, 100);
 | 
|    gfx::Size layer_bounds(1000, 1000);
 | 
|  
 | 
| @@ -2788,24 +2735,10 @@ TEST_F(PictureLayerImplTest, TilingSetRasterQueue) {
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|  
 | 
|    SetupPendingTree(pending_pile);
 | 
| +  EXPECT_EQ(2u, pending_layer_->num_tilings());
 | 
|  
 | 
| -  ASSERT_TRUE(pending_layer_->CanHaveTilings());
 | 
| -
 | 
| -  float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
 | 
| -
 | 
| -  // No tilings.
 | 
|    scoped_ptr<TilingSetRasterQueue> queue =
 | 
|        pending_layer_->CreateRasterQueue(false);
 | 
| -  EXPECT_TRUE(queue->IsEmpty());
 | 
| -
 | 
| -  pending_layer_->AddTiling(low_res_factor);
 | 
| -  pending_layer_->AddTiling(0.3f);
 | 
| -  pending_layer_->AddTiling(0.7f);
 | 
| -  PictureLayerTiling* high_res_tiling = pending_layer_->AddTiling(1.0f);
 | 
| -  pending_layer_->AddTiling(2.0f);
 | 
| -
 | 
| -  host_impl_.SetViewportSize(gfx::Size(500, 500));
 | 
| -  host_impl_.pending_tree()->UpdateDrawProperties();
 | 
|  
 | 
|    std::set<Tile*> unique_tiles;
 | 
|    bool reached_prepaint = false;
 | 
| @@ -2883,7 +2816,8 @@ TEST_F(PictureLayerImplTest, TilingSetRasterQueue) {
 | 
|        gfx::Rect(0, 0, 500, 500);
 | 
|    pending_layer_->UpdateTiles(Occlusion(), resourceless_software_draw);
 | 
|  
 | 
| -  std::vector<Tile*> high_res_tiles = high_res_tiling->AllTilesForTesting();
 | 
| +  std::vector<Tile*> high_res_tiles =
 | 
| +      pending_layer_->HighResTiling()->AllTilesForTesting();
 | 
|    for (std::vector<Tile*>::iterator tile_it = high_res_tiles.begin();
 | 
|         tile_it != high_res_tiles.end();
 | 
|         ++tile_it) {
 | 
| @@ -2916,33 +2850,23 @@ TEST_F(PictureLayerImplTest, TilingSetRasterQueue) {
 | 
|  TEST_F(PictureLayerImplTest, TilingSetEvictionQueue) {
 | 
|    gfx::Size tile_size(100, 100);
 | 
|    gfx::Size layer_bounds(1000, 1000);
 | 
| +  float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
 | 
| +
 | 
| +  host_impl_.SetViewportSize(gfx::Size(500, 500));
 | 
|  
 | 
|    scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|  
 | 
| +  // TODO(vmpstr): Add a test with tilings other than high/low res on the active
 | 
| +  // tree.
 | 
|    SetupPendingTree(pending_pile);
 | 
| -
 | 
| -  ASSERT_TRUE(pending_layer_->CanHaveTilings());
 | 
| -
 | 
| -  float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
 | 
| -
 | 
| -  std::vector<PictureLayerTiling*> tilings;
 | 
| -  tilings.push_back(pending_layer_->AddTiling(low_res_factor));
 | 
| -  tilings.push_back(pending_layer_->AddTiling(0.3f));
 | 
| -  tilings.push_back(pending_layer_->AddTiling(0.7f));
 | 
| -  tilings.push_back(pending_layer_->AddTiling(1.0f));
 | 
| -  tilings.push_back(pending_layer_->AddTiling(2.0f));
 | 
| -
 | 
| -  host_impl_.SetViewportSize(gfx::Size(500, 500));
 | 
| -  host_impl_.pending_tree()->UpdateDrawProperties();
 | 
| +  EXPECT_EQ(2u, pending_layer_->num_tilings());
 | 
|  
 | 
|    std::vector<Tile*> all_tiles;
 | 
| -  for (std::vector<PictureLayerTiling*>::iterator tiling_iterator =
 | 
| -           tilings.begin();
 | 
| -       tiling_iterator != tilings.end();
 | 
| -       ++tiling_iterator) {
 | 
| -    std::vector<Tile*> tiles = (*tiling_iterator)->AllTilesForTesting();
 | 
| -    std::copy(tiles.begin(), tiles.end(), std::back_inserter(all_tiles));
 | 
| +  for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) {
 | 
| +    PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i);
 | 
| +    std::vector<Tile*> tiles = tiling->AllTilesForTesting();
 | 
| +    all_tiles.insert(all_tiles.end(), tiles.begin(), tiles.end());
 | 
|    }
 | 
|  
 | 
|    std::set<Tile*> all_tiles_set(all_tiles.begin(), all_tiles.end());
 | 
| @@ -2950,8 +2874,8 @@ TEST_F(PictureLayerImplTest, TilingSetEvictionQueue) {
 | 
|    bool mark_required = false;
 | 
|    size_t number_of_marked_tiles = 0u;
 | 
|    size_t number_of_unmarked_tiles = 0u;
 | 
| -  for (size_t i = 0; i < tilings.size(); ++i) {
 | 
| -    PictureLayerTiling* tiling = tilings.at(i);
 | 
| +  for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) {
 | 
| +    PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i);
 | 
|      for (PictureLayerTiling::CoverageIterator iter(
 | 
|               tiling,
 | 
|               pending_layer_->contents_scale_x(),
 | 
| @@ -2969,8 +2893,8 @@ TEST_F(PictureLayerImplTest, TilingSetEvictionQueue) {
 | 
|    }
 | 
|  
 | 
|    // Sanity checks.
 | 
| -  EXPECT_EQ(91u, all_tiles.size());
 | 
| -  EXPECT_EQ(91u, all_tiles_set.size());
 | 
| +  EXPECT_EQ(17u, all_tiles.size());
 | 
| +  EXPECT_EQ(17u, all_tiles_set.size());
 | 
|    EXPECT_GT(number_of_marked_tiles, 1u);
 | 
|    EXPECT_GT(number_of_unmarked_tiles, 1u);
 | 
|  
 | 
| @@ -2982,10 +2906,12 @@ TEST_F(PictureLayerImplTest, TilingSetEvictionQueue) {
 | 
|    host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles);
 | 
|  
 | 
|    std::set<Tile*> unique_tiles;
 | 
| -  float expected_scales[] = {2.0f, 0.3f, 0.7f, low_res_factor, 1.0f};
 | 
| +  float expected_scales[] = {low_res_factor, 1.f};
 | 
|    size_t scale_index = 0;
 | 
|    bool reached_visible = false;
 | 
|    Tile* last_tile = nullptr;
 | 
| +  size_t distance_decreasing = 0;
 | 
| +  size_t distance_increasing = 0;
 | 
|    queue = pending_layer_->CreateEvictionQueue(SAME_PRIORITY_FOR_BOTH_TREES);
 | 
|    while (!queue->IsEmpty()) {
 | 
|      Tile* tile = queue->Top();
 | 
| @@ -3013,24 +2939,28 @@ TEST_F(PictureLayerImplTest, TilingSetEvictionQueue) {
 | 
|      EXPECT_FLOAT_EQ(tile->contents_scale(), expected_scales[scale_index]);
 | 
|      unique_tiles.insert(tile);
 | 
|  
 | 
| -    // If the tile is the same rough bin as last tile (same activation, bin, and
 | 
| -    // scale), then distance should be decreasing.
 | 
|      if (tile->required_for_activation() ==
 | 
|              last_tile->required_for_activation() &&
 | 
|          priority.priority_bin ==
 | 
|              last_tile->priority(PENDING_TREE).priority_bin &&
 | 
|          std::abs(tile->contents_scale() - last_tile->contents_scale()) <
 | 
|              std::numeric_limits<float>::epsilon()) {
 | 
| -      EXPECT_LE(priority.distance_to_visible,
 | 
| -                last_tile->priority(PENDING_TREE).distance_to_visible);
 | 
| +      if (priority.distance_to_visible <=
 | 
| +          last_tile->priority(PENDING_TREE).distance_to_visible)
 | 
| +        ++distance_decreasing;
 | 
| +      else
 | 
| +        ++distance_increasing;
 | 
|      }
 | 
|  
 | 
|      last_tile = tile;
 | 
|      queue->Pop();
 | 
|    }
 | 
|  
 | 
| +  // 4 high res tiles are inside the viewport, the rest are evicted.
 | 
|    EXPECT_TRUE(reached_visible);
 | 
| -  EXPECT_EQ(65u, unique_tiles.size());
 | 
| +  EXPECT_EQ(12u, unique_tiles.size());
 | 
| +  EXPECT_EQ(1u, distance_increasing);
 | 
| +  EXPECT_EQ(11u, distance_decreasing);
 | 
|  
 | 
|    scale_index = 0;
 | 
|    bool reached_required = false;
 | 
| @@ -3069,16 +2999,12 @@ TEST_F(PictureLayerImplTest, Occlusion) {
 | 
|    gfx::Size viewport_size(1000, 1000);
 | 
|  
 | 
|    LayerTestCommon::LayerImplTest impl;
 | 
| +  host_impl_.SetViewportSize(viewport_size);
 | 
|  
 | 
|    scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(layer_bounds, layer_bounds);
 | 
| -  SetupPendingTree(pending_pile);
 | 
| -  pending_layer_->SetBounds(layer_bounds);
 | 
| +  SetupPendingTreeWithFixedTileSize(pending_pile, tile_size, Region());
 | 
|    ActivateTree();
 | 
| -  active_layer_->set_fixed_tile_size(tile_size);
 | 
| -
 | 
| -  host_impl_.SetViewportSize(viewport_size);
 | 
| -  host_impl_.active_tree()->UpdateDrawProperties();
 | 
|  
 | 
|    std::vector<Tile*> tiles =
 | 
|        active_layer_->HighResTiling()->AllTilesForTesting();
 | 
| @@ -3121,6 +3047,8 @@ TEST_F(PictureLayerImplTest, RasterScaleChangeWithoutAnimation) {
 | 
|    gfx::Size tile_size(host_impl_.settings().default_tile_size);
 | 
|    SetupDefaultTrees(tile_size);
 | 
|  
 | 
| +  ResetTilingsAndRasterScales();
 | 
| +
 | 
|    float contents_scale = 2.f;
 | 
|    float device_scale = 1.f;
 | 
|    float page_scale = 1.f;
 | 
| @@ -3161,15 +3089,9 @@ TEST_F(PictureLayerImplTest, LowResReadyToDrawNotEnoughToActivate) {
 | 
|    gfx::Size tile_size(100, 100);
 | 
|    gfx::Size layer_bounds(1000, 1000);
 | 
|  
 | 
| -  host_impl_.SetViewportSize(layer_bounds);
 | 
| -
 | 
| -  SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
 | 
| -
 | 
|    // Make sure some tiles are not shared.
 | 
| -  pending_layer_->set_invalidation(gfx::Rect(gfx::Point(50, 50), tile_size));
 | 
| -
 | 
| -  CreateHighLowResAndSetAllTilesVisible();
 | 
| -  active_layer_->SetAllTilesReady();
 | 
| +  gfx::Rect invalidation(gfx::Point(50, 50), tile_size);
 | 
| +  SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size, invalidation);
 | 
|  
 | 
|    // All pending layer tiles required are not ready.
 | 
|    EXPECT_FALSE(pending_layer_->AllTilesRequiredForActivationAreReadyToDraw());
 | 
| @@ -3190,15 +3112,9 @@ TEST_F(PictureLayerImplTest, HighResReadyToDrawEnoughToActivate) {
 | 
|    gfx::Size tile_size(100, 100);
 | 
|    gfx::Size layer_bounds(1000, 1000);
 | 
|  
 | 
| -  host_impl_.SetViewportSize(layer_bounds);
 | 
| -
 | 
| -  SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
 | 
| -
 | 
|    // Make sure some tiles are not shared.
 | 
| -  pending_layer_->set_invalidation(gfx::Rect(gfx::Point(50, 50), tile_size));
 | 
| -
 | 
| -  CreateHighLowResAndSetAllTilesVisible();
 | 
| -  active_layer_->SetAllTilesReady();
 | 
| +  gfx::Rect invalidation(gfx::Point(50, 50), tile_size);
 | 
| +  SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size, invalidation);
 | 
|  
 | 
|    // All pending layer tiles required are not ready.
 | 
|    EXPECT_FALSE(pending_layer_->AllTilesRequiredForActivationAreReadyToDraw());
 | 
| @@ -3215,14 +3131,9 @@ TEST_F(PictureLayerImplTest,
 | 
|    gfx::Size tile_size(100, 100);
 | 
|    gfx::Size layer_bounds(1000, 1000);
 | 
|  
 | 
| -  host_impl_.SetViewportSize(layer_bounds);
 | 
| -
 | 
| -  SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
 | 
| -
 | 
|    // Make sure some tiles are not shared.
 | 
| -  pending_layer_->set_invalidation(gfx::Rect(gfx::Point(50, 50), tile_size));
 | 
| -
 | 
| -  CreateHighLowResAndSetAllTilesVisible();
 | 
| +  gfx::Rect invalidation(gfx::Point(50, 50), tile_size);
 | 
| +  SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size, invalidation);
 | 
|  
 | 
|    // Initialize all high-res tiles in the active layer.
 | 
|    active_layer_->SetAllTilesReadyInTiling(active_layer_->HighResTiling());
 | 
| @@ -3241,33 +3152,83 @@ TEST_F(PictureLayerImplTest, SharedActiveHighResReadyNotEnoughToActivate) {
 | 
|    gfx::Size tile_size(100, 100);
 | 
|    gfx::Size layer_bounds(1000, 1000);
 | 
|  
 | 
| -  host_impl_.SetViewportSize(layer_bounds);
 | 
| -
 | 
| -  SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
 | 
| -
 | 
|    // Make sure some tiles are not shared.
 | 
| -  pending_layer_->set_invalidation(gfx::Rect(gfx::Point(50, 50), tile_size));
 | 
| -
 | 
| -  CreateHighLowResAndSetAllTilesVisible();
 | 
| +  gfx::Rect invalidation(gfx::Point(50, 50), tile_size);
 | 
| +  SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size, invalidation);
 | 
|  
 | 
|    // Initialize all high-res tiles in the active layer.
 | 
|    active_layer_->SetAllTilesReadyInTiling(active_layer_->HighResTiling());
 | 
|  
 | 
| -  // The unshared high-res tiles are not ready, so we cannot activate.
 | 
| -  EXPECT_FALSE(pending_layer_->AllTilesRequiredForActivationAreReadyToDraw());
 | 
| +  // The unshared high-res tiles are not ready, so we cannot activate.
 | 
| +  EXPECT_FALSE(pending_layer_->AllTilesRequiredForActivationAreReadyToDraw());
 | 
| +
 | 
| +  // When the unshared pending high-res tiles are ready, we can activate.
 | 
| +  pending_layer_->SetAllTilesReadyInTiling(pending_layer_->HighResTiling());
 | 
| +  EXPECT_TRUE(pending_layer_->AllTilesRequiredForActivationAreReadyToDraw());
 | 
| +}
 | 
| +
 | 
| +TEST_F(NoLowResPictureLayerImplTest, ManageTilingsCreatesTilings) {
 | 
| +  gfx::Size tile_size(400, 400);
 | 
| +  gfx::Size layer_bounds(1300, 1900);
 | 
| +
 | 
| +  scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
| +      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| +  scoped_refptr<FakePicturePileImpl> active_pile =
 | 
| +      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| +
 | 
| +  SetupTrees(pending_pile, active_pile);
 | 
| +
 | 
| +  float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
 | 
| +  EXPECT_LT(low_res_factor, 1.f);
 | 
| +
 | 
| +  ResetTilingsAndRasterScales();
 | 
| +
 | 
| +  SetupDrawPropertiesAndUpdateTiles(active_layer_,
 | 
| +                                    6.f,  // ideal contents scale
 | 
| +                                    3.f,  // device scale
 | 
| +                                    2.f,  // page scale
 | 
| +                                    1.f,  // maximum animation scale
 | 
| +                                    false);
 | 
| +  ASSERT_EQ(1u, active_layer_->tilings()->num_tilings());
 | 
| +  EXPECT_FLOAT_EQ(6.f,
 | 
| +                  active_layer_->tilings()->tiling_at(0)->contents_scale());
 | 
| +
 | 
| +  // If we change the page scale factor, then we should get new tilings.
 | 
| +  SetupDrawPropertiesAndUpdateTiles(active_layer_,
 | 
| +                                    6.6f,  // ideal contents scale
 | 
| +                                    3.f,   // device scale
 | 
| +                                    2.2f,  // page scale
 | 
| +                                    1.f,   // maximum animation scale
 | 
| +                                    false);
 | 
| +  ASSERT_EQ(2u, active_layer_->tilings()->num_tilings());
 | 
| +  EXPECT_FLOAT_EQ(6.6f,
 | 
| +                  active_layer_->tilings()->tiling_at(0)->contents_scale());
 | 
| +
 | 
| +  // If we change the device scale factor, then we should get new tilings.
 | 
| +  SetupDrawPropertiesAndUpdateTiles(active_layer_,
 | 
| +                                    7.26f,  // ideal contents scale
 | 
| +                                    3.3f,   // device scale
 | 
| +                                    2.2f,   // page scale
 | 
| +                                    1.f,    // maximum animation scale
 | 
| +                                    false);
 | 
| +  ASSERT_EQ(3u, active_layer_->tilings()->num_tilings());
 | 
| +  EXPECT_FLOAT_EQ(7.26f,
 | 
| +                  active_layer_->tilings()->tiling_at(0)->contents_scale());
 | 
|  
 | 
| -  // When the unshared pending high-res tiles are ready, we can activate.
 | 
| -  pending_layer_->SetAllTilesReadyInTiling(pending_layer_->HighResTiling());
 | 
| -  EXPECT_TRUE(pending_layer_->AllTilesRequiredForActivationAreReadyToDraw());
 | 
| +  // If we change the device scale factor, but end up at the same total scale
 | 
| +  // factor somehow, then we don't get new tilings.
 | 
| +  SetupDrawPropertiesAndUpdateTiles(active_layer_,
 | 
| +                                    7.26f,  // ideal contents scale
 | 
| +                                    2.2f,   // device scale
 | 
| +                                    3.3f,   // page scale
 | 
| +                                    1.f,    // maximum animation scale
 | 
| +                                    false);
 | 
| +  ASSERT_EQ(3u, active_layer_->tilings()->num_tilings());
 | 
| +  EXPECT_FLOAT_EQ(7.26f,
 | 
| +                  active_layer_->tilings()->tiling_at(0)->contents_scale());
 | 
|  }
 | 
|  
 | 
| -class NoLowResPictureLayerImplTest : public PictureLayerImplTest {
 | 
| - public:
 | 
| -  NoLowResPictureLayerImplTest()
 | 
| -      : PictureLayerImplTest(NoLowResTilingsSettings()) {}
 | 
| -};
 | 
| -
 | 
| -TEST_F(NoLowResPictureLayerImplTest, ManageTilingsCreatesTilings) {
 | 
| +TEST_F(NoLowResPictureLayerImplTest, PendingLayerOnlyHasHighResTiling) {
 | 
|    gfx::Size tile_size(400, 400);
 | 
|    gfx::Size layer_bounds(1300, 1900);
 | 
|  
 | 
| @@ -3277,11 +3238,12 @@ TEST_F(NoLowResPictureLayerImplTest, ManageTilingsCreatesTilings) {
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|  
 | 
|    SetupTrees(pending_pile, active_pile);
 | 
| -  EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
 | 
|  
 | 
|    float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
 | 
|    EXPECT_LT(low_res_factor, 1.f);
 | 
|  
 | 
| +  ResetTilingsAndRasterScales();
 | 
| +
 | 
|    SetupDrawPropertiesAndUpdateTiles(pending_layer_,
 | 
|                                      6.f,  // ideal contents scale
 | 
|                                      3.f,  // device scale
 | 
| @@ -3299,7 +3261,7 @@ TEST_F(NoLowResPictureLayerImplTest, ManageTilingsCreatesTilings) {
 | 
|                                      2.2f,  // page scale
 | 
|                                      1.f,   // maximum animation scale
 | 
|                                      false);
 | 
| -  ASSERT_EQ(2u, pending_layer_->tilings()->num_tilings());
 | 
| +  ASSERT_EQ(1u, pending_layer_->tilings()->num_tilings());
 | 
|    EXPECT_FLOAT_EQ(6.6f,
 | 
|                    pending_layer_->tilings()->tiling_at(0)->contents_scale());
 | 
|  
 | 
| @@ -3310,7 +3272,7 @@ TEST_F(NoLowResPictureLayerImplTest, ManageTilingsCreatesTilings) {
 | 
|                                      2.2f,   // page scale
 | 
|                                      1.f,    // maximum animation scale
 | 
|                                      false);
 | 
| -  ASSERT_EQ(3u, pending_layer_->tilings()->num_tilings());
 | 
| +  ASSERT_EQ(1u, pending_layer_->tilings()->num_tilings());
 | 
|    EXPECT_FLOAT_EQ(7.26f,
 | 
|                    pending_layer_->tilings()->tiling_at(0)->contents_scale());
 | 
|  
 | 
| @@ -3322,7 +3284,7 @@ TEST_F(NoLowResPictureLayerImplTest, ManageTilingsCreatesTilings) {
 | 
|                                      3.3f,   // page scale
 | 
|                                      1.f,    // maximum animation scale
 | 
|                                      false);
 | 
| -  ASSERT_EQ(3u, pending_layer_->tilings()->num_tilings());
 | 
| +  ASSERT_EQ(1u, pending_layer_->tilings()->num_tilings());
 | 
|    EXPECT_FLOAT_EQ(7.26f,
 | 
|                    pending_layer_->tilings()->tiling_at(0)->contents_scale());
 | 
|  }
 | 
| @@ -3331,11 +3293,7 @@ TEST_F(NoLowResPictureLayerImplTest, AllHighResRequiredEvenIfShared) {
 | 
|    gfx::Size layer_bounds(400, 400);
 | 
|    gfx::Size tile_size(100, 100);
 | 
|  
 | 
| -  host_impl_.SetViewportSize(layer_bounds);
 | 
| -
 | 
| -  SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size);
 | 
| -
 | 
| -  CreateHighLowResAndSetAllTilesVisible();
 | 
| +  SetupDefaultTreesWithFixedTileSize(layer_bounds, tile_size, Region());
 | 
|  
 | 
|    Tile* some_active_tile =
 | 
|        active_layer_->HighResTiling()->AllTilesForTesting()[0];
 | 
| @@ -3355,6 +3313,7 @@ TEST_F(NoLowResPictureLayerImplTest, AllHighResRequiredEvenIfShared) {
 | 
|  TEST_F(NoLowResPictureLayerImplTest, NothingRequiredIfActiveMissingTiles) {
 | 
|    gfx::Size layer_bounds(400, 400);
 | 
|    gfx::Size tile_size(100, 100);
 | 
| +
 | 
|    scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|    // This pile will create tilings, but has no recordings so will not create any
 | 
| @@ -3364,11 +3323,8 @@ TEST_F(NoLowResPictureLayerImplTest, NothingRequiredIfActiveMissingTiles) {
 | 
|    scoped_refptr<FakePicturePileImpl> active_pile =
 | 
|        FakePicturePileImpl::CreateEmptyPileThatThinksItHasRecordings(
 | 
|            tile_size, layer_bounds);
 | 
| -  SetupTrees(pending_pile, active_pile);
 | 
| -  pending_layer_->set_fixed_tile_size(tile_size);
 | 
| -  active_layer_->set_fixed_tile_size(tile_size);
 | 
|  
 | 
| -  CreateHighLowResAndSetAllTilesVisible();
 | 
| +  SetupTreesWithFixedTileSize(pending_pile, active_pile, tile_size, Region());
 | 
|  
 | 
|    // Active layer has tilings, but no tiles due to missing recordings.
 | 
|    EXPECT_TRUE(active_layer_->CanHaveTilings());
 | 
| @@ -3401,10 +3357,8 @@ TEST_F(NoLowResPictureLayerImplTest, InvalidViewportForPrioritizingTiles) {
 | 
|    scoped_refptr<FakePicturePileImpl> active_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|  
 | 
| -  SetupTrees(pending_pile, active_pile);
 | 
| +  SetupTreesWithInvalidation(pending_pile, active_pile, Region());
 | 
|  
 | 
| -  Region invalidation;
 | 
| -  AddDefaultTilingsWithInvalidation(invalidation);
 | 
|    SetupDrawPropertiesAndUpdateTiles(active_layer_, 1.f, 1.f, 1.f, 1.f, false);
 | 
|  
 | 
|    // UpdateTiles with valid viewport. Should update tile viewport.
 | 
| @@ -3484,7 +3438,6 @@ TEST_F(NoLowResPictureLayerImplTest, CleanUpTilings) {
 | 
|    std::vector<PictureLayerTiling*> used_tilings;
 | 
|  
 | 
|    SetupTrees(pending_pile, active_pile);
 | 
| -  EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
 | 
|  
 | 
|    float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
 | 
|    EXPECT_LT(low_res_factor, 1.f);
 | 
| @@ -3493,6 +3446,8 @@ TEST_F(NoLowResPictureLayerImplTest, CleanUpTilings) {
 | 
|    float page_scale = 3.2f;
 | 
|    float scale = 1.f;
 | 
|  
 | 
| +  ResetTilingsAndRasterScales();
 | 
| +
 | 
|    SetContentsScaleOnBothLayers(scale, device_scale, page_scale, 1.f, false);
 | 
|    ASSERT_EQ(1u, active_layer_->tilings()->num_tilings());
 | 
|  
 | 
| @@ -3578,80 +3533,6 @@ TEST_F(NoLowResPictureLayerImplTest, CleanUpTilings) {
 | 
|    ASSERT_EQ(1u, active_layer_->tilings()->num_tilings());
 | 
|  }
 | 
|  
 | 
| -TEST_F(PictureLayerImplTest, ScaleCollision) {
 | 
| -  gfx::Size tile_size(400, 400);
 | 
| -  gfx::Size layer_bounds(1300, 1900);
 | 
| -
 | 
| -  scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
| -      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| -  scoped_refptr<FakePicturePileImpl> active_pile =
 | 
| -      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| -
 | 
| -  std::vector<PictureLayerTiling*> used_tilings;
 | 
| -
 | 
| -  SetupTrees(pending_pile, active_pile);
 | 
| -
 | 
| -  float pending_contents_scale = 1.f;
 | 
| -  float active_contents_scale = 2.f;
 | 
| -  float device_scale_factor = 1.f;
 | 
| -  float page_scale_factor = 1.f;
 | 
| -  float maximum_animation_contents_scale = 1.f;
 | 
| -  bool animating_transform = false;
 | 
| -
 | 
| -  EXPECT_TRUE(host_impl_.settings().create_low_res_tiling);
 | 
| -  float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
 | 
| -  EXPECT_LT(low_res_factor, 1.f);
 | 
| -
 | 
| -  SetupDrawPropertiesAndUpdateTiles(pending_layer_,
 | 
| -                                    pending_contents_scale,
 | 
| -                                    device_scale_factor,
 | 
| -                                    page_scale_factor,
 | 
| -                                    maximum_animation_contents_scale,
 | 
| -                                    animating_transform);
 | 
| -  SetupDrawPropertiesAndUpdateTiles(active_layer_,
 | 
| -                                    active_contents_scale,
 | 
| -                                    device_scale_factor,
 | 
| -                                    page_scale_factor,
 | 
| -                                    maximum_animation_contents_scale,
 | 
| -                                    animating_transform);
 | 
| -
 | 
| -  ASSERT_EQ(4u, pending_layer_->tilings()->num_tilings());
 | 
| -  ASSERT_EQ(4u, active_layer_->tilings()->num_tilings());
 | 
| -
 | 
| -  EXPECT_EQ(active_contents_scale,
 | 
| -            pending_layer_->tilings()->tiling_at(0)->contents_scale());
 | 
| -  EXPECT_EQ(pending_contents_scale,
 | 
| -            pending_layer_->tilings()->tiling_at(1)->contents_scale());
 | 
| -  EXPECT_EQ(active_contents_scale * low_res_factor,
 | 
| -            pending_layer_->tilings()->tiling_at(2)->contents_scale());
 | 
| -  EXPECT_EQ(pending_contents_scale * low_res_factor,
 | 
| -            pending_layer_->tilings()->tiling_at(3)->contents_scale());
 | 
| -
 | 
| -  EXPECT_EQ(active_contents_scale,
 | 
| -            active_layer_->tilings()->tiling_at(0)->contents_scale());
 | 
| -  EXPECT_EQ(pending_contents_scale,
 | 
| -            active_layer_->tilings()->tiling_at(1)->contents_scale());
 | 
| -  EXPECT_EQ(active_contents_scale * low_res_factor,
 | 
| -            active_layer_->tilings()->tiling_at(2)->contents_scale());
 | 
| -  EXPECT_EQ(pending_contents_scale * low_res_factor,
 | 
| -            active_layer_->tilings()->tiling_at(3)->contents_scale());
 | 
| -
 | 
| -  // The unused low res tiling from the pending tree must be kept or we may add
 | 
| -  // it again on the active tree and collide with the pending tree.
 | 
| -  used_tilings.push_back(active_layer_->tilings()->tiling_at(1));
 | 
| -  active_layer_->CleanUpTilingsOnActiveLayer(used_tilings);
 | 
| -  ASSERT_EQ(4u, active_layer_->tilings()->num_tilings());
 | 
| -
 | 
| -  EXPECT_EQ(active_contents_scale,
 | 
| -            active_layer_->tilings()->tiling_at(0)->contents_scale());
 | 
| -  EXPECT_EQ(pending_contents_scale,
 | 
| -            active_layer_->tilings()->tiling_at(1)->contents_scale());
 | 
| -  EXPECT_EQ(active_contents_scale * low_res_factor,
 | 
| -            active_layer_->tilings()->tiling_at(2)->contents_scale());
 | 
| -  EXPECT_EQ(pending_contents_scale * low_res_factor,
 | 
| -            active_layer_->tilings()->tiling_at(3)->contents_scale());
 | 
| -}
 | 
| -
 | 
|  TEST_F(NoLowResPictureLayerImplTest, ReleaseResources) {
 | 
|    gfx::Size tile_size(400, 400);
 | 
|    gfx::Size layer_bounds(1300, 1900);
 | 
| @@ -3662,15 +3543,8 @@ TEST_F(NoLowResPictureLayerImplTest, ReleaseResources) {
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|  
 | 
|    SetupTrees(pending_pile, active_pile);
 | 
| -  EXPECT_EQ(0u, pending_layer_->tilings()->num_tilings());
 | 
| -
 | 
| -  SetupDrawPropertiesAndUpdateTiles(pending_layer_,
 | 
| -                                    1.3f,  // ideal contents scale
 | 
| -                                    2.7f,  // device scale
 | 
| -                                    3.2f,  // page scale
 | 
| -                                    1.f,   // maximum animation scale
 | 
| -                                    false);
 | 
|    EXPECT_EQ(1u, pending_layer_->tilings()->num_tilings());
 | 
| +  EXPECT_EQ(1u, active_layer_->tilings()->num_tilings());
 | 
|  
 | 
|    // All tilings should be removed when losing output surface.
 | 
|    active_layer_->ReleaseResources();
 | 
| @@ -3694,7 +3568,7 @@ TEST_F(PictureLayerImplTest, SharedQuadStateContainsMaxTilingScale) {
 | 
|    gfx::Size tile_size(400, 400);
 | 
|    gfx::Size layer_bounds(1000, 2000);
 | 
|  
 | 
| -  host_impl_.SetViewportSize(layer_bounds);
 | 
| +  host_impl_.SetViewportSize(gfx::Size(10000, 20000));
 | 
|  
 | 
|    scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| @@ -3703,14 +3577,12 @@ TEST_F(PictureLayerImplTest, SharedQuadStateContainsMaxTilingScale) {
 | 
|  
 | 
|    SetupTrees(pending_pile, active_pile);
 | 
|  
 | 
| -  SetupDrawPropertiesAndUpdateTiles(pending_layer_, 2.5f, 1.f, 1.f, 1.f, false);
 | 
| -  host_impl_.pending_tree()->UpdateDrawProperties();
 | 
| -
 | 
| -  active_layer_->draw_properties().visible_content_rect =
 | 
| -      gfx::Rect(layer_bounds);
 | 
| -  host_impl_.active_tree()->UpdateDrawProperties();
 | 
| +  ResetTilingsAndRasterScales();
 | 
| +  SetupDrawPropertiesAndUpdateTiles(active_layer_, 2.5f, 1.f, 1.f, 1.f, false);
 | 
|  
 | 
|    float max_contents_scale = active_layer_->MaximumTilingContentsScale();
 | 
| +  EXPECT_EQ(2.5f, max_contents_scale);
 | 
| +
 | 
|    gfx::Transform scaled_draw_transform = active_layer_->draw_transform();
 | 
|    scaled_draw_transform.Scale(SK_MScalar1 / max_contents_scale,
 | 
|                                SK_MScalar1 / max_contents_scale);
 | 
| @@ -3747,40 +3619,35 @@ TEST_F(PictureLayerImplTest, UpdateTilesForMasksWithNoVisibleContent) {
 | 
|  
 | 
|    scoped_ptr<FakePictureLayerImpl> layer_with_mask =
 | 
|        FakePictureLayerImpl::Create(host_impl_.pending_tree(), 2);
 | 
| -
 | 
|    layer_with_mask->SetBounds(bounds);
 | 
|    layer_with_mask->SetContentBounds(bounds);
 | 
|  
 | 
|    scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, bounds);
 | 
|    scoped_ptr<FakePictureLayerImpl> mask =
 | 
| -      FakePictureLayerImpl::CreateWithRasterSource(host_impl_.pending_tree(), 3,
 | 
| -                                                   pending_pile);
 | 
| -  mask->set_is_mask(true);
 | 
| -
 | 
| +      FakePictureLayerImpl::CreateMaskWithRasterSource(
 | 
| +          host_impl_.pending_tree(), 3, pending_pile);
 | 
|    mask->SetBounds(bounds);
 | 
|    mask->SetContentBounds(bounds);
 | 
|    mask->SetDrawsContent(true);
 | 
| -
 | 
| -  FakePictureLayerImpl* pending_mask_content = mask.get();
 | 
|    layer_with_mask->SetMaskLayer(mask.Pass());
 | 
|  
 | 
| +  FakePictureLayerImpl* pending_mask =
 | 
| +      static_cast<FakePictureLayerImpl*>(layer_with_mask->mask_layer());
 | 
| +
 | 
|    scoped_ptr<FakePictureLayerImpl> child_of_layer_with_mask =
 | 
|        FakePictureLayerImpl::Create(host_impl_.pending_tree(), 4);
 | 
| -
 | 
|    child_of_layer_with_mask->SetBounds(bounds);
 | 
|    child_of_layer_with_mask->SetContentBounds(bounds);
 | 
|    child_of_layer_with_mask->SetDrawsContent(true);
 | 
| -
 | 
|    layer_with_mask->AddChild(child_of_layer_with_mask.Pass());
 | 
| -
 | 
|    root->AddChild(layer_with_mask.Pass());
 | 
|  
 | 
|    host_impl_.pending_tree()->SetRootLayer(root.Pass());
 | 
|  
 | 
| -  EXPECT_FALSE(pending_mask_content->tilings());
 | 
| +  EXPECT_EQ(0u, pending_mask->num_tilings());
 | 
|    host_impl_.pending_tree()->UpdateDrawProperties();
 | 
| -  EXPECT_NE(0u, pending_mask_content->num_tilings());
 | 
| +  EXPECT_NE(0u, pending_mask->num_tilings());
 | 
|  }
 | 
|  
 | 
|  class PictureLayerImplTestWithDelegatingRenderer : public PictureLayerImplTest {
 | 
| @@ -3804,7 +3671,6 @@ TEST_F(PictureLayerImplTestWithDelegatingRenderer,
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|    SetupPendingTree(pending_pile);
 | 
|    pending_layer_->SetBounds(layer_bounds);
 | 
| -  host_impl_.SetViewportSize(layer_bounds);
 | 
|    ActivateTree();
 | 
|    host_impl_.active_tree()->UpdateDrawProperties();
 | 
|    std::vector<Tile*> tiles =
 | 
| @@ -3851,14 +3717,17 @@ class OcclusionTrackingPictureLayerImplTest : public PictureLayerImplTest {
 | 
|    OcclusionTrackingPictureLayerImplTest()
 | 
|        : PictureLayerImplTest(OcclusionTrackingSettings()) {}
 | 
|  
 | 
| -  void VerifyEvictionConsidersOcclusion(
 | 
| -      PictureLayerImpl* layer,
 | 
| -      size_t expected_occluded_tile_count[NUM_TREE_PRIORITIES]) {
 | 
| +  void VerifyEvictionConsidersOcclusion(FakePictureLayerImpl* layer,
 | 
| +                                        FakePictureLayerImpl* twin_layer,
 | 
| +                                        WhichTree tree,
 | 
| +                                        size_t expected_occluded_tile_count) {
 | 
| +    WhichTree twin_tree = tree == ACTIVE_TREE ? PENDING_TREE : ACTIVE_TREE;
 | 
|      for (int priority_count = 0; priority_count < NUM_TREE_PRIORITIES;
 | 
|           ++priority_count) {
 | 
|        TreePriority tree_priority = static_cast<TreePriority>(priority_count);
 | 
|        size_t occluded_tile_count = 0u;
 | 
|        Tile* last_tile = nullptr;
 | 
| +      std::set<Tile*> shared_tiles;
 | 
|  
 | 
|        scoped_ptr<TilingSetEvictionQueue> queue =
 | 
|            layer->CreateEvictionQueue(tree_priority);
 | 
| @@ -3866,23 +3735,22 @@ class OcclusionTrackingPictureLayerImplTest : public PictureLayerImplTest {
 | 
|          Tile* tile = queue->Top();
 | 
|          if (!last_tile)
 | 
|            last_tile = tile;
 | 
| +        if (tile->is_shared())
 | 
| +          EXPECT_TRUE(shared_tiles.insert(tile).second);
 | 
|  
 | 
|          // 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.
 | 
| -        bool tile_is_occluded =
 | 
| -            tile->is_occluded_for_tree_priority(tree_priority);
 | 
| +        bool tile_is_occluded = tile->is_occluded(tree);
 | 
|          if (tile_is_occluded) {
 | 
|            occluded_tile_count++;
 | 
|  
 | 
| -          bool last_tile_is_occluded =
 | 
| -              last_tile->is_occluded_for_tree_priority(tree_priority);
 | 
| +          bool last_tile_is_occluded = last_tile->is_occluded(tree);
 | 
|            if (!last_tile_is_occluded) {
 | 
|              TilePriority::PriorityBin tile_priority_bin =
 | 
| -                tile->priority_for_tree_priority(tree_priority).priority_bin;
 | 
| +                tile->priority(tree).priority_bin;
 | 
|              TilePriority::PriorityBin last_tile_priority_bin =
 | 
| -                last_tile->priority_for_tree_priority(tree_priority)
 | 
| -                    .priority_bin;
 | 
| +                last_tile->priority(tree).priority_bin;
 | 
|  
 | 
|              EXPECT_TRUE(
 | 
|                  (tile_priority_bin < last_tile_priority_bin) ||
 | 
| @@ -3893,8 +3761,74 @@ class OcclusionTrackingPictureLayerImplTest : public PictureLayerImplTest {
 | 
|          last_tile = tile;
 | 
|          queue->Pop();
 | 
|        }
 | 
| -      EXPECT_EQ(expected_occluded_tile_count[priority_count],
 | 
| -                occluded_tile_count);
 | 
| +      // Count also shared tiles which are occluded in the tree but which were
 | 
| +      // not returned by the tiling set eviction queue. Those shared tiles
 | 
| +      // shall be returned by the twin tiling set eviction queue.
 | 
| +      queue = twin_layer->CreateEvictionQueue(tree_priority);
 | 
| +      while (!queue->IsEmpty()) {
 | 
| +        Tile* tile = queue->Top();
 | 
| +        if (tile->is_shared()) {
 | 
| +          EXPECT_TRUE(shared_tiles.insert(tile).second);
 | 
| +          if (tile->is_occluded(tree))
 | 
| +            ++occluded_tile_count;
 | 
| +          // Check the reasons why the shared tile was not returned by
 | 
| +          // the first tiling set eviction queue.
 | 
| +          switch (tree_priority) {
 | 
| +            case SAME_PRIORITY_FOR_BOTH_TREES: {
 | 
| +              const TilePriority& priority = tile->priority(tree);
 | 
| +              const TilePriority& priority_for_tree_priority =
 | 
| +                  tile->priority_for_tree_priority(tree_priority);
 | 
| +              const TilePriority& twin_priority = tile->priority(twin_tree);
 | 
| +              // Check if the shared tile was not returned by the first tiling
 | 
| +              // set eviction queue because it was out of order for the first
 | 
| +              // tiling set eviction queue but not for the twin tiling set
 | 
| +              // eviction queue.
 | 
| +              if (priority.priority_bin != twin_priority.priority_bin) {
 | 
| +                EXPECT_LT(priority_for_tree_priority.priority_bin,
 | 
| +                          priority.priority_bin);
 | 
| +                EXPECT_EQ(priority_for_tree_priority.priority_bin,
 | 
| +                          twin_priority.priority_bin);
 | 
| +                EXPECT_TRUE(priority_for_tree_priority.priority_bin <
 | 
| +                            priority.priority_bin);
 | 
| +              } else if (tile->is_occluded(tree) !=
 | 
| +                         tile->is_occluded(twin_tree)) {
 | 
| +                EXPECT_TRUE(tile->is_occluded(tree));
 | 
| +                EXPECT_FALSE(tile->is_occluded(twin_tree));
 | 
| +                EXPECT_FALSE(
 | 
| +                    tile->is_occluded_for_tree_priority(tree_priority));
 | 
| +              } else if (priority.distance_to_visible !=
 | 
| +                         twin_priority.distance_to_visible) {
 | 
| +                EXPECT_LT(priority_for_tree_priority.distance_to_visible,
 | 
| +                          priority.distance_to_visible);
 | 
| +                EXPECT_EQ(priority_for_tree_priority.distance_to_visible,
 | 
| +                          twin_priority.distance_to_visible);
 | 
| +                EXPECT_TRUE(priority_for_tree_priority.distance_to_visible <
 | 
| +                            priority.distance_to_visible);
 | 
| +              } else {
 | 
| +                // Shared tiles having the same active and pending priorities
 | 
| +                // should be returned only by a pending tree eviction queue.
 | 
| +                EXPECT_EQ(ACTIVE_TREE, tree);
 | 
| +              }
 | 
| +              break;
 | 
| +            }
 | 
| +            case SMOOTHNESS_TAKES_PRIORITY:
 | 
| +              // Shared tiles should be returned only by an active tree
 | 
| +              // eviction queue.
 | 
| +              EXPECT_EQ(PENDING_TREE, tree);
 | 
| +              break;
 | 
| +            case NEW_CONTENT_TAKES_PRIORITY:
 | 
| +              // Shared tiles should be returned only by a pending tree
 | 
| +              // eviction queue.
 | 
| +              EXPECT_EQ(ACTIVE_TREE, tree);
 | 
| +              break;
 | 
| +            case NUM_TREE_PRIORITIES:
 | 
| +              NOTREACHED();
 | 
| +              break;
 | 
| +          }
 | 
| +        }
 | 
| +        queue->Pop();
 | 
| +      }
 | 
| +      EXPECT_EQ(expected_occluded_tile_count, occluded_tile_count);
 | 
|      }
 | 
|    }
 | 
|  };
 | 
| @@ -3911,13 +3845,11 @@ TEST_F(OcclusionTrackingPictureLayerImplTest,
 | 
|    gfx::Size viewport_size(500, 500);
 | 
|    gfx::Point occluding_layer_position(310, 0);
 | 
|  
 | 
| +  host_impl_.SetViewportSize(viewport_size);
 | 
| +
 | 
|    scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| -  SetupPendingTree(pending_pile);
 | 
| -  pending_layer_->set_fixed_tile_size(tile_size);
 | 
| -
 | 
| -  host_impl_.SetViewportSize(viewport_size);
 | 
| -  host_impl_.pending_tree()->UpdateDrawProperties();
 | 
| +  SetupPendingTreeWithFixedTileSize(pending_pile, tile_size, Region());
 | 
|  
 | 
|    // No occlusion.
 | 
|    int unoccluded_tile_count = 0;
 | 
| @@ -4004,13 +3936,11 @@ TEST_F(OcclusionTrackingPictureLayerImplTest,
 | 
|    gfx::Size viewport_size(500, 500);
 | 
|    gfx::Point occluding_layer_position(310, 0);
 | 
|  
 | 
| +  host_impl_.SetViewportSize(viewport_size);
 | 
| +
 | 
|    scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| -  SetupPendingTree(pending_pile);
 | 
| -  pending_layer_->set_fixed_tile_size(tile_size);
 | 
| -
 | 
| -  host_impl_.SetViewportSize(viewport_size);
 | 
| -  host_impl_.pending_tree()->UpdateDrawProperties();
 | 
| +  SetupPendingTreeWithFixedTileSize(pending_pile, tile_size, Region());
 | 
|  
 | 
|    // No occlusion.
 | 
|    int occluded_tile_count = 0;
 | 
| @@ -4125,6 +4055,11 @@ TEST_F(OcclusionTrackingPictureLayerImplTest,
 | 
|  }
 | 
|  
 | 
|  TEST_F(OcclusionTrackingPictureLayerImplTest, OcclusionForDifferentScales) {
 | 
| +  base::TimeTicks time_ticks;
 | 
| +  time_ticks += base::TimeDelta::FromMilliseconds(1);
 | 
| +  host_impl_.SetCurrentBeginFrameArgs(
 | 
| +      CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
 | 
| +
 | 
|    gfx::Size tile_size(102, 102);
 | 
|    gfx::Size layer_bounds(1000, 1000);
 | 
|    gfx::Size viewport_size(500, 500);
 | 
| @@ -4132,19 +4067,11 @@ TEST_F(OcclusionTrackingPictureLayerImplTest, OcclusionForDifferentScales) {
 | 
|  
 | 
|    scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| -  SetupPendingTree(pending_pile);
 | 
| -  pending_layer_->set_fixed_tile_size(tile_size);
 | 
|  
 | 
| -  ASSERT_TRUE(pending_layer_->CanHaveTilings());
 | 
| -
 | 
| -  float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
 | 
| +  host_impl_.SetViewportSize(viewport_size);
 | 
|  
 | 
| -  std::vector<PictureLayerTiling*> tilings;
 | 
| -  tilings.push_back(pending_layer_->AddTiling(low_res_factor));
 | 
| -  tilings.push_back(pending_layer_->AddTiling(0.3f));
 | 
| -  tilings.push_back(pending_layer_->AddTiling(0.7f));
 | 
| -  tilings.push_back(pending_layer_->AddTiling(1.0f));
 | 
| -  tilings.push_back(pending_layer_->AddTiling(2.0f));
 | 
| +  SetupPendingTreeWithFixedTileSize(pending_pile, tile_size, Region());
 | 
| +  ASSERT_TRUE(pending_layer_->CanHaveTilings());
 | 
|  
 | 
|    pending_layer_->AddChild(LayerImpl::Create(host_impl_.pending_tree(), 1));
 | 
|    LayerImpl* layer1 = pending_layer_->children()[0];
 | 
| @@ -4154,49 +4081,56 @@ TEST_F(OcclusionTrackingPictureLayerImplTest, OcclusionForDifferentScales) {
 | 
|    layer1->SetContentsOpaque(true);
 | 
|    layer1->SetPosition(occluding_layer_position);
 | 
|  
 | 
| -  host_impl_.SetViewportSize(viewport_size);
 | 
| +  pending_layer_->tilings()->RemoveAllTilings();
 | 
| +  float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
 | 
| +  pending_layer_->AddTiling(low_res_factor);
 | 
| +  pending_layer_->AddTiling(0.3f);
 | 
| +  pending_layer_->AddTiling(0.7f);
 | 
| +  pending_layer_->AddTiling(1.0f);
 | 
| +  pending_layer_->AddTiling(2.0f);
 | 
| +
 | 
| +  time_ticks += base::TimeDelta::FromMilliseconds(1);
 | 
| +  host_impl_.SetCurrentBeginFrameArgs(
 | 
| +      CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
 | 
| +  // UpdateDrawProperties with the occluding layer.
 | 
|    host_impl_.pending_tree()->UpdateDrawProperties();
 | 
|  
 | 
| -  int tiling_count = 0;
 | 
| +  EXPECT_EQ(5u, pending_layer_->num_tilings());
 | 
| +
 | 
|    int occluded_tile_count = 0;
 | 
| -  for (std::vector<PictureLayerTiling*>::iterator tiling_iterator =
 | 
| -           tilings.begin();
 | 
| -       tiling_iterator != tilings.end();
 | 
| -       ++tiling_iterator) {
 | 
| -    (*tiling_iterator)->UpdateAllTilePrioritiesForTesting();
 | 
| -    std::vector<Tile*> tiles = (*tiling_iterator)->AllTilesForTesting();
 | 
| +  for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) {
 | 
| +    PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i);
 | 
| +    tiling->UpdateAllTilePrioritiesForTesting();
 | 
| +    std::vector<Tile*> tiles = tiling->AllTilesForTesting();
 | 
|  
 | 
|      occluded_tile_count = 0;
 | 
| -    for (size_t i = 0; i < tiles.size(); ++i) {
 | 
| -      if (tiles[i]->is_occluded(PENDING_TREE)) {
 | 
| +    for (size_t j = 0; j < tiles.size(); ++j) {
 | 
| +      if (tiles[j]->is_occluded(PENDING_TREE)) {
 | 
|          gfx::Rect scaled_content_rect = ScaleToEnclosingRect(
 | 
| -            tiles[i]->content_rect(), 1.0f / tiles[i]->contents_scale());
 | 
| +            tiles[j]->content_rect(), 1.0f / tiles[j]->contents_scale());
 | 
|          EXPECT_GE(scaled_content_rect.x(), occluding_layer_position.x());
 | 
|          occluded_tile_count++;
 | 
|        }
 | 
|      }
 | 
| -    switch (tiling_count) {
 | 
| +
 | 
| +    switch (i) {
 | 
|        case 0:
 | 
| +        EXPECT_EQ(occluded_tile_count, 30);
 | 
| +        break;
 | 
|        case 1:
 | 
| -        EXPECT_EQ(occluded_tile_count, 2);
 | 
| +        EXPECT_EQ(occluded_tile_count, 5);
 | 
|          break;
 | 
|        case 2:
 | 
|          EXPECT_EQ(occluded_tile_count, 4);
 | 
|          break;
 | 
| -      case 3:
 | 
| -        EXPECT_EQ(occluded_tile_count, 5);
 | 
| -        break;
 | 
|        case 4:
 | 
| -        EXPECT_EQ(occluded_tile_count, 30);
 | 
| +      case 3:
 | 
| +        EXPECT_EQ(occluded_tile_count, 2);
 | 
|          break;
 | 
|        default:
 | 
|          NOTREACHED();
 | 
|      }
 | 
| -
 | 
| -    tiling_count++;
 | 
|    }
 | 
| -
 | 
| -  EXPECT_EQ(tiling_count, 5);
 | 
|  }
 | 
|  
 | 
|  TEST_F(OcclusionTrackingPictureLayerImplTest, DifferentOcclusionOnTrees) {
 | 
| @@ -4210,24 +4144,23 @@ TEST_F(OcclusionTrackingPictureLayerImplTest, DifferentOcclusionOnTrees) {
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|    scoped_refptr<FakePicturePileImpl> active_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| -  SetupTrees(pending_pile, active_pile);
 | 
| +
 | 
| +  host_impl_.SetViewportSize(viewport_size);
 | 
| +  SetupPendingTree(active_pile);
 | 
|  
 | 
|    // Partially occlude the active layer.
 | 
| -  active_layer_->AddChild(LayerImpl::Create(host_impl_.active_tree(), 2));
 | 
| -  LayerImpl* layer1 = active_layer_->children()[0];
 | 
| +  pending_layer_->AddChild(LayerImpl::Create(host_impl_.pending_tree(), 2));
 | 
| +  LayerImpl* layer1 = pending_layer_->children()[0];
 | 
|    layer1->SetBounds(layer_bounds);
 | 
|    layer1->SetContentBounds(layer_bounds);
 | 
|    layer1->SetDrawsContent(true);
 | 
|    layer1->SetContentsOpaque(true);
 | 
|    layer1->SetPosition(occluding_layer_position);
 | 
|  
 | 
| -  // Partially invalidate the pending layer.
 | 
| -  pending_layer_->set_invalidation(invalidation_rect);
 | 
| -
 | 
| -  host_impl_.SetViewportSize(viewport_size);
 | 
| +  ActivateTree();
 | 
|  
 | 
| -  active_layer_->CreateDefaultTilingsAndTiles();
 | 
| -  pending_layer_->CreateDefaultTilingsAndTiles();
 | 
| +  // Partially invalidate the pending layer.
 | 
| +  SetupPendingTreeWithInvalidation(pending_pile, invalidation_rect);
 | 
|  
 | 
|    for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) {
 | 
|      PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i);
 | 
| @@ -4306,36 +4239,45 @@ TEST_F(OcclusionTrackingPictureLayerImplTest, DifferentOcclusionOnTrees) {
 | 
|  
 | 
|  TEST_F(OcclusionTrackingPictureLayerImplTest,
 | 
|         OccludedTilesConsideredDuringEviction) {
 | 
| +  base::TimeTicks time_ticks;
 | 
| +  time_ticks += base::TimeDelta::FromMilliseconds(1);
 | 
| +  host_impl_.SetCurrentBeginFrameArgs(
 | 
| +      CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
 | 
| +
 | 
|    gfx::Size tile_size(102, 102);
 | 
|    gfx::Size layer_bounds(1000, 1000);
 | 
| -  gfx::Size viewport_size(500, 500);
 | 
| +  gfx::Size viewport_size(1000, 1000);
 | 
|    gfx::Point pending_occluding_layer_position(310, 0);
 | 
|    gfx::Point active_occluding_layer_position(0, 310);
 | 
|    gfx::Rect invalidation_rect(230, 230, 102, 102);
 | 
|  
 | 
| +  host_impl_.SetViewportSize(viewport_size);
 | 
| +  host_impl_.SetDeviceScaleFactor(2.f);
 | 
| +
 | 
|    scoped_refptr<FakePicturePileImpl> pending_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
|    scoped_refptr<FakePicturePileImpl> active_pile =
 | 
|        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| -  SetupTrees(pending_pile, active_pile);
 | 
|  
 | 
| -  pending_layer_->set_fixed_tile_size(tile_size);
 | 
| -  active_layer_->set_fixed_tile_size(tile_size);
 | 
| +  SetupPendingTreeWithFixedTileSize(active_pile, tile_size, Region());
 | 
|  
 | 
| -  float low_res_factor = host_impl_.settings().low_res_contents_scale_factor;
 | 
| +  // Partially occlude the active layer.
 | 
| +  pending_layer_->AddChild(LayerImpl::Create(host_impl_.pending_tree(), 2));
 | 
| +  LayerImpl* active_occluding_layer = pending_layer_->children()[0];
 | 
| +  active_occluding_layer->SetBounds(layer_bounds);
 | 
| +  active_occluding_layer->SetContentBounds(layer_bounds);
 | 
| +  active_occluding_layer->SetDrawsContent(true);
 | 
| +  active_occluding_layer->SetContentsOpaque(true);
 | 
| +  active_occluding_layer->SetPosition(active_occluding_layer_position);
 | 
|  
 | 
| -  std::vector<PictureLayerTiling*> tilings;
 | 
| -  tilings.push_back(pending_layer_->AddTiling(low_res_factor));
 | 
| -  tilings.push_back(pending_layer_->AddTiling(0.3f));
 | 
| -  tilings.push_back(pending_layer_->AddTiling(0.7f));
 | 
| -  tilings.push_back(pending_layer_->AddTiling(1.0f));
 | 
| -  tilings.push_back(pending_layer_->AddTiling(2.0f));
 | 
| +  ActivateTree();
 | 
|  
 | 
| -  EXPECT_EQ(5u, pending_layer_->num_tilings());
 | 
| -  EXPECT_EQ(5u, active_layer_->num_tilings());
 | 
| +  // Partially invalidate the pending layer. Tiles inside the invalidation rect
 | 
| +  // are not shared between trees.
 | 
| +  SetupPendingTreeWithFixedTileSize(pending_pile, tile_size, invalidation_rect);
 | 
|  
 | 
| -  // Partially occlude the pending layer.
 | 
| -  pending_layer_->AddChild(LayerImpl::Create(host_impl_.pending_tree(), 1));
 | 
| +  // Partially occlude the pending layer in a different way.
 | 
| +  pending_layer_->AddChild(LayerImpl::Create(host_impl_.pending_tree(), 3));
 | 
|    LayerImpl* pending_occluding_layer = pending_layer_->children()[0];
 | 
|    pending_occluding_layer->SetBounds(layer_bounds);
 | 
|    pending_occluding_layer->SetContentBounds(layer_bounds);
 | 
| @@ -4343,52 +4285,38 @@ TEST_F(OcclusionTrackingPictureLayerImplTest,
 | 
|    pending_occluding_layer->SetContentsOpaque(true);
 | 
|    pending_occluding_layer->SetPosition(pending_occluding_layer_position);
 | 
|  
 | 
| -  // Partially occlude the active layer.
 | 
| -  active_layer_->AddChild(LayerImpl::Create(host_impl_.active_tree(), 2));
 | 
| -  LayerImpl* active_occluding_layer = active_layer_->children()[0];
 | 
| -  active_occluding_layer->SetBounds(layer_bounds);
 | 
| -  active_occluding_layer->SetContentBounds(layer_bounds);
 | 
| -  active_occluding_layer->SetDrawsContent(true);
 | 
| -  active_occluding_layer->SetContentsOpaque(true);
 | 
| -  active_occluding_layer->SetPosition(active_occluding_layer_position);
 | 
| -
 | 
| -  // Partially invalidate the pending layer. Tiles inside the invalidation rect
 | 
| -  // are not shared between trees.
 | 
| -  pending_layer_->set_invalidation(invalidation_rect);
 | 
| +  EXPECT_EQ(2u, pending_layer_->num_tilings());
 | 
| +  EXPECT_EQ(2u, active_layer_->num_tilings());
 | 
|  
 | 
| -  host_impl_.SetViewportSize(viewport_size);
 | 
| -  host_impl_.active_tree()->UpdateDrawProperties();
 | 
| +  time_ticks += base::TimeDelta::FromMilliseconds(1);
 | 
| +  host_impl_.SetCurrentBeginFrameArgs(
 | 
| +      CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
 | 
| +  // UpdateDrawProperties with the occluding layer.
 | 
|    host_impl_.pending_tree()->UpdateDrawProperties();
 | 
|  
 | 
| -  // The expected number of occluded tiles on each of the 5 tilings for each of
 | 
| +  // The expected number of occluded tiles on each of the 2 tilings for each of
 | 
|    // the 3 tree priorities.
 | 
| -  size_t expected_occluded_tile_count_on_both[] = {9u, 1u, 1u, 1u, 1u};
 | 
| -  size_t expected_occluded_tile_count_on_active[] = {30u, 5u, 4u, 2u, 2u};
 | 
| -  size_t expected_occluded_tile_count_on_pending[] = {30u, 5u, 4u, 2u, 2u};
 | 
| +  size_t expected_occluded_tile_count_on_both[] = {9u, 1u};
 | 
| +  size_t expected_occluded_tile_count_on_active[] = {30u, 3u};
 | 
| +  size_t expected_occluded_tile_count_on_pending[] = {30u, 3u};
 | 
|  
 | 
| -  // The total expected number of occluded tiles on all tilings for each of the
 | 
| -  // 3 tree priorities.
 | 
| -  size_t total_expected_occluded_tile_count[] = {13u, 43u, 43u};
 | 
| -
 | 
| -  ASSERT_EQ(arraysize(total_expected_occluded_tile_count), NUM_TREE_PRIORITIES);
 | 
| +  size_t total_expected_occluded_tile_count_on_trees[] = {33u, 33u};
 | 
|  
 | 
|    // Verify number of occluded tiles on the pending layer for each tiling.
 | 
|    for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) {
 | 
|      PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i);
 | 
| -    tiling->CreateAllTilesForTesting();
 | 
|      tiling->UpdateAllTilePrioritiesForTesting();
 | 
|  
 | 
|      size_t occluded_tile_count_on_pending = 0u;
 | 
|      size_t occluded_tile_count_on_active = 0u;
 | 
|      size_t occluded_tile_count_on_both = 0u;
 | 
| -    for (PictureLayerTiling::CoverageIterator iter(
 | 
| -             tiling,
 | 
| -             pending_layer_->contents_scale_x(),
 | 
| -             gfx::Rect(layer_bounds));
 | 
| -         iter;
 | 
| -         ++iter) {
 | 
| +    for (PictureLayerTiling::CoverageIterator iter(tiling, 1.f,
 | 
| +                                                   gfx::Rect(layer_bounds));
 | 
| +         iter; ++iter) {
 | 
|        Tile* tile = *iter;
 | 
|  
 | 
| +      if (!tile)
 | 
| +        continue;
 | 
|        if (tile->is_occluded(PENDING_TREE))
 | 
|          occluded_tile_count_on_pending++;
 | 
|        if (tile->is_occluded(ACTIVE_TREE))
 | 
| @@ -4398,19 +4326,18 @@ TEST_F(OcclusionTrackingPictureLayerImplTest,
 | 
|      }
 | 
|      EXPECT_EQ(expected_occluded_tile_count_on_pending[i],
 | 
|                occluded_tile_count_on_pending)
 | 
| -        << i;
 | 
| +        << tiling->contents_scale();
 | 
|      EXPECT_EQ(expected_occluded_tile_count_on_active[i],
 | 
|                occluded_tile_count_on_active)
 | 
| -        << i;
 | 
| +        << tiling->contents_scale();
 | 
|      EXPECT_EQ(expected_occluded_tile_count_on_both[i],
 | 
|                occluded_tile_count_on_both)
 | 
| -        << i;
 | 
| +        << tiling->contents_scale();
 | 
|    }
 | 
|  
 | 
|    // Verify number of occluded tiles on the active layer for each tiling.
 | 
|    for (size_t i = 0; i < active_layer_->num_tilings(); ++i) {
 | 
|      PictureLayerTiling* tiling = active_layer_->tilings()->tiling_at(i);
 | 
| -    tiling->CreateAllTilesForTesting();
 | 
|      tiling->UpdateAllTilePrioritiesForTesting();
 | 
|  
 | 
|      size_t occluded_tile_count_on_pending = 0u;
 | 
| @@ -4424,6 +4351,8 @@ TEST_F(OcclusionTrackingPictureLayerImplTest,
 | 
|           ++iter) {
 | 
|        Tile* tile = *iter;
 | 
|  
 | 
| +      if (!tile)
 | 
| +        continue;
 | 
|        if (tile->is_occluded(PENDING_TREE))
 | 
|          occluded_tile_count_on_pending++;
 | 
|        if (tile->is_occluded(ACTIVE_TREE))
 | 
| @@ -4443,20 +4372,38 @@ TEST_F(OcclusionTrackingPictureLayerImplTest,
 | 
|    }
 | 
|  
 | 
|    std::vector<Tile*> all_tiles;
 | 
| -  for (std::vector<PictureLayerTiling*>::iterator tiling_iterator =
 | 
| -           tilings.begin();
 | 
| -       tiling_iterator != tilings.end();
 | 
| -       ++tiling_iterator) {
 | 
| -    std::vector<Tile*> tiles = (*tiling_iterator)->AllTilesForTesting();
 | 
| -    std::copy(tiles.begin(), tiles.end(), std::back_inserter(all_tiles));
 | 
| +  for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) {
 | 
| +    PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i);
 | 
| +    std::vector<Tile*> tiles = tiling->AllTilesForTesting();
 | 
| +    all_tiles.insert(all_tiles.end(), tiles.begin(), tiles.end());
 | 
|    }
 | 
|  
 | 
|    host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles);
 | 
|  
 | 
| -  VerifyEvictionConsidersOcclusion(pending_layer_,
 | 
| -                                   total_expected_occluded_tile_count);
 | 
| -  VerifyEvictionConsidersOcclusion(active_layer_,
 | 
| -                                   total_expected_occluded_tile_count);
 | 
| +  VerifyEvictionConsidersOcclusion(
 | 
| +      pending_layer_, active_layer_, PENDING_TREE,
 | 
| +      total_expected_occluded_tile_count_on_trees[PENDING_TREE]);
 | 
| +  VerifyEvictionConsidersOcclusion(
 | 
| +      active_layer_, pending_layer_, ACTIVE_TREE,
 | 
| +      total_expected_occluded_tile_count_on_trees[ACTIVE_TREE]);
 | 
| +
 | 
| +  // Repeat the tests without valid active tree priorities.
 | 
| +  active_layer_->set_has_valid_tile_priorities(false);
 | 
| +  VerifyEvictionConsidersOcclusion(
 | 
| +      pending_layer_, active_layer_, PENDING_TREE,
 | 
| +      total_expected_occluded_tile_count_on_trees[PENDING_TREE]);
 | 
| +  VerifyEvictionConsidersOcclusion(
 | 
| +      active_layer_, pending_layer_, ACTIVE_TREE, 0u);
 | 
| +  active_layer_->set_has_valid_tile_priorities(true);
 | 
| +
 | 
| +  // Repeat the tests without valid pending tree priorities.
 | 
| +  pending_layer_->set_has_valid_tile_priorities(false);
 | 
| +  VerifyEvictionConsidersOcclusion(
 | 
| +      active_layer_, pending_layer_, ACTIVE_TREE,
 | 
| +      total_expected_occluded_tile_count_on_trees[ACTIVE_TREE]);
 | 
| +  VerifyEvictionConsidersOcclusion(
 | 
| +      pending_layer_, active_layer_, PENDING_TREE, 0u);
 | 
| +  pending_layer_->set_has_valid_tile_priorities(true);
 | 
|  }
 | 
|  
 | 
|  TEST_F(PictureLayerImplTest, PendingOrActiveTwinLayer) {
 | 
| @@ -4530,8 +4477,6 @@ void PictureLayerImplTest::TestQuadsForSolidColor(bool test_for_solid) {
 | 
|    host->SetRootLayer(layer);
 | 
|    RecordingSource* recording_source = layer->GetRecordingSourceForTesting();
 | 
|  
 | 
| -  host_impl_.SetViewportSize(layer_bounds);
 | 
| -
 | 
|    int frame_number = 0;
 | 
|  
 | 
|    client.set_fill_with_nonsolid_color(!test_for_solid);
 | 
| @@ -4544,11 +4489,9 @@ void PictureLayerImplTest::TestQuadsForSolidColor(bool test_for_solid) {
 | 
|    scoped_refptr<RasterSource> pending_raster_source =
 | 
|        recording_source->CreateRasterSource();
 | 
|  
 | 
| -  SetupPendingTree(pending_raster_source);
 | 
| +  SetupPendingTreeWithFixedTileSize(pending_raster_source, tile_size, Region());
 | 
|    ActivateTree();
 | 
|  
 | 
| -  active_layer_->set_fixed_tile_size(tile_size);
 | 
| -  host_impl_.active_tree()->UpdateDrawProperties();
 | 
|    if (test_for_solid) {
 | 
|      EXPECT_EQ(0u, active_layer_->tilings()->num_tilings());
 | 
|    } else {
 | 
| @@ -4597,8 +4540,6 @@ TEST_F(PictureLayerImplTest, NonSolidToSolidNoTilings) {
 | 
|    host->SetRootLayer(layer);
 | 
|    RecordingSource* recording_source = layer->GetRecordingSourceForTesting();
 | 
|  
 | 
| -  host_impl_.SetViewportSize(layer_bounds);
 | 
| -
 | 
|    int frame_number = 0;
 | 
|  
 | 
|    client.set_fill_with_nonsolid_color(true);
 | 
| @@ -4696,6 +4637,66 @@ TEST_F(PictureLayerImplTest, ChangeInViewportAllowsTilingUpdates) {
 | 
|    EXPECT_TRUE(pending_layer_->AllTilesRequiredForActivationAreReadyToDraw());
 | 
|  }
 | 
|  
 | 
| +TEST_F(PictureLayerImplTest, CloneMissingRecordings) {
 | 
| +  gfx::Size tile_size(100, 100);
 | 
| +  gfx::Size layer_bounds(400, 400);
 | 
| +
 | 
| +  scoped_refptr<FakePicturePileImpl> filled_pile =
 | 
| +      FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
 | 
| +  scoped_refptr<FakePicturePileImpl> partial_pile =
 | 
| +      FakePicturePileImpl::CreateEmptyPile(tile_size, layer_bounds);
 | 
| +  for (int i = 1; i < partial_pile->tiling().num_tiles_x(); ++i) {
 | 
| +    for (int j = 1; j < partial_pile->tiling().num_tiles_y(); ++j)
 | 
| +      partial_pile->AddRecordingAt(i, j);
 | 
| +  }
 | 
| +
 | 
| +  SetupPendingTreeWithFixedTileSize(filled_pile, tile_size, Region());
 | 
| +  ActivateTree();
 | 
| +
 | 
| +  PictureLayerTiling* pending_tiling = old_pending_layer_->HighResTiling();
 | 
| +  PictureLayerTiling* active_tiling = active_layer_->HighResTiling();
 | 
| +
 | 
| +  // We should have all tiles in both tile sets.
 | 
| +  EXPECT_EQ(5u * 5u, pending_tiling->AllTilesForTesting().size());
 | 
| +  EXPECT_EQ(5u * 5u, active_tiling->AllTilesForTesting().size());
 | 
| +
 | 
| +  // Now put a partially-recorded pile on the pending tree (and invalidate
 | 
| +  // everything, since the main thread PicturePile will invalidate dropped
 | 
| +  // recordings). This will cause us to be missing some tiles.
 | 
| +  SetupPendingTreeWithFixedTileSize(partial_pile, tile_size,
 | 
| +                                    Region(gfx::Rect(layer_bounds)));
 | 
| +  EXPECT_EQ(3u * 3u, pending_tiling->AllTilesForTesting().size());
 | 
| +  EXPECT_FALSE(pending_tiling->TileAt(0, 0));
 | 
| +  EXPECT_FALSE(pending_tiling->TileAt(1, 1));
 | 
| +  EXPECT_TRUE(pending_tiling->TileAt(2, 2));
 | 
| +
 | 
| +  // Active is not affected yet.
 | 
| +  EXPECT_EQ(5u * 5u, active_tiling->AllTilesForTesting().size());
 | 
| +
 | 
| +  // Activate the tree. The same tiles go missing on the active tree.
 | 
| +  ActivateTree();
 | 
| +  EXPECT_EQ(3u * 3u, active_tiling->AllTilesForTesting().size());
 | 
| +  EXPECT_FALSE(active_tiling->TileAt(0, 0));
 | 
| +  EXPECT_FALSE(active_tiling->TileAt(1, 1));
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(2, 2));
 | 
| +
 | 
| +  // Now put a full recording on the pending tree again. We'll get all our tiles
 | 
| +  // back.
 | 
| +  SetupPendingTreeWithFixedTileSize(filled_pile, tile_size,
 | 
| +                                    Region(gfx::Rect(layer_bounds)));
 | 
| +  EXPECT_EQ(5u * 5u, pending_tiling->AllTilesForTesting().size());
 | 
| +
 | 
| +  // Active is not affected yet.
 | 
| +  EXPECT_EQ(3u * 3u, active_tiling->AllTilesForTesting().size());
 | 
| +
 | 
| +  // Activate the tree. The tiles are created and shared on the active tree.
 | 
| +  ActivateTree();
 | 
| +  EXPECT_EQ(5u * 5u, active_tiling->AllTilesForTesting().size());
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(0, 0)->is_shared());
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(1, 1)->is_shared());
 | 
| +  EXPECT_TRUE(active_tiling->TileAt(2, 2)->is_shared());
 | 
| +}
 | 
| +
 | 
|  class TileSizeSettings : public ImplSidePaintingSettings {
 | 
|   public:
 | 
|    TileSizeSettings() {
 | 
| 
 |