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