Commit 3b167405 authored by ben@chromium.org's avatar ben@chromium.org

Revert 266940 "First step at synchronizing client model changes ..."

> First step at synchronizing client model changes with service.
> 
> R=sky@chromium.org
> http://crbug.com/365012
> 
> Review URL: https://codereview.chromium.org/258623005

TBR=ben@chromium.org

Review URL: https://codereview.chromium.org/261513002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@266944 0039d316-1c4b-4281-b951-d872f2087c98
parent 20b21445
...@@ -2,17 +2,16 @@ ...@@ -2,17 +2,16 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "base/at_exit.h"
#include "base/bind.h" #include "base/bind.h"
#include "base/command_line.h" #include "mojo/public/cpp/bindings/allocation_scope.h"
#include "base/message_loop/message_loop.h" #include "mojo/public/cpp/bindings/remote_ptr.h"
#include "mojo/public/cpp/environment/environment.h" #include "mojo/public/cpp/environment/environment.h"
#include "mojo/public/cpp/shell/application.h" #include "mojo/public/cpp/shell/application.h"
#include "mojo/public/cpp/system/core.h" #include "mojo/public/cpp/system/core.h"
#include "mojo/public/cpp/system/macros.h" #include "mojo/public/cpp/system/macros.h"
#include "mojo/public/cpp/utility/run_loop.h" #include "mojo/public/cpp/utility/run_loop.h"
#include "mojo/services/public/cpp/view_manager/view_manager.h" #include "mojo/public/interfaces/shell/shell.mojom.h"
#include "mojo/services/public/cpp/view_manager/view_tree_node.h" #include "mojo/services/public/interfaces/view_manager/view_manager.mojom.h"
#if defined(WIN32) #if defined(WIN32)
#if !defined(CDECL) #if !defined(CDECL)
...@@ -27,28 +26,43 @@ ...@@ -27,28 +26,43 @@
namespace mojo { namespace mojo {
namespace examples { namespace examples {
class SampleApp : public Application { class SampleApp : public Application,
public services::view_manager::ViewManagerClient {
public: public:
explicit SampleApp(MojoHandle shell_handle) explicit SampleApp(MojoHandle shell_handle) : Application(shell_handle) {
: Application(shell_handle) { InterfacePipe<services::view_manager::ViewManager, AnyInterface>
view_manager_.reset(new services::view_manager::ViewManager(shell())); view_manager_pipe;
node_1_.reset( AllocationScope scope;
new services::view_manager::ViewTreeNode(view_manager_.get())); shell()->Connect("mojo:mojo_view_manager",
node_11_.reset( view_manager_pipe.handle_to_peer.Pass());
new services::view_manager::ViewTreeNode(view_manager_.get())); view_manager_.reset(view_manager_pipe.handle_to_self.Pass(), this);
node_1_->AddChild(node_11_.get()); view_manager_->CreateNode(1, base::Bind(&SampleApp::OnCreatedView,
base::Unretained(this)));
} }
virtual ~SampleApp() { virtual ~SampleApp() {
} }
// ViewManagerClient::
virtual void OnConnectionEstablished(uint16_t connection_id) OVERRIDE {
}
virtual void OnNodeHierarchyChanged(uint32_t node,
uint32_t new_parent,
uint32_t old_parent,
uint32_t change_id) OVERRIDE {
}
virtual void OnNodeViewReplaced(uint32_t node,
uint32_t old_view_id,
uint32_t new_view_id,
uint32_t change_id) OVERRIDE {
}
private: private:
// SampleApp creates a ViewManager and a trivial node hierarchy. void OnCreatedView(bool success) {
scoped_ptr<services::view_manager::ViewManager> view_manager_; DCHECK(success);
scoped_ptr<services::view_manager::ViewTreeNode> node_1_; }
scoped_ptr<services::view_manager::ViewTreeNode> node_11_;
DISALLOW_COPY_AND_ASSIGN(SampleApp); RemotePtr<services::view_manager::ViewManager> view_manager_;
}; };
} // namespace examples } // namespace examples
...@@ -56,7 +70,8 @@ class SampleApp : public Application { ...@@ -56,7 +70,8 @@ class SampleApp : public Application {
extern "C" SAMPLE_APP_EXPORT MojoResult CDECL MojoMain( extern "C" SAMPLE_APP_EXPORT MojoResult CDECL MojoMain(
MojoHandle shell_handle) { MojoHandle shell_handle) {
base::MessageLoop loop; mojo::Environment env;
mojo::RunLoop loop;
mojo::examples::SampleApp app(shell_handle); mojo::examples::SampleApp app(shell_handle);
loop.Run(); loop.Run();
......
...@@ -284,11 +284,11 @@ ...@@ -284,11 +284,11 @@
'../ui/gfx/gfx.gyp:gfx_geometry', '../ui/gfx/gfx.gyp:gfx_geometry',
'../ui/gl/gl.gyp:gl', '../ui/gl/gl.gyp:gl',
'mojo_bindings', 'mojo_bindings',
'mojo_environment_chromium', 'mojo_environment_standalone',
'mojo_gles2', 'mojo_gles2',
'mojo_view_manager_lib', 'mojo_view_manager_bindings',
'mojo_shell_client', 'mojo_shell_client',
'mojo_system_impl', 'mojo_system',
'mojo_utility', 'mojo_utility',
], ],
'sources': [ 'sources': [
......
...@@ -118,37 +118,15 @@ ...@@ -118,37 +118,15 @@
}], }],
], ],
}, },
{
'target_name': 'mojo_view_manager_bindings',
'type': 'static_library',
'sources': [
'services/public/interfaces/view_manager/view_manager.mojom',
],
'variables': {
'mojom_base_output_dir': 'mojo',
},
'includes': [ 'public/tools/bindings/mojom_bindings_generator.gypi' ],
'export_dependent_settings': [
'mojo_bindings',
],
'dependencies': [
'mojo_bindings',
],
},
{ {
'target_name': 'mojo_view_manager_lib', 'target_name': 'mojo_view_manager_lib',
'type': 'static_library', 'type': 'static_library',
'dependencies': [ 'dependencies': [
'../base/base.gyp:base', '../base/base.gyp:base',
'mojo_view_manager_bindings',
], ],
'sources': [ 'sources': [
'services/public/cpp/view_manager/lib/view.cc', 'services/public/cpp/view_manager/lib/view.cc',
'services/public/cpp/view_manager/lib/view_manager.cc', 'services/public/cpp/view_manager/lib/view_manager.cc',
'services/public/cpp/view_manager/lib/view_manager_private.cc',
'services/public/cpp/view_manager/lib/view_manager_private.h',
'services/public/cpp/view_manager/lib/view_manager_synchronizer.cc',
'services/public/cpp/view_manager/lib/view_manager_synchronizer.h',
'services/public/cpp/view_manager/lib/view_tree_host.cc', 'services/public/cpp/view_manager/lib/view_tree_host.cc',
'services/public/cpp/view_manager/lib/view_tree_node.cc', 'services/public/cpp/view_manager/lib/view_tree_node.cc',
'services/public/cpp/view_manager/lib/view_tree_node_observer.cc', 'services/public/cpp/view_manager/lib/view_tree_node_observer.cc',
...@@ -182,6 +160,23 @@ ...@@ -182,6 +160,23 @@
'conditions': [ 'conditions': [
['use_aura==1', { ['use_aura==1', {
'targets': [ 'targets': [
{
'target_name': 'mojo_view_manager_bindings',
'type': 'static_library',
'sources': [
'services/public/interfaces/view_manager/view_manager.mojom',
],
'variables': {
'mojom_base_output_dir': 'mojo',
},
'includes': [ 'public/tools/bindings/mojom_bindings_generator.gypi' ],
'export_dependent_settings': [
'mojo_bindings',
],
'dependencies': [
'mojo_bindings',
],
},
{ {
'target_name': 'mojo_view_manager', 'target_name': 'mojo_view_manager',
'type': '<(component)', 'type': '<(component)',
......
// 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/public/cpp/view_manager/view_manager.h"
#include "mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.h"
namespace mojo {
namespace services {
namespace view_manager {
ViewManager::ViewManager(Shell* shell)
: shell_(shell),
synchronizer_(new ViewManagerSynchronizer(this)) {}
ViewManager::~ViewManager() {}
} // namespace view_manager
} // namespace services
} // namespace mojo
// 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/public/cpp/view_manager/lib/view_manager_private.h"
namespace mojo {
namespace services {
namespace view_manager {
ViewManagerPrivate::ViewManagerPrivate(ViewManager* manager)
: manager_(manager) {}
ViewManagerPrivate::~ViewManagerPrivate() {}
} // namespace view_manager
} // namespace services
} // namespace mojo
// 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_PUBLIC_CPP_VIEW_MANAGER_LIB_VIEW_MANAGER_PRIVATE_H_
#define MOJO_SERVICES_PUBLIC_CPP_VIEW_MANAGER_LIB_VIEW_MANAGER_PRIVATE_H_
#include "base/basictypes.h"
#include "mojo/services/public/cpp/view_manager/view_manager.h"
namespace mojo {
namespace services {
namespace view_manager {
class ViewManagerSynchronizer;
class ViewManagerPrivate {
public:
explicit ViewManagerPrivate(ViewManager* manager);
~ViewManagerPrivate();
ViewManagerSynchronizer* synchronizer() {
return manager_->synchronizer_.get();
}
Shell* shell() { return manager_->shell_; }
private:
ViewManager* manager_;
DISALLOW_COPY_AND_ASSIGN(ViewManagerPrivate);
};
} // namespace view_manager
} // namespace services
} // namespace mojo
#endif // MOJO_SERVICES_PUBLIC_CPP_VIEW_MANAGER_LIB_VIEW_MANAGER_PRIVATE_H_
// 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/public/cpp/view_manager/lib/view_manager_synchronizer.h"
#include "base/bind.h"
#include "base/message_loop/message_loop.h"
#include "mojo/public/cpp/bindings/allocation_scope.h"
#include "mojo/public/interfaces/shell/shell.mojom.h"
#include "mojo/services/public/cpp/view_manager/lib/view_manager_private.h"
namespace mojo {
namespace services {
namespace view_manager {
class ViewManagerTransaction {
public:
virtual ~ViewManagerTransaction() {}
void Commit() {
DCHECK(!committed_);
DoCommit();
committed_ = true;
}
bool committed() const { return committed_; }
uint32_t change_id() const { return change_id_; }
// General callback to be used for commits to the service.
void OnActionCompleted(bool success) {
DCHECK(success);
DoActionCompleted(success);
synchronizer_->RemoveFromPendingQueue(this);
}
protected:
enum TransactionType {
// Node creation.
TYPE_CREATE_VIEW_TREE_NODE,
// Modifications to the hierarchy (addition of or removal of nodes from a
// parent.)
TYPE_HIERARCHY
};
ViewManagerTransaction(TransactionType transaction_type,
ViewManagerSynchronizer* synchronizer)
: transaction_type_(transaction_type),
change_id_(synchronizer->GetNextChangeId()),
committed_(false),
synchronizer_(synchronizer) {
}
// Overridden to perform transaction-specific commit actions.
virtual void DoCommit() = 0;
// Overridden to perform transaction-specific cleanup on commit ack from the
// service.
virtual void DoActionCompleted(bool success) = 0;
IViewManager* service() { return synchronizer_->service_.get(); }
uint32_t MakeTransportId(uint16_t id) {
return (synchronizer_->connection_id_ << 16) | id;
}
private:
const TransactionType transaction_type_;
const uint32_t change_id_;
bool committed_;
ViewManagerSynchronizer* synchronizer_;
DISALLOW_COPY_AND_ASSIGN(ViewManagerTransaction);
};
class CreateViewTreeNodeTransaction
: public ViewManagerTransaction {
public:
CreateViewTreeNodeTransaction(uint16_t node_id,
ViewManagerSynchronizer* synchronizer)
: ViewManagerTransaction(TYPE_CREATE_VIEW_TREE_NODE, synchronizer),
node_id_(node_id) {}
virtual ~CreateViewTreeNodeTransaction() {}
private:
// Overridden from ViewManagerTransaction:
virtual void DoCommit() OVERRIDE {
service()->CreateNode(
node_id_,
base::Bind(&ViewManagerTransaction::OnActionCompleted,
base::Unretained(this)));
}
void DoActionCompleted(bool success) {
// TODO(beng): Failure means we tried to create with an extant id for this
// connection. Figure out what to do.
}
const uint16_t node_id_;
DISALLOW_COPY_AND_ASSIGN(CreateViewTreeNodeTransaction);
};
class HierarchyTransaction : public ViewManagerTransaction {
public:
enum HierarchyChangeType {
TYPE_ADD,
TYPE_REMOVE
};
HierarchyTransaction(HierarchyChangeType hierarchy_change_type,
uint16_t child_id,
uint16_t parent_id,
ViewManagerSynchronizer* synchronizer)
: ViewManagerTransaction(TYPE_HIERARCHY, synchronizer),
hierarchy_change_type_(hierarchy_change_type),
child_id_(child_id),
parent_id_(parent_id) {}
virtual ~HierarchyTransaction() {}
private:
// Overridden from ViewManagerTransaction:
virtual void DoCommit() OVERRIDE {
switch (hierarchy_change_type_) {
case TYPE_ADD:
service()->AddNode(
MakeTransportId(parent_id_),
MakeTransportId(child_id_),
change_id(),
base::Bind(&ViewManagerTransaction::OnActionCompleted,
base::Unretained(this)));
break;
case TYPE_REMOVE:
service()->RemoveNodeFromParent(
MakeTransportId(child_id_),
change_id(),
base::Bind(&ViewManagerTransaction::OnActionCompleted,
base::Unretained(this)));
break;
}
}
void DoActionCompleted(bool success) {
// TODO(beng): Failure means either one of the nodes specified didn't exist,
// or we passed the same node id for both params. Roll back?
}
const HierarchyChangeType hierarchy_change_type_;
const uint16_t child_id_;
const uint16_t parent_id_;
DISALLOW_COPY_AND_ASSIGN(HierarchyTransaction);
};
ViewManagerSynchronizer::ViewManagerSynchronizer(ViewManager* view_manager)
: view_manager_(view_manager),
connected_(false),
connection_id_(0),
next_id_(0),
next_change_id_(0) {
InterfacePipe<services::view_manager::IViewManager, AnyInterface>
view_manager_pipe;
AllocationScope scope;
ViewManagerPrivate(view_manager_).shell()->Connect(
"mojo:mojo_view_manager", view_manager_pipe.handle_to_peer.Pass());
service_.reset(view_manager_pipe.handle_to_self.Pass(), this);
}
ViewManagerSynchronizer::~ViewManagerSynchronizer() {
}
uint16_t ViewManagerSynchronizer::CreateViewTreeNode() {
uint16_t id = next_id_++;
pending_transactions_.push_back(new CreateViewTreeNodeTransaction(id, this));
ScheduleSync();
return id;
}
void ViewManagerSynchronizer::AddChild(uint16_t child_id, uint16_t parent_id) {
pending_transactions_.push_back(
new HierarchyTransaction(HierarchyTransaction::TYPE_ADD,
child_id,
parent_id,
this));
ScheduleSync();
}
void ViewManagerSynchronizer::RemoveChild(uint16_t child_id,
uint16_t parent_id) {
pending_transactions_.push_back(
new HierarchyTransaction(HierarchyTransaction::TYPE_REMOVE,
child_id,
parent_id,
this));
ScheduleSync();
}
////////////////////////////////////////////////////////////////////////////////
// ViewManagerSynchronizer, IViewManagerClient implementation:
void ViewManagerSynchronizer::OnConnectionEstablished(uint16 connection_id) {
connected_ = true;
connection_id_ = connection_id;
ScheduleSync();
}
void ViewManagerSynchronizer::OnNodeHierarchyChanged(uint32_t node,
uint32_t new_parent,
uint32_t old_parent,
uint32_t change_id) {
if (change_id == 0) {
// TODO(beng): Apply changes from another client.
}
}
void ViewManagerSynchronizer::OnNodeViewReplaced(uint32_t node,
uint32_t new_view_id,
uint32_t old_view_id,
uint32_t change_id) {
// ..
}
////////////////////////////////////////////////////////////////////////////////
// ViewManagerSynchronizer, private:
void ViewManagerSynchronizer::ScheduleSync() {
base::MessageLoop::current()->PostTask(
FROM_HERE,
base::Bind(&ViewManagerSynchronizer::DoSync, base::Unretained(this)));
}
void ViewManagerSynchronizer::DoSync() {
// The service connection may not be set up yet. OnConnectionEstablished()
// will schedule another sync when it is.
if (!connected_)
return;
Transactions::const_iterator it = pending_transactions_.begin();
for (; it != pending_transactions_.end(); ++it) {
if (!(*it)->committed())
(*it)->Commit();
}
}
uint32_t ViewManagerSynchronizer::GetNextChangeId() {
// TODO(beng): deal with change id collisions? Important in the "never ack'ed
// change" case mentioned in OnNodeHierarchyChanged().
// "0" is a special value passed to other connected clients, so we can't use
// it.
next_change_id_ = std::max(1u, ++next_change_id_);
return next_change_id_;
}
void ViewManagerSynchronizer::RemoveFromPendingQueue(
ViewManagerTransaction* transaction) {
DCHECK_EQ(transaction, pending_transactions_.front());
pending_transactions_.erase(pending_transactions_.begin());
}
} // namespace view_manager
} // namespace services
} // namespace mojo
// 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_PUBLIC_CPP_VIEW_MANAGER_LIB_VIEW_MANAGER_SYNCHRONIZER_H_
#define MOJO_SERVICES_PUBLIC_CPP_VIEW_MANAGER_LIB_VIEW_MANAGER_SYNCHRONIZER_H_
#include "base/basictypes.h"
#include "base/memory/scoped_vector.h"
#include "mojo/public/cpp/bindings/remote_ptr.h"
#include "mojo/services/public/interfaces/view_manager/view_manager.mojom.h"
namespace mojo {
namespace services {
namespace view_manager {
class ViewManager;
class ViewManagerTransaction;
// Manages the connection with the View Manager service.
class ViewManagerSynchronizer : public IViewManagerClient {
public:
explicit ViewManagerSynchronizer(ViewManager* view_manager);
virtual ~ViewManagerSynchronizer();
// API exposed to the node implementation that pushes local changes to the
// service.
uint16_t CreateViewTreeNode();
void AddChild(uint16_t child_id, uint16_t parent_id);
void RemoveChild(uint16_t child_id, uint16_t parent_id);
private:
friend class ViewManagerTransaction;
typedef ScopedVector<ViewManagerTransaction> Transactions;
// Overridden from IViewManagerClient:
virtual void OnConnectionEstablished(uint16 connection_id) OVERRIDE;
virtual void OnNodeHierarchyChanged(uint32 node,
uint32 new_parent,
uint32 old_parent,
uint32 change_id) OVERRIDE;
virtual void OnNodeViewReplaced(uint32_t node,
uint32_t new_view_id,
uint32_t old_view_id,
uint32_t change_id) OVERRIDE;
// Called to schedule a sync of the client model with the service after a
// return to the message loop.
void ScheduleSync();
// Sync the client model with the service by enumerating the pending
// transaction queue and applying them in order.
void DoSync();
// Used by individual transactions to generate a connection-specific change
// id.
// TODO(beng): What happens when there are more than sizeof(int) changes in
// the queue?
uint32_t GetNextChangeId();
// Removes |transaction| from the pending queue. |transaction| must be at the
// front of the queue.
void RemoveFromPendingQueue(ViewManagerTransaction* transaction);
ViewManager* view_manager_;
bool connected_;
uint16_t connection_id_;
uint16_t next_id_;
uint32_t next_change_id_;
Transactions pending_transactions_;
RemotePtr<IViewManager> service_;
DISALLOW_COPY_AND_ASSIGN(ViewManagerSynchronizer);
};
} // namespace view_manager
} // namespace services
} // namespace mojo
#endif // MOJO_SERVICES_PUBLIC_CPP_VIEW_MANAGER_LIB_VIEW_MANAGER_SYNCHRONIZER_H_
...@@ -4,8 +4,6 @@ ...@@ -4,8 +4,6 @@
#include "mojo/services/public/cpp/view_manager/view_tree_node.h" #include "mojo/services/public/cpp/view_manager/view_tree_node.h"
#include "mojo/services/public/cpp/view_manager/lib/view_manager_private.h"
#include "mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.h"
#include "mojo/services/public/cpp/view_manager/lib/view_tree_node_private.h" #include "mojo/services/public/cpp/view_manager/lib/view_tree_node_private.h"
#include "mojo/services/public/cpp/view_manager/view_tree_node_observer.h" #include "mojo/services/public/cpp/view_manager/view_tree_node_observer.h"
...@@ -90,17 +88,7 @@ void RemoveChildImpl(ViewTreeNode* child, ViewTreeNode::Children* children) { ...@@ -90,17 +88,7 @@ void RemoveChildImpl(ViewTreeNode* child, ViewTreeNode::Children* children) {
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// ViewTreeNode, public: // ViewTreeNode, public:
ViewTreeNode::ViewTreeNode() ViewTreeNode::ViewTreeNode() : owned_by_parent_(true), parent_(NULL) {}
: manager_(NULL),
id_(-1),
owned_by_parent_(true),
parent_(NULL) {}
ViewTreeNode::ViewTreeNode(ViewManager* manager)
: manager_(manager),
id_(ViewManagerPrivate(manager).synchronizer()->CreateViewTreeNode()),
owned_by_parent_(true),
parent_(NULL) {}
ViewTreeNode::~ViewTreeNode() { ViewTreeNode::~ViewTreeNode() {
while (!children_.empty()) { while (!children_.empty()) {
...@@ -134,14 +122,12 @@ void ViewTreeNode::AddChild(ViewTreeNode* child) { ...@@ -134,14 +122,12 @@ void ViewTreeNode::AddChild(ViewTreeNode* child) {
RemoveChildImpl(child, &child->parent_->children_); RemoveChildImpl(child, &child->parent_->children_);
children_.push_back(child); children_.push_back(child);
child->parent_ = this; child->parent_ = this;
ViewManagerPrivate(manager_).synchronizer()->AddChild(child->id(), id_);
} }
void ViewTreeNode::RemoveChild(ViewTreeNode* child) { void ViewTreeNode::RemoveChild(ViewTreeNode* child) {
DCHECK_EQ(this, child->parent()); DCHECK_EQ(this, child->parent());
ScopedTreeNotifier(child, this, NULL); ScopedTreeNotifier(child, this, NULL);
RemoveChildImpl(child, &children_); RemoveChildImpl(child, &children_);
ViewManagerPrivate(manager_).synchronizer()->RemoveChild(child->id(), id_);
} }
bool ViewTreeNode::Contains(ViewTreeNode* child) const { bool ViewTreeNode::Contains(ViewTreeNode* child) const {
......
...@@ -6,31 +6,14 @@ ...@@ -6,31 +6,14 @@
#define MOJO_SERVICES_PUBLIC_CPP_VIEW_MANAGER_VIEW_MANAGER_H_ #define MOJO_SERVICES_PUBLIC_CPP_VIEW_MANAGER_VIEW_MANAGER_H_
#include "base/basictypes.h" #include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
namespace mojo { namespace mojo {
class Shell;
namespace services { namespace services {
namespace view_manager { namespace view_manager {
class ViewManagerSynchronizer;
// Approximately encapsulates the View Manager service.
// Owns a synchronizer that keeps a client model in sync with the service.
// Owned by the creator.
//
// TODO: displays
class ViewManager { class ViewManager {
public: public:
explicit ViewManager(Shell* shell);
~ViewManager();
private: private:
friend class ViewManagerPrivate;
Shell* shell_;
scoped_ptr<ViewManagerSynchronizer> synchronizer_;
DISALLOW_COPY_AND_ASSIGN(ViewManager); DISALLOW_COPY_AND_ASSIGN(ViewManager);
}; };
......
...@@ -14,19 +14,16 @@ namespace mojo { ...@@ -14,19 +14,16 @@ namespace mojo {
namespace services { namespace services {
namespace view_manager { namespace view_manager {
class ViewManager;
class ViewTreeNodeObserver; class ViewTreeNodeObserver;
class ViewTreeNode { class ViewTreeNode {
public: public:
typedef std::vector<ViewTreeNode*> Children; typedef std::vector<ViewTreeNode*> Children;
explicit ViewTreeNode(ViewManager* manager); ViewTreeNode();
ViewTreeNode(); // Used for tests.
~ViewTreeNode(); ~ViewTreeNode();
// Configuration. // Configuration.
uint16_t id() const { return id_; }
void set_owned_by_parent(bool owned_by_parent) { void set_owned_by_parent(bool owned_by_parent) {
owned_by_parent_ = owned_by_parent; owned_by_parent_ = owned_by_parent;
} }
...@@ -48,8 +45,6 @@ class ViewTreeNode { ...@@ -48,8 +45,6 @@ class ViewTreeNode {
private: private:
friend class ViewTreeNodePrivate; friend class ViewTreeNodePrivate;
ViewManager* manager_;
uint16_t id_;
bool owned_by_parent_; bool owned_by_parent_;
ViewTreeNode* parent_; ViewTreeNode* parent_;
Children children_; Children children_;
......
...@@ -15,8 +15,8 @@ module mojo.services.view_manager { ...@@ -15,8 +15,8 @@ module mojo.services.view_manager {
// uint16 as the connection id of the originating connection is used. // uint16 as the connection id of the originating connection is used.
// //
// The root node is identified with a connection id of 0, and value of 1. // The root node is identified with a connection id of 0, and value of 1.
[Peer=IViewManagerClient] [Peer=ViewManagerClient]
interface IViewManager { interface ViewManager {
// Creates a new node with the specified id. It is up to the client to ensure // Creates a new node with the specified id. It is up to the client to ensure
// the id is unique to the connection (the id need not be globally unique). // the id is unique to the connection (the id need not be globally unique).
CreateNode(uint16 node_id) => (bool success); CreateNode(uint16 node_id) => (bool success);
...@@ -43,8 +43,8 @@ interface IViewManager { ...@@ -43,8 +43,8 @@ interface IViewManager {
SetView(uint32 node_id, uint32 view_id, uint32 change_id) => (bool success); SetView(uint32 node_id, uint32 view_id, uint32 change_id) => (bool success);
}; };
[Peer=IViewManager] [Peer=ViewManager]
interface IViewManagerClient { interface ViewManagerClient {
// Invoked once the connection has been established. |connection_id| is the id // Invoked once the connection has been established. |connection_id| is the id
// used to uniquely identify the connection. // used to uniquely identify the connection.
OnConnectionEstablished(uint16 connection_id); OnConnectionEstablished(uint16 connection_id);
......
...@@ -39,7 +39,7 @@ void ViewManagerConnection::Initialize( ...@@ -39,7 +39,7 @@ void ViewManagerConnection::Initialize(
ServiceConnector<ViewManagerConnection, RootNodeManager>* service_factory, ServiceConnector<ViewManagerConnection, RootNodeManager>* service_factory,
ScopedMessagePipeHandle client_handle) { ScopedMessagePipeHandle client_handle) {
DCHECK_EQ(0, id_); // Should only get Initialize() once. DCHECK_EQ(0, id_); // Should only get Initialize() once.
ServiceConnection<IViewManager, ViewManagerConnection, RootNodeManager>:: ServiceConnection<ViewManager, ViewManagerConnection, RootNodeManager>::
Initialize(service_factory, client_handle.Pass()); Initialize(service_factory, client_handle.Pass());
id_ = context()->GetAndAdvanceNextConnectionId(); id_ = context()->GetAndAdvanceNextConnectionId();
context()->AddConnection(this); context()->AddConnection(this);
......
...@@ -24,7 +24,7 @@ class View; ...@@ -24,7 +24,7 @@ class View;
// Manages a connection from the client. // Manages a connection from the client.
class MOJO_VIEW_MANAGER_EXPORT ViewManagerConnection class MOJO_VIEW_MANAGER_EXPORT ViewManagerConnection
: public ServiceConnection<IViewManager, ViewManagerConnection, : public ServiceConnection<ViewManager, ViewManagerConnection,
RootNodeManager>, RootNodeManager>,
public NodeDelegate { public NodeDelegate {
public: public:
...@@ -75,7 +75,7 @@ class MOJO_VIEW_MANAGER_EXPORT ViewManagerConnection ...@@ -75,7 +75,7 @@ class MOJO_VIEW_MANAGER_EXPORT ViewManagerConnection
const ViewId& view_id, const ViewId& view_id,
ChangeId change_id); ChangeId change_id);
// Overridden from IViewManager: // Overridden from ViewManager:
virtual void CreateNode(uint16_t node_id, virtual void CreateNode(uint16_t node_id,
const Callback<void(bool)>& callback) OVERRIDE; const Callback<void(bool)>& callback) OVERRIDE;
virtual void DeleteNode(uint32_t transport_node_id, virtual void DeleteNode(uint32_t transport_node_id,
...@@ -99,7 +99,7 @@ class MOJO_VIEW_MANAGER_EXPORT ViewManagerConnection ...@@ -99,7 +99,7 @@ class MOJO_VIEW_MANAGER_EXPORT ViewManagerConnection
ChangeId change_id, ChangeId change_id,
const mojo::Callback<void(bool)>& callback) OVERRIDE; const mojo::Callback<void(bool)>& callback) OVERRIDE;
// Overridden from NodeDelegate: // Overriden from NodeDelegate:
virtual void OnNodeHierarchyChanged(const NodeId& node, virtual void OnNodeHierarchyChanged(const NodeId& node,
const NodeId& new_parent, const NodeId& new_parent,
const NodeId& old_parent) OVERRIDE; const NodeId& old_parent) OVERRIDE;
......
...@@ -70,7 +70,7 @@ uint32_t CreateViewId(uint16_t connection_id, uint16_t view_id) { ...@@ -70,7 +70,7 @@ uint32_t CreateViewId(uint16_t connection_id, uint16_t view_id) {
// Creates a node with the specified id. Returns true on success. Blocks until // Creates a node with the specified id. Returns true on success. Blocks until
// we get back result from server. // we get back result from server.
bool CreateNode(IViewManager* view_manager, uint16_t id) { bool CreateNode(ViewManager* view_manager, uint16_t id) {
bool result = false; bool result = false;
view_manager->CreateNode(id, base::Bind(&BooleanCallback, &result)); view_manager->CreateNode(id, base::Bind(&BooleanCallback, &result));
DoRunLoop(); DoRunLoop();
...@@ -80,7 +80,7 @@ bool CreateNode(IViewManager* view_manager, uint16_t id) { ...@@ -80,7 +80,7 @@ bool CreateNode(IViewManager* view_manager, uint16_t id) {
// TODO(sky): make a macro for these functions, they are all the same. // TODO(sky): make a macro for these functions, they are all the same.
// Deletes a node, blocking until done. // Deletes a node, blocking until done.
bool DeleteNode(IViewManager* view_manager, bool DeleteNode(ViewManager* view_manager,
uint32_t node_id, uint32_t node_id,
ChangeId change_id) { ChangeId change_id) {
bool result = false; bool result = false;
...@@ -91,7 +91,7 @@ bool DeleteNode(IViewManager* view_manager, ...@@ -91,7 +91,7 @@ bool DeleteNode(IViewManager* view_manager,
} }
// Adds a node, blocking until done. // Adds a node, blocking until done.
bool AddNode(IViewManager* view_manager, bool AddNode(ViewManager* view_manager,
uint32_t parent, uint32_t parent,
uint32_t child, uint32_t child,
ChangeId change_id) { ChangeId change_id) {
...@@ -103,7 +103,7 @@ bool AddNode(IViewManager* view_manager, ...@@ -103,7 +103,7 @@ bool AddNode(IViewManager* view_manager,
} }
// Removes a node, blocking until done. // Removes a node, blocking until done.
bool RemoveNodeFromParent(IViewManager* view_manager, bool RemoveNodeFromParent(ViewManager* view_manager,
uint32_t node_id, uint32_t node_id,
ChangeId change_id) { ChangeId change_id) {
bool result = false; bool result = false;
...@@ -115,7 +115,7 @@ bool RemoveNodeFromParent(IViewManager* view_manager, ...@@ -115,7 +115,7 @@ bool RemoveNodeFromParent(IViewManager* view_manager,
// Creates a view with the specified id. Returns true on success. Blocks until // Creates a view with the specified id. Returns true on success. Blocks until
// we get back result from server. // we get back result from server.
bool CreateView(IViewManager* view_manager, uint16_t id) { bool CreateView(ViewManager* view_manager, uint16_t id) {
bool result = false; bool result = false;
view_manager->CreateView(id, base::Bind(&BooleanCallback, &result)); view_manager->CreateView(id, base::Bind(&BooleanCallback, &result));
DoRunLoop(); DoRunLoop();
...@@ -124,7 +124,7 @@ bool CreateView(IViewManager* view_manager, uint16_t id) { ...@@ -124,7 +124,7 @@ bool CreateView(IViewManager* view_manager, uint16_t id) {
// Sets a view on the specified node. Returns true on success. Blocks until we // Sets a view on the specified node. Returns true on success. Blocks until we
// get back result from server. // get back result from server.
bool SetView(IViewManager* view_manager, bool SetView(ViewManager* view_manager,
uint32_t node_id, uint32_t node_id,
uint32_t view_id, uint32_t view_id,
ChangeId change_id) { ChangeId change_id) {
...@@ -139,7 +139,7 @@ bool SetView(IViewManager* view_manager, ...@@ -139,7 +139,7 @@ bool SetView(IViewManager* view_manager,
typedef std::vector<std::string> Changes; typedef std::vector<std::string> Changes;
class ViewManagerClientImpl : public IViewManagerClient { class ViewManagerClientImpl : public ViewManagerClient {
public: public:
ViewManagerClientImpl() : id_(0), quit_count_(0) {} ViewManagerClientImpl() : id_(0), quit_count_(0) {}
...@@ -164,7 +164,7 @@ class ViewManagerClientImpl : public IViewManagerClient { ...@@ -164,7 +164,7 @@ class ViewManagerClientImpl : public IViewManagerClient {
} }
private: private:
// IViewManagerClient overrides: // ViewManagerClient overrides:
virtual void OnConnectionEstablished(uint16_t connection_id) OVERRIDE { virtual void OnConnectionEstablished(uint16_t connection_id) OVERRIDE {
id_ = connection_id; id_ = connection_id;
if (current_run_loop) if (current_run_loop)
...@@ -219,7 +219,7 @@ class ViewManagerConnectionTest : public testing::Test { ...@@ -219,7 +219,7 @@ class ViewManagerConnectionTest : public testing::Test {
test_helper_.Init(); test_helper_.Init();
InterfacePipe<IViewManager, AnyInterface> pipe; InterfacePipe<ViewManager, AnyInterface> pipe;
test_helper_.shell()->Connect("mojo:mojo_view_manager", test_helper_.shell()->Connect("mojo:mojo_view_manager",
pipe.handle_to_peer.Pass()); pipe.handle_to_peer.Pass());
view_manager_.reset(pipe.handle_to_self.Pass(), &client_); view_manager_.reset(pipe.handle_to_self.Pass(), &client_);
...@@ -231,7 +231,7 @@ class ViewManagerConnectionTest : public testing::Test { ...@@ -231,7 +231,7 @@ class ViewManagerConnectionTest : public testing::Test {
// Creates a second connection to the viewmanager. // Creates a second connection to the viewmanager.
void EstablishSecondConnection() { void EstablishSecondConnection() {
AllocationScope allocation_scope; AllocationScope allocation_scope;
InterfacePipe<IViewManager, AnyInterface> pipe; InterfacePipe<ViewManager, AnyInterface> pipe;
test_helper_.shell()->Connect("mojo:mojo_view_manager", test_helper_.shell()->Connect("mojo:mojo_view_manager",
pipe.handle_to_peer.Pass()); pipe.handle_to_peer.Pass());
view_manager2_.reset(pipe.handle_to_self.Pass(), &client2_); view_manager2_.reset(pipe.handle_to_self.Pass(), &client2_);
...@@ -247,10 +247,10 @@ class ViewManagerConnectionTest : public testing::Test { ...@@ -247,10 +247,10 @@ class ViewManagerConnectionTest : public testing::Test {
shell::ShellTestHelper test_helper_; shell::ShellTestHelper test_helper_;
ViewManagerClientImpl client_; ViewManagerClientImpl client_;
RemotePtr<IViewManager> view_manager_; RemotePtr<ViewManager> view_manager_;
ViewManagerClientImpl client2_; ViewManagerClientImpl client2_;
RemotePtr<IViewManager> view_manager2_; RemotePtr<ViewManager> view_manager2_;
DISALLOW_COPY_AND_ASSIGN(ViewManagerConnectionTest); DISALLOW_COPY_AND_ASSIGN(ViewManagerConnectionTest);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment