blob: d92024495149c4a8798ee8dffa5144b9d494fea2 [file] [log] [blame]
// 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.
#ifndef MOJO_SERVICES_VIEW_MANAGER_TEST_CHANGE_TRACKER_H_
#define MOJO_SERVICES_VIEW_MANAGER_TEST_CHANGE_TRACKER_H_
#include <string>
#include <vector>
#include "mojo/public/cpp/bindings/array.h"
#include "mojo/services/public/cpp/view_manager/types.h"
#include "mojo/services/public/interfaces/view_manager/view_manager.mojom.h"
#include "ui/gfx/rect.h"
namespace mojo {
namespace service {
enum ChangeType {
CHANGE_TYPE_EMBED,
CHANGE_TYPE_NODE_BOUNDS_CHANGED,
CHANGE_TYPE_NODE_HIERARCHY_CHANGED,
CHANGE_TYPE_NODE_REORDERED,
CHANGE_TYPE_NODE_DELETED,
CHANGE_TYPE_INPUT_EVENT,
CHANGE_TYPE_DELEGATE_EMBED,
};
// TODO(sky): consider nuking and converting directly to ViewData.
struct TestView {
// Returns a string description of this.
std::string ToString() const;
Id parent_id;
Id view_id;
};
// Tracks a call to ViewManagerClient. See the individual functions for the
// fields that are used.
struct Change {
Change();
~Change();
ChangeType type;
ConnectionSpecificId connection_id;
std::vector<TestView> views;
Id view_id;
Id view_id2;
Id view_id3;
gfx::Rect bounds;
gfx::Rect bounds2;
int32 event_action;
String creator_url;
String embed_url;
OrderDirection direction;
};
// Converts Changes to string descriptions.
std::vector<std::string> ChangesToDescription1(
const std::vector<Change>& changes);
// Returns a string description of |changes[0].views|. Returns an empty string
// if change.size() != 1.
std::string ChangeViewDescription(const std::vector<Change>& changes);
// Converts ViewDatas to TestViews.
void ViewDatasToTestViews(const Array<ViewDataPtr>& data,
std::vector<TestView>* test_views);
// TestChangeTracker is used to record ViewManagerClient functions. It notifies
// a delegate any time a change is added.
class TestChangeTracker {
public:
// Used to notify the delegate when a change is added. A change corresponds to
// a single ViewManagerClient function.
class Delegate {
public:
virtual void OnChangeAdded() = 0;
protected:
virtual ~Delegate() {}
};
TestChangeTracker();
~TestChangeTracker();
void set_delegate(Delegate* delegate) {
delegate_ = delegate;
}
std::vector<Change>* changes() { return &changes_; }
// Each of these functions generate a Change. There is one per
// ViewManagerClient function.
void OnEmbed(ConnectionSpecificId connection_id,
const String& creator_url,
ViewDataPtr root);
void OnViewBoundsChanged(Id view_id, RectPtr old_bounds, RectPtr new_bounds);
void OnViewHierarchyChanged(Id view_id,
Id new_parent_id,
Id old_parent_id,
Array<ViewDataPtr> views);
void OnViewReordered(Id view_id,
Id relative_view_id,
OrderDirection direction);
void OnViewDeleted(Id view_id);
void OnViewInputEvent(Id view_id, EventPtr event);
void DelegateEmbed(const String& url);
private:
void AddChange(const Change& change);
Delegate* delegate_;
std::vector<Change> changes_;
DISALLOW_COPY_AND_ASSIGN(TestChangeTracker);
};
} // namespace service
} // namespace mojo
#endif // MOJO_SERVICES_VIEW_MANAGER_TEST_CHANGE_TRACKER_H_