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

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

Issue 2365243003: Fixes possible crash in ~Display (Closed)
Patch Set: Created 4 years, 2 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_manager_state_unittest.cc ('k') | no next file » | 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_server.h" 5 #include "services/ui/ws/window_server.h"
6 6
7 #include <set> 7 #include <set>
8 #include <string> 8 #include <string>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 auto iter = tree_map_.find(tree->id()); 153 auto iter = tree_map_.find(tree->id());
154 DCHECK(iter != tree_map_.end()); 154 DCHECK(iter != tree_map_.end());
155 tree_ptr = std::move(iter->second); 155 tree_ptr = std::move(iter->second);
156 tree_map_.erase(iter); 156 tree_map_.erase(iter);
157 } 157 }
158 158
159 // Notify remaining connections so that they can cleanup. 159 // Notify remaining connections so that they can cleanup.
160 for (auto& pair : tree_map_) 160 for (auto& pair : tree_map_)
161 pair.second->OnWindowDestroyingTreeImpl(tree); 161 pair.second->OnWindowDestroyingTreeImpl(tree);
162 162
163 // Notify the hosts, taking care to only notify each host once.
164 std::set<Display*> displays_notified;
165 for (auto* root : tree->roots()) {
166 // WindowTree holds its roots as a const, which is right as WindowTree
167 // doesn't need to modify the window. OTOH we do. We could look up the
168 // window using the id to get non-const version, but instead we cast.
169 Display* display =
170 display_manager_->GetDisplayContaining(const_cast<ServerWindow*>(root));
171 if (display && displays_notified.count(display) == 0) {
172 display->OnWillDestroyTree(tree);
173 displays_notified.insert(display);
174 }
175 }
176
177 window_manager_window_tree_factory_set_.DeleteFactoryAssociatedWithTree(tree); 163 window_manager_window_tree_factory_set_.DeleteFactoryAssociatedWithTree(tree);
178 164
179 // Remove any requests from the client that resulted in a call to the window 165 // Remove any requests from the client that resulted in a call to the window
180 // manager and we haven't gotten a response back yet. 166 // manager and we haven't gotten a response back yet.
181 std::set<uint32_t> to_remove; 167 std::set<uint32_t> to_remove;
182 for (auto& pair : in_flight_wm_change_map_) { 168 for (auto& pair : in_flight_wm_change_map_) {
183 if (pair.second.client_id == tree->id()) 169 if (pair.second.client_id == tree->id())
184 to_remove.insert(pair.first); 170 to_remove.insert(pair.first);
185 } 171 }
186 for (uint32_t id : to_remove) 172 for (uint32_t id : to_remove)
(...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after
833 void WindowServer::OnUserIdAdded(const UserId& id) { 819 void WindowServer::OnUserIdAdded(const UserId& id) {
834 activity_monitor_map_[id] = base::MakeUnique<UserActivityMonitor>(nullptr); 820 activity_monitor_map_[id] = base::MakeUnique<UserActivityMonitor>(nullptr);
835 } 821 }
836 822
837 void WindowServer::OnUserIdRemoved(const UserId& id) { 823 void WindowServer::OnUserIdRemoved(const UserId& id) {
838 activity_monitor_map_.erase(id); 824 activity_monitor_map_.erase(id);
839 } 825 }
840 826
841 } // namespace ws 827 } // namespace ws
842 } // namespace ui 828 } // namespace ui
OLDNEW
« no previous file with comments | « services/ui/ws/window_manager_state_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698