// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef ASH_SHELL_TEST_API_H_
#define ASH_SHELL_TEST_API_H_

#include <memory>

#include "ash/public/interfaces/shell_test_api.mojom.h"
#include "base/macros.h"

class PrefService;

namespace ash {
class DragDropController;
class MessageCenterController;
class NativeCursorManagerAsh;
class ScreenPositionController;
class Shell;
class SystemGestureEventFilter;
class WorkspaceController;

// Accesses private data from a Shell for testing.
class ShellTestApi : public mojom::ShellTestApi {
 public:
  ShellTestApi();
  explicit ShellTestApi(Shell* shell);

  // Creates and binds an instance from a remote request (e.g. from chrome).
  static void BindRequest(mojom::ShellTestApiRequest request);

  MessageCenterController* message_center_controller();
  SystemGestureEventFilter* system_gesture_event_filter();
  WorkspaceController* workspace_controller();
  ScreenPositionController* screen_position_controller();
  NativeCursorManagerAsh* native_cursor_manager_ash();
  DragDropController* drag_drop_controller();

  // Calls the private method.
  void OnLocalStatePrefServiceInitialized(
      std::unique_ptr<PrefService> pref_service);

  // Resets |shell_->power_button_controller_| to hold a new object to simulate
  // Chrome starting.
  void ResetPowerButtonControllerForTest();

  // Simulates a modal dialog being open.
  void SimulateModalWindowOpenForTest(bool modal_window_open);

  // mojom::ShellTestApi:
  void IsSystemModalWindowOpen(IsSystemModalWindowOpenCallback cb) override;

 private:
  Shell* shell_;  // not owned

  DISALLOW_COPY_AND_ASSIGN(ShellTestApi);
};

}  // namespace ash

#endif  // ASH_SHELL_TEST_API_H_
