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 #include "mojo/services/view_manager/test_change_tracker.h" 6 7 #include "base/strings/string_util.h" 8 #include "base/strings/stringprintf.h" 9 #include "mojo/common/common_type_converters.h" 10 #include "mojo/services/public/cpp/geometry/geometry_type_converters.h" 11 #include "mojo/services/public/cpp/view_manager/util.h" 12 13 namespace mojo { 14 namespace view_manager { 15 namespace service { 16 17 std::string NodeIdToString(Id id) { 18 return (id == 0) ? "null" : 19 base::StringPrintf("%d,%d", HiWord(id), LoWord(id)); 20 } 21 22 namespace { 23 24 std::string RectToString(const gfx::Rect& rect) { 25 return base::StringPrintf("%d,%d %dx%d", rect.x(), rect.y(), rect.width(), 26 rect.height()); 27 } 28 29 std::string DirectionToString(OrderDirection direction) { 30 return direction == ORDER_ABOVE ? "above" : "below"; 31 } 32 33 std::string ChangeToDescription1(const Change& change) { 34 switch (change.type) { 35 case CHANGE_TYPE_CONNECTION_ESTABLISHED: 36 return base::StringPrintf("OnConnectionEstablished creator=%s", 37 change.creator_url.data()); 38 39 case CHANGE_TYPE_ROOTS_ADDED: 40 return "OnRootsAdded"; 41 42 case CHANGE_TYPE_SERVER_CHANGE_ID_ADVANCED: 43 return base::StringPrintf( 44 "ServerChangeIdAdvanced %d", static_cast<int>(change.change_id)); 45 46 47 case CHANGE_TYPE_NODE_BOUNDS_CHANGED: 48 return base::StringPrintf( 49 "BoundsChanged node=%s old_bounds=%s new_bounds=%s", 50 NodeIdToString(change.node_id).c_str(), 51 RectToString(change.bounds).c_str(), 52 RectToString(change.bounds2).c_str()); 53 54 case CHANGE_TYPE_NODE_HIERARCHY_CHANGED: 55 return base::StringPrintf( 56 "HierarchyChanged change_id=%d node=%s new_parent=%s old_parent=%s", 57 static_cast<int>(change.change_id), 58 NodeIdToString(change.node_id).c_str(), 59 NodeIdToString(change.node_id2).c_str(), 60 NodeIdToString(change.node_id3).c_str()); 61 62 case CHANGE_TYPE_NODE_REORDERED: 63 return base::StringPrintf( 64 "Reordered change_id=%d node=%s relative=%s direction=%s", 65 static_cast<int>(change.change_id), 66 NodeIdToString(change.node_id).c_str(), 67 NodeIdToString(change.node_id2).c_str(), 68 DirectionToString(change.direction).c_str()); 69 70 case CHANGE_TYPE_NODE_DELETED: 71 return base::StringPrintf("NodeDeleted change_id=%d node=%s", 72 static_cast<int>(change.change_id), 73 NodeIdToString(change.node_id).c_str()); 74 75 case CHANGE_TYPE_VIEW_DELETED: 76 return base::StringPrintf("ViewDeleted view=%s", 77 NodeIdToString(change.view_id).c_str()); 78 79 case CHANGE_TYPE_VIEW_REPLACED: 80 return base::StringPrintf( 81 "ViewReplaced node=%s new_view=%s old_view=%s", 82 NodeIdToString(change.node_id).c_str(), 83 NodeIdToString(change.view_id).c_str(), 84 NodeIdToString(change.view_id2).c_str()); 85 86 case CHANGE_TYPE_INPUT_EVENT: 87 return base::StringPrintf( 88 "InputEvent view=%s event_action=%d", 89 NodeIdToString(change.view_id).c_str(), 90 change.event_action); 91 } 92 return std::string(); 93 } 94 95 } // namespace 96 97 std::vector<std::string> ChangesToDescription1( 98 const std::vector<Change>& changes) { 99 std::vector<std::string> strings(changes.size()); 100 for (size_t i = 0; i < changes.size(); ++i) 101 strings[i] = ChangeToDescription1(changes[i]); 102 return strings; 103 } 104 105 std::string ChangeNodeDescription(const std::vector<Change>& changes) { 106 if (changes.size() != 1) 107 return std::string(); 108 std::vector<std::string> node_strings(changes[0].nodes.size()); 109 for (size_t i = 0; i < changes[0].nodes.size(); ++i) 110 node_strings[i] = "[" + changes[0].nodes[i].ToString() + "]"; 111 return JoinString(node_strings, ','); 112 } 113 114 void NodeDatasToTestNodes(const Array<NodeDataPtr>& data, 115 std::vector<TestNode>* test_nodes) { 116 for (size_t i = 0; i < data.size(); ++i) { 117 TestNode node; 118 node.parent_id = data[i]->parent_id; 119 node.node_id = data[i]->node_id; 120 node.view_id = data[i]->view_id; 121 test_nodes->push_back(node); 122 } 123 } 124 125 Change::Change() 126 : type(CHANGE_TYPE_CONNECTION_ESTABLISHED), 127 connection_id(0), 128 change_id(0), 129 node_id(0), 130 node_id2(0), 131 node_id3(0), 132 view_id(0), 133 view_id2(0), 134 event_action(0), 135 direction(ORDER_ABOVE) {} 136 137 Change::~Change() { 138 } 139 140 TestChangeTracker::TestChangeTracker() 141 : delegate_(NULL) { 142 } 143 144 TestChangeTracker::~TestChangeTracker() { 145 } 146 147 void TestChangeTracker::OnViewManagerConnectionEstablished( 148 ConnectionSpecificId connection_id, 149 const String& creator_url, 150 Id next_server_change_id, 151 Array<NodeDataPtr> nodes) { 152 Change change; 153 change.type = CHANGE_TYPE_CONNECTION_ESTABLISHED; 154 change.connection_id = connection_id; 155 change.change_id = next_server_change_id; 156 change.creator_url = creator_url; 157 NodeDatasToTestNodes(nodes, &change.nodes); 158 AddChange(change); 159 } 160 161 void TestChangeTracker::OnRootsAdded(Array<NodeDataPtr> nodes) { 162 Change change; 163 change.type = CHANGE_TYPE_ROOTS_ADDED; 164 NodeDatasToTestNodes(nodes, &change.nodes); 165 AddChange(change); 166 } 167 168 void TestChangeTracker::OnServerChangeIdAdvanced(Id change_id) { 169 Change change; 170 change.type = CHANGE_TYPE_SERVER_CHANGE_ID_ADVANCED; 171 change.change_id = change_id; 172 AddChange(change); 173 } 174 175 void TestChangeTracker::OnNodeBoundsChanged(Id node_id, 176 RectPtr old_bounds, 177 RectPtr new_bounds) { 178 Change change; 179 change.type = CHANGE_TYPE_NODE_BOUNDS_CHANGED; 180 change.node_id = node_id; 181 change.bounds = old_bounds.To<gfx::Rect>(); 182 change.bounds2 = new_bounds.To<gfx::Rect>(); 183 AddChange(change); 184 } 185 186 void TestChangeTracker::OnNodeHierarchyChanged(Id node_id, 187 Id new_parent_id, 188 Id old_parent_id, 189 Id server_change_id, 190 Array<NodeDataPtr> nodes) { 191 Change change; 192 change.type = CHANGE_TYPE_NODE_HIERARCHY_CHANGED; 193 change.node_id = node_id; 194 change.node_id2 = new_parent_id; 195 change.node_id3 = old_parent_id; 196 change.change_id = server_change_id; 197 NodeDatasToTestNodes(nodes, &change.nodes); 198 AddChange(change); 199 } 200 201 void TestChangeTracker::OnNodeReordered(Id node_id, 202 Id relative_node_id, 203 OrderDirection direction, 204 Id server_change_id) { 205 Change change; 206 change.type = CHANGE_TYPE_NODE_REORDERED; 207 change.node_id = node_id; 208 change.node_id2 = relative_node_id; 209 change.direction = direction; 210 change.change_id = server_change_id; 211 AddChange(change); 212 } 213 214 void TestChangeTracker::OnNodeDeleted(Id node_id, Id server_change_id) { 215 Change change; 216 change.type = CHANGE_TYPE_NODE_DELETED; 217 change.node_id = node_id; 218 change.change_id = server_change_id; 219 AddChange(change); 220 } 221 222 void TestChangeTracker::OnViewDeleted(Id view_id) { 223 Change change; 224 change.type = CHANGE_TYPE_VIEW_DELETED; 225 change.view_id = view_id; 226 AddChange(change); 227 } 228 229 void TestChangeTracker::OnNodeViewReplaced(Id node_id, 230 Id new_view_id, 231 Id old_view_id) { 232 Change change; 233 change.type = CHANGE_TYPE_VIEW_REPLACED; 234 change.node_id = node_id; 235 change.view_id = new_view_id; 236 change.view_id2 = old_view_id; 237 AddChange(change); 238 } 239 240 void TestChangeTracker::OnViewInputEvent(Id view_id, EventPtr event) { 241 Change change; 242 change.type = CHANGE_TYPE_INPUT_EVENT; 243 change.view_id = view_id; 244 change.event_action = event->action; 245 AddChange(change); 246 } 247 248 void TestChangeTracker::AddChange(const Change& change) { 249 changes_.push_back(change); 250 if (delegate_) 251 delegate_->OnChangeAdded(); 252 } 253 254 std::string TestNode::ToString() const { 255 return base::StringPrintf("node=%s parent=%s view=%s", 256 NodeIdToString(node_id).c_str(), 257 NodeIdToString(parent_id).c_str(), 258 NodeIdToString(view_id).c_str()); 259 } 260 261 } // namespace service 262 } // namespace view_manager 263 } // namespace mojo 264