Home | History | Annotate | Download | only in view_manager
      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