| Index: cc/layers/layer_position_constraint_unittest.cc
 | 
| diff --git a/cc/layers/layer_position_constraint_unittest.cc b/cc/layers/layer_position_constraint_unittest.cc
 | 
| index 3557f7f5a1b98cf234cbbc3e4e816ff217f9d8a9..57e4c1de595b65c4dba6f7b0322d3b192830de10 100644
 | 
| --- a/cc/layers/layer_position_constraint_unittest.cc
 | 
| +++ b/cc/layers/layer_position_constraint_unittest.cc
 | 
| @@ -39,14 +39,13 @@
 | 
|                                      bool can_use_lcd_text) {
 | 
|    gfx::Transform identity_matrix;
 | 
|    std::vector<LayerImpl*> dummy_render_surface_layer_list;
 | 
| -  LayerImpl* scroll_layer = root_layer->children()[0];
 | 
|    gfx::Size device_viewport_size =
 | 
|        gfx::Size(root_layer->bounds().width() * device_scale_factor,
 | 
|                  root_layer->bounds().height() * device_scale_factor);
 | 
|  
 | 
| -  // We are probably not testing what is intended if the scroll_layer bounds are
 | 
| +  // We are probably not testing what is intended if the root_layer bounds are
 | 
|    // empty.
 | 
| -  DCHECK(!scroll_layer->bounds().IsEmpty());
 | 
| +  DCHECK(!root_layer->bounds().IsEmpty());
 | 
|    LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
 | 
|        root_layer, device_viewport_size, &dummy_render_surface_layer_list);
 | 
|    inputs.device_scale_factor = device_scale_factor;
 | 
| @@ -67,7 +66,6 @@
 | 
|    LayerPositionConstraintTest()
 | 
