blob: 70125f4a53060b9442d25d8401c3ce541902abc2 [file] [log] [blame]
Jeff Brown0b1c4042015-10-27 18:45:58 -07001// Copyright 2015 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
Jeff Brown0b1c4042015-10-27 18:45:58 -07005#include "services/ui/view_manager/view_state.h"
Jeff Brown711b2f12016-01-26 15:51:21 -08006
Jeff Brown83365b12016-02-10 11:08:14 -08007#include "base/bind.h"
Jeff Brown711b2f12016-01-26 15:51:21 -08008#include "base/logging.h"
9#include "base/strings/stringprintf.h"
Jeff Brown83365b12016-02-10 11:08:14 -080010#include "services/ui/view_manager/view_host_impl.h"
11#include "services/ui/view_manager/view_registry.h"
12#include "services/ui/view_manager/view_stub.h"
Jeff Brown0b1c4042015-10-27 18:45:58 -070013
14namespace view_manager {
15
Jeff Brown83365b12016-02-10 11:08:14 -080016ViewState::ViewState(
17 ViewRegistry* registry,
18 mojo::ui::ViewPtr view,
19 mojo::ui::ViewTokenPtr view_token,
20 mojo::InterfaceRequest<mojo::ui::ViewHost> view_host_request,
21 const std::string& label)
Jeff Brown0b1c4042015-10-27 18:45:58 -070022 : view_(view.Pass()),
Jeff Brown711b2f12016-01-26 15:51:21 -080023 view_token_(view_token.Pass()),
24 label_(label),
Jeff Brown83365b12016-02-10 11:08:14 -080025 impl_(new ViewHostImpl(registry, this)),
26 host_binding_(impl_.get(), view_host_request.Pass()),
27 owner_binding_(impl_.get()),
Jeff Brown0b1c4042015-10-27 18:45:58 -070028 weak_factory_(this) {
29 DCHECK(view_);
Jeff Brown711b2f12016-01-26 15:51:21 -080030 DCHECK(view_token_);
Jeff Brown83365b12016-02-10 11:08:14 -080031
32 view_.set_connection_error_handler(
33 base::Bind(&ViewRegistry::OnViewDied, base::Unretained(registry),
34 base::Unretained(this), "View connection closed"));
35 host_binding_.set_connection_error_handler(
36 base::Bind(&ViewRegistry::OnViewDied, base::Unretained(registry),
37 base::Unretained(this), "ViewHost connection closed"));
38 owner_binding_.set_connection_error_handler(
39 base::Bind(&ViewRegistry::OnViewDied, base::Unretained(registry),
40 base::Unretained(this), "ViewOwner connection closed"));
Jeff Brown0b1c4042015-10-27 18:45:58 -070041}
42
43ViewState::~ViewState() {}
44
Jeff Brown83365b12016-02-10 11:08:14 -080045void ViewState::LinkChild(uint32_t key, std::unique_ptr<ViewStub> child) {
46 DCHECK(children_.find(key) == children_.end());
47 DCHECK(child);
48 DCHECK(!child->is_linked());
49
50 child->SetParent(this, key);
51 children_.emplace(key, std::move(child));
52}
53
54std::unique_ptr<ViewStub> ViewState::UnlinkChild(uint32_t key) {
55 auto child_it = children_.find(key);
56 DCHECK(child_it != children_.end());
57 std::unique_ptr<ViewStub> child(std::move(child_it->second));
58 child->Unlink();
59 children_.erase(child_it);
60 children_needing_layout_.erase(child->key());
61 return child;
62}
63
64std::vector<std::unique_ptr<ViewStub>> ViewState::UnlinkAllChildren() {
65 std::vector<std::unique_ptr<ViewStub>> stubs;
66 for (auto& pair : children_) {
67 pair.second->Unlink();
68 stubs.push_back(std::move(pair.second));
Jeff Brown0b1c4042015-10-27 18:45:58 -070069 }
Jeff Brown83365b12016-02-10 11:08:14 -080070 children_.clear();
71 children_needing_layout_.clear();
72 return stubs;
Jeff Brown0b1c4042015-10-27 18:45:58 -070073}
74
Jeff Brown83365b12016-02-10 11:08:14 -080075void ViewState::BindOwner(
76 mojo::InterfaceRequest<mojo::ui::ViewOwner> view_owner_request) {
77 DCHECK(!owner_binding_.is_bound());
78 owner_binding_.Bind(view_owner_request.Pass());
Jeff Brown0b1c4042015-10-27 18:45:58 -070079}
80
Jeff Brown83365b12016-02-10 11:08:14 -080081void ViewState::ReleaseOwner() {
82 DCHECK(owner_binding_.is_bound());
83 owner_binding_.Close();
Jeff Brown0b1c4042015-10-27 18:45:58 -070084}
85
Jeff Brown711b2f12016-01-26 15:51:21 -080086mojo::ui::ViewLayoutInfoPtr ViewState::CreateLayoutInfo() {
87 if (!layout_result_ || !scene_token_)
88 return nullptr;
89
90 auto info = mojo::ui::ViewLayoutInfo::New();
91 info->size = layout_result_->size.Clone();
92 info->scene_token = scene_token_.Clone();
93 return info;
94}
95
Jeff Brown83365b12016-02-10 11:08:14 -080096const std::string& ViewState::FormattedLabel() const {
Jeff Brown711b2f12016-01-26 15:51:21 -080097 if (formatted_label_cache_.empty()) {
98 formatted_label_cache_ =
99 label_.empty()
100 ? base::StringPrintf("<%d>", view_token_->value)
101 : base::StringPrintf("<%d:%s>", view_token_->value, label_.c_str());
102 }
103 return formatted_label_cache_;
104}
105
106std::ostream& operator<<(std::ostream& os, ViewState* view_state) {
107 if (!view_state)
108 return os << "null";
109 return os << view_state->FormattedLabel();
110}
Jeff Brown0b1c4042015-10-27 18:45:58 -0700111
112} // namespace view_manager