diff --git a/cc/input/scroll_elasticity_helper.cc b/cc/input/scroll_elasticity_helper.cc
index 413d64f..8670b830 100644
--- a/cc/input/scroll_elasticity_helper.cc
+++ b/cc/input/scroll_elasticity_helper.cc
@@ -7,6 +7,7 @@
 #include "cc/layers/layer_impl.h"
 #include "cc/trees/layer_tree_host_impl.h"
 #include "cc/trees/layer_tree_impl.h"
+#include "cc/trees/scroll_node.h"
 
 namespace cc {
 
@@ -36,11 +37,11 @@
 }
 
 bool ScrollElasticityHelperImpl::IsUserScrollable() const {
-  LayerImpl* layer = layer_tree_host_impl_->OuterViewportScrollLayer();
-  if (!layer)
+  const auto* scroll_node = layer_tree_host_impl_->OuterViewportScrollNode();
+  if (!scroll_node)
     return false;
-  return layer->user_scrollable_horizontal() ||
-         layer->user_scrollable_vertical();
+  return scroll_node->user_scrollable_horizontal ||
+         scroll_node->user_scrollable_vertical;
 }
 
 gfx::Vector2dF ScrollElasticityHelperImpl::StretchAmount() const {
diff --git a/cc/input/scrollbar_animation_controller_unittest.cc b/cc/input/scrollbar_animation_controller_unittest.cc
index b9ddce2..a25ea11 100644
--- a/cc/input/scrollbar_animation_controller_unittest.cc
+++ b/cc/input/scrollbar_animation_controller_unittest.cc
@@ -1402,7 +1402,8 @@
 
   LayerImpl* scroll_layer = host_impl_.active_tree()->LayerById(1);
   ASSERT_TRUE(scroll_layer);
-  scroll_layer->set_user_scrollable_horizontal(false);
+  scroll_layer->test_properties()->user_scrollable_horizontal = false;
+  host_impl_.active_tree()->BuildLayerListAndPropertyTreesForTesting();
 
   scrollbar_controller_->DidScrollBegin();
 
@@ -1417,7 +1418,8 @@
 
   LayerImpl* scroll_layer = host_impl_.active_tree()->LayerById(1);
   ASSERT_TRUE(scroll_layer);
-  scroll_layer->set_user_scrollable_vertical(false);
+  scroll_layer->test_properties()->user_scrollable_vertical = false;
+  host_impl_.active_tree()->BuildLayerListAndPropertyTreesForTesting();
 
   scrollbar_controller_->DidScrollBegin();
 
@@ -1433,7 +1435,8 @@
 
   LayerImpl* scroll_layer = host_impl_.active_tree()->LayerById(1);
   ASSERT_TRUE(scroll_layer);
-  scroll_layer->set_user_scrollable_vertical(false);
+  scroll_layer->test_properties()->user_scrollable_vertical = false;
+  host_impl_.active_tree()->BuildLayerListAndPropertyTreesForTesting();
 
   scrollbar_controller_->DidScrollBegin();
 
@@ -1449,7 +1452,8 @@
 
   LayerImpl* scroll_layer = host_impl_.active_tree()->LayerById(1);
   ASSERT_TRUE(scroll_layer);
-  scroll_layer->set_user_scrollable_horizontal(false);
+  scroll_layer->test_properties()->user_scrollable_horizontal = false;
+  host_impl_.active_tree()->BuildLayerListAndPropertyTreesForTesting();
 
   scrollbar_controller_->DidScrollBegin();
 
diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc
index d3100f3..f4ff01d 100644
--- a/cc/layers/layer.cc
+++ b/cc/layers/layer.cc
@@ -1171,8 +1171,6 @@
   layer->SetShouldCheckBackfaceVisibility(should_check_backface_visibility_);
 
   layer->SetScrollClipLayer(inputs_.scroll_clip_layer_id);
-  layer->set_user_scrollable_horizontal(inputs_.user_scrollable_horizontal);
-  layer->set_user_scrollable_vertical(inputs_.user_scrollable_vertical);
   layer->SetMutableProperties(inputs_.mutable_properties);
 
   // The property trees must be safe to access because they will be used below
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc
index be6cf82..1b20f0e 100644
--- a/cc/layers/layer_impl.cc
+++ b/cc/layers/layer_impl.cc
@@ -55,8 +55,6 @@
       scroll_clip_layer_id_(Layer::INVALID_ID),
       main_thread_scrolling_reasons_(
           MainThreadScrollingReason::kNotScrollingOnMain),
-      user_scrollable_horizontal_(true),
-      user_scrollable_vertical_(true),
       should_flatten_transform_from_property_tree_(false),
       layer_property_changed_(false),
       may_contain_video_(false),
@@ -290,19 +288,6 @@
   return scroll_clip_layer_id_ != Layer::INVALID_ID;
 }
 
