15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/interactive_test_utils.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/frame/browser_view.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/base/test/ui_controls.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/compositor/layer.h" 136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/compositor/layer_animator.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/focus_manager.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui_test_utils { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Until the whole browser UI is ported to tookit-views on Mac, these need to 196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// use the definitions in interactive_test_utils_mac.mm. 206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if !defined(OS_MACOSX) 216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsViewFocused(const Browser* browser, ViewID vid) { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserWindow* browser_window = browser->window(); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(browser_window); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeWindow window = browser_window->GetNativeWindow(); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(window); 276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const views::Widget* widget = views::Widget::GetWidgetForNativeWindow(window); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(widget); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const views::FocusManager* focus_manager = widget->GetFocusManager(); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(focus_manager); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(focus_manager->GetFocusedView()); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return focus_manager->GetFocusedView()->id() == vid; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ClickOnView(const Browser* browser, ViewID vid) { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View* view = 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserView::GetBrowserViewForBrowser(browser)->GetViewByID(vid); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(view); 39a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) MoveMouseToCenterAndPress(view, 40a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ui_controls::LEFT, 41a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ui_controls::DOWN | ui_controls::UP, 42a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) base::MessageLoop::QuitClosure()); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunMessageLoop(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid FocusView(const Browser* browser, ViewID vid) { 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci views::View* view = 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BrowserView::GetBrowserViewForBrowser(browser)->GetViewByID(vid); 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(view); 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci view->RequestFocus(); 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif // defined(OS_MACOSX) 546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MoveMouseToCenterAndPress(views::View* view, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_controls::MouseButton button, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int state, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& closure) { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(view); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(view->GetWidget()); 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Complete any in-progress animation before sending the events so that the 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // mouse-event targetting happens reliably, and does not flake because of 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // unreliable animation state. 646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ui::Layer* layer = view->GetWidget()->GetLayer(); 656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (layer) { 666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ui::LayerAnimator* animator = layer->GetAnimator(); 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (animator && animator->is_animating()) 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) animator->StopAnimating(); 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point view_center(view->width() / 2, view->height() / 2); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View::ConvertPointToScreen(view, &view_center); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_controls::SendMouseMoveNotifyWhenDone( 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_center.x(), 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_center.y(), 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&internal::ClickTask, button, state, closure)); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui_test_utils 80