1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifndef MOJO_SERVICES_VIEW_MANAGER_TEST_CHANGE_TRACKER_H_
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define MOJO_SERVICES_VIEW_MANAGER_TEST_CHANGE_TRACKER_H_
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <string>
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <vector>
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "mojo/public/cpp/bindings/array.h"
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/services/public/cpp/view_manager/types.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "mojo/services/public/interfaces/view_manager/view_manager.mojom.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gfx/rect.h"
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace mojo {
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace service {
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)enum ChangeType {
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CHANGE_TYPE_EMBED,
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(sky): NODE->VIEW.
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CHANGE_TYPE_NODE_BOUNDS_CHANGED,
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CHANGE_TYPE_NODE_HIERARCHY_CHANGED,
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  CHANGE_TYPE_NODE_REORDERED,
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHANGE_TYPE_NODE_VISIBILITY_CHANGED,
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHANGE_TYPE_NODE_DRAWN_STATE_CHANGED,
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CHANGE_TYPE_NODE_DELETED,
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CHANGE_TYPE_INPUT_EVENT,
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  CHANGE_TYPE_DELEGATE_EMBED,
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// TODO(sky): consider nuking and converting directly to ViewData.
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistruct TestView {
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Returns a string description of this.
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string ToString() const;
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns a string description that includes visible and drawn.
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string ToString2() const;
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Id parent_id;
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Id view_id;
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool visible;
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool drawn;
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Tracks a call to ViewManagerClient. See the individual functions for the
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// fields that are used.
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)struct Change {
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Change();
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ~Change();
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ChangeType type;
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ConnectionSpecificId connection_id;
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<TestView> views;
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Id view_id;
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Id view_id2;
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Id view_id3;
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Rect bounds;
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Rect bounds2;
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  int32 event_action;
61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  String creator_url;
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  String embed_url;
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  OrderDirection direction;
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool bool_value;
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Converts Changes to string descriptions.
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::vector<std::string> ChangesToDescription1(
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const std::vector<Change>& changes);
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Returns a string description of |changes[0].views|. Returns an empty string
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// if change.size() != 1.
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistd::string ChangeViewDescription(const std::vector<Change>& changes);
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Converts ViewDatas to TestViews.
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ViewDatasToTestViews(const Array<ViewDataPtr>& data,
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          std::vector<TestView>* test_views);
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// TestChangeTracker is used to record ViewManagerClient functions. It notifies
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// a delegate any time a change is added.
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class TestChangeTracker {
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Used to notify the delegate when a change is added. A change corresponds to
84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // a single ViewManagerClient function.
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  class Delegate {
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   public:
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    virtual void OnChangeAdded() = 0;
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   protected:
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    virtual ~Delegate() {}
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  };
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TestChangeTracker();
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ~TestChangeTracker();
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void set_delegate(Delegate* delegate) {
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    delegate_ = delegate;
986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<Change>* changes() { return &changes_; }
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Each of these functions generate a Change. There is one per
103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // ViewManagerClient function.
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void OnEmbed(ConnectionSpecificId connection_id,
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               const String& creator_url,
1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)               ViewDataPtr root);
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnViewBoundsChanged(Id view_id, RectPtr old_bounds, RectPtr new_bounds);
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnViewHierarchyChanged(Id view_id,
109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                              Id new_parent_id,
110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                              Id old_parent_id,
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              Array<ViewDataPtr> views);
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnViewReordered(Id view_id,
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       Id relative_view_id,
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       OrderDirection direction);
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnViewDeleted(Id view_id);
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnViewVisibilityChanged(Id view_id, bool visible);
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnViewDrawnStateChanged(Id view_id, bool drawn);
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnViewInputEvent(Id view_id, EventPtr event);
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void DelegateEmbed(const String& url);
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void AddChange(const Change& change);
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Delegate* delegate_;
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<Change> changes_;
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestChangeTracker);
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace service
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace mojo
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // MOJO_SERVICES_VIEW_MANAGER_TEST_CHANGE_TRACKER_H_
134