1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h"
6
7#include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
8#include "content/public/test/test_utils.h"
9#include "testing/gtest/include/gtest/gtest.h"
10
11namespace chromeos {
12
13OobeScreenWaiter::OobeScreenWaiter(OobeDisplay::Screen expected_screen)
14    : waiting_for_screen_(false),
15      expected_screen_(expected_screen) {
16}
17
18OobeScreenWaiter::~OobeScreenWaiter() {
19  if (waiting_for_screen_) {
20    GetOobeUI()->RemoveObserver(this);
21  }
22}
23
24void OobeScreenWaiter::Wait() {
25  WaitNoAssertCurrentScreen();
26
27  ASSERT_EQ(expected_screen_, GetOobeUI()->current_screen());
28}
29
30void OobeScreenWaiter::WaitNoAssertCurrentScreen() {
31  if (GetOobeUI()->current_screen() == expected_screen_)
32    return;
33
34  waiting_for_screen_ = true;
35  GetOobeUI()->AddObserver(this);
36
37  runner_ = new content::MessageLoopRunner;
38  runner_->Run();
39  ASSERT_FALSE(waiting_for_screen_);
40}
41
42void OobeScreenWaiter::OnCurrentScreenChanged(
43    OobeDisplay::Screen current_screen,
44    OobeDisplay::Screen new_screen) {
45  if (waiting_for_screen_ && new_screen == expected_screen_) {
46    runner_->Quit();
47    waiting_for_screen_ = false;
48    GetOobeUI()->RemoveObserver(this);
49  }
50}
51
52OobeUI* OobeScreenWaiter::GetOobeUI() {
53  OobeUI* oobe_ui = static_cast<chromeos::LoginDisplayHostImpl*>(
54      chromeos::LoginDisplayHostImpl::default_host())->GetOobeUI();
55  CHECK(oobe_ui);
56  return oobe_ui;
57}
58
59}  // namespace chromeos
60