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

Side by Side Diff: services/ui/ws/window_tree.cc

Issue 2125883003: Adds ability for pre-target accelerators to not consume events (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: merge Created 4 years, 5 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
« no previous file with comments | « services/ui/ws/window_tree.h ('k') | services/ui/ws/window_tree_client_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "services/ui/ws/window_tree.h" 5 #include "services/ui/ws/window_tree.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <utility> 9 #include <utility>
10 10
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after
424 } else { 424 } else {
425 DVLOG(1) << "AddActivationParent supplied invalid window id"; 425 DVLOG(1) << "AddActivationParent supplied invalid window id";
426 } 426 }
427 } 427 }
428 428
429 void WindowTree::OnChangeCompleted(uint32_t change_id, bool success) { 429 void WindowTree::OnChangeCompleted(uint32_t change_id, bool success) {
430 client()->OnChangeCompleted(change_id, success); 430 client()->OnChangeCompleted(change_id, success);
431 } 431 }
432 432
433 void WindowTree::OnAccelerator(uint32_t accelerator_id, 433 void WindowTree::OnAccelerator(uint32_t accelerator_id,
434 const ui::Event& event) { 434 const ui::Event& event,
435 bool needs_ack) {
435 DCHECK(window_manager_internal_); 436 DCHECK(window_manager_internal_);
437 if (needs_ack)
438 GenerateEventAckId();
439 else
440 DCHECK_EQ(0u, event_ack_id_);
436 // TODO(moshayedi): crbug.com/617167. Don't clone even once we map 441 // TODO(moshayedi): crbug.com/617167. Don't clone even once we map
437 // mojom::Event directly to ui::Event. 442 // mojom::Event directly to ui::Event.
438 window_manager_internal_->OnAccelerator(accelerator_id, 443 window_manager_internal_->OnAccelerator(event_ack_id_, accelerator_id,
439 ui::Event::Clone(event)); 444 ui::Event::Clone(event));
440 } 445 }
441 446
442 void WindowTree::ClientJankinessChanged(WindowTree* tree) { 447 void WindowTree::ClientJankinessChanged(WindowTree* tree) {
443 tree->janky_ = !tree->janky_; 448 tree->janky_ = !tree->janky_;
444 if (window_manager_internal_) { 449 if (window_manager_internal_) {
445 window_manager_internal_->WmClientJankinessChanged( 450 window_manager_internal_->WmClientJankinessChanged(
446 tree->id(), tree->janky()); 451 tree->id(), tree->janky());
447 } 452 }
448 } 453 }
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after
952 existing_owner->RemoveRoot(window, RemoveRootReason::EMBED); 957 existing_owner->RemoveRoot(window, RemoveRootReason::EMBED);
953 } 958 }
954 } 959 }
955 960
956 void WindowTree::RemoveChildrenAsPartOfEmbed(ServerWindow* window) { 961 void WindowTree::RemoveChildrenAsPartOfEmbed(ServerWindow* window) {
957 CHECK(window); 962 CHECK(window);
958 while (!window->children().empty()) 963 while (!window->children().empty())
959 window->Remove(window->children().front()); 964 window->Remove(window->children().front());
960 } 965 }
961 966
967 uint32_t WindowTree::GenerateEventAckId() {
968 DCHECK(!event_ack_id_);
969 // We do not want to create a sequential id for each event, because that can
970 // leak some information to the client. So instead, manufacture the id
971 // randomly.
972 event_ack_id_ = 0x1000000 | (rand() & 0xffffff);
973 return event_ack_id_;
974 }
975
962 void WindowTree::DispatchInputEventImpl(ServerWindow* target, 976 void WindowTree::DispatchInputEventImpl(ServerWindow* target,
963 const ui::Event& event) { 977 const ui::Event& event) {
964 DCHECK(!event_ack_id_); 978 GenerateEventAckId();
965 // We do not want to create a sequential id for each event, because that can
966 // leak some information to the client. So instead, manufacture the id
967 // randomly.
968 // TODO(moshayedi): Find a faster way to generate ids.
969 event_ack_id_ = 0x1000000 | (rand() & 0xffffff);
970 WindowManagerDisplayRoot* display_root = GetWindowManagerDisplayRoot(target); 979 WindowManagerDisplayRoot* display_root = GetWindowManagerDisplayRoot(target);
971 DCHECK(display_root); 980 DCHECK(display_root);
972 event_source_wms_ = display_root->window_manager_state(); 981 event_source_wms_ = display_root->window_manager_state();
973 // Should only get events from windows attached to a host. 982 // Should only get events from windows attached to a host.
974 DCHECK(event_source_wms_); 983 DCHECK(event_source_wms_);
975 bool matched_observer = 984 bool matched_observer =
976 event_observer_matcher_ && event_observer_matcher_->MatchesEvent(event); 985 event_observer_matcher_ && event_observer_matcher_->MatchesEvent(event);
977 client()->OnWindowInputEvent( 986 client()->OnWindowInputEvent(
978 event_ack_id_, ClientWindowIdForWindow(target).id, 987 event_ack_id_, ClientWindowIdForWindow(target).id,
979 ui::Event::Clone(event), matched_observer ? event_observer_id_ : 0); 988 ui::Event::Clone(event), matched_observer ? event_observer_id_ : 0);
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
1290 display->SetImeVisibility(window, visible); 1299 display->SetImeVisibility(window, visible);
1291 } 1300 }
1292 } 1301 }
1293 1302
1294 void WindowTree::OnWindowInputEventAck(uint32_t event_id, 1303 void WindowTree::OnWindowInputEventAck(uint32_t event_id,
1295 mojom::EventResult result) { 1304 mojom::EventResult result) {
1296 if (event_ack_id_ == 0 || event_id != event_ack_id_) { 1305 if (event_ack_id_ == 0 || event_id != event_ack_id_) {
1297 // TODO(sad): Something bad happened. Kill the client? 1306 // TODO(sad): Something bad happened. Kill the client?
1298 NOTIMPLEMENTED() << ": Wrong event acked. event_id=" << event_id 1307 NOTIMPLEMENTED() << ": Wrong event acked. event_id=" << event_id
1299 << ", event_ack_id_=" << event_ack_id_; 1308 << ", event_ack_id_=" << event_ack_id_;
1309 DVLOG(1) << "OnWindowInputEventAck supplied unexpected event_id";
1300 } 1310 }
1301 event_ack_id_ = 0; 1311 event_ack_id_ = 0;
1302 1312
1303 if (janky_) 1313 if (janky_)
1304 event_source_wms_->window_tree()->ClientJankinessChanged(this); 1314 event_source_wms_->window_tree()->ClientJankinessChanged(this);
1305 1315
1306 WindowManagerState* event_source_wms = event_source_wms_; 1316 WindowManagerState* event_source_wms = event_source_wms_;
1307 event_source_wms_ = nullptr; 1317 event_source_wms_ = nullptr;
1308 if (event_source_wms) 1318 if (event_source_wms)
1309 event_source_wms->OnEventAck(this, result); 1319 event_source_wms->OnEventAck(this, result);
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
1603 ServerWindow* window = 1613 ServerWindow* window =
1604 GetWindowByClientId(ClientWindowId(transport_window_id)); 1614 GetWindowByClientId(ClientWindowId(transport_window_id));
1605 if (window && window->id().client_id != id_) { 1615 if (window && window->id().client_id != id_) {
1606 DVLOG(1) << "OnWmCreatedTopLevelWindow supplied invalid window id"; 1616 DVLOG(1) << "OnWmCreatedTopLevelWindow supplied invalid window id";
1607 window_server_->WindowManagerSentBogusMessage(); 1617 window_server_->WindowManagerSentBogusMessage();
1608 window = nullptr; 1618 window = nullptr;
1609 } 1619 }
1610 window_server_->WindowManagerCreatedTopLevelWindow(this, change_id, window); 1620 window_server_->WindowManagerCreatedTopLevelWindow(this, change_id, window);
1611 } 1621 }
1612 1622
1623 void WindowTree::OnAcceleratorAck(uint32_t event_id,
1624 mojom::EventResult result) {
1625 if (event_ack_id_ == 0 || event_id != event_ack_id_) {
1626 DVLOG(1) << "OnAcceleratorAck supplied invalid event_id";
1627 window_server_->WindowManagerSentBogusMessage();
1628 return;
1629 }
1630 event_ack_id_ = 0;
1631 DCHECK(window_manager_state_);
1632 window_manager_state_->OnAcceleratorAck(result);
1633 }
1634
1613 bool WindowTree::HasRootForAccessPolicy(const ServerWindow* window) const { 1635 bool WindowTree::HasRootForAccessPolicy(const ServerWindow* window) const {
1614 return HasRoot(window); 1636 return HasRoot(window);
1615 } 1637 }
1616 1638
1617 bool WindowTree::IsWindowKnownForAccessPolicy( 1639 bool WindowTree::IsWindowKnownForAccessPolicy(
1618 const ServerWindow* window) const { 1640 const ServerWindow* window) const {
1619 return IsWindowKnown(window); 1641 return IsWindowKnown(window);
1620 } 1642 }
1621 1643
1622 bool WindowTree::IsWindowRootOfAnotherTreeForAccessPolicy( 1644 bool WindowTree::IsWindowRootOfAnotherTreeForAccessPolicy(
1623 const ServerWindow* window) const { 1645 const ServerWindow* window) const {
1624 WindowTree* tree = window_server_->GetTreeWithRoot(window); 1646 WindowTree* tree = window_server_->GetTreeWithRoot(window);
1625 return tree && tree != this; 1647 return tree && tree != this;
1626 } 1648 }
1627 1649
1628 } // namespace ws 1650 } // namespace ws
1629 } // namespace ui 1651 } // namespace ui
OLDNEW
« no previous file with comments | « services/ui/ws/window_tree.h ('k') | services/ui/ws/window_tree_client_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698