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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/view_event_test_base.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/interactive_test_utils.h"
12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/base/ime/input_method_initializer.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/base/test/ui_controls.h"
171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/compositor/test/context_factories_for_test.h"
18a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "ui/message_center/message_center.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_screen.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_ASH)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
25ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ash/test/test_session_state_delegate.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/test/test_shell_delegate.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/event_client.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/test/aura_test_helper.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/audio/cras_audio_handler.h"
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chromeos/network/network_handler.h"
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// View subclass that allows you to specify the preferred size.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestView : public views::View {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestView() {}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetPreferredSize(const gfx::Size& size) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    preferred_size_ = size;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PreferredSizeChanged();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::Size GetPreferredSize() OVERRIDE {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!preferred_size_.IsEmpty())
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return preferred_size_;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return View::GetPreferredSize();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Layout() OVERRIDE {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    View* child_view = child_at(0);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    child_view->SetBounds(0, 0, width(), height());
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size preferred_size_;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestView);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Delay in background thread before posting mouse move.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kMouseMoveDelayMS = 200;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ViewEventTestBase::ViewEventTestBase()
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  : window_(NULL),
77a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    content_view_(NULL) {
78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // The TestingBrowserProcess must be created in the constructor because there
79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // are tests that require it before SetUp() is called.
80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  TestingBrowserProcess::CreateInstance();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ViewEventTestBase::Done() {
84a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  base::MessageLoop::current()->Quit();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need to post a message to tickle the Dispatcher getting called and
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // exiting out of the nested loop. Without this the quit never runs.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (window_)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PostMessage(window_->GetNativeWindow(), WM_USER, 0, 0);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we're in a nested message loop, as is the case with menus, we
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // need to quit twice. The second quit does that for us. Finish all
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pending UI events before posting closure because events it may be
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // executed before UI events are executed.
97a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ui_controls::RunClosureAfterAllPendingUIEvents(
98a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      base::MessageLoop::QuitClosure());
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ViewEventTestBase::SetUp() {
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  views::ViewsDelegate::views_delegate = &views_delegate_;
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ui::InitializeInputMethodForTesting();
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::NativeView context = NULL;
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_ASH)
1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // The ContextFactory must exist before any Compositors are created.
1081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool allow_test_contexts = true;
1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ui::InitializeContextFactoryForTests(allow_test_contexts);
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // http://crbug.com/154081 use ash::Shell code path below on win_ash bots when
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // interactive_ui_tests is brought up on that platform.
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Screen::SetScreenInstance(
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::SCREEN_TYPE_NATIVE, views::CreateDesktopScreen());
115c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
116c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#else  // !OS_WIN
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Ash Shell can't just live on its own without a browser process, we need to
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // also create the message center.
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_center::MessageCenter::Initialize();
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::CrasAudioHandler::InitializeForTesting();
1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  chromeos::NetworkHandler::Initialize();
123c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#endif  // OS_CHROMEOS
124ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ash::test::TestShellDelegate* shell_delegate =
125ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      new ash::test::TestShellDelegate();
126ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ash::Shell::CreateInstance(shell_delegate);
127ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  shell_delegate->test_session_state_delegate()
128ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      ->SetActiveUserSessionStarted(true);
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context = ash::Shell::GetPrimaryRootWindow();
130c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#endif  // !OS_WIN
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  aura::Env::CreateInstance();
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(USE_AURA)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Instead of using the ash shell, use an AuraTestHelper to create and manage
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the test screen.
135a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  aura_test_helper_.reset(
136a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch      new aura::test::AuraTestHelper(base::MessageLoopForUI::current()));
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura_test_helper_->SetUp();
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  context = aura_test_helper_->root_window();
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // !USE_ASH && USE_AURA
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_ = views::Widget::CreateWindowWithContext(this, context);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ViewEventTestBase::TearDown() {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (window_) {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(USE_AURA)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DestroyWindow(window_->GetNativeWindow());
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->Close();
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RunAllPendingInMessageLoop();
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_ = NULL;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_ASH)
1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if !defined(OS_WIN)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ash::Shell::DeleteInstance();
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  chromeos::NetworkHandler::Shutdown();
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::CrasAudioHandler::Shutdown();
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Ash Shell can't just live on its own without a browser process, we need to
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // also shut down the message center.
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  message_center::MessageCenter::Shutdown();
1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // !OS_WIN
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Env::DeleteInstance();
1671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ui::TerminateContextFactoryForTests();
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(USE_AURA)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura_test_helper_->TearDown();
1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // !USE_ASH && USE_AURA
1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ui::ShutdownInputMethodForTesting();
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  views::ViewsDelegate::views_delegate = NULL;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ViewEventTestBase::CanResize() const {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* ViewEventTestBase::GetContentsView() {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!content_view_) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Wrap the real view (as returned by CreateContentsView) in a View so
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // that we can customize the preferred size.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestView* test_view = new TestView();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_view->SetPreferredSize(GetPreferredSize());
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_view->AddChildView(CreateContentsView());
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_view_ = test_view;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return content_view_;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const views::Widget* ViewEventTestBase::GetWidget() const {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return content_view_->GetWidget();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::Widget* ViewEventTestBase::GetWidget() {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return content_view_->GetWidget();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ViewEventTestBase::~ViewEventTestBase() {
201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  TestingBrowserProcess::DeleteInstance();
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ViewEventTestBase::StartMessageLoopAndRunTest() {
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui_test_utils::ShowAndFocusNativeWindow(window_->GetNativeWindow()));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Flush any pending events to make sure we start with a clean slate.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RunAllPendingInMessageLoop();
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Schedule a task that starts the test. Need to do this as we're going to
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // run the message loop.
213a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
214a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      FROM_HERE, base::Bind(&ViewEventTestBase::DoTestOnMessageLoop, this));
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RunMessageLoop();
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size ViewEventTestBase::GetPreferredSize() {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Size();
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ViewEventTestBase::ScheduleMouseMoveInBackground(int x, int y) {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!dnd_thread_.get()) {
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dnd_thread_.reset(new base::Thread("mouse-move-thread"));
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dnd_thread_->Start();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dnd_thread_->message_loop()->PostDelayedTask(
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(base::IgnoreResult(&ui_controls::SendMouseMove), x, y),
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(kMouseMoveDelayMS));
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ViewEventTestBase::StopBackgroundThread() {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dnd_thread_.reset(NULL);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ViewEventTestBase::RunTestMethod(const base::Closure& task) {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StopBackgroundThread();
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  task.Run();
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (HasFatalFailure())
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Done();
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245