chromium/components/exo/test/exo_test_helper.h

// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_EXO_TEST_EXO_TEST_HELPER_H_
#define COMPONENTS_EXO_TEST_EXO_TEST_HELPER_H_

#include <memory>

#include "base/compiler_specific.h"
#include "base/memory/raw_ptr.h"
#include "chromeos/ui/base/window_state_type.h"
#include "components/exo/client_controlled_shell_surface.h"
#include "ui/gfx/buffer_types.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/size.h"

namespace gfx {
class GpuMemoryBuffer;
}

namespace exo {
class ClientControlledShellSurface;
class InputMethodSurface;
class InputMethodSurfaceManager;
class Surface;
class ToastSurface;
class ToastSurfaceManager;
class Buffer;

namespace test {

class ClientControlledShellSurfaceDelegate
    : public ClientControlledShellSurface::Delegate {
 public:
  explicit ClientControlledShellSurfaceDelegate(
      ClientControlledShellSurface* shell_surface,
      bool delay_commit = false);
  ~ClientControlledShellSurfaceDelegate() override;
  ClientControlledShellSurfaceDelegate(
      const ClientControlledShellSurfaceDelegate&) = delete;
  ClientControlledShellSurfaceDelegate& operator=(
      const ClientControlledShellSurfaceDelegate&) = delete;

 protected:
  // ClientControlledShellSurface::Delegate:
  void OnGeometryChanged(const gfx::Rect& geometry) override;
  void OnStateChanged(chromeos::WindowStateType old_state_type,
                      chromeos::WindowStateType new_state_type) override;
  void OnBoundsChanged(chromeos::WindowStateType current_state,
                       chromeos::WindowStateType requested_state,
                       int64_t display_id,
                       const gfx::Rect& bounds_in_display,
                       bool is_resize,
                       int bounds_change,
                       bool is_adjusted_bounds) override;
  void OnDragStarted(int component) override;
  void OnDragFinished(int x, int y, bool canceled) override;
  void OnZoomLevelChanged(ZoomChange zoom_change) override;
  void Commit();

  raw_ptr<ClientControlledShellSurface> shell_surface_;
  bool delay_commit_;
};

// A helper class that does common initialization required for Exosphere.
class ExoTestHelper {
 public:
  ExoTestHelper();

  ExoTestHelper(const ExoTestHelper&) = delete;
  ExoTestHelper& operator=(const ExoTestHelper&) = delete;

  ~ExoTestHelper();

  // Creates a GpuMemoryBuffer instance that can be used for tests.
  static std::unique_ptr<gfx::GpuMemoryBuffer> CreateGpuMemoryBuffer(
      const gfx::Size& size,
      gfx::BufferFormat format = gfx::BufferFormat::RGBA_8888);

  // Creates an exo::Buffer that has the size of the given
  // shell surface.
  static std::unique_ptr<Buffer> CreateBuffer(
      ShellSurfaceBase* shell_surface,
      gfx::BufferFormat format = gfx::BufferFormat::RGBA_8888);

  // Creates an exo::Buffer that will be backed by either GpuMemoryBuffer or
  // MappableSI if enabled.
  static std::unique_ptr<Buffer> CreateBuffer(
      gfx::Size buffer_size,
      gfx::BufferFormat buffer_format = gfx::BufferFormat::RGBA_8888,
      bool is_overlay_candidate = false);

  // Creates an exo::Buffer from GMBHandle.
  static std::unique_ptr<Buffer> CreateBufferFromGMBHandle(
      gfx::GpuMemoryBufferHandle handle,
      gfx::Size buffer_size,
      gfx::BufferFormat buffer_format);

  std::unique_ptr<ClientControlledShellSurface>
  CreateClientControlledShellSurface(Surface* surface,
                                     bool is_modal = false,
                                     bool default_scale_cancellation = false);
  std::unique_ptr<InputMethodSurface> CreateInputMethodSurface(
      Surface* surface,
      InputMethodSurfaceManager* surface_manager,
      bool default_scale_cancellation = true);
  std::unique_ptr<ToastSurface> CreateToastSurface(
      Surface* surface,
      ToastSurfaceManager* surface_manager,
      bool default_scale_cancellation = true);
};

}  // namespace test
}  // namespace exo

#endif  // COMPONENTS_EXO_TEST_EXO_TEST_HELPER_H_