| Index: services/ui/view_manager/view_stub.cc
|
| diff --git a/services/ui/view_manager/view_stub.cc b/services/ui/view_manager/view_stub.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8fd5eae8f402e58e006f63e97f693bcdffb063a2
|
| --- /dev/null
|
| +++ b/services/ui/view_manager/view_stub.cc
|
| @@ -0,0 +1,98 @@
|
| +// Copyright 2016 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 "services/ui/view_manager/view_stub.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/logging.h"
|
| +#include "services/ui/view_manager/view_registry.h"
|
| +#include "services/ui/view_manager/view_state.h"
|
| +#include "services/ui/view_manager/view_tree_state.h"
|
| +
|
| +namespace view_manager {
|
| +
|
| +ViewStub::ViewStub(ViewRegistry* registry, mojo::ui::ViewOwnerPtr owner)
|
| + : registry_(registry), owner_(owner.Pass()) {
|
| + DCHECK(registry_);
|
| + DCHECK(owner_);
|
| +
|
| + owner_.set_connection_error_handler(
|
| + base::Bind(&ViewStub::OnViewResolved, base::Unretained(this), nullptr));
|
| + owner_->GetToken(
|
| + base::Bind(&ViewStub::OnViewResolved, base::Unretained(this)));
|
| +}
|
| +
|
| +ViewStub::~ViewStub() {
|
| + // Ensure that everything was properly released before this object was
|
| + // destroyed. The |ViewRegistry| is responsible for maintaining the
|
| + // invariant that all |ViewState| objects are owned so by the time we
|
| + // get here, the view should have found a new owner or been unregistered.
|
| + DCHECK(is_unavailable());
|
| +}
|
| +
|
| +void ViewStub::AttachView(ViewState* state) {
|
| + DCHECK(state);
|
| + DCHECK(!state->view_stub());
|
| + DCHECK(is_pending());
|
| +
|
| + state_ = state;
|
| + state_->set_view_stub(this);
|
| +}
|
| +
|
| +ViewState* ViewStub::ReleaseView() {
|
| + if (is_unavailable())
|
| + return nullptr;
|
| +
|
| + ViewState* state = state_;
|
| + if (state) {
|
| + DCHECK(state->view_stub() == this);
|
| + state->set_view_stub(nullptr);
|
| + state_ = nullptr;
|
| + }
|
| + unavailable_ = true;
|
| + return state;
|
| +}
|
| +
|
| +void ViewStub::SetTree(ViewTreeState* tree, uint32_t key) {
|
| + DCHECK(tree);
|
| + DCHECK(!tree_ && !parent_);
|
| +
|
| + key_ = key;
|
| + SetTreeRecursively(tree);
|
| +}
|
| +
|
| +void ViewStub::SetParent(ViewState* parent, uint32_t key) {
|
| + DCHECK(parent);
|
| + DCHECK(!tree_ && !parent_);
|
| +
|
| + parent_ = parent;
|
| + key_ = key;
|
| + if (parent->view_stub())
|
| + SetTreeRecursively(parent->view_stub()->tree());
|
| +}
|
| +
|
| +void ViewStub::Unlink() {
|
| + parent_ = nullptr;
|
| + key_ = 0;
|
| + SetTreeRecursively(nullptr);
|
| +}
|
| +
|
| +void ViewStub::SetTreeRecursively(ViewTreeState* tree) {
|
| + if (tree_ == tree)
|
| + return;
|
| + tree_ = tree;
|
| + if (state_) {
|
| + for (const auto& pair : state_->children()) {
|
| + pair.second->SetTreeRecursively(tree);
|
| + }
|
| + }
|
| +}
|
| +
|
| +void ViewStub::OnViewResolved(mojo::ui::ViewTokenPtr view_token) {
|
| + DCHECK(owner_);
|
| + owner_.reset();
|
| + registry_->OnViewResolved(this, view_token.Pass());
|
| +}
|
| +
|
| +} // namespace view_manager
|
|
|