1// Copyright 2014 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#ifndef MOJO_SERVICES_VIEW_MANAGER_TEST_CHANGE_TRACKER_H_
6#define MOJO_SERVICES_VIEW_MANAGER_TEST_CHANGE_TRACKER_H_
7
8#include <string>
9#include <vector>
10
11#include "mojo/public/cpp/bindings/array.h"
12#include "mojo/services/public/cpp/view_manager/types.h"
13#include "mojo/services/public/interfaces/view_manager/view_manager.mojom.h"
14#include "ui/gfx/rect.h"
15
16namespace mojo {
17namespace service {
18
19enum ChangeType {
20  CHANGE_TYPE_EMBED,
21  // TODO(sky): NODE->VIEW.
22  CHANGE_TYPE_NODE_BOUNDS_CHANGED,
23  CHANGE_TYPE_NODE_HIERARCHY_CHANGED,
24  CHANGE_TYPE_NODE_REORDERED,
25  CHANGE_TYPE_NODE_VISIBILITY_CHANGED,
26  CHANGE_TYPE_NODE_DRAWN_STATE_CHANGED,
27  CHANGE_TYPE_NODE_DELETED,
28  CHANGE_TYPE_INPUT_EVENT,
29  CHANGE_TYPE_DELEGATE_EMBED,
30};
31
32// TODO(sky): consider nuking and converting directly to ViewData.
33struct TestView {
34  // Returns a string description of this.
35  std::string ToString() const;
36
37  // Returns a string description that includes visible and drawn.
38  std::string ToString2() const;
39
40  Id parent_id;
41  Id view_id;
42  bool visible;
43  bool drawn;
44};
45
46// Tracks a call to ViewManagerClient. See the individual functions for the
47// fields that are used.
48struct Change {
49  Change();
50  ~Change();
51
52  ChangeType type;
53  ConnectionSpecificId connection_id;
54  std::vector<TestView> views;
55  Id view_id;
56  Id view_id2;
57  Id view_id3;
58  gfx::Rect bounds;
59  gfx::Rect bounds2;
60  int32 event_action;
61  String creator_url;
62  String embed_url;
63  OrderDirection direction;
64  bool bool_value;
65};
66
67// Converts Changes to string descriptions.
68std::vector<std::string> ChangesToDescription1(
69    const std::vector<Change>& changes);
70
71// Returns a string description of |changes[0].views|. Returns an empty string
72// if change.size() != 1.
73std::string ChangeViewDescription(const std::vector<Change>& changes);
74
75// Converts ViewDatas to TestViews.
76void ViewDatasToTestViews(const Array<ViewDataPtr>& data,
77                          std::vector<TestView>* test_views);
78
79// TestChangeTracker is used to record ViewManagerClient functions. It notifies
80// a delegate any time a change is added.
81class TestChangeTracker {
82 public:
83  // Used to notify the delegate when a change is added. A change corresponds to
84  // a single ViewManagerClient function.
85  class Delegate {
86   public:
87    virtual void OnChangeAdded() = 0;
88
89   protected:
90    virtual ~Delegate() {}
91  };
92
93  TestChangeTracker();
94  ~TestChangeTracker();
95
96  void set_delegate(Delegate* delegate) {
97    delegate_ = delegate;
98  }
99
100  std::vector<Change>* changes() { return &changes_; }
101
102  // Each of these functions generate a Change. There is one per
103  // ViewManagerClient function.
104  void OnEmbed(ConnectionSpecificId connection_id,
105               const String& creator_url,
106               ViewDataPtr root);
107  void OnViewBoundsChanged(Id view_id, RectPtr old_bounds, RectPtr new_bounds);
108  void OnViewHierarchyChanged(Id view_id,
109                              Id new_parent_id,
110                              Id old_parent_id,
111                              Array<ViewDataPtr> views);
112  void OnViewReordered(Id view_id,
113                       Id relative_view_id,
114                       OrderDirection direction);
115  void OnViewDeleted(Id view_id);
116  void OnViewVisibilityChanged(Id view_id, bool visible);
117  void OnViewDrawnStateChanged(Id view_id, bool drawn);
118  void OnViewInputEvent(Id view_id, EventPtr event);
119  void DelegateEmbed(const String& url);
120
121 private:
122  void AddChange(const Change& change);
123
124  Delegate* delegate_;
125  std::vector<Change> changes_;
126
127  DISALLOW_COPY_AND_ASSIGN(TestChangeTracker);
128};
129
130}  // namespace service
131}  // namespace mojo
132
133#endif  // MOJO_SERVICES_VIEW_MANAGER_TEST_CHANGE_TRACKER_H_
134