-void LayerImpl::set_user_scrollable_horizontal(bool scrollable) {
-  user_scrollable_horizontal_ = scrollable;
-}
-
-void LayerImpl::set_user_scrollable_vertical(bool scrollable) {
-  user_scrollable_vertical_ = scrollable;
-}
-
-bool LayerImpl::user_scrollable(ScrollbarOrientation orientation) const {
-  return (orientation == HORIZONTAL) ? user_scrollable_horizontal_
-                                     : user_scrollable_vertical_;
-}
-
 std::unique_ptr<LayerImpl> LayerImpl::CreateLayerImpl(
     LayerTreeImpl* tree_impl) {
   return LayerImpl::Create(tree_impl, layer_id_);
@@ -321,8 +306,6 @@
 
   layer->offset_to_transform_parent_ = offset_to_transform_parent_;
   layer->main_thread_scrolling_reasons_ = main_thread_scrolling_reasons_;
-  layer->user_scrollable_horizontal_ = user_scrollable_horizontal_;
-  layer->user_scrollable_vertical_ = user_scrollable_vertical_;
   layer->should_flatten_transform_from_property_tree_ =
       should_flatten_transform_from_property_tree_;
   layer->masks_to_bounds_ = masks_to_bounds_;
diff --git a/cc/layers/layer_impl.h b/cc/layers/layer_impl.h
index cd791ca..5fa037d0 100644
--- a/cc/layers/layer_impl.h
+++ b/cc/layers/layer_impl.h
@@ -307,15 +307,6 @@
   LayerImpl* scroll_clip_layer() const;
   bool scrollable() const;
 
-  void set_user_scrollable_horizontal(bool scrollable);
-  bool user_scrollable_horizontal() const {
-    return user_scrollable_horizontal_;
-  }
-  void set_user_scrollable_vertical(bool scrollable);
-  bool user_scrollable_vertical() const { return user_scrollable_vertical_; }
-
-  bool user_scrollable(ScrollbarOrientation orientation) const;
-
   void set_main_thread_scrolling_reasons(
       uint32_t main_thread_scrolling_reasons) {
     main_thread_scrolling_reasons_ = main_thread_scrolling_reasons;
@@ -493,8 +484,6 @@
   gfx::Vector2dF offset_to_transform_parent_;
   uint32_t main_thread_scrolling_reasons_;
 
-  bool user_scrollable_horizontal_ : 1;
-  bool user_scrollable_vertical_ : 1;
   bool should_flatten_transform_from_property_tree_ : 1;
 
   // Tracks if drawing-related properties have changed since last redraw.
diff --git a/cc/layers/layer_impl_test_properties.h b/cc/layers/layer_impl_test_properties.h
index ee2917e2..fe4c1f8 100644
--- a/cc/layers/layer_impl_test_properties.h
+++ b/cc/layers/layer_impl_test_properties.h
@@ -56,6 +56,8 @@
   LayerImplList children;
   LayerImpl* mask_layer;
   LayerImpl* parent;
+  bool user_scrollable_horizontal = true;
+  bool user_scrollable_vertical = true;
 };
 
 }  // namespace cc
