| Index: ui/views/corewm/tooltip_controller_unittest.cc
 | 
| diff --git a/ui/views/corewm/tooltip_controller_unittest.cc b/ui/views/corewm/tooltip_controller_unittest.cc
 | 
| index f09a2a0533e92f0f1d25e618914cbc56f33426d4..d5cd9db304cb318cc46b5085363ef0745ed8a9c9 100644
 | 
| --- a/ui/views/corewm/tooltip_controller_unittest.cc
 | 
| +++ b/ui/views/corewm/tooltip_controller_unittest.cc
 | 
| @@ -671,6 +671,7 @@ class TestTooltip : public Tooltip {
 | 
|                         const base::string16& tooltip_text,
 | 
|                         const gfx::Point& location) OVERRIDE {
 | 
|      tooltip_text_ = tooltip_text;
 | 
| +    location_ = location;
 | 
|    }
 | 
|    virtual void Show() OVERRIDE {
 | 
|      is_visible_ = true;
 | 
| @@ -681,10 +682,12 @@ class TestTooltip : public Tooltip {
 | 
|    virtual bool IsVisible() OVERRIDE {
 | 
|      return is_visible_;
 | 
|    }
 | 
| +  const gfx::Point& location() { return location_; }
 | 
|  
 | 
|   private:
 | 
|    bool is_visible_;
 | 
|    base::string16 tooltip_text_;
 | 
| +  gfx::Point location_;
 | 
|  
 | 
|    DISALLOW_COPY_AND_ASSIGN(TestTooltip);
 | 
|  };
 | 
| @@ -766,6 +769,173 @@ TEST_F(TooltipControllerTest2, CloseOnCancelMode) {
 | 
|    EXPECT_TRUE(helper_->GetTooltipWindow() == NULL);
 | 
|  }
 | 
|  
 | 
| +// Use for tests that need both views and a TestTooltip.
 | 
| +class TooltipControllerTest3 : public aura::test::AuraTestBase {
 | 
| + public:
 | 
| +  TooltipControllerTest3() : test_tooltip_(new TestTooltip) {}
 | 
| +  virtual ~TooltipControllerTest3() {}
 | 
| +
 | 
| +  virtual void SetUp() OVERRIDE {
 | 
| +    wm_state_.reset(new wm::WMState);
 | 
| +    aura::test::AuraTestBase::SetUp();
 | 
| +
 | 
| +    widget_.reset(CreateWidget(root_window()));
 | 
| +    widget_->SetContentsView(new View);
 | 
| +    view_ = new TooltipTestView;
 | 
| +    widget_->GetContentsView()->AddChildView(view_);
 | 
| +    view_->SetBoundsRect(widget_->GetContentsView()->GetLocalBounds());
 | 
| +
 | 
| +    generator_.reset(new aura::test::EventGenerator(GetRootWindow()));
 | 
| +    controller_.reset(new TooltipController(
 | 
| +        scoped_ptr<views::corewm::Tooltip>(test_tooltip_)));
 | 
| +    GetRootWindow()->RemovePreTargetHandler(
 | 
| +        static_cast<TooltipController*>(aura::client::GetTooltipClient(
 | 
| +            widget_->GetNativeWindow()->GetRootWindow())));
 | 
| +    GetRootWindow()->AddPreTargetHandler(controller_.get());
 | 
| +    helper_.reset(new TooltipControllerTestHelper(controller_.get()));
 | 
| +    SetTooltipClient(GetRootWindow(), controller_.get());
 | 
| +  }
 | 
| +
 | 
| +  virtual void TearDown() OVERRIDE {
 | 
| +    GetRootWindow()->RemovePreTargetHandler(controller_.get());
 | 
| +    aura::client::SetTooltipClient(GetRootWindow(), NULL);
 | 
| +
 | 
| +    controller_.reset();
 | 
| +    generator_.reset();
 | 
| +    helper_.reset();
 | 
| +    widget_.reset();
 | 
| +    aura::test::AuraTestBase::TearDown();
 | 
| +    wm_state_.reset();
 | 
| +  }
 | 
| +
 | 
| +  aura::Window* GetWindow() { return widget_->GetNativeWindow(); }
 | 
| +
 | 
| + protected:
 | 
| +  // Owned by |controller_|.
 | 
| +  TestTooltip* test_tooltip_;
 | 
| +  scoped_ptr<TooltipControllerTestHelper> helper_;
 | 
| +  scoped_ptr<aura::test::EventGenerator> generator_;
 | 
| +  scoped_ptr<views::Widget> widget_;
 | 
| +  TooltipTestView* view_;
 | 
| +
 | 
| + private:
 | 
| +  scoped_ptr<TooltipController> controller_;
 | 
| +  scoped_ptr<wm::WMState> wm_state_;
 | 
| +
 | 
| +#if defined(OS_WIN)
 | 
| +  ui::ScopedOleInitializer ole_initializer_;
 | 
| +#endif
 | 
| +
 | 
| +  aura::Window* GetRootWindow() { return GetWindow()->GetRootWindow(); }
 | 
| +
 | 
| +  DISALLOW_COPY_AND_ASSIGN(TooltipControllerTest3);
 | 
| +};
 | 
| +
 | 
| +TEST_F(TooltipControllerTest3, TooltipPositionChangesOnTwoViewsWithSameLabel) {
 | 
| +  // Owned by |view_|.
 | 
| +  // These two views have the same tooltip text
 | 
| +  TooltipTestView* v1 = new TooltipTestView;
 | 
| +  TooltipTestView* v2 = new TooltipTestView;
 | 
| +  // v1_1 is a view inside v1 that has an identical tooltip text to that of v1
 | 
| +  // and v2
 | 
| +  TooltipTestView* v1_1 = new TooltipTestView;
 | 
| +  // v2_1 is a view inside v2 that has an identical tooltip text to that of v1
 | 
| +  // and v2
 | 
| +  TooltipTestView* v2_1 = new TooltipTestView;
 | 
| +  // v2_2 is a view inside v2 with the tooltip text different from all the
 | 
| +  // others
 | 
| +  TooltipTestView* v2_2 = new TooltipTestView;
 | 
| +
 | 
| +  // Setup all the views' relations
 | 
| +  view_->AddChildView(v1);
 | 
| +  view_->AddChildView(v2);
 | 
| +  v1->AddChildView(v1_1);
 | 
| +  v2->AddChildView(v2_1);
 | 
| +  v2->AddChildView(v2_2);
 | 
| +  const base::string16 reference_string(
 | 
| +      base::ASCIIToUTF16("Identical Tooltip Text"));
 | 
| +  const base::string16 alternative_string(
 | 
| +      base::ASCIIToUTF16("Another Shrubbery"));
 | 
| +  v1->set_tooltip_text(reference_string);
 | 
| +  v2->set_tooltip_text(reference_string);
 | 
| +  v1_1->set_tooltip_text(reference_string);
 | 
| +  v2_1->set_tooltip_text(reference_string);
 | 
| +  v2_2->set_tooltip_text(alternative_string);
 | 
| +
 | 
| +  // Set views' bounds
 | 
| +  gfx::Rect view_bounds(view_->GetLocalBounds());
 | 
| +  view_bounds.set_height(view_bounds.height() / 2);
 | 
| +  v1->SetBoundsRect(view_bounds);
 | 
| +  v1_1->SetBounds(0, 0, 3, 3);
 | 
| +  view_bounds.set_y(view_bounds.height());
 | 
| +  v2->SetBoundsRect(view_bounds);
 | 
| +  v2_2->SetBounds(view_bounds.width() - 3, view_bounds.height() - 3, 3, 3);
 | 
| +  v2_1->SetBounds(0, 0, 3, 3);
 | 
| +
 | 
| +  // Test whether a toolbar appears on v1
 | 
| +  gfx::Point center = v1->bounds().CenterPoint();
 | 
| +  generator_->MoveMouseRelativeTo(GetWindow(), center);
 | 
| +  helper_->FireTooltipTimer();
 | 
| +  EXPECT_TRUE(helper_->IsTooltipVisible());
 | 
| +  EXPECT_EQ(reference_string, helper_->GetTooltipText());
 | 
| +  gfx::Point tooltip_bounds1 = test_tooltip_->location();
 | 
| +
 | 
| +  // Test whether the toolbar changes position on mouse over v2
 | 
| +  center = v2->bounds().CenterPoint();
 | 
| +  generator_->MoveMouseRelativeTo(GetWindow(), center);
 | 
| +  helper_->FireTooltipTimer();
 | 
| +  EXPECT_TRUE(helper_->IsTooltipVisible());
 | 
| +  EXPECT_EQ(reference_string, helper_->GetTooltipText());
 | 
| +  gfx::Point tooltip_bounds2 = test_tooltip_->location();
 | 
| +
 | 
| +  EXPECT_NE(tooltip_bounds1, gfx::Point());
 | 
| +  EXPECT_NE(tooltip_bounds2, gfx::Point());
 | 
| +  EXPECT_NE(tooltip_bounds1, tooltip_bounds2);
 | 
| +
 | 
| +  // Test if the toolbar does not change position on encountering a contained
 | 
| +  // view with the same tooltip text
 | 
| +  center = v2_1->GetLocalBounds().CenterPoint();
 | 
| +  views::View::ConvertPointToTarget(v2_1, view_, ¢er);
 | 
| +  generator_->MoveMouseRelativeTo(GetWindow(), center);
 | 
| +  helper_->FireTooltipTimer();
 | 
| +  gfx::Point tooltip_bounds2_1 = test_tooltip_->location();
 | 
| +
 | 
| +  EXPECT_NE(tooltip_bounds2, tooltip_bounds2_1);
 | 
| +  EXPECT_TRUE(helper_->IsTooltipVisible());
 | 
| +  EXPECT_EQ(reference_string, helper_->GetTooltipText());
 | 
| +
 | 
| +  // Test if the toolbar changes position on encountering a contained
 | 
| +  // view with a different tooltip text
 | 
| +  center = v2_2->GetLocalBounds().CenterPoint();
 | 
| +  views::View::ConvertPointToTarget(v2_2, view_, ¢er);
 | 
| +  generator_->MoveMouseRelativeTo(GetWindow(), center);
 | 
| +  helper_->FireTooltipTimer();
 | 
| +  gfx::Point tooltip_bounds2_2 = test_tooltip_->location();
 | 
| +
 | 
| +  EXPECT_NE(tooltip_bounds2_1, tooltip_bounds2_2);
 | 
| +  EXPECT_TRUE(helper_->IsTooltipVisible());
 | 
| +  EXPECT_EQ(alternative_string, helper_->GetTooltipText());
 | 
| +
 | 
| +  // Test if moving from a view that is contained by a larger view, both with
 | 
| +  // the same tooltip text, does not change tooltip's position.
 | 
| +  center = v1_1->GetLocalBounds().CenterPoint();
 | 
| +  views::View::ConvertPointToTarget(v1_1, view_, ¢er);
 | 
| +  generator_->MoveMouseRelativeTo(GetWindow(), center);
 | 
| +  helper_->FireTooltipTimer();
 | 
| +  gfx::Point tooltip_bounds1_1 = test_tooltip_->location();
 | 
| +
 | 
| +  EXPECT_TRUE(helper_->IsTooltipVisible());
 | 
| +  EXPECT_EQ(reference_string, helper_->GetTooltipText());
 | 
| +
 | 
| +  center = v1->bounds().CenterPoint();
 | 
| +  generator_->MoveMouseRelativeTo(GetWindow(), center);
 | 
| +  helper_->FireTooltipTimer();
 | 
| +  tooltip_bounds1 = test_tooltip_->location();
 | 
| +
 | 
| +  EXPECT_NE(tooltip_bounds1_1, tooltip_bounds1);
 | 
| +  EXPECT_EQ(reference_string, helper_->GetTooltipText());
 | 
| +}
 | 
| +
 | 
|  }  // namespace test
 | 
|  }  // namespace corewm
 | 
|  }  // namespace views
 | 
| 
 |