Index: mojo/ui/associates/view_inspector_client.cc |
diff --git a/mojo/ui/associates/view_inspector_client.cc b/mojo/ui/associates/view_inspector_client.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fef65d8fdbe1fb3ca44e2af125b9a8df93573335 |
--- /dev/null |
+++ b/mojo/ui/associates/view_inspector_client.cc |
@@ -0,0 +1,111 @@ |
+// 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 "mojo/ui/associates/view_inspector_client.h" |
+ |
+#include <algorithm> |
+ |
+#include "base/bind.h" |
+#include "base/logging.h" |
+ |
+namespace mojo { |
+namespace ui { |
+ |
+ViewInspectorClient::ViewInspectorClient( |
+ mojo::ui::ViewInspectorPtr view_inspector) |
+ : view_inspector_(view_inspector.Pass()) { |
+ DCHECK(view_inspector_); |
+} |
+ |
+ViewInspectorClient::~ViewInspectorClient() {} |
+ |
+void ViewInspectorClient::ResolveHits( |
+ mojo::gfx::composition::HitTestResultPtr hit_test_result, |
+ const ResolvedHitsCallback& callback) { |
+ DCHECK(hit_test_result); |
+ |
+ scoped_ptr<ResolvedHits> resolved_hits( |
+ new ResolvedHits(hit_test_result.Pass())); |
+ |
+ if (resolved_hits->result()->root) { |
+ mojo::Array<mojo::gfx::composition::SceneTokenPtr> missing_scene_tokens; |
+ ResolveSceneHit(resolved_hits->result()->root.get(), resolved_hits.get(), |
+ &missing_scene_tokens); |
+ if (missing_scene_tokens.size()) { |
+ // TODO(jeffbrown): Ideally we would set the capacity of the array |
+ // here since we know it upfront but mojo::Array doesn't support this. |
+ mojo::Array<uint32_t> missing_scene_token_values; |
+ for (const auto& token : missing_scene_tokens.storage()) |
+ missing_scene_token_values.push_back(token->value); |
+ view_inspector_->ResolveScenes( |
+ missing_scene_tokens.Pass(), |
+ base::Bind(&ViewInspectorClient::OnScenesResolved, |
+ base::Unretained(this), base::Passed(resolved_hits.Pass()), |
+ base::Passed(missing_scene_token_values.Pass()), |
+ callback)); |
+ return; |
+ } |
+ } |
+ |
+ callback.Run(resolved_hits.Pass()); |
+} |
+ |
+void ViewInspectorClient::ResolveSceneHit( |
+ const mojo::gfx::composition::SceneHit* scene_hit, |
+ ResolvedHits* resolved_hits, |
+ mojo::Array<mojo::gfx::composition::SceneTokenPtr>* missing_scene_tokens) { |
+ DCHECK(scene_hit); |
+ DCHECK(scene_hit->scene_token); |
+ DCHECK(resolved_hits); |
+ DCHECK(missing_scene_tokens); |
+ |
+ const uint32_t scene_token_value = scene_hit->scene_token->value; |
+ if (resolved_hits->map().find(scene_token_value) == |
+ resolved_hits->map().end()) { |
+ auto it = resolved_scene_cache_.find(scene_hit->scene_token->value); |
+ if (it != resolved_scene_cache_.end()) { |
+ if (it->second) |
+ resolved_hits->AddMapping(scene_token_value, it->second->Clone()); |
+ } else { |
+ if (std::none_of( |
+ missing_scene_tokens->storage().begin(), |
+ missing_scene_tokens->storage().end(), |
+ [scene_token_value]( |
+ const mojo::gfx::composition::SceneTokenPtr& needle) { |
+ return needle->value == scene_token_value; |
+ })) |
+ missing_scene_tokens->push_back(scene_hit->scene_token.Clone()); |
+ } |
+ } |
+ |
+ for (const auto& hit : scene_hit->hits.storage()) { |
+ if (hit->is_scene()) { |
+ ResolveSceneHit(hit->get_scene().get(), resolved_hits, |
+ missing_scene_tokens); |
+ } |
+ } |
+} |
+ |
+void ViewInspectorClient::OnScenesResolved( |
+ scoped_ptr<ResolvedHits> resolved_hits, |
+ mojo::Array<uint32_t> missing_scene_token_values, |
+ const ResolvedHitsCallback& callback, |
+ mojo::Array<mojo::ui::ViewTokenPtr> view_tokens) { |
+ DCHECK(resolved_hits); |
+ DCHECK(missing_scene_token_values); |
+ DCHECK(view_tokens); |
+ DCHECK(missing_scene_token_values.size() == view_tokens.size()); |
+ |
+ for (size_t i = 0; i < view_tokens.size(); i++) { |
+ const uint32_t scene_token_value = missing_scene_token_values[i]; |
+ resolved_scene_cache_.emplace(scene_token_value, view_tokens[i].Clone()); |
+ if (view_tokens[i]) |
+ resolved_hits->AddMapping(scene_token_value, view_tokens[i].Pass()); |
+ } |
+ |
+ callback.Run(resolved_hits.Pass()); |
+} |
+ |
+} // namespace ui |
+} // namespace mojo |