blob: be248df131e3e96c4ead008526b740b975069eff [file] [log] [blame]
// Copyright 2015 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_tree_state.h"
#include "base/bind.h"
#include "base/logging.h"
#include "base/strings/stringprintf.h"
#include "services/ui/view_manager/view_registry.h"
#include "services/ui/view_manager/view_state.h"
#include "services/ui/view_manager/view_stub.h"
#include "services/ui/view_manager/view_tree_impl.h"
namespace view_manager {
ViewTreeState::ViewTreeState(
ViewRegistry* registry,
mojo::ui::ViewTreeTokenPtr view_tree_token,
mojo::InterfaceRequest<mojo::ui::ViewTree> view_tree_request,
mojo::ui::ViewTreeListenerPtr view_tree_listener,
const std::string& label)
: view_tree_token_(view_tree_token.Pass()),
view_tree_listener_(view_tree_listener.Pass()),
label_(label),
impl_(new ViewTreeImpl(registry, this)),
view_tree_binding_(impl_.get(), view_tree_request.Pass()),
weak_factory_(this) {
DCHECK(view_tree_token_);
DCHECK(view_tree_listener_);
view_tree_binding_.set_connection_error_handler(
base::Bind(&ViewRegistry::OnViewTreeDied, base::Unretained(registry),
base::Unretained(this), "ViewTree connection closed"));
view_tree_listener_.set_connection_error_handler(
base::Bind(&ViewRegistry::OnViewTreeDied, base::Unretained(registry),
base::Unretained(this), "ViewTreeListener connection closed"));
}
ViewTreeState::~ViewTreeState() {
ClearHitTesterCallbacks(false /*renderer_changed*/);
}
void ViewTreeState::SetRenderer(mojo::gfx::composition::RendererPtr renderer) {
renderer_ = renderer.Pass();
ClearHitTesterCallbacks(true /*renderer_changed*/);
}
ViewStub* ViewTreeState::GetRoot() const {
if (children().empty())
return nullptr;
return children().cbegin()->second.get();
}
void ViewTreeState::RequestHitTester(
mojo::InterfaceRequest<mojo::gfx::composition::HitTester>
hit_tester_request,
const mojo::ui::ViewInspector::GetHitTesterCallback& callback) {
DCHECK(hit_tester_request.is_pending());
if (renderer_)
renderer_->GetHitTester(hit_tester_request.Pass());
pending_hit_tester_callbacks_.push_back(callback);
}
void ViewTreeState::ClearHitTesterCallbacks(bool renderer_changed) {
for (const auto& callback : pending_hit_tester_callbacks_)
callback.Run(renderer_changed);
pending_hit_tester_callbacks_.clear();
}
ViewTreeState* ViewTreeState::AsViewTreeState() {
return this;
}
const std::string& ViewTreeState::FormattedLabel() const {
if (formatted_label_cache_.empty()) {
formatted_label_cache_ =
label_.empty() ? base::StringPrintf("<T%d>", view_tree_token_->value)
: base::StringPrintf("<T%d:%s>", view_tree_token_->value,
label_.c_str());
}
return formatted_label_cache_;
}
} // namespace view_manager