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 "ui/aura/test/aura_test_helper.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/run_loop.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/aura_constants.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/default_capture_client.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/focus_client.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h"
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/aura/input_state_lookup.h"
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/aura/test/env_test_helper.h"
156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/aura/test/event_generator_delegate_aura.h"
168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "ui/aura/test/test_focus_client.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/test/test_screen.h"
181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/aura/test/test_window_tree_client.h"
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h"
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/base/ime/dummy_input_method.h"
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/base/ime/input_method_initializer.h"
22c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "ui/compositor/compositor.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animator.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/scoped_animation_duration_scale_mode.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_X11)
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/aura/window_tree_host_x11.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/x/x11_util.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace aura {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)AuraTestHelper::AuraTestHelper(base::MessageLoopForUI* message_loop)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : setup_called_(false),
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      teardown_called_(false),
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      owns_host_(false) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(message_loop);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_ = message_loop;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable animations during tests.
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  zero_duration_mode_.reset(new ui::ScopedAnimationDurationScaleMode(
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::ScopedAnimationDurationScaleMode::ZERO_DURATION));
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if defined(USE_X11)
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  test::SetUseOverrideRedirectWindowByDefault(true);
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  InitializeAuraEventGeneratorDelegate();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AuraTestHelper::~AuraTestHelper() {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(setup_called_)
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      << "AuraTestHelper::SetUp() never called.";
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(teardown_called_)
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      << "AuraTestHelper::TearDown() never called.";
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AuraTestHelper::SetUp(ui::ContextFactory* context_factory) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  setup_called_ = true;
59c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Env::CreateInstance(true);
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Env::GetInstance()->set_context_factory(context_factory);
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Unit tests generally don't want to query the system, rather use the state
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // from RootWindow.
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EnvTestHelper(Env::GetInstance()).SetInputStateLookup(
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      scoped_ptr<InputStateLookup>());
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ui::InitializeInputMethodForTesting();
681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  gfx::Size host_size(800, 600);
706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  test_screen_.reset(TestScreen::Create(host_size));
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_NATIVE, test_screen_.get());
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  host_.reset(test_screen_->CreateHostForPrimaryDisplay());
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  focus_client_.reset(new TestFocusClient);
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  client::SetFocusClient(root_window(), focus_client_.get());
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  stacking_client_.reset(new TestWindowTreeClient(root_window()));
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  capture_client_.reset(new client::DefaultCaptureClient(root_window()));
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  test_input_method_.reset(new ui::DummyInputMethod);
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  root_window()->SetProperty(
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      client::kRootWindowInputMethodKey,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_input_method_.get());
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  root_window()->Show();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure width != height so tests won't confuse them.
856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  host()->SetBounds(gfx::Rect(host_size));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AuraTestHelper::TearDown() {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  teardown_called_ = true;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_input_method_.reset();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  stacking_client_.reset();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  capture_client_.reset();
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  focus_client_.reset();
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  client::SetFocusClient(root_window(), NULL);
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  host_.reset();
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ui::GestureRecognizer::Reset();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_screen_.reset();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_NATIVE, NULL);
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_X11)
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ui::test::ResetXCursorCache();
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ui::ShutdownInputMethodForTesting();
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Env::DeleteInstance();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AuraTestHelper::RunAllPendingInMessageLoop() {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(jbates) crbug.com/134753 Find quitters of this RunLoop and have them
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //              use run_loop.QuitClosure().
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop run_loop;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  run_loop.RunUntilIdle();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace test
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace aura
118