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