diff --git a/cc/layers/layer_impl_unittest.cc b/cc/layers/layer_impl_unittest.cc
index b12d3a3..e857606 100644
--- a/cc/layers/layer_impl_unittest.cc
+++ b/cc/layers/layer_impl_unittest.cc
@@ -623,7 +623,7 @@
   gfx::ScrollOffset scroll_offset(10, 5);
   gfx::Vector2dF scroll_delta(20.5f, 8.5f);
 
-  layer()->set_user_scrollable_vertical(false);
+  layer()->test_properties()->user_scrollable_vertical = false;
   layer()->layer_tree_impl()->property_trees()->needs_rebuild = true;
   layer()->layer_tree_impl()->BuildLayerListAndPropertyTreesForTesting();
   scroll_tree(layer())->UpdateScrollOffsetBaseForTesting(layer()->id(),
diff --git a/cc/layers/scrollbar_layer_impl_base.cc b/cc/layers/scrollbar_layer_impl_base.cc
index 7c51ea9e..f9b342a 100644
--- a/cc/layers/scrollbar_layer_impl_base.cc
+++ b/cc/layers/scrollbar_layer_impl_base.cc
@@ -7,6 +7,7 @@
 #include <algorithm>
 #include "cc/trees/effect_node.h"
 #include "cc/trees/layer_tree_impl.h"
+#include "cc/trees/scroll_node.h"
 #include "ui/gfx/geometry/rect_conversions.h"
 
 namespace cc {
@@ -80,12 +81,18 @@
 }
 
 bool ScrollbarLayerImplBase::CanScrollOrientation() const {
-  // TODO(pdr): Refactor this to not depend on layers by using the associated
-  // scroll node's user_scrollable values.
-  LayerImpl* scroll_layer =
-      layer_tree_impl()->LayerByElementId(scroll_element_id_);
-  if (!scroll_layer)
-    return false;
+  PropertyTrees* property_trees = layer_tree_impl()->property_trees();
+  const auto* scroll_node =
+      property_trees->scroll_tree.FindNodeFromElementId(scroll_element_id_);
+  DCHECK(scroll_node);
+
+  if (orientation() == ScrollbarOrientation::HORIZONTAL) {
+    if (!scroll_node->user_scrollable_horizontal)
+      return false;
+  } else {
+    if (!scroll_node->user_scrollable_vertical)
+      return false;
+  }
 
   // Ensure the clip_layer_length and scroll_layer_length values are up-to-date.
   // TODO(pdr): Instead of using the clip and scroll layer lengths which require
@@ -93,10 +100,9 @@
   // as in LayerTreeHostImpl::TryScroll).
   layer_tree_impl()->UpdateScrollbarGeometries();
 
-  return scroll_layer->user_scrollable(orientation()) &&
-         // Ensure clip_layer_length is smaller than scroll_layer_length, not
-         // including small deltas due to floating point error.
-         !MathUtil::IsFloatNearlyTheSame(clip_layer_length(),
+  // Ensure clip_layer_length is smaller than scroll_layer_length, not including
+  // small deltas due to floating point error.
+  return !MathUtil::IsFloatNearlyTheSame(clip_layer_length(),
                                          scroll_layer_length()) &&
          clip_layer_length() < scroll_layer_length();
 }
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index a0b3611..fe1084b 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -1622,11 +1622,11 @@
 
   active_tree_->GetViewportSelection(&metadata.selection);
 
-  if (OuterViewportScrollLayer()) {
+  if (const auto* outer_viewport_scroll_node = OuterViewportScrollNode()) {
     metadata.root_overflow_x_hidden =
-        !OuterViewportScrollLayer()->user_scrollable_horizontal();
+        !outer_viewport_scroll_node->user_scrollable_horizontal;
     metadata.root_overflow_y_hidden =
-        !OuterViewportScrollLayer()->user_scrollable_vertical();
+        !outer_viewport_scroll_node->user_scrollable_vertical;
   }
 
   if (GetDrawMode() == DRAW_MODE_RESOURCELESS_SOFTWARE) {
@@ -1638,13 +1638,14 @@
     metadata.referenced_surfaces.push_back(surface_id);
   }
 
-  if (!InnerViewportScrollLayer())
+  const auto* inner_viewport_scroll_node = InnerViewportScrollNode();
+  if (!inner_viewport_scroll_node)
     return metadata;
 
   metadata.root_overflow_x_hidden |=
-      !InnerViewportScrollLayer()->user_scrollable_horizontal();
+      !inner_viewport_scroll_node->user_scrollable_horizontal;
   metadata.root_overflow_y_hidden |=
-      !InnerViewportScrollLayer()->user_scrollable_vertical();
+      !inner_viewport_scroll_node->user_scrollable_vertical;
 
   // TODO(miletus) : Change the metadata to hold ScrollOffset.
   metadata.root_scroll_offset =
@@ -2012,11 +2013,21 @@
   return active_tree_->InnerViewportScrollLayer();
 }
 
+ScrollNode* LayerTreeHostImpl::InnerViewportScrollNode() const {
+  const auto* inner_viewport_scroll_layer = InnerViewportScrollLayer();
+  if (!inner_viewport_scroll_layer)
+    return nullptr;
+  ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree;
+  return scroll_tree.Node(inner_viewport_scroll_layer->scroll_tree_index());
+}
+
 LayerImpl* LayerTreeHostImpl::OuterViewportScrollLayer() const {
   return active_tree_->OuterViewportScrollLayer();
 }
 
 ScrollNode* LayerTreeHostImpl::OuterViewportScrollNode() const {
+  // TODO(pdr): Refactor this to work like InnerViewportScrollNode and access
+  // OuterViewportScrollLayer instead of MainScrollLayer.
   if (!viewport()->MainScrollLayer())
     return nullptr;
   ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree;
@@ -3374,10 +3385,10 @@
                                    scroll_state->delta_y());
 
   // When inner viewport is unscrollable, disable overscrolls.
-  if (InnerViewportScrollLayer()) {
-    if (!InnerViewportScrollLayer()->user_scrollable_horizontal())
+  if (const auto* inner_viewport_scroll_node = InnerViewportScrollNode()) {
+    if (!inner_viewport_scroll_node->user_scrollable_horizontal)
       unused_root_delta.set_x(0);
-    if (!InnerViewportScrollLayer()->user_scrollable_vertical())
+    if (!inner_viewport_scroll_node->user_scrollable_vertical)
       unused_root_delta.set_y(0);
   }
 
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h
index 3036110..eaad972 100644
--- a/cc/trees/layer_tree_host_impl.h
+++ b/cc/trees/layer_tree_host_impl.h
@@ -437,6 +437,7 @@
 
   // Shortcuts to layers/nodes on the active tree.
   LayerImpl* InnerViewportScrollLayer() const;
+  ScrollNode* InnerViewportScrollNode() const;
   LayerImpl* OuterViewportScrollLayer() const;
   ScrollNode* OuterViewportScrollNode() const;
   ScrollNode* CurrentlyScrollingNode();
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index b207e5b..6056657 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -1446,7 +1446,7 @@
   EXPECT_VECTOR_EQ(gfx::Vector2dF(), scroll_layer->CurrentScrollOffset());
   EXPECT_VECTOR_EQ(gfx::Vector2dF(10, 10), overflow->CurrentScrollOffset());
 
-  overflow->set_user_scrollable_horizontal(false);
+  overflow->test_properties()->user_scrollable_horizontal = false;
   host_impl_->active_tree()->BuildPropertyTreesForTesting();
 
   DrawFrame();
@@ -1464,7 +1464,7 @@
   EXPECT_VECTOR_EQ(gfx::Vector2dF(0, 0), scroll_layer->CurrentScrollOffset());
   EXPECT_VECTOR_EQ(gfx::Vector2dF(10, 20), overflow->CurrentScrollOffset());
 
-  overflow->set_user_scrollable_vertical(false);
+  overflow->test_properties()->user_scrollable_vertical = false;
   host_impl_->active_tree()->BuildPropertyTreesForTesting();
   DrawFrame();
 
@@ -3334,6 +3334,7 @@
   animation_task_ = base::Closure();
   child_clip_ptr->SetBounds(gfx::Size(200, 200));
   child_ptr->set_needs_show_scrollbars(true);
+  host_impl_->active_tree()->BuildPropertyTreesForTesting();
   host_impl_->active_tree()->HandleScrollbarShowRequestsFromMain();
   EXPECT_FALSE(animation_task_.Equals(base::Closure()));
   animation_task_ = base::Closure();
@@ -3553,7 +3554,9 @@
   {
     host_impl_->active_tree()
         ->OuterViewportScrollLayer()
-        ->set_user_scrollable_horizontal(false);
+        ->test_properties()
+        ->user_scrollable_horizontal = false;
+    host_impl_->active_tree()->BuildPropertyTreesForTesting();
     CompositorFrameMetadata metadata =
         host_impl_->MakeCompositorFrameMetadata();
     EXPECT_TRUE(metadata.root_overflow_x_hidden);
@@ -3561,7 +3564,9 @@
 
     host_impl_->active_tree()
         ->OuterViewportScrollLayer()
-        ->set_user_scrollable_vertical(false);
+        ->test_properties()
+        ->user_scrollable_vertical = false;
+    host_impl_->active_tree()->BuildPropertyTreesForTesting();
     metadata = host_impl_->MakeCompositorFrameMetadata();
     EXPECT_TRUE(metadata.root_overflow_x_hidden);
     EXPECT_TRUE(metadata.root_overflow_y_hidden);
@@ -3571,10 +3576,13 @@
   {
     host_impl_->active_tree()
         ->OuterViewportScrollLayer()
-        ->set_user_scrollable_horizontal(true);
+        ->test_properties()
+        ->user_scrollable_horizontal = true;
     host_impl_->active_tree()
         ->OuterViewportScrollLayer()
-        ->set_user_scrollable_vertical(true);
+        ->test_properties()
+        ->user_scrollable_vertical = true;
+    host_impl_->active_tree()->BuildPropertyTreesForTesting();
     CompositorFrameMetadata metadata =
         host_impl_->MakeCompositorFrameMetadata();
     EXPECT_FALSE(metadata.root_overflow_x_hidden);
@@ -3586,7 +3594,9 @@
   {
     host_impl_->active_tree()
         ->InnerViewportScrollLayer()
-        ->set_user_scrollable_horizontal(false);
+        ->test_properties()
+        ->user_scrollable_horizontal = false;
+    host_impl_->active_tree()->BuildPropertyTreesForTesting();
     CompositorFrameMetadata metadata =
         host_impl_->MakeCompositorFrameMetadata();
     EXPECT_TRUE(metadata.root_overflow_x_hidden);
@@ -3594,7 +3604,9 @@
 
     host_impl_->active_tree()
         ->InnerViewportScrollLayer()
-        ->set_user_scrollable_vertical(false);
+        ->test_properties()
+        ->user_scrollable_vertical = false;
+    host_impl_->active_tree()->BuildPropertyTreesForTesting();
     metadata = host_impl_->MakeCompositorFrameMetadata();
     EXPECT_TRUE(metadata.root_overflow_x_hidden);
     EXPECT_TRUE(metadata.root_overflow_y_hidden);
@@ -10353,8 +10365,8 @@
   SetupVirtualViewportLayers(content_size, outer_viewport, inner_viewport);
   // Make inner viewport unscrollable.
   LayerImpl* inner_scroll = host_impl_->InnerViewportScrollLayer();
-  inner_scroll->set_user_scrollable_horizontal(false);
-  inner_scroll->set_user_scrollable_vertical(false);
+  inner_scroll->test_properties()->user_scrollable_horizontal = false;
+  inner_scroll->test_properties()->user_scrollable_vertical = false;
   host_impl_->active_tree()->BuildPropertyTreesForTesting();
 
   DrawFrame();
@@ -11357,8 +11369,12 @@
   const gfx::Size viewport_size(500, 500);
   CreateBasicVirtualViewportLayers(viewport_size, content_size);
 
-  host_impl_->OuterViewportScrollLayer()->set_user_scrollable_vertical(true);
-  host_impl_->OuterViewportScrollLayer()->set_user_scrollable_horizontal(false);
+  host_impl_->OuterViewportScrollLayer()
+      ->test_properties()
+      ->user_scrollable_vertical = true;
+  host_impl_->OuterViewportScrollLayer()
+      ->test_properties()
+      ->user_scrollable_horizontal = false;
   host_impl_->active_tree()->BuildPropertyTreesForTesting();
 
   DrawFrame();
diff --git a/cc/trees/property_tree_builder.cc b/cc/trees/property_tree_builder.cc
index 52446225..20d087b9 100644
--- a/cc/trees/property_tree_builder.cc
+++ b/cc/trees/property_tree_builder.cc
@@ -989,6 +989,22 @@
   return should_create_render_surface;
 }
 
+static inline bool UserScrollableHorizontal(Layer* layer) {
+  return layer->user_scrollable_horizontal();
+}
+
+static inline bool UserScrollableHorizontal(LayerImpl* layer) {
+  return layer->test_properties()->user_scrollable_horizontal;
+}
+
+static inline bool UserScrollableVertical(Layer* layer) {
+  return layer->user_scrollable_vertical();
+}
+
+static inline bool UserScrollableVertical(LayerImpl* layer) {
+  return layer->test_properties()->user_scrollable_vertical;
+}
+
 template <typename LayerType>
 void AddScrollNodeIfNeeded(
     const DataForRecursion<LayerType>& data_from_ancestor,
@@ -1048,8 +1064,8 @@
     node.bounds = layer->bounds();
     node.offset_to_transform_parent = layer->offset_to_transform_parent();
     node.should_flatten = layer->should_flatten_transform_from_property_tree();
-    node.user_scrollable_horizontal = layer->user_scrollable_horizontal();
-    node.user_scrollable_vertical = layer->user_scrollable_vertical();
+    node.user_scrollable_horizontal = UserScrollableHorizontal(layer);
+    node.user_scrollable_vertical = UserScrollableVertical(layer);
     node.element_id = layer->element_id();
     node.transform_id =
         data_for_children->transform_tree_parent->transform_tree_index();
diff --git a/third_party/WebKit/Source/core/svg/properties/SVGListPropertyHelper.h b/third_party/WebKit/Source/core/svg/properties/SVGListPropertyHelper.h
index 22f2279..528b556c 100644
--- a/third_party/WebKit/Source/core/svg/properties/SVGListPropertyHelper.h
+++ b/third_party/WebKit/Source/core/svg/properties/SVGListPropertyHelper.h
@@ -99,7 +99,9 @@
     new_item->SetOwnerList(this);
   }
 
-  bool operator==(const Derived&) const;
+  bool operator==(const Derived& other) const {
+    return values_ == other.values_;
+  }
   bool operator!=(const Derived& other) const { return !(*this == other); }
 
   bool IsEmpty() const { return !length(); }
@@ -142,38 +144,17 @@
 
  private:
   inline bool CheckIndexBound(size_t, ExceptionState&);
-  size_t FindItem(ItemPropertyType*);
 
   HeapVector<Member<ItemPropertyType>> values_;
 };
 
 template <typename Derived, typename ItemProperty>
-bool SVGListPropertyHelper<Derived, ItemProperty>::operator==(
-    const Derived& other) const {
-  if (length() != other.length())
-    return false;
-
-  size_t size = length();
-  for (size_t i = 0; i < size; ++i) {
-    if (*at(i) != *other.at(i))
-      return false;
-  }
-
-  return true;
-}
-
-template <typename Derived, typename ItemProperty>
 void SVGListPropertyHelper<Derived, ItemProperty>::Clear() {
-  // detach all list items as they are no longer part of this list
-  typename HeapVector<Member<ItemPropertyType>>::const_iterator it =
-      values_.begin();
-  typename HeapVector<Member<ItemPropertyType>>::const_iterator it_end =
-      values_.end();
-  for (; it != it_end; ++it) {
-    DCHECK_EQ((*it)->OwnerList(), this);
-    (*it)->SetOwnerList(nullptr);
+  // Detach all list items as they are no longer part of this list.
+  for (auto& value : values_) {
+    DCHECK_EQ(value->OwnerList(), this);
+    value->SetOwnerList(nullptr);
   }
-
   values_.clear();
 }
 
@@ -193,10 +174,7 @@
     ExceptionState& exception_state) {
   if (!CheckIndexBound(index, exception_state))
     return nullptr;
-
-  DCHECK_LT(index, values_.size());
-  DCHECK_EQ(values_.at(index)->OwnerList(), this);
-  return values_.at(index);
+  return at(index);
 }
 
 template <typename Derived, typename ItemProperty>
@@ -214,7 +192,6 @@
   // front of the list.
   values_.insert(index, new_item);
   new_item->SetOwnerList(this);
-
   return new_item;
 }
 
@@ -222,16 +199,13 @@
 ItemProperty* SVGListPropertyHelper<Derived, ItemProperty>::RemoveItem(
     size_t index,
     ExceptionState& exception_state) {
-  if (index >= values_.size()) {
-    exception_state.ThrowDOMException(
-        kIndexSizeError, ExceptionMessages::IndexExceedsMaximumBound(
-                             "index", index, values_.size()));
+  if (!CheckIndexBound(index, exception_state))
     return nullptr;
-  }
+
   DCHECK_EQ(values_.at(index)->OwnerList(), this);
   ItemPropertyType* old_item = values_.at(index);
   values_.erase(index);
-  old_item->SetOwnerList(0);
+  old_item->SetOwnerList(nullptr);
   return old_item;
 }
 
@@ -240,7 +214,6 @@
     ItemProperty* new_item) {
   // Append the value and wrapper at the end of the list.
   Append(new_item);
-
   return new_item;
 }
 
@@ -255,6 +228,7 @@
   if (values_.IsEmpty()) {
     // 'newItem' already lived in our list, we removed it, and now we're empty,
     // which means there's nothing to replace.
+    // TODO(fs): This should not cause us to throw an exception.
     exception_state.ThrowDOMException(
         kIndexSizeError,
         String::Format("Failed to replace the provided item at index %zu.",
@@ -265,10 +239,9 @@
   // Update the value at the desired position 'index'.
   Member<ItemPropertyType>& position = values_[index];
   DCHECK_EQ(position->OwnerList(), this);
-  position->SetOwnerList(0);
+  position->SetOwnerList(nullptr);
   position = new_item;
   new_item->SetOwnerList(this);
-
   return new_item;
 }
 
@@ -282,26 +255,14 @@
                              "index", index, values_.size()));
     return false;
   }
-
   return true;
 }
 
 template <typename Derived, typename ItemProperty>
