Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(32)

Side by Side Diff: mojo/ui/associates/view_tree_hit_tester_client.cc

Issue 1778593003: Mozart: Add helpers for building view associates. (Closed) Base URL: git@github.com:domokit/mojo.git@moz-6
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 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
5 #include "mojo/ui/associates/view_tree_hit_tester_client.h"
6
7 #include "base/bind.h"
8 #include "base/logging.h"
9
10 namespace mojo {
11 namespace ui {
12
13 ViewTreeHitTesterClient::ViewTreeHitTesterClient(
14 const scoped_refptr<ViewInspectorClient>& view_inspector_client,
15 mojo::ui::ViewTreeTokenPtr view_tree_token)
16 : view_inspector_client_(view_inspector_client),
17 view_tree_token_(view_tree_token.Pass()),
18 weak_factory_(this) {
19 DCHECK(view_inspector_client_);
20 DCHECK(view_tree_token_);
21
22 UpdateHitTester();
23 }
24
25 ViewTreeHitTesterClient::~ViewTreeHitTesterClient() {}
26
27 void ViewTreeHitTesterClient::HitTest(mojo::PointPtr point,
28 const ResolvedHitsCallback& callback) {
29 if (!hit_tester_) {
30 callback.Run(nullptr);
31 return;
32 }
33
34 // TODO(jeffbrown): Here we are assuming that the hit test callbacks will be
35 // invoked in FIFO order. It might be a good idea to eliminate that
36 // assumption.
37 pending_callbacks_.push(callback);
38 hit_tester_->HitTest(point.Pass(),
39 base::Bind(&ViewTreeHitTesterClient::OnHitTestResult,
40 base::Unretained(this)));
41 }
42
43 void ViewTreeHitTesterClient::OnHitTestResult(
44 mojo::gfx::composition::HitTestResultPtr result) {
45 DCHECK(result);
46 DCHECK(!pending_callbacks_.empty());
47
48 view_inspector_client_->ResolveHits(result.Pass(),
49 pending_callbacks_.front());
50 pending_callbacks_.pop();
51 }
52
53 void ViewTreeHitTesterClient::UpdateHitTester() {
54 DCHECK(!hit_tester_);
55
56 view_inspector_client_->view_inspector()->GetHitTester(
57 view_tree_token_.Clone(), mojo::GetProxy(&hit_tester_),
58 base::Bind(&ViewTreeHitTesterClient::OnHitTesterInvalidated,
59 weak_factory_.GetWeakPtr()));
60
61 hit_tester_.set_connection_error_handler(base::Bind(
62 &ViewTreeHitTesterClient::OnHitTesterDied, base::Unretained(this)));
63 }
64
65 void ViewTreeHitTesterClient::ReleaseHitTester() {
66 hit_tester_.reset();
67
68 while (!pending_callbacks_.empty()) {
69 pending_callbacks_.front().Run(nullptr);
70 pending_callbacks_.pop();
71 }
72 }
73
74 void ViewTreeHitTesterClient::OnHitTesterInvalidated(bool renderer_changed) {
75 ReleaseHitTester();
76
77 if (renderer_changed)
78 UpdateHitTester();
79
80 if (!hit_tester_changed_callback_.is_null())
81 hit_tester_changed_callback_.Run();
82 }
83
84 void ViewTreeHitTesterClient::OnHitTesterDied() {
85 ReleaseHitTester();
86
87 if (!hit_tester_changed_callback_.is_null())
88 hit_tester_changed_callback_.Run();
89 }
90
91 } // namespace ui
92 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/ui/associates/view_tree_hit_tester_client.h ('k') | mojo/ui/associates/view_tree_hit_tester_client_apptest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698