blob: 159bd8e83173ea4fd52b49a164b8adbadb861fda [file] [log] [blame]
// Copyright 2015 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 UI_AURA_TEST_MUS_TEST_WINDOW_TREE_H_
#define UI_AURA_TEST_MUS_TEST_WINDOW_TREE_H_
#include <stdint.h>
#include <vector>
#include "base/macros.h"
#include "services/ws/common/types.h"
#include "services/ws/public/mojom/window_tree.mojom.h"
#include "ui/aura/mus/mus_types.h"
namespace aura {
enum class WindowTreeChangeType {
ADD_TRANSIENT,
BOUNDS,
// Used for both set and release capture.
CAPTURE,
FOCUS,
MODAL,
NEW_TOP_LEVEL,
NEW_WINDOW,
PROPERTY,
REMOVE_TRANSIENT,
REORDER,
TRANSFORM,
VISIBLE,
// This covers all cases that aren't used in tests.
OTHER,
};
struct TransientData {
ws::Id parent_id;
ws::Id child_id;
};
// WindowTree implementation for tests. TestWindowTree maintains a list of all
// calls that take a change_id and are expected to be acked back to the client.
// Various functions are provided to respond to the changes.
class TestWindowTree : public ws::mojom::WindowTree {
public:
TestWindowTree();
~TestWindowTree() override;
void set_client(ws::mojom::WindowTreeClient* client) { client_ = client; }
uint32_t window_id() const { return window_id_; }
bool WasEventAcked(uint32_t event_id) const;
// Returns the result of the specified event. UNHANDLED if |event_id| was
// not acked (use WasEventAcked() to determine if the event was acked).
ws::mojom::EventResult GetEventResult(uint32_t event_id) const;
base::Optional<std::vector<uint8_t>> GetLastPropertyValue();
base::Optional<base::flat_map<std::string, std::vector<uint8_t>>>
GetLastNewWindowProperties();
// True if at least one function has been called that takes a change id.
bool has_change() const { return !changes_.empty(); }
size_t number_of_changes() const { return changes_.size(); }
// Pretends that there is a scheduled embed request for |token|.
void AddScheduledEmbedToken(const base::UnguessableToken& token);
// Pretends the other side has called EmbedUsingToken for |token|.
void AddEmbedRootForToken(const base::UnguessableToken& token);
// Pretends the embedder window goes away.
void RemoveEmbedderWindow(ws::Id embedder_window_id);
// Acks all changes with a value of true.
void AckAllChanges();
// Returns false if there are no, or more than one, changes of the specified
// type. If there is only one of the matching type it is acked with a result
// of |result| and true is returned.
bool AckSingleChangeOfType(WindowTreeChangeType type, bool result);
// Same as AckSingleChangeOfType(), but doesn't fail if there is more than
// one change of the specified type.
bool AckFirstChangeOfType(WindowTreeChangeType type, bool result);
void AckAllChangesOfType(WindowTreeChangeType type, bool result);
bool GetAndRemoveFirstChangeOfType(WindowTreeChangeType type,
uint32_t* change_id);
size_t GetChangeCountForType(WindowTreeChangeType type);
// Data from the most recently added/removed transient window.
const TransientData& transient_data() const { return transient_data_; }
const gfx::Insets& last_client_area() const { return last_client_area_; }
const base::Optional<gfx::Rect>& last_hit_test_mask() const {
return last_hit_test_mask_;
}
const base::Optional<viz::LocalSurfaceId>& last_local_surface_id() const {
return last_local_surface_id_;
}
const gfx::Rect& last_set_window_bounds() const {
return last_set_window_bounds_;
}
const std::string& last_wm_action() const { return last_wm_action_; }
private:
struct Change {
WindowTreeChangeType type;
uint32_t id;
};
void OnChangeReceived(
uint32_t change_id,
WindowTreeChangeType type = WindowTreeChangeType::OTHER);
// ws::mojom::WindowTree:
void NewWindow(
uint32_t change_id,
ws::Id window_id,
const base::Optional<base::flat_map<std::string, std::vector<uint8_t>>>&
properties) override;
void NewTopLevelWindow(
uint32_t change_id,
ws::Id window_id,
const base::flat_map<std::string, std::vector<uint8_t>>& properties)
override;
void DeleteWindow(uint32_t change_id, ws::Id window_id) override;
void SetWindowBounds(
uint32_t change_id,
ws::Id window_id,
const gfx::Rect& bounds,
const base::Optional<viz::LocalSurfaceId>& local_surface_id) override;
void SetWindowTransform(uint32_t change_id,
ws::Id window_id,
const gfx::Transform& transform) override;
void SetClientArea(ws::Id window_id,
const gfx::Insets& insets,
const base::Optional<std::vector<gfx::Rect>>&
additional_client_areas) override;
void SetHitTestMask(ws::Id window_id,
const base::Optional<gfx::Rect>& mask) override;
void SetCanAcceptDrops(ws::Id window_id, bool accepts_drags) override;
void SetWindowVisibility(uint32_t change_id,
ws::Id window_id,
bool visible) override;
void SetWindowProperty(
uint32_t change_id,
ws::Id window_id,
const std::string& name,
const base::Optional<std::vector<uint8_t>>& value) override;
void SetWindowOpacity(uint32_t change_id,
ws::Id window_id,
float opacity) override;
void AttachCompositorFrameSink(
ws::Id window_id,
mojo::InterfaceRequest<viz::mojom::CompositorFrameSink> surface,
viz::mojom::CompositorFrameSinkClientPtr client) override;
void AddWindow(uint32_t change_id, ws::Id parent, ws::Id child) override;
void RemoveWindowFromParent(uint32_t change_id, ws::Id window_id) override;
void AddTransientWindow(uint32_t change_id,
ws::Id window_id,
ws::Id transient_window_id) override;
void RemoveTransientWindowFromParent(uint32_t change_id,
ws::Id window_id) override;
void SetModalType(uint32_t change_id,
ws::Id window_id,
ui::ModalType modal_type) override;
void ReorderWindow(uint32_t change_id,
ws::Id window_id,
ws::Id relative_window_id,
ws::mojom::OrderDirection direction) override;
void GetWindowTree(ws::Id window_id, GetWindowTreeCallback callback) override;
void SetCapture(uint32_t change_id, ws::Id window_id) override;
void ReleaseCapture(uint32_t change_id, ws::Id window_id) override;
void StartPointerWatcher(bool want_moves) override;
void StopPointerWatcher() override;
void Embed(ws::Id window_id,
ws::mojom::WindowTreeClientPtr client,
uint32_t flags,
EmbedCallback callback) override;
void ScheduleEmbed(ws::mojom::WindowTreeClientPtr client,
ScheduleEmbedCallback callback) override;
void EmbedUsingToken(ws::Id window_id,
const base::UnguessableToken& token,
uint32_t embed_flags,
EmbedUsingTokenCallback callback) override;
void ScheduleEmbedForExistingClient(
ws::ClientSpecificId window_id,
ScheduleEmbedForExistingClientCallback callback) override;
void SetFocus(uint32_t change_id, ws::Id window_id) override;
void SetCanFocus(ws::Id window_id, bool can_focus) override;
void SetEventTargetingPolicy(ws::Id window_id,
ws::mojom::EventTargetingPolicy policy) override;
void SetCursor(uint32_t change_id,
ws::Id transport_window_id,
ui::CursorData cursor_data) override;
void SetWindowTextInputState(ws::Id window_id,
ui::mojom::TextInputStatePtr state) override;
void SetImeVisibility(ws::Id window_id,
bool visible,
ui::mojom::TextInputStatePtr state) override;
void OnWindowInputEventAck(uint32_t event_id,
ws::mojom::EventResult result) override;
void DeactivateWindow(ws::Id window_id) override;
void StackAbove(uint32_t change_id,
ws::Id above_id,
ws::Id below_id) override;
void StackAtTop(uint32_t change_id, ws::Id window_id) override;
void PerformWmAction(ws::Id window_id, const std::string& action) override;
void GetCursorLocationMemory(
GetCursorLocationMemoryCallback callback) override;
void PerformDragDrop(
uint32_t change_id,
ws::Id source_window_id,
const gfx::Point& screen_location,
const base::flat_map<std::string, std::vector<uint8_t>>& drag_data,
const gfx::ImageSkia& drag_image,
const gfx::Vector2d& drag_image_offset,
uint32_t drag_operation,
ui::mojom::PointerKind source) override;
void CancelDragDrop(ws::Id window_id) override;
void PerformWindowMove(uint32_t change_id,
ws::Id window_id,
ws::mojom::MoveLoopSource source,
const gfx::Point& cursor_location) override;
void CancelWindowMove(ws::Id window_id) override;
void ObserveTopmostWindow(ws::mojom::MoveLoopSource source,
ws::Id window_id) override;
void StopObservingTopmostWindow() override;
struct AckedEvent {
uint32_t event_id;
ws::mojom::EventResult result;
};
std::vector<AckedEvent> acked_events_;
ws::Id window_id_ = 0u;
base::Optional<std::vector<uint8_t>> last_property_value_;
std::vector<Change> changes_;
ws::mojom::WindowTreeClient* client_;
base::Optional<base::flat_map<std::string, std::vector<uint8_t>>>
last_new_window_properties_;
TransientData transient_data_;
gfx::Insets last_client_area_;
base::Optional<gfx::Rect> last_hit_test_mask_;
base::Optional<viz::LocalSurfaceId> last_local_surface_id_;
gfx::Rect last_set_window_bounds_;
std::string last_wm_action_;
// Support only one scheduled embed in test.
base::UnguessableToken scheduled_embed_;
DISALLOW_COPY_AND_ASSIGN(TestWindowTree);
};
} // namespace aura
#endif // UI_AURA_TEST_MUS_TEST_WINDOW_TREE_H_