OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 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 | 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 "ash/common/devtools/ash_devtools_dom_agent.h" | 5 #include "ash/common/devtools/ash_devtools_dom_agent.h" |
6 | 6 |
7 #include "ash/common/wm_window.h" | 7 #include "ash/common/wm_window.h" |
8 #include "ash/public/cpp/shell_window_ids.h" | 8 #include "ash/public/cpp/shell_window_ids.h" |
9 #include "ash/root_window_controller.h" | 9 #include "ash/root_window_controller.h" |
10 #include "ash/shell.h" | 10 #include "ash/shell.h" |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 } | 130 } |
131 | 131 |
132 ui::devtools::protocol::Response AshDevToolsDOMAgent::hideHighlight() { | 132 ui::devtools::protocol::Response AshDevToolsDOMAgent::hideHighlight() { |
133 if (widget_for_highlighting_ && widget_for_highlighting_->IsVisible()) | 133 if (widget_for_highlighting_ && widget_for_highlighting_->IsVisible()) |
134 widget_for_highlighting_->Hide(); | 134 widget_for_highlighting_->Hide(); |
135 return ui::devtools::protocol::Response::OK(); | 135 return ui::devtools::protocol::Response::OK(); |
136 } | 136 } |
137 | 137 |
138 // Handles removing windows. | 138 // Handles removing windows. |
139 void AshDevToolsDOMAgent::OnWindowHierarchyChanging( | 139 void AshDevToolsDOMAgent::OnWindowHierarchyChanging( |
140 const HierarchyChangeParams& params) { | 140 const aura::WindowObserver::HierarchyChangeParams& params) { |
141 // Only trigger this when params.receiver == params.old_parent. | 141 // Only trigger this when params.receiver == params.old_parent. |
142 // Only removals are handled here. Removing a node can occur as a result of | 142 // Only removals are handled here. Removing a node can occur as a result of |
143 // reorganizing a window or just destroying it. OnWindowHierarchyChanged | 143 // reorganizing a window or just destroying it. OnWindowHierarchyChanged |
144 // is only called if there is a new_parent. The only case this method isn't | 144 // is only called if there is a new_parent. The only case this method isn't |
145 // called is when adding a node because old_parent is then null. | 145 // called is when adding a node because old_parent is then null. |
146 // Finally, We only trigger this 0 or 1 times as an old_parent will | 146 // Finally, We only trigger this 0 or 1 times as an old_parent will |
147 // either exist and only call this callback once, or not at all. | 147 // either exist and only call this callback once, or not at all. |
148 if (params.receiver == params.old_parent) | 148 if (params.receiver == params.old_parent) |
149 RemoveWindowTree(WmWindow::Get(params.target), true); | 149 RemoveWindowTree(WmWindow::Get(params.target), true); |
150 } | 150 } |
151 | 151 |
152 // Handles adding windows. | 152 // Handles adding windows. |
153 void AshDevToolsDOMAgent::OnWindowHierarchyChanged( | 153 void AshDevToolsDOMAgent::OnWindowHierarchyChanged( |
154 const HierarchyChangeParams& params) { | 154 const aura::WindowObserver::HierarchyChangeParams& params) { |
155 // Only trigger this when params.receiver == params.new_parent. | 155 // Only trigger this when params.receiver == params.new_parent. |
156 // If there is an old_parent + new_parent, then this window's node was | 156 // If there is an old_parent + new_parent, then this window's node was |
157 // removed in OnWindowHierarchyChanging and will now be added to the | 157 // removed in OnWindowHierarchyChanging and will now be added to the |
158 // new_parent. If there is only a new_parent, OnWindowHierarchyChanging is | 158 // new_parent. If there is only a new_parent, OnWindowHierarchyChanging is |
159 // never called and the window is only added here. | 159 // never called and the window is only added here. |
160 if (params.receiver == params.new_parent) | 160 if (params.receiver == params.new_parent) |
161 AddWindowTree(WmWindow::Get(params.target)); | 161 AddWindowTree(WmWindow::Get(params.target)); |
162 } | 162 } |
163 | 163 |
164 void AshDevToolsDOMAgent::OnWindowStackingChanged(aura::Window* window) { | 164 // For WindowElement observers |
165 RemoveWindowTree(WmWindow::Get(window), false); | 165 void AshDevToolsDOMAgent::NotifyOnWindowHierarchyChanging( |
166 AddWindowTree(WmWindow::Get(window)); | 166 const aura::WindowObserver::HierarchyChangeParams& params) { |
| 167 OnWindowHierarchyChanging(params); |
167 } | 168 } |
168 | 169 |
169 void AshDevToolsDOMAgent::OnWindowBoundsChanged(aura::Window* window, | 170 void AshDevToolsDOMAgent::NotifyOnWindowHierarchyChanged( |
170 const gfx::Rect& old_bounds, | 171 const aura::WindowObserver::HierarchyChangeParams& params) { |
171 const gfx::Rect& new_bounds) { | 172 OnWindowHierarchyChanged(params); |
172 for (auto& observer : observers_) | |
173 observer.OnWindowBoundsChanged(WmWindow::Get(window)); | |
174 } | 173 } |
175 | 174 |
176 void AshDevToolsDOMAgent::OnWillRemoveView(views::Widget* widget, | 175 void AshDevToolsDOMAgent::NotifyRemoveWindowTree(WmWindow* window, |
177 views::View* view) { | 176 bool remove_observer) { |
178 if (view == widget->GetRootView()) | 177 RemoveWindowTree(window, remove_observer); |
179 RemoveViewTree(view, nullptr, true); | |
180 } | 178 } |
181 | 179 |
182 void AshDevToolsDOMAgent::OnWidgetBoundsChanged(views::Widget* widget, | 180 void AshDevToolsDOMAgent::NotifyAddWindowTree(WmWindow* window) { |
183 const gfx::Rect& new_bounds) { | 181 AddWindowTree(window); |
| 182 } |
| 183 |
| 184 void AshDevToolsDOMAgent::NotfiyOnWindowBoundsChanged(WmWindow* window) { |
| 185 for (auto& observer : observers_) |
| 186 observer.OnWindowBoundsChanged(window); |
| 187 } |
| 188 |
| 189 // For ViewElement observers |
| 190 void AshDevToolsDOMAgent::NotifyRemoveViewTree(views::View* view, |
| 191 views::View* parent, |
| 192 bool remove_observer) { |
| 193 RemoveViewTree(view, parent, true); |
| 194 } |
| 195 |
| 196 void AshDevToolsDOMAgent::NotifyAddViewTree(views::View* view) { |
| 197 AddViewTree(view); |
| 198 } |
| 199 |
| 200 void AshDevToolsDOMAgent::NotifyOnViewBoundsChanged(views::View* view) { |
| 201 for (auto& observer : observers_) |
| 202 observer.OnViewBoundsChanged(view); |
| 203 } |
| 204 |
| 205 // For WidgetElement observers |
| 206 void AshDevToolsDOMAgent::NotifyOnWidgetBoundsChanged(views::Widget* widget) { |
184 for (auto& observer : observers_) | 207 for (auto& observer : observers_) |
185 observer.OnWidgetBoundsChanged(widget); | 208 observer.OnWidgetBoundsChanged(widget); |
186 } | 209 } |
187 | 210 |
188 void AshDevToolsDOMAgent::OnChildViewRemoved(views::View* parent, | 211 void AshDevToolsDOMAgent::OnUIElementBoundsChanged(UIElement* ui_element) { |
189 views::View* view) { | |
190 RemoveViewTree(view, parent, true); | |
191 } | |
192 | |
193 void AshDevToolsDOMAgent::OnChildViewAdded(views::View* parent, | |
194 views::View* view) { | |
195 AddViewTree(view); | |
196 } | |
197 | |
198 void AshDevToolsDOMAgent::OnChildViewReordered(views::View* parent, | |
199 views::View* view) { | |
200 RemoveViewTree(view, parent, false); | |
201 AddViewTree(view); | |
202 } | |
203 | |
204 void AshDevToolsDOMAgent::OnViewBoundsChanged(views::View* view) { | |
205 for (auto& observer : observers_) | 212 for (auto& observer : observers_) |
206 observer.OnViewBoundsChanged(view); | 213 observer.OnUIElementBoundsChanged(ui_element); |
207 } | 214 } |
208 | 215 |
209 WmWindow* AshDevToolsDOMAgent::GetWindowFromNodeId(int nodeId) { | 216 WmWindow* AshDevToolsDOMAgent::GetWindowFromNodeId(int nodeId) { |
210 return node_id_to_window_map_.count(nodeId) ? node_id_to_window_map_[nodeId] | 217 return node_id_to_window_map_.count(nodeId) ? node_id_to_window_map_[nodeId] |
211 : nullptr; | 218 : nullptr; |
212 } | 219 } |
213 | 220 |
214 views::Widget* AshDevToolsDOMAgent::GetWidgetFromNodeId(int nodeId) { | 221 views::Widget* AshDevToolsDOMAgent::GetWidgetFromNodeId(int nodeId) { |
215 return node_id_to_widget_map_.count(nodeId) ? node_id_to_widget_map_[nodeId] | 222 return node_id_to_widget_map_.count(nodeId) ? node_id_to_widget_map_[nodeId] |
216 : nullptr; | 223 : nullptr; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 views::Widget* widget = GetWidgetFromWmWindow(window); | 267 views::Widget* widget = GetWidgetFromWmWindow(window); |
261 if (widget) | 268 if (widget) |
262 children->addItem(BuildTreeForRootWidget(widget)); | 269 children->addItem(BuildTreeForRootWidget(widget)); |
263 for (ash::WmWindow* child : window->GetChildren()) { | 270 for (ash::WmWindow* child : window->GetChildren()) { |
264 if (!IsHighlightingWindow(child)) | 271 if (!IsHighlightingWindow(child)) |
265 children->addItem(BuildTreeForWindow(child)); | 272 children->addItem(BuildTreeForWindow(child)); |
266 } | 273 } |
267 | 274 |
268 std::unique_ptr<ui::devtools::protocol::DOM::Node> node = | 275 std::unique_ptr<ui::devtools::protocol::DOM::Node> node = |
269 BuildNode("Window", GetAttributes(window), std::move(children)); | 276 BuildNode("Window", GetAttributes(window), std::move(children)); |
270 if (!window->aura_window()->HasObserver(this)) | 277 // if (!window->aura_window()->HasObserver(this)) |
271 window->aura_window()->AddObserver(this); | 278 // window->aura_window()->AddObserver(this); |
272 window_to_node_id_map_[window] = node->getNodeId(); | 279 window_to_node_id_map_[window] = node->getNodeId(); |
273 node_id_to_window_map_[node->getNodeId()] = window; | 280 node_id_to_window_map_[node->getNodeId()] = window; |
274 return node; | 281 return node; |
275 } | 282 } |
276 | 283 |
277 std::unique_ptr<DOM::Node> AshDevToolsDOMAgent::BuildTreeForRootWidget( | 284 std::unique_ptr<DOM::Node> AshDevToolsDOMAgent::BuildTreeForRootWidget( |
278 views::Widget* widget) { | 285 views::Widget* widget) { |
279 DCHECK(!widget_to_node_id_map_.count(widget)); | 286 DCHECK(!widget_to_node_id_map_.count(widget)); |
280 std::unique_ptr<Array<DOM::Node>> children = Array<DOM::Node>::create(); | 287 std::unique_ptr<Array<DOM::Node>> children = Array<DOM::Node>::create(); |
281 children->addItem(BuildTreeForView(widget->GetRootView())); | 288 children->addItem(BuildTreeForView(widget->GetRootView())); |
282 std::unique_ptr<ui::devtools::protocol::DOM::Node> node = | 289 std::unique_ptr<ui::devtools::protocol::DOM::Node> node = |
283 BuildNode("Widget", GetAttributes(widget), std::move(children)); | 290 BuildNode("Widget", GetAttributes(widget), std::move(children)); |
284 if (!widget->HasRemovalsObserver(this)) | 291 // if (!widget->HasRemovalsObserver(this)) |
285 widget->AddRemovalsObserver(this); | 292 // widget->AddRemovalsObserver(this); |
286 widget_to_node_id_map_[widget] = node->getNodeId(); | 293 widget_to_node_id_map_[widget] = node->getNodeId(); |
287 node_id_to_widget_map_[node->getNodeId()] = widget; | 294 node_id_to_widget_map_[node->getNodeId()] = widget; |
288 return node; | 295 return node; |
289 } | 296 } |
290 | 297 |
291 std::unique_ptr<DOM::Node> AshDevToolsDOMAgent::BuildTreeForView( | 298 std::unique_ptr<DOM::Node> AshDevToolsDOMAgent::BuildTreeForView( |
292 views::View* view) { | 299 views::View* view) { |
293 DCHECK(!view_to_node_id_map_.count(view)); | 300 DCHECK(!view_to_node_id_map_.count(view)); |
294 std::unique_ptr<Array<DOM::Node>> children = Array<DOM::Node>::create(); | 301 std::unique_ptr<Array<DOM::Node>> children = Array<DOM::Node>::create(); |
295 for (int i = 0, count = view->child_count(); i < count; i++) | 302 for (int i = 0, count = view->child_count(); i < count; i++) |
296 children->addItem(BuildTreeForView(view->child_at(i))); | 303 children->addItem(BuildTreeForView(view->child_at(i))); |
297 std::unique_ptr<ui::devtools::protocol::DOM::Node> node = | 304 std::unique_ptr<ui::devtools::protocol::DOM::Node> node = |
298 BuildNode("View", GetAttributes(view), std::move(children)); | 305 BuildNode("View", GetAttributes(view), std::move(children)); |
299 if (!view->HasObserver(this)) | 306 // if (!view->HasObserver(this)) |
300 view->AddObserver(this); | 307 // view->AddObserver(this); |
301 view_to_node_id_map_[view] = node->getNodeId(); | 308 view_to_node_id_map_[view] = node->getNodeId(); |
302 node_id_to_view_map_[node->getNodeId()] = view; | 309 node_id_to_view_map_[node->getNodeId()] = view; |
303 return node; | 310 return node; |
304 } | 311 } |
305 | 312 |
306 void AshDevToolsDOMAgent::AddWindowTree(WmWindow* window) { | 313 void AshDevToolsDOMAgent::AddWindowTree(WmWindow* window) { |
307 if (IsHighlightingWindow(window)) | 314 if (IsHighlightingWindow(window)) |
308 return; | 315 return; |
309 | 316 |
310 DCHECK(window_to_node_id_map_.count(window->GetParent())); | 317 DCHECK(window_to_node_id_map_.count(window->GetParent())); |
(...skipping 25 matching lines...) Expand all Loading... |
336 window_to_node_id_map_.find(window); | 343 window_to_node_id_map_.find(window); |
337 DCHECK(window_to_node_id_it != window_to_node_id_map_.end()); | 344 DCHECK(window_to_node_id_it != window_to_node_id_map_.end()); |
338 | 345 |
339 int node_id = window_to_node_id_it->second; | 346 int node_id = window_to_node_id_it->second; |
340 int parent_id = GetNodeIdFromWindow(window->GetParent()); | 347 int parent_id = GetNodeIdFromWindow(window->GetParent()); |
341 | 348 |
342 NodeIdToWindowMap::iterator node_id_to_window_it = | 349 NodeIdToWindowMap::iterator node_id_to_window_it = |
343 node_id_to_window_map_.find(node_id); | 350 node_id_to_window_map_.find(node_id); |
344 DCHECK(node_id_to_window_it != node_id_to_window_map_.end()); | 351 DCHECK(node_id_to_window_it != node_id_to_window_map_.end()); |
345 | 352 |
346 if (remove_observer) | 353 // if (remove_observer) |
347 window->aura_window()->RemoveObserver(this); | 354 // window->aura_window()->RemoveObserver(this); |
348 | 355 |
349 node_id_to_window_map_.erase(node_id_to_window_it); | 356 node_id_to_window_map_.erase(node_id_to_window_it); |
350 window_to_node_id_map_.erase(window_to_node_id_it); | 357 window_to_node_id_map_.erase(window_to_node_id_it); |
351 frontend()->childNodeRemoved(parent_id, node_id); | 358 frontend()->childNodeRemoved(parent_id, node_id); |
352 } | 359 } |
353 | 360 |
354 void AshDevToolsDOMAgent::RemoveWidgetTree(views::Widget* widget, | 361 void AshDevToolsDOMAgent::RemoveWidgetTree(views::Widget* widget, |
355 bool remove_observer) { | 362 bool remove_observer) { |
356 DCHECK(widget); | 363 DCHECK(widget); |
357 if (widget->GetRootView()) | 364 if (widget->GetRootView()) |
358 RemoveViewTree(widget->GetRootView(), nullptr, remove_observer); | 365 RemoveViewTree(widget->GetRootView(), nullptr, remove_observer); |
359 RemoveWidgetNode(widget, remove_observer); | 366 RemoveWidgetNode(widget, remove_observer); |
360 } | 367 } |
361 | 368 |
362 void AshDevToolsDOMAgent::RemoveWidgetNode(views::Widget* widget, | 369 void AshDevToolsDOMAgent::RemoveWidgetNode(views::Widget* widget, |
363 bool remove_observer) { | 370 bool remove_observer) { |
364 WidgetToNodeIdMap::iterator widget_to_node_id_it = | 371 WidgetToNodeIdMap::iterator widget_to_node_id_it = |
365 widget_to_node_id_map_.find(widget); | 372 widget_to_node_id_map_.find(widget); |
366 DCHECK(widget_to_node_id_it != widget_to_node_id_map_.end()); | 373 DCHECK(widget_to_node_id_it != widget_to_node_id_map_.end()); |
367 | 374 |
368 int node_id = widget_to_node_id_it->second; | 375 int node_id = widget_to_node_id_it->second; |
369 int parent_id = GetNodeIdFromWindow(WmWindow::Get(widget->GetNativeWindow())); | 376 int parent_id = GetNodeIdFromWindow(WmWindow::Get(widget->GetNativeWindow())); |
370 | 377 |
371 if (remove_observer) | 378 // if (remove_observer) |
372 widget->RemoveRemovalsObserver(this); | 379 // widget->RemoveRemovalsObserver(this); |
373 | 380 |
374 NodeIdToWidgetMap::iterator node_id_to_widget_it = | 381 NodeIdToWidgetMap::iterator node_id_to_widget_it = |
375 node_id_to_widget_map_.find(node_id); | 382 node_id_to_widget_map_.find(node_id); |
376 DCHECK(node_id_to_widget_it != node_id_to_widget_map_.end()); | 383 DCHECK(node_id_to_widget_it != node_id_to_widget_map_.end()); |
377 | 384 |
378 widget_to_node_id_map_.erase(widget_to_node_id_it); | 385 widget_to_node_id_map_.erase(widget_to_node_id_it); |
379 node_id_to_widget_map_.erase(node_id_to_widget_it); | 386 node_id_to_widget_map_.erase(node_id_to_widget_it); |
380 frontend()->childNodeRemoved(parent_id, node_id); | 387 frontend()->childNodeRemoved(parent_id, node_id); |
381 } | 388 } |
382 | 389 |
(...skipping 22 matching lines...) Expand all Loading... |
405 view_to_node_id_map_.find(view); | 412 view_to_node_id_map_.find(view); |
406 DCHECK(view_to_node_id_it != view_to_node_id_map_.end()); | 413 DCHECK(view_to_node_id_it != view_to_node_id_map_.end()); |
407 | 414 |
408 int node_id = view_to_node_id_it->second; | 415 int node_id = view_to_node_id_it->second; |
409 int parent_id = 0; | 416 int parent_id = 0; |
410 if (parent) | 417 if (parent) |
411 parent_id = GetNodeIdFromView(parent); | 418 parent_id = GetNodeIdFromView(parent); |
412 else // views::RootView | 419 else // views::RootView |
413 parent_id = GetNodeIdFromWidget(view->GetWidget()); | 420 parent_id = GetNodeIdFromWidget(view->GetWidget()); |
414 | 421 |
415 if (remove_observer) | 422 // if (remove_observer) |
416 view->RemoveObserver(this); | 423 // view->RemoveObserver(this); |
417 | 424 |
418 NodeIdToViewMap::iterator node_id_to_view_it = | 425 NodeIdToViewMap::iterator node_id_to_view_it = |
419 node_id_to_view_map_.find(node_id); | 426 node_id_to_view_map_.find(node_id); |
420 DCHECK(node_id_to_view_it != node_id_to_view_map_.end()); | 427 DCHECK(node_id_to_view_it != node_id_to_view_map_.end()); |
421 | 428 |
422 view_to_node_id_map_.erase(view_to_node_id_it); | 429 view_to_node_id_map_.erase(view_to_node_id_it); |
423 node_id_to_view_map_.erase(node_id_to_view_it); | 430 node_id_to_view_map_.erase(node_id_to_view_it); |
424 frontend()->childNodeRemoved(parent_id, node_id); | 431 frontend()->childNodeRemoved(parent_id, node_id); |
425 } | 432 } |
426 | 433 |
427 void AshDevToolsDOMAgent::RemoveObservers() { | 434 void AshDevToolsDOMAgent::RemoveObservers() { |
428 for (auto& pair : window_to_node_id_map_) | 435 // for (auto& pair : window_to_node_id_map_) |
429 pair.first->aura_window()->RemoveObserver(this); | 436 // pair.first->aura_window()->RemoveObserver(this); |
430 for (auto& pair : widget_to_node_id_map_) | 437 // for (auto& pair : widget_to_node_id_map_) |
431 pair.first->RemoveRemovalsObserver(this); | 438 // pair.first->RemoveRemovalsObserver(this); |
432 for (auto& pair : view_to_node_id_map_) | 439 // for (auto& pair : view_to_node_id_map_) |
433 pair.first->RemoveObserver(this); | 440 // pair.first->RemoveObserver(this); |
434 } | 441 } |
435 | 442 |
436 void AshDevToolsDOMAgent::Reset() { | 443 void AshDevToolsDOMAgent::Reset() { |
437 RemoveObservers(); | 444 RemoveObservers(); |
438 widget_for_highlighting_.reset(); | 445 widget_for_highlighting_.reset(); |
439 window_to_node_id_map_.clear(); | 446 window_to_node_id_map_.clear(); |
440 widget_to_node_id_map_.clear(); | 447 widget_to_node_id_map_.clear(); |
441 view_to_node_id_map_.clear(); | 448 view_to_node_id_map_.clear(); |
442 node_id_to_window_map_.clear(); | 449 node_id_to_window_map_.clear(); |
443 node_id_to_widget_map_.clear(); | 450 node_id_to_widget_map_.clear(); |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
524 return ui::devtools::protocol::Response::OK(); | 531 return ui::devtools::protocol::Response::OK(); |
525 } | 532 } |
526 | 533 |
527 bool AshDevToolsDOMAgent::IsHighlightingWindow(WmWindow* window) { | 534 bool AshDevToolsDOMAgent::IsHighlightingWindow(WmWindow* window) { |
528 return widget_for_highlighting_ && | 535 return widget_for_highlighting_ && |
529 GetWidgetFromWmWindow(window) == widget_for_highlighting_.get(); | 536 GetWidgetFromWmWindow(window) == widget_for_highlighting_.get(); |
530 } | 537 } |
531 | 538 |
532 } // namespace devtools | 539 } // namespace devtools |
533 } // namespace ash | 540 } // namespace ash |
OLD | NEW |