| Index: content/renderer/input/input_scroll_elasticity_controller_unittest.cc | 
| diff --git a/content/renderer/input/input_scroll_elasticity_controller_unittest.cc b/content/renderer/input/input_scroll_elasticity_controller_unittest.cc | 
| deleted file mode 100644 | 
| index fa2c7f19bee3ef3fcdf0d5cf69453647c09a28b4..0000000000000000000000000000000000000000 | 
| --- a/content/renderer/input/input_scroll_elasticity_controller_unittest.cc | 
| +++ /dev/null | 
| @@ -1,387 +0,0 @@ | 
| -// Copyright 2014 The Chromium Authors. All rights reserved. | 
| -// Use of this source code is governed by a BSD-style license that can be | 
| -// found in the LICENSE file. | 
| - | 
| -#include "cc/input/input_handler.h" | 
| -#include "content/renderer/input/input_scroll_elasticity_controller.h" | 
| -#include "testing/gtest/include/gtest/gtest.h" | 
| -#include "third_party/WebKit/public/web/WebInputEvent.h" | 
| - | 
| -namespace content { | 
| -namespace { | 
| - | 
| -enum Phase { | 
| -  PhaseNone = blink::WebMouseWheelEvent::PhaseNone, | 
| -  PhaseBegan = blink::WebMouseWheelEvent::PhaseBegan, | 
| -  PhaseStationary = blink::WebMouseWheelEvent::PhaseStationary, | 
| -  PhaseChanged = blink::WebMouseWheelEvent::PhaseChanged, | 
| -  PhaseEnded = blink::WebMouseWheelEvent::PhaseEnded, | 
| -  PhaseCancelled = blink::WebMouseWheelEvent::PhaseCancelled, | 
| -  PhaseMayBegin = blink::WebMouseWheelEvent::PhaseMayBegin, | 
| -}; | 
| - | 
| -class MockScrollElasticityHelper : public cc::ScrollElasticityHelper { | 
| - public: | 
| -  MockScrollElasticityHelper() | 
| -      : is_user_scrollable_(true), | 
| -        set_stretch_amount_count_(0), | 
| -        request_animate_count_(0) {} | 
| -  ~MockScrollElasticityHelper() override {} | 
| - | 
| -  // cc::ScrollElasticityHelper implementation: | 
| -  bool IsUserScrollable() const override { return is_user_scrollable_; } | 
| -  gfx::Vector2dF StretchAmount() const override { return stretch_amount_; } | 
| -  void SetStretchAmount(const gfx::Vector2dF& stretch_amount) override { | 
| -    set_stretch_amount_count_ += 1; | 
| -    stretch_amount_ = stretch_amount; | 
| -  } | 
| -  gfx::ScrollOffset ScrollOffset() const override { return scroll_offset_; } | 
| -  gfx::ScrollOffset MaxScrollOffset() const override { | 
| -    return max_scroll_offset_; | 
| -  } | 
| -  void ScrollBy(const gfx::Vector2dF& delta) override { | 
| -    scroll_offset_ += gfx::ScrollOffset(delta); | 
| -  } | 
| -  void RequestAnimate() override { request_animate_count_ += 1; } | 
| - | 
| -  // Counters for number of times functions were called. | 
| -  int request_animate_count() const { return request_animate_count_; } | 
| -  int set_stretch_amount_count() const { return set_stretch_amount_count_; } | 
| - | 
| -  void SetScrollOffsetAndMaxScrollOffset( | 
| -      const gfx::ScrollOffset& scroll_offset, | 
| -      const gfx::ScrollOffset& max_scroll_offset) { | 
| -    scroll_offset_ = scroll_offset; | 
| -    max_scroll_offset_ = max_scroll_offset; | 
| -  } | 
| -  void SetUserScrollable(bool is_user_scrollable) { | 
| -    is_user_scrollable_ = is_user_scrollable; | 
| -  } | 
| - | 
| - private: | 
| -  bool is_user_scrollable_; | 
| -  gfx::Vector2dF stretch_amount_; | 
| -  int set_stretch_amount_count_; | 
| -  int request_animate_count_; | 
| - | 
| -  gfx::ScrollOffset scroll_offset_; | 
| -  gfx::ScrollOffset max_scroll_offset_; | 
| -}; | 
| - | 
| -class ScrollElasticityControllerTest : public testing::Test { | 
| - public: | 
| -  ScrollElasticityControllerTest() | 
| -      : controller_(&helper_), | 
| -        input_event_count_(0), | 
| -        current_time_(base::TimeTicks::FromInternalValue(100000000ull)) {} | 
| -  ~ScrollElasticityControllerTest() override {} | 
| - | 
| -  void SendMouseWheelEvent( | 
| -      Phase phase, | 
| -      Phase momentum_phase, | 
| -      const gfx::Vector2dF& event_delta = gfx::Vector2dF(), | 
| -      const gfx::Vector2dF& overscroll_delta = gfx::Vector2dF()) { | 
| -    blink::WebMouseWheelEvent event; | 
| -    event.phase = static_cast<blink::WebMouseWheelEvent::Phase>(phase); | 
| -    event.momentumPhase = | 
| -        static_cast<blink::WebMouseWheelEvent::Phase>(momentum_phase); | 
| -    event.deltaX = -event_delta.x(); | 
| -    event.deltaY = -event_delta.y(); | 
| -    TickCurrentTime(); | 
| -    event.timeStampSeconds = (current_time_ - base::TimeTicks()).InSecondsF(); | 
| - | 
| -    cc::InputHandlerScrollResult scroll_result; | 
| -    scroll_result.did_overscroll_root = !overscroll_delta.IsZero(); | 
| -    scroll_result.unused_scroll_delta = overscroll_delta; | 
| - | 
| -    controller_.ObserveWheelEventAndResult(event, scroll_result); | 
| -    input_event_count_ += 1; | 
| -  } | 
| - | 
| -  const base::TimeTicks& TickCurrentTime() { | 
| -    current_time_ += base::TimeDelta::FromSecondsD(1 / 60.f); | 
| -    return current_time_; | 
| -  } | 
| -  void TickCurrentTimeAndAnimate() { | 
| -    TickCurrentTime(); | 
| -    controller_.Animate(current_time_); | 
| -  } | 
| - | 
| -  MockScrollElasticityHelper helper_; | 
| -  InputScrollElasticityController controller_; | 
| -  int input_event_count_; | 
| -  base::TimeTicks current_time_; | 
| -}; | 
| - | 
| -// Verify that stretching only occurs in one axis at a time, and that it | 
| -// is biased to the Y axis. | 
| -TEST_F(ScrollElasticityControllerTest, Axis) { | 
| -  helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(0, 0), | 
| -                                            gfx::ScrollOffset(0, 0)); | 
| - | 
| -  // If we push equally in the X and Y directions, we should see a stretch only | 
| -  // in the Y direction. | 
| -  SendMouseWheelEvent(PhaseBegan, PhaseNone); | 
| -  SendMouseWheelEvent(PhaseChanged, PhaseNone, gfx::Vector2dF(10, 10), | 
| -                      gfx::Vector2dF(10, 10)); | 
| -  EXPECT_EQ(1, helper_.set_stretch_amount_count()); | 
| -  EXPECT_EQ(0.f, helper_.StretchAmount().x()); | 
| -  EXPECT_LT(0.f, helper_.StretchAmount().y()); | 
| -  helper_.SetStretchAmount(gfx::Vector2dF()); | 
| -  EXPECT_EQ(2, helper_.set_stretch_amount_count()); | 
| -  SendMouseWheelEvent(PhaseEnded, PhaseNone); | 
| -  EXPECT_EQ(0, helper_.request_animate_count()); | 
| - | 
| -  // If we push more in the X direction than the Y direction, we should see a | 
| -  // stretch only in the X direction. This decision should be based on the | 
| -  // input delta, not the actual overscroll delta. | 
| -  SendMouseWheelEvent(PhaseBegan, PhaseNone); | 
| -  SendMouseWheelEvent(PhaseChanged, PhaseNone, gfx::Vector2dF(-25, 10), | 
| -                      gfx::Vector2dF(-25, 40)); | 
| -  EXPECT_EQ(3, helper_.set_stretch_amount_count()); | 
| -  EXPECT_GT(0.f, helper_.StretchAmount().x()); | 
| -  EXPECT_EQ(0.f, helper_.StretchAmount().y()); | 
| -  helper_.SetStretchAmount(gfx::Vector2dF()); | 
| -  EXPECT_EQ(4, helper_.set_stretch_amount_count()); | 
| -  SendMouseWheelEvent(PhaseEnded, PhaseNone); | 
| -  EXPECT_EQ(0, helper_.request_animate_count()); | 
| -} | 
| - | 
| -// Verify that we need a total overscroll delta of at least 10 in a pinned | 
| -// direction before we start stretching. | 
| -TEST_F(ScrollElasticityControllerTest, MinimumDeltaBeforeStretch) { | 
| -  // We should not start stretching while we are not pinned in the direction | 
| -  // of the scroll (even if there is an overscroll delta). We have to wait for | 
| -  // the regular scroll to eat all of the events. | 
| -  helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(5, 5), | 
| -                                            gfx::ScrollOffset(10, 10)); | 
| -  SendMouseWheelEvent(PhaseMayBegin, PhaseNone); | 
| -  SendMouseWheelEvent(PhaseBegan, PhaseNone); | 
| -  SendMouseWheelEvent(PhaseChanged, PhaseNone, gfx::Vector2dF(0, 10), | 
| -                      gfx::Vector2dF(0, 10)); | 
| -  SendMouseWheelEvent(PhaseChanged, PhaseNone, gfx::Vector2dF(0, 10), | 
| -                      gfx::Vector2dF(0, 10)); | 
| -  EXPECT_EQ(0, helper_.set_stretch_amount_count()); | 
| - | 
| -  // Now pin the -X and +Y direction. The first event will not generate a | 
| -  // stretch | 
| -  // because it is below the delta threshold of 10. | 
| -  helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(0, 10), | 
| -                                            gfx::ScrollOffset(10, 10)); | 
| -  SendMouseWheelEvent(PhaseChanged, PhaseNone, gfx::Vector2dF(0, 10), | 
| -                      gfx::Vector2dF(0, 8)); | 
| -  EXPECT_EQ(0, helper_.set_stretch_amount_count()); | 
| - | 
| -  // Make the next scroll be in the -X direction more than the +Y direction, | 
| -  // which will erase the memory of the previous unused delta of 8. | 
| -  SendMouseWheelEvent(PhaseChanged, PhaseNone, gfx::Vector2dF(-10, 5), | 
| -                      gfx::Vector2dF(-8, 10)); | 
| -  EXPECT_EQ(0, helper_.set_stretch_amount_count()); | 
| - | 
| -  // Now push against the pinned +Y direction again by 8. We reset the | 
| -  // previous delta, so this will not generate a stretch. | 
| -  SendMouseWheelEvent(PhaseChanged, PhaseNone, gfx::Vector2dF(0, 10), | 
| -                      gfx::Vector2dF(0, 8)); | 
| -  EXPECT_EQ(0, helper_.set_stretch_amount_count()); | 
| - | 
| -  // Push against +Y by another 8. This gets us above the delta threshold of | 
| -  // 10, so we should now have had the stretch set, and it should be in the | 
| -  // +Y direction. The scroll in the -X direction should have been forgotten. | 
| -  SendMouseWheelEvent(PhaseChanged, PhaseNone, gfx::Vector2dF(0, 10), | 
| -                      gfx::Vector2dF(0, 8)); | 
| -  EXPECT_EQ(1, helper_.set_stretch_amount_count()); | 
| -  EXPECT_EQ(0.f, helper_.StretchAmount().x()); | 
| -  EXPECT_LT(0.f, helper_.StretchAmount().y()); | 
| - | 
| -  // End the gesture. Because there is a non-zero stretch, we should be in the | 
| -  // animated state, and should have had a frame requested. | 
| -  EXPECT_EQ(0, helper_.request_animate_count()); | 
| -  SendMouseWheelEvent(PhaseEnded, PhaseNone); | 
| -  EXPECT_EQ(1, helper_.request_animate_count()); | 
| -} | 
| - | 
| -// Verify that an stretch caused by a momentum scroll will switch to the | 
| -// animating mode, where input events are ignored, and the stretch is updated | 
| -// while animating. | 
| -TEST_F(ScrollElasticityControllerTest, MomentumAnimate) { | 
| -  // Do an active scroll, then switch to the momentum phase and scroll for a | 
| -  // bit. | 
| -  helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(5, 5), | 
| -                                            gfx::ScrollOffset(10, 10)); | 
| -  SendMouseWheelEvent(PhaseBegan, PhaseNone); | 
| -  SendMouseWheelEvent(PhaseChanged, PhaseNone, gfx::Vector2dF(0, -80), | 
| -                      gfx::Vector2dF(0, 0)); | 
| -  SendMouseWheelEvent(PhaseChanged, PhaseNone, gfx::Vector2dF(0, -80), | 
| -                      gfx::Vector2dF(0, 0)); | 
| -  SendMouseWheelEvent(PhaseChanged, PhaseNone, gfx::Vector2dF(0, -80), | 
| -                      gfx::Vector2dF(0, 0)); | 
| -  SendMouseWheelEvent(PhaseEnded, PhaseNone); | 
| -  SendMouseWheelEvent(PhaseNone, PhaseBegan); | 
| -  SendMouseWheelEvent(PhaseNone, PhaseChanged, gfx::Vector2dF(0, -80), | 
| -                      gfx::Vector2dF(0, 0)); | 
| -  SendMouseWheelEvent(PhaseNone, PhaseChanged, gfx::Vector2dF(0, -80), | 
| -                      gfx::Vector2dF(0, 0)); | 
| -  SendMouseWheelEvent(PhaseNone, PhaseChanged, gfx::Vector2dF(0, -80), | 
| -                      gfx::Vector2dF(0, 0)); | 
| -  EXPECT_EQ(0, helper_.set_stretch_amount_count()); | 
| - | 
| -  // Hit the -Y edge and overscroll slightly, but not enough to go over the | 
| -  // threshold to cause a stretch. | 
| -  helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(5, 0), | 
| -                                            gfx::ScrollOffset(10, 10)); | 
| -  SendMouseWheelEvent(PhaseNone, PhaseChanged, gfx::Vector2dF(0, -80), | 
| -                      gfx::Vector2dF(0, -8)); | 
| -  EXPECT_EQ(0, helper_.set_stretch_amount_count()); | 
| -  EXPECT_EQ(0, helper_.request_animate_count()); | 
| - | 
| -  // Take another step, this time going over the threshold. This should update | 
| -  // the stretch amount, and then switch to the animating mode. | 
| -  SendMouseWheelEvent(PhaseNone, PhaseChanged, gfx::Vector2dF(0, -80), | 
| -                      gfx::Vector2dF(0, -80)); | 
| -  EXPECT_EQ(1, helper_.set_stretch_amount_count()); | 
| -  EXPECT_EQ(1, helper_.request_animate_count()); | 
| -  EXPECT_GT(-1.f, helper_.StretchAmount().y()); | 
| - | 
| -  // Subsequent momentum events should do nothing. | 
| -  SendMouseWheelEvent(PhaseNone, PhaseChanged, gfx::Vector2dF(0, -80), | 
| -                      gfx::Vector2dF(0, -80)); | 
| -  SendMouseWheelEvent(PhaseNone, PhaseChanged, gfx::Vector2dF(0, -80), | 
| -                      gfx::Vector2dF(0, -80)); | 
| -  SendMouseWheelEvent(PhaseNone, PhaseEnded, gfx::Vector2dF(0, -80), | 
| -                      gfx::Vector2dF(0, -80)); | 
| -  EXPECT_EQ(1, helper_.set_stretch_amount_count()); | 
| -  EXPECT_EQ(1, helper_.request_animate_count()); | 
| - | 
| -  // Subsequent animate events should update the stretch amount and request | 
| -  // another frame. | 
| -  TickCurrentTimeAndAnimate(); | 
| -  EXPECT_EQ(2, helper_.set_stretch_amount_count()); | 
| -  EXPECT_EQ(2, helper_.request_animate_count()); | 
| -  EXPECT_GT(-1.f, helper_.StretchAmount().y()); | 
| - | 
| -  // Touching the trackpad (a PhaseMayBegin event) should disable animation. | 
| -  SendMouseWheelEvent(PhaseMayBegin, PhaseNone); | 
| -  TickCurrentTimeAndAnimate(); | 
| -  EXPECT_EQ(2, helper_.set_stretch_amount_count()); | 
| -  EXPECT_EQ(2, helper_.request_animate_count()); | 
| - | 
| -  // Releasing the trackpad should re-enable animation. | 
| -  SendMouseWheelEvent(PhaseCancelled, PhaseNone); | 
| -  EXPECT_EQ(2, helper_.set_stretch_amount_count()); | 
| -  EXPECT_EQ(3, helper_.request_animate_count()); | 
| -  TickCurrentTimeAndAnimate(); | 
| -  EXPECT_EQ(3, helper_.set_stretch_amount_count()); | 
| -  EXPECT_EQ(4, helper_.request_animate_count()); | 
| - | 
| -  // Keep animating frames until the stretch returns to rest. | 
| -  int stretch_count = 3; | 
| -  int animate_count = 4; | 
| -  while (1) { | 
| -    TickCurrentTimeAndAnimate(); | 
| -    if (helper_.StretchAmount().IsZero()) { | 
| -      stretch_count += 1; | 
| -      EXPECT_EQ(stretch_count, helper_.set_stretch_amount_count()); | 
| -      EXPECT_EQ(animate_count, helper_.request_animate_count()); | 
| -      break; | 
| -    } | 
| -    stretch_count += 1; | 
| -    animate_count += 1; | 
| -    EXPECT_EQ(stretch_count, helper_.set_stretch_amount_count()); | 
| -    EXPECT_EQ(animate_count, helper_.request_animate_count()); | 
| -  } | 
| - | 
| -  // After coming to rest, no subsequent animate calls change anything. | 
| -  TickCurrentTimeAndAnimate(); | 
| -  EXPECT_EQ(stretch_count, helper_.set_stretch_amount_count()); | 
| -  EXPECT_EQ(animate_count, helper_.request_animate_count()); | 
| -} | 
| - | 
| -// Verify that an stretch opposing a scroll is correctly resolved. | 
| -TEST_F(ScrollElasticityControllerTest, ReconcileStretchAndScroll) { | 
| -  SendMouseWheelEvent(PhaseBegan, PhaseNone); | 
| - | 
| -  // Verify completely knocking out the scroll in the -Y direction. | 
| -  helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(5, 5), | 
| -                                            gfx::ScrollOffset(10, 10)); | 
| -  helper_.SetStretchAmount(gfx::Vector2dF(0, -10)); | 
| -  controller_.ReconcileStretchAndScroll(); | 
| -  EXPECT_EQ(helper_.StretchAmount(), gfx::Vector2dF(0, -5)); | 
| -  EXPECT_EQ(helper_.ScrollOffset(), gfx::ScrollOffset(5, 0)); | 
| - | 
| -  // Verify partially knocking out the scroll in the -Y direction. | 
| -  helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(5, 8), | 
| -                                            gfx::ScrollOffset(10, 10)); | 
| -  helper_.SetStretchAmount(gfx::Vector2dF(0, -5)); | 
| -  controller_.ReconcileStretchAndScroll(); | 
| -  EXPECT_EQ(helper_.StretchAmount(), gfx::Vector2dF(0, 0)); | 
| -  EXPECT_EQ(helper_.ScrollOffset(), gfx::ScrollOffset(5, 3)); | 
| - | 
| -  // Verify completely knocking out the scroll in the +X direction. | 
| -  helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(5, 5), | 
| -                                            gfx::ScrollOffset(10, 10)); | 
| -  helper_.SetStretchAmount(gfx::Vector2dF(10, 0)); | 
| -  controller_.ReconcileStretchAndScroll(); | 
| -  EXPECT_EQ(helper_.StretchAmount(), gfx::Vector2dF(5, 0)); | 
| -  EXPECT_EQ(helper_.ScrollOffset(), gfx::ScrollOffset(10, 5)); | 
| - | 
| -  // Verify partially knocking out the scroll in the +X and +Y directions. | 
| -  helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(2, 3), | 
| -                                            gfx::ScrollOffset(10, 10)); | 
| -  helper_.SetStretchAmount(gfx::Vector2dF(5, 5)); | 
| -  controller_.ReconcileStretchAndScroll(); | 
| -  EXPECT_EQ(helper_.StretchAmount(), gfx::Vector2dF(0, 0)); | 
| -  EXPECT_EQ(helper_.ScrollOffset(), gfx::ScrollOffset(7, 8)); | 
| -} | 
| - | 
| -// Verify that stretching only happens when the area is user scrollable. | 
| -TEST_F(ScrollElasticityControllerTest, UserScrollableRequiredForStretch) { | 
| -  helper_.SetScrollOffsetAndMaxScrollOffset(gfx::ScrollOffset(0, 0), | 
| -                                            gfx::ScrollOffset(10, 10)); | 
| -  gfx::Vector2dF delta(0, -15); | 
| - | 
| -  // Do an active scroll, and ensure that the stretch amount doesn't change, | 
| -  // and also that the stretch amount isn't even ever changed. | 
| -  helper_.SetUserScrollable(false); | 
| -  SendMouseWheelEvent(PhaseBegan, PhaseNone); | 
| -  SendMouseWheelEvent(PhaseChanged, PhaseNone, delta, delta); | 
| -  SendMouseWheelEvent(PhaseChanged, PhaseNone, delta, delta); | 
| -  SendMouseWheelEvent(PhaseEnded, PhaseNone); | 
| -  EXPECT_EQ(helper_.StretchAmount(), gfx::Vector2dF(0, 0)); | 
| -  EXPECT_EQ(0, helper_.set_stretch_amount_count()); | 
| -  SendMouseWheelEvent(PhaseNone, PhaseBegan); | 
| -  SendMouseWheelEvent(PhaseNone, PhaseChanged, delta, delta); | 
| -  SendMouseWheelEvent(PhaseNone, PhaseChanged, delta, delta); | 
| -  SendMouseWheelEvent(PhaseNone, PhaseEnded); | 
| -  EXPECT_EQ(helper_.StretchAmount(), gfx::Vector2dF(0, 0)); | 
| -  EXPECT_EQ(0, helper_.set_stretch_amount_count()); | 
| - | 
| -  // Re-enable user scrolling and ensure that stretching is re-enabled. | 
| -  helper_.SetUserScrollable(true); | 
| -  SendMouseWheelEvent(PhaseBegan, PhaseNone); | 
| -  SendMouseWheelEvent(PhaseChanged, PhaseNone, delta, delta); | 
| -  SendMouseWheelEvent(PhaseChanged, PhaseNone, delta, delta); | 
| -  SendMouseWheelEvent(PhaseEnded, PhaseNone); | 
| -  EXPECT_NE(helper_.StretchAmount(), gfx::Vector2dF(0, 0)); | 
| -  EXPECT_GT(helper_.set_stretch_amount_count(), 0); | 
| -  SendMouseWheelEvent(PhaseNone, PhaseBegan); | 
| -  SendMouseWheelEvent(PhaseNone, PhaseChanged, delta, delta); | 
| -  SendMouseWheelEvent(PhaseNone, PhaseChanged, delta, delta); | 
| -  SendMouseWheelEvent(PhaseNone, PhaseEnded); | 
| -  EXPECT_NE(helper_.StretchAmount(), gfx::Vector2dF(0, 0)); | 
| -  EXPECT_GT(helper_.set_stretch_amount_count(), 0); | 
| - | 
| -  // Disable user scrolling and tick the timer until the stretch goes back | 
| -  // to zero. Ensure that the return to zero doesn't happen immediately. | 
| -  helper_.SetUserScrollable(false); | 
| -  int ticks_to_zero = 0; | 
| -  while (1) { | 
| -    TickCurrentTimeAndAnimate(); | 
| -    if (helper_.StretchAmount().IsZero()) | 
| -      break; | 
| -    ticks_to_zero += 1; | 
| -  } | 
| -  EXPECT_GT(ticks_to_zero, 3); | 
| -} | 
| - | 
| -}  // namespace | 
| -}  // namespace content | 
|  |