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