|        : host_impl_(&proxy_) {
 | 
|      root_ = CreateTreeForTest();
 | 
| -    scroll_ = root_->children()[0];
 | 
|      fixed_to_top_left_.set_is_fixed_position(true);
 | 
|      fixed_to_bottom_right_.set_is_fixed_position(true);
 | 
|      fixed_to_bottom_right_.set_is_fixed_to_right_edge(true);
 | 
| @@ -76,8 +74,6 @@
 | 
|  
 | 
|    scoped_ptr<LayerImpl> CreateTreeForTest() {
 | 
|      scoped_ptr<LayerImpl> root =
 | 
| -        LayerImpl::Create(host_impl_.active_tree(), 42);
 | 
| -    scoped_ptr<LayerImpl> scroll_layer =
 | 
|          LayerImpl::Create(host_impl_.active_tree(), 1);
 | 
|      scoped_ptr<LayerImpl> child =
 | 
|          LayerImpl::Create(host_impl_.active_tree(), 2);
 | 
| @@ -89,9 +85,8 @@
 | 
|      gfx::Transform IdentityMatrix;
 | 
|      gfx::PointF anchor;
 | 
|      gfx::PointF position;
 | 
| -    gfx::Size bounds(200, 200);
 | 
| -    gfx::Size clip_bounds(100, 100);
 | 
| -    SetLayerPropertiesForTesting(scroll_layer.get(),
 | 
| +    gfx::Size bounds(100, 100);
 | 
| +    SetLayerPropertiesForTesting(root.get(),
 | 
|                                   IdentityMatrix,
 | 
|                                   IdentityMatrix,
 | 
|                                   anchor,
 | 
| @@ -120,15 +115,16 @@
 | 
|                                   bounds,
 | 
|                                   false);
 | 
|  
 | 
| -    root->SetBounds(clip_bounds);
 | 
| -    scroll_layer->SetScrollClipLayer(root->id());
 | 
| -    child->SetScrollClipLayer(root->id());
 | 
| -    grand_child->SetScrollClipLayer(root->id());
 | 
| +    root->SetMaxScrollOffset(gfx::Vector2d(100, 100));
 | 
| +    root->SetScrollable(true);
 | 
| +    child->SetMaxScrollOffset(gfx::Vector2d(100, 100));
 | 
| +    child->SetScrollable(true);
 | 
| +    grand_child->SetMaxScrollOffset(gfx::Vector2d(100, 100));
 | 
| +    grand_child->SetScrollable(true);
 | 
|  
 | 
|      grand_child->AddChild(great_grand_child.Pass());
 | 
|      child->AddChild(grand_child.Pass());
 | 
| -    scroll_layer->AddChild(child.Pass());
 | 
| -    root->AddChild(scroll_layer.Pass());
 | 
| +    root->AddChild(child.Pass());
 | 
|  
 | 
|      return root.Pass();
 | 
|    }
 | 
| @@ -137,7 +133,6 @@
 | 
|    FakeImplProxy proxy_;
 | 
|    FakeLayerTreeHostImpl host_impl_;
 | 
|    scoped_ptr<LayerImpl> root_;
 | 
| -  LayerImpl* scroll_;
 | 
|  
 | 
|    LayerPositionConstraint fixed_to_top_left_;
 | 
|    LayerPositionConstraint fixed_to_bottom_right_;
 | 
| @@ -147,7 +142,7 @@
 | 
|       ScrollCompensationForFixedPositionLayerWithDirectContainer) {
 | 
|    // This test checks for correct scroll compensation when the fixed-position
 | 
|    // container is the direct parent of the fixed-position layer.
 | 
| -  LayerImpl* child = scroll_->children()[0];
 | 
| +  LayerImpl* child = root_->children()[0];
 | 
|    LayerImpl* grand_child = child->children()[0];
 | 
|  
 | 
|    child->SetIsContainerForFixedPositionLayers(true);
 | 
| @@ -215,7 +210,7 @@
 | 
|    // Transforms are in general non-commutative; using something like a
 | 
|    // non-uniform scale helps to verify that translations and non-uniform scales
 | 
|    // are applied in the correct order.
 | 
| -  LayerImpl* child = scroll_->children()[0];
 | 
| +  LayerImpl* child = root_->children()[0];
 | 
|    LayerImpl* grand_child = child->children()[0];
 | 
|  
 | 
|    // This scale will cause child and grand_child to be effectively 200 x 800
 | 
| @@ -287,7 +282,7 @@
 | 
|       ScrollCompensationForFixedPositionLayerWithDistantContainer) {
 | 
|    // This test checks for correct scroll compensation when the fixed-position
 | 
|    // container is NOT the direct parent of the fixed-position layer.
 | 
| -  LayerImpl* child = scroll_->children()[0];
 | 
| +  LayerImpl* child = root_->children()[0];
 | 
|    LayerImpl* grand_child = child->children()[0];
 | 
|    LayerImpl* great_grand_child = grand_child->children()[0];
 | 
|  
 | 
| @@ -367,7 +362,7 @@
 | 
|    // container is NOT the direct parent of the fixed-position layer, and the
 | 
|    // hierarchy has various transforms that have to be processed in the correct
 | 
|    // order.
 | 
| -  LayerImpl* child = scroll_->children()[0];
 | 
| +  LayerImpl* child = root_->children()[0];
 | 
|    LayerImpl* grand_child = child->children()[0];
 | 
|    LayerImpl* great_grand_child = grand_child->children()[0];
 | 
|  
 | 
| @@ -479,7 +474,7 @@
 | 
|    // container is NOT the direct parent of the fixed-position layer, and the
 | 
|    // hierarchy has various transforms that have to be processed in the correct
 | 
|    // order.
 | 
| -  LayerImpl* child = scroll_->children()[0];
 | 
| +  LayerImpl* child = root_->children()[0];
 | 
|    LayerImpl* grand_child = child->children()[0];
 | 
|    LayerImpl* great_grand_child = grand_child->children()[0];
 | 
|  
 | 
| @@ -590,7 +585,7 @@
 | 
|    // container contributes to a different render surface than the fixed-position
 | 
|    // layer. In this case, the surface draw transforms also have to be accounted
 | 
|    // for when checking the scroll delta.
 | 
| -  LayerImpl* child = scroll_->children()[0];
 | 
| +  LayerImpl* child = root_->children()[0];
 | 
|    LayerImpl* grand_child = child->children()[0];
 | 
|    LayerImpl* great_grand_child = grand_child->children()[0];
 | 
|  
 | 
| @@ -714,7 +709,7 @@
 | 
|    // layer, with additional render surfaces in-between. This checks that the
 | 
|    // conversion to ancestor surfaces is accumulated properly in the final matrix
 | 
|    // transform.
 | 
| -  LayerImpl* child = scroll_->children()[0];
 | 
| +  LayerImpl* child = root_->children()[0];
 | 
|    LayerImpl* grand_child = child->children()[0];
 | 
|    LayerImpl* great_grand_child = grand_child->children()[0];
 | 
|  
 | 
| @@ -901,7 +896,7 @@
 | 
|    // should be treated like a layer that contributes to a render target, and
 | 
|    // that render target is completely irrelevant; it should not affect the
 | 
|    // scroll compensation.
 | 
| -  LayerImpl* child = scroll_->children()[0];
 | 
| +  LayerImpl* child = root_->children()[0];
 | 
|    LayerImpl* grand_child = child->children()[0];
 | 
|  
 | 
|    child->SetIsContainerForFixedPositionLayers(true);
 | 
| @@ -979,7 +974,7 @@
 | 
|    // This test checks the scenario where a fixed-position layer also happens to
 | 
|    // be a container itself for a descendant fixed position layer. In particular,
 | 
|    // the layer should not accidentally be fixed to itself.
 | 
| -  LayerImpl* child = scroll_->children()[0];
 | 
| +  LayerImpl* child = root_->children()[0];
 | 
|    LayerImpl* grand_child = child->children()[0];
 | 
|  
 | 
|    child->SetIsContainerForFixedPositionLayers(true);
 | 
| @@ -1031,6 +1026,67 @@
 | 
|    expected_grand_child_transform.MakeIdentity();
 | 
|    // Apply size delta from the child(container) layer.
 | 
|    expected_grand_child_transform.Translate(20.0, 20.0);
 | 
| +
 | 
| +  EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform,
 | 
| +                                  child->draw_transform());
 | 
| +  EXPECT_TRANSFORMATION_MATRIX_EQ(expected_grand_child_transform,
 | 
| +                                  grand_child->draw_transform());
 | 
| +}
 | 
