1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/views/toolbar/toolbar_button.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/interactive_test_utils.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/view_event_test_base.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/models/simple_menu_model.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/base/test/ui_controls.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class ToolbarButtonDragTest : public ViewEventTestBase,
15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                     ui::SimpleMenuModel::Delegate {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ToolbarButtonDragTest()
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : button_(NULL),
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu_shown_(false),
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        menu_closed_(false) {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual ~ToolbarButtonDragTest() {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ViewEventTestBase implementation.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    button_ = new ToolbarButton(NULL, new ui::SimpleMenuModel(this));
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ViewEventTestBase::SetUp();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ViewEventTestBase::TearDown();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual views::View* CreateContentsView() OVERRIDE {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return button_;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual gfx::Size GetPreferredSize() const OVERRIDE {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return button_->GetPreferredSize();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ui::SimpleMenuModel::Delegate implementation.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsCommandIdChecked(int id) const OVERRIDE {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsCommandIdEnabled(int id) const OVERRIDE {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool GetAcceleratorForCommandId(
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int id,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator* accelerator) OVERRIDE {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ExecuteCommand(int id, int event_flags) OVERRIDE {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void MenuWillShow(ui::SimpleMenuModel* /*source*/) OVERRIDE {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu_shown_ = true;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void MenuClosed(ui::SimpleMenuModel* /*source*/) OVERRIDE {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu_closed_ = true;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ViewEventTestBase implementation.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DoTestOnMessageLoop() OVERRIDE {
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Click on the ToolbarButton.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        button_,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::LEFT,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN,
78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        CreateEventTask(this, &ToolbarButtonDragTest::Step1));
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step1() {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Drag to invoke the menu.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Point view_center;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::View::ConvertPointToScreen(button_, &view_center);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The 50 is a bit arbitrary. We just need a value greater than the drag
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // threshold.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseMoveNotifyWhenDone(
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        view_center.x(), view_center.y() + 50,
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        CreateEventTask(this, &ToolbarButtonDragTest::Step2));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step2() {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu_shown_);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Release.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_controls::SendMouseEventsNotifyWhenDone(
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::LEFT,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::UP,
99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        CreateEventTask(this, &ToolbarButtonDragTest::Step3));
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step3() {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Click mouse to dismiss menu.  The views menu does not dismiss the
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // menu on click-drag-release unless an item is selected.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::MoveMouseToCenterAndPress(
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        button_,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::LEFT,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ui_controls::DOWN | ui_controls::UP,
109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        CreateEventTask(this, &ToolbarButtonDragTest::Step4));
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step4() {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // One more hop is required because ui::SimpleMenuModel calls
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ui::SimpleMenuModel::Delegate::MenuClosed() via a posted
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // task.
116b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoopForUI::current()->PostTask(
117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        FROM_HERE, CreateEventTask(this, &ToolbarButtonDragTest::Step5));
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Step5() {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(menu_closed_);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ToolbarButton* button_;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool menu_shown_;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool menu_closed_;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Broken since landed. crbug.com/325055
132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)VIEW_TEST(ToolbarButtonDragTest, DISABLED_DragActivation)
133