| Index: mojo/services/view_manager/test_change_tracker.cc
 | 
| diff --git a/mojo/services/view_manager/test_change_tracker.cc b/mojo/services/view_manager/test_change_tracker.cc
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..3e31aa4f3d793eff10e4414d0df57dd46303e568
 | 
| --- /dev/null
 | 
| +++ b/mojo/services/view_manager/test_change_tracker.cc
 | 
| @@ -0,0 +1,314 @@
 | 
| +// Copyright 2014 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.
 | 
| +
 | 
| +#include "mojo/services/view_manager/test_change_tracker.h"
 | 
| +
 | 
| +#include "base/strings/string_util.h"
 | 
| +#include "base/strings/stringprintf.h"
 | 
| +#include "mojo/common/common_type_converters.h"
 | 
| +#include "third_party/mojo_services/src/view_manager/public/cpp/util.h"
 | 
| +
 | 
| +using mojo::Array;
 | 
| +using mojo::Id;
 | 
| +using mojo::ViewDataPtr;
 | 
| +using mojo::String;
 | 
| +
 | 
| +namespace view_manager {
 | 
| +
 | 
| +std::string ViewIdToString(Id id) {
 | 
| +  return (id == 0) ? "null" : base::StringPrintf("%d,%d", mojo::HiWord(id),
 | 
| +                                                 mojo::LoWord(id));
 | 
| +}
 | 
| +
 | 
| +namespace {
 | 
| +
 | 
| +std::string RectToString(const mojo::Rect& rect) {
 | 
| +  return base::StringPrintf("%d,%d %dx%d", rect.x, rect.y, rect.width,
 | 
| +                            rect.height);
 | 
| +}
 | 
| +
 | 
| +std::string DirectionToString(mojo::OrderDirection direction) {
 | 
| +  return direction == mojo::ORDER_DIRECTION_ABOVE ? "above" : "below";
 | 
| +}
 | 
| +
 | 
| +std::string ChangeToDescription1(const Change& change) {
 | 
| +  switch (change.type) {
 | 
| +    case CHANGE_TYPE_EMBED:
 | 
| +      return base::StringPrintf("OnEmbed creator=%s",
 | 
| +                                change.creator_url.data());
 | 
| +
 | 
| +    case CHANGE_TYPE_EMBEDDED_APP_DISCONNECTED:
 | 
| +      return base::StringPrintf("OnEmbeddedAppDisconnected view=%s",
 | 
| +                                ViewIdToString(change.view_id).c_str());
 | 
| +
 | 
| +    case CHANGE_TYPE_NODE_BOUNDS_CHANGED:
 | 
| +      return base::StringPrintf(
 | 
| +          "BoundsChanged view=%s old_bounds=%s new_bounds=%s",
 | 
| +          ViewIdToString(change.view_id).c_str(),
 | 
| +          RectToString(change.bounds).c_str(),
 | 
| +          RectToString(change.bounds2).c_str());
 | 
| +
 | 
| +    case CHANGE_TYPE_NODE_VIEWPORT_METRICS_CHANGED:
 | 
| +      // TODO(sky): Not implemented.
 | 
| +      return "ViewportMetricsChanged";
 | 
| +
 | 
| +    case CHANGE_TYPE_NODE_HIERARCHY_CHANGED:
 | 
| +      return base::StringPrintf(
 | 
| +          "HierarchyChanged view=%s new_parent=%s old_parent=%s",
 | 
| +          ViewIdToString(change.view_id).c_str(),
 | 
| +          ViewIdToString(change.view_id2).c_str(),
 | 
| +          ViewIdToString(change.view_id3).c_str());
 | 
| +
 | 
| +    case CHANGE_TYPE_NODE_REORDERED:
 | 
| +      return base::StringPrintf("Reordered view=%s relative=%s direction=%s",
 | 
| +                                ViewIdToString(change.view_id).c_str(),
 | 
| +                                ViewIdToString(change.view_id2).c_str(),
 | 
| +                                DirectionToString(change.direction).c_str());
 | 
| +
 | 
| +    case CHANGE_TYPE_NODE_DELETED:
 | 
| +      return base::StringPrintf("ViewDeleted view=%s",
 | 
| +                                ViewIdToString(change.view_id).c_str());
 | 
| +
 | 
| +    case CHANGE_TYPE_NODE_VISIBILITY_CHANGED:
 | 
| +      return base::StringPrintf("VisibilityChanged view=%s visible=%s",
 | 
| +                                ViewIdToString(change.view_id).c_str(),
 | 
| +                                change.bool_value ? "true" : "false");
 | 
| +
 | 
| +    case CHANGE_TYPE_NODE_DRAWN_STATE_CHANGED:
 | 
| +      return base::StringPrintf("DrawnStateChanged view=%s drawn=%s",
 | 
| +                                ViewIdToString(change.view_id).c_str(),
 | 
| +                                change.bool_value ? "true" : "false");
 | 
| +
 | 
| +    case CHANGE_TYPE_INPUT_EVENT:
 | 
| +      return base::StringPrintf("InputEvent view=%s event_action=%d",
 | 
| +                                ViewIdToString(change.view_id).c_str(),
 | 
| +                                change.event_action);
 | 
| +
 | 
| +    case CHANGE_TYPE_PROPERTY_CHANGED:
 | 
| +      return base::StringPrintf("PropertyChanged view=%s key=%s value=%s",
 | 
| +                                ViewIdToString(change.view_id).c_str(),
 | 
| +                                change.property_key.c_str(),
 | 
| +                                change.property_value.c_str());
 | 
| +
 | 
| +    case CHANGE_TYPE_DELEGATE_EMBED:
 | 
| +      return base::StringPrintf("DelegateEmbed url=%s",
 | 
| +                                change.embed_url.data());
 | 
| +  }
 | 
| +  return std::string();
 | 
| +}
 | 
| +
 | 
| +}  // namespace
 | 
| +
 | 
| +std::vector<std::string> ChangesToDescription1(
 | 
| +    const std::vector<Change>& changes) {
 | 
| +  std::vector<std::string> strings(changes.size());
 | 
| +  for (size_t i = 0; i < changes.size(); ++i)
 | 
| +    strings[i] = ChangeToDescription1(changes[i]);
 | 
| +  return strings;
 | 
| +}
 | 
| +
 | 
| +std::string SingleChangeToDescription(const std::vector<Change>& changes) {
 | 
| +  if (changes.size() != 1u)
 | 
| +    return std::string();
 | 
| +  return ChangeToDescription1(changes[0]);
 | 
| +}
 | 
| +
 | 
| +std::string SingleViewDescription(const std::vector<TestView>& views) {
 | 
| +  if (views.size() != 1u)
 | 
| +    return std::string();
 | 
| +  return views[0].ToString();
 | 
| +}
 | 
| +
 | 
| +std::string ChangeViewDescription(const std::vector<Change>& changes) {
 | 
| +  if (changes.size() != 1)
 | 
| +    return std::string();
 | 
| +  std::vector<std::string> view_strings(changes[0].views.size());
 | 
| +  for (size_t i = 0; i < changes[0].views.size(); ++i)
 | 
| +    view_strings[i] = "[" + changes[0].views[i].ToString() + "]";
 | 
| +  return JoinString(view_strings, ',');
 | 
| +}
 | 
| +
 | 
| +TestView ViewDataToTestView(const ViewDataPtr& data) {
 | 
| +  TestView view;
 | 
| +  view.parent_id = data->parent_id;
 | 
| +  view.view_id = data->view_id;
 | 
| +  view.visible = data->visible;
 | 
| +  view.drawn = data->drawn;
 | 
| +  view.properties =
 | 
| +      data->properties.To<std::map<std::string, std::vector<uint8_t>>>();
 | 
| +  return view;
 | 
| +}
 | 
| +
 | 
| +void ViewDatasToTestViews(const Array<ViewDataPtr>& data,
 | 
| +                          std::vector<TestView>* test_views) {
 | 
| +  for (size_t i = 0; i < data.size(); ++i)
 | 
| +    test_views->push_back(ViewDataToTestView(data[i]));
 | 
| +}
 | 
| +
 | 
| +Change::Change()
 | 
| +    : type(CHANGE_TYPE_EMBED),
 | 
| +      connection_id(0),
 | 
| +      view_id(0),
 | 
| +      view_id2(0),
 | 
| +      view_id3(0),
 | 
| +      event_action(0),
 | 
| +      direction(mojo::ORDER_DIRECTION_ABOVE),
 | 
| +      bool_value(false) {
 | 
| +}
 | 
| +
 | 
| +Change::~Change() {
 | 
| +}
 | 
| +
 | 
| +TestChangeTracker::TestChangeTracker()
 | 
| +    : delegate_(NULL) {
 | 
| +}
 | 
| +
 | 
| +TestChangeTracker::~TestChangeTracker() {
 | 
| +}
 | 
| +
 | 
| +void TestChangeTracker::OnEmbed(mojo::ConnectionSpecificId connection_id,
 | 
| +                                const String& creator_url,
 | 
| +                                ViewDataPtr root) {
 | 
| +  Change change;
 | 
| +  change.type = CHANGE_TYPE_EMBED;
 | 
| +  change.connection_id = connection_id;
 | 
| +  change.creator_url = creator_url;
 | 
| +  change.views.push_back(ViewDataToTestView(root));
 | 
| +  AddChange(change);
 | 
| +}
 | 
| +
 | 
| +void TestChangeTracker::OnEmbeddedAppDisconnected(Id view_id) {
 | 
| +  Change change;
 | 
| +  change.type = CHANGE_TYPE_EMBEDDED_APP_DISCONNECTED;
 | 
| +  change.view_id = view_id;
 | 
| +  AddChange(change);
 | 
| +}
 | 
| +
 | 
| +void TestChangeTracker::OnViewBoundsChanged(Id view_id,
 | 
| +                                            mojo::RectPtr old_bounds,
 | 
| +                                            mojo::RectPtr new_bounds) {
 | 
| +  Change change;
 | 
| +  change.type = CHANGE_TYPE_NODE_BOUNDS_CHANGED;
 | 
| +  change.view_id = view_id;
 | 
| +  change.bounds.x = old_bounds->x;
 | 
| +  change.bounds.y = old_bounds->y;
 | 
| +  change.bounds.width = old_bounds->width;
 | 
| +  change.bounds.height = old_bounds->height;
 | 
| +  change.bounds2.x = new_bounds->x;
 | 
| +  change.bounds2.y = new_bounds->y;
 | 
| +  change.bounds2.width = new_bounds->width;
 | 
| +  change.bounds2.height = new_bounds->height;
 | 
| +  AddChange(change);
 | 
| +}
 | 
| +
 | 
| +void TestChangeTracker::OnViewViewportMetricsChanged(
 | 
| +    mojo::ViewportMetricsPtr old_metrics,
 | 
| +    mojo::ViewportMetricsPtr new_metrics) {
 | 
| +  Change change;
 | 
| +  change.type = CHANGE_TYPE_NODE_VIEWPORT_METRICS_CHANGED;
 | 
| +  // NOT IMPLEMENTED
 | 
| +  AddChange(change);
 | 
| +}
 | 
| +
 | 
| +void TestChangeTracker::OnViewHierarchyChanged(Id view_id,
 | 
| +                                               Id new_parent_id,
 | 
| +                                               Id old_parent_id,
 | 
| +                                               Array<ViewDataPtr> views) {
 | 
| +  Change change;
 | 
| +  change.type = CHANGE_TYPE_NODE_HIERARCHY_CHANGED;
 | 
| +  change.view_id = view_id;
 | 
| +  change.view_id2 = new_parent_id;
 | 
| +  change.view_id3 = old_parent_id;
 | 
| +  ViewDatasToTestViews(views, &change.views);
 | 
| +  AddChange(change);
 | 
| +}
 | 
| +
 | 
| +void TestChangeTracker::OnViewReordered(Id view_id,
 | 
| +                                        Id relative_view_id,
 | 
| +                                        mojo::OrderDirection direction) {
 | 
| +  Change change;
 | 
| +  change.type = CHANGE_TYPE_NODE_REORDERED;
 | 
| +  change.view_id = view_id;
 | 
| +  change.view_id2 = relative_view_id;
 | 
| +  change.direction = direction;
 | 
| +  AddChange(change);
 | 
| +}
 | 
| +
 | 
| +void TestChangeTracker::OnViewDeleted(Id view_id) {
 | 
| +  Change change;
 | 
| +  change.type = CHANGE_TYPE_NODE_DELETED;
 | 
| +  change.view_id = view_id;
 | 
| +  AddChange(change);
 | 
| +}
 | 
| +
 | 
| +void TestChangeTracker::OnViewVisibilityChanged(Id view_id, bool visible) {
 | 
| +  Change change;
 | 
| +  change.type = CHANGE_TYPE_NODE_VISIBILITY_CHANGED;
 | 
| +  change.view_id = view_id;
 | 
| +  change.bool_value = visible;
 | 
| +  AddChange(change);
 | 
| +}
 | 
| +
 | 
| +void TestChangeTracker::OnViewDrawnStateChanged(Id view_id, bool drawn) {
 | 
| +  Change change;
 | 
| +  change.type = CHANGE_TYPE_NODE_DRAWN_STATE_CHANGED;
 | 
| +  change.view_id = view_id;
 | 
| +  change.bool_value = drawn;
 | 
| +  AddChange(change);
 | 
| +}
 | 
| +
 | 
| +void TestChangeTracker::OnViewInputEvent(Id view_id, mojo::EventPtr event) {
 | 
| +  Change change;
 | 
| +  change.type = CHANGE_TYPE_INPUT_EVENT;
 | 
| +  change.view_id = view_id;
 | 
| +  change.event_action = event->action;
 | 
| +  AddChange(change);
 | 
| +}
 | 
| +
 | 
| +void TestChangeTracker::OnViewSharedPropertyChanged(Id view_id,
 | 
| +                                                    String name,
 | 
| +                                                    Array<uint8_t> data) {
 | 
| +  Change change;
 | 
| +  change.type = CHANGE_TYPE_PROPERTY_CHANGED;
 | 
| +  change.view_id = view_id;
 | 
| +  change.property_key = name;
 | 
| +  if (data.is_null())
 | 
| +    change.property_value = "NULL";
 | 
| +  else
 | 
| +    change.property_value = data.To<std::string>();
 | 
| +  AddChange(change);
 | 
| +}
 | 
| +
 | 
| +void TestChangeTracker::DelegateEmbed(const String& url) {
 | 
| +  Change change;
 | 
| +  change.type = CHANGE_TYPE_DELEGATE_EMBED;
 | 
| +  change.embed_url = url;
 | 
| +  AddChange(change);
 | 
| +}
 | 
| +
 | 
| +void TestChangeTracker::AddChange(const Change& change) {
 | 
| +  changes_.push_back(change);
 | 
| +  if (delegate_)
 | 
| +    delegate_->OnChangeAdded();
 | 
| +}
 | 
| +
 | 
| +TestView::TestView() {}
 | 
| +
 | 
| +TestView::~TestView() {}
 | 
| +
 | 
| +std::string TestView::ToString() const {
 | 
| +  return base::StringPrintf("view=%s parent=%s",
 | 
| +                            ViewIdToString(view_id).c_str(),
 | 
| +                            ViewIdToString(parent_id).c_str());
 | 
| +}
 | 
| +
 | 
| +std::string TestView::ToString2() const {
 | 
| +  return base::StringPrintf("view=%s parent=%s visible=%s drawn=%s",
 | 
| +                            ViewIdToString(view_id).c_str(),
 | 
| +                            ViewIdToString(parent_id).c_str(),
 | 
| +                            visible ? "true" : "false",
 | 
| +                            drawn ? "true" : "false");
 | 
| +}
 | 
| +
 | 
| +}  // namespace view_manager
 | 
| 
 |