| +
 | 
| +TEST_F(LayerPositionConstraintTest,
 | 
| +     ScrollCompensationForFixedPositionLayerThatHasNoContainer) {
 | 
| +  // This test checks scroll compensation when a fixed-position layer does not
 | 
| +  // find any ancestor that is a "containerForFixedPositionLayers". In this
 | 
| +  // situation, the layer should be fixed to the root layer.
 | 
| +  LayerImpl* child = root_->children()[0];
 | 
| +  LayerImpl* grand_child = child->children()[0];
 | 
| +
 | 
| +  gfx::Transform rotation_by_z;
 | 
| +  rotation_by_z.RotateAboutZAxis(90.0);
 | 
| +
 | 
| +  root_->SetTransform(rotation_by_z);
 | 
| +  grand_child->SetPositionConstraint(fixed_to_top_left_);
 | 
| +
 | 
| +  // Case 1: root scroll delta of 0, 0
 | 
| +  root_->SetScrollDelta(gfx::Vector2d(0, 0));
 | 
| +  ExecuteCalculateDrawProperties(root_.get());
 | 
| +
 | 
| +  gfx::Transform identity_matrix;
 | 
| +
 | 
| +  EXPECT_TRANSFORMATION_MATRIX_EQ(rotation_by_z, child->draw_transform());
 | 
| +  EXPECT_TRANSFORMATION_MATRIX_EQ(rotation_by_z,
 | 
| +                                  grand_child->draw_transform());
 | 
| +
 | 
| +  // Case 2: root scroll delta of 10, 10
 | 
| +  root_->SetScrollDelta(gfx::Vector2d(10, 20));
 | 
| +  ExecuteCalculateDrawProperties(root_.get());
 | 
| +
 | 
| +  gfx::Transform expected_child_transform;
 | 
| +  expected_child_transform.Translate(-10.0, -20.0);
 | 
| +  expected_child_transform.PreconcatTransform(rotation_by_z);
 | 
| +
 | 
| +  EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform,
 | 
| +                                  child->draw_transform());
 | 
| +  EXPECT_TRANSFORMATION_MATRIX_EQ(rotation_by_z,
 | 
| +                                  grand_child->draw_transform());
 | 
| +
 | 
| +  // Case 3: fixed-container size delta of 20, 20
 | 
| +  root_->SetFixedContainerSizeDelta(gfx::Vector2d(20, 20));
 | 
| +  ExecuteCalculateDrawProperties(root_.get());
 | 
| +
 | 
| +  // Top-left fixed-position layer should not be affected by container size.
 | 
| +  EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform,
 | 
| +                                  child->draw_transform());
 | 
| +  EXPECT_TRANSFORMATION_MATRIX_EQ(rotation_by_z,
 | 
| +                                  grand_child->draw_transform());
 | 
| +
 | 
| +  // Case 4: Bottom-right fixed-position layer.
 | 
| +  grand_child->SetPositionConstraint(fixed_to_bottom_right_);
 | 
| +  ExecuteCalculateDrawProperties(root_.get());
 | 
| +
 | 
| +  gfx::Transform expected_grand_child_transform;
 | 
| +  expected_grand_child_transform.Translate(-20.0, 20.0);
 | 
| +  expected_grand_child_transform.PreconcatTransform(rotation_by_z);
 | 
|  
 | 
|    EXPECT_TRANSFORMATION_MATRIX_EQ(expected_child_transform,
 | 
|                                    child->draw_transform());
 | 
| @@ -1046,7 +1102,7 @@
 | 
|    // the scroll compensation, and the child fixed-position layer does not
 | 
|    // need to compensate further.
 | 
|  
 | 
| -  LayerImpl* child = scroll_->children()[0];
 | 
| +  LayerImpl* child = root_->children()[0];
 | 
|    LayerImpl* grand_child = child->children()[0];
 | 
|    LayerImpl* great_grand_child = grand_child->children()[0];
 | 
|  
 | 
| @@ -1105,7 +1161,7 @@
 | 
|    // position containers. In this situation, the child fixed-position element
 | 
|    // would still have to compensate with respect to its container.
 | 
|  
 | 
| -  LayerImpl* container1 = scroll_->children()[0];
 | 
| +  LayerImpl* container1 = root_->children()[0];
 | 
|    LayerImpl* fixed_to_container1 = container1->children()[0];
 | 
|    LayerImpl* container2 = fixed_to_container1->children()[0];
 | 
|  
 | 
| 
 |