-size_t SVGListPropertyHelper<Derived, ItemProperty>::FindItem(
-    ItemPropertyType* item) {
-  return values_.Find(item);
-}
-
-template <typename Derived, typename ItemProperty>
 void SVGListPropertyHelper<Derived, ItemProperty>::DeepCopy(Derived* from) {
   Clear();
-  typename HeapVector<Member<ItemPropertyType>>::const_iterator it =
-      from->values_.begin();
-  typename HeapVector<Member<ItemPropertyType>>::const_iterator it_end =
-      from->values_.end();
-  for (; it != it_end; ++it) {
-    Append((*it)->Clone());
-  }
+  for (const auto& from_value : from->values_)
+    Append(from_value->Clone());
 }
 
 template <typename Derived, typename ItemProperty>
@@ -325,16 +286,12 @@
     } else {
       DeepCopy(to_list);
     }
-
     return false;
   }
 
   DCHECK(!from_list_size || from_list_size == to_list_size);
-  if (length() < to_list_size) {
-    size_t padding_count = to_list_size - length();
-    for (size_t i = 0; i < padding_count; ++i)
-      Append(CreatePaddingItem());
-  }
+  for (size_t i = length(); i < to_list_size; ++i)
+    Append(CreatePaddingItem());
 
   return true;
 }