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

Side by Side Diff: ash/common/devtools/ash_devtools_dom_agent.cc

Issue 2532243003: Revert of Hook up views/widgets to AshDevToolsDOMAgent (Closed)
Patch Set: Created 4 years 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
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_lookup.h" 7 #include "ash/common/wm_lookup.h"
8 #include "ash/common/wm_window.h" 8 #include "ash/common/wm_window.h"
9 #include "components/ui_devtools/devtools_server.h" 9 #include "components/ui_devtools/devtools_server.h"
10 10
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 59
60 WmWindow* FindPreviousSibling(WmWindow* window) { 60 WmWindow* FindPreviousSibling(WmWindow* window) {
61 std::vector<WmWindow*> siblings = window->GetParent()->GetChildren(); 61 std::vector<WmWindow*> siblings = window->GetParent()->GetChildren();
62 std::vector<WmWindow*>::iterator it = 62 std::vector<WmWindow*>::iterator it =
63 std::find(siblings.begin(), siblings.end(), window); 63 std::find(siblings.begin(), siblings.end(), window);
64 DCHECK(it != siblings.end()); 64 DCHECK(it != siblings.end());
65 // If this is the first child of its parent, the previous sibling is null 65 // If this is the first child of its parent, the previous sibling is null
66 return it == siblings.begin() ? nullptr : *std::prev(it); 66 return it == siblings.begin() ? nullptr : *std::prev(it);
67 } 67 }
68 68
69 views::View* FindPreviousSibling(views::View* view) {
70 views::View* parent = view->parent();
71 int view_index = -1;
72 for (int i = 0, count = parent->child_count(); i < count; i++) {
73 if (view == parent->child_at(i)) {
74 view_index = i;
75 break;
76 }
77 }
78 DCHECK_GE(view_index, 0);
79 return view_index == 0 ? nullptr : parent->child_at(view_index - 1);
80 }
81
82 } // namespace 69 } // namespace
83 70
84 AshDevToolsDOMAgent::AshDevToolsDOMAgent(ash::WmShell* shell) : shell_(shell) { 71 AshDevToolsDOMAgent::AshDevToolsDOMAgent(ash::WmShell* shell) : shell_(shell) {
85 DCHECK(shell_); 72 DCHECK(shell_);
86 } 73 }
87 74
88 AshDevToolsDOMAgent::~AshDevToolsDOMAgent() { 75 AshDevToolsDOMAgent::~AshDevToolsDOMAgent() {
89 RemoveObservers(); 76 RemoveObserverFromAllWindows();
90 } 77 }
91 78
92 ui::devtools::protocol::Response AshDevToolsDOMAgent::disable() { 79 ui::devtools::protocol::Response AshDevToolsDOMAgent::disable() {
93 Reset(); 80 Reset();
94 return ui::devtools::protocol::Response::OK(); 81 return ui::devtools::protocol::Response::OK();
95 } 82 }
96 83
97 ui::devtools::protocol::Response AshDevToolsDOMAgent::getDocument( 84 ui::devtools::protocol::Response AshDevToolsDOMAgent::getDocument(
98 std::unique_ptr<ui::devtools::protocol::DOM::Node>* out_root) { 85 std::unique_ptr<ui::devtools::protocol::DOM::Node>* out_root) {
99 *out_root = BuildInitialTree(); 86 *out_root = BuildInitialTree();
(...skipping 24 matching lines...) Expand all
124 // the window is only added here. 111 // the window is only added here.
125 if (window == params.new_parent) 112 if (window == params.new_parent)
126 AddWindowTree(params.target); 113 AddWindowTree(params.target);
127 } 114 }
128 115
129 void AshDevToolsDOMAgent::OnWindowStackingChanged(WmWindow* window) { 116 void AshDevToolsDOMAgent::OnWindowStackingChanged(WmWindow* window) {
130 RemoveWindowTree(window, false); 117 RemoveWindowTree(window, false);
131 AddWindowTree(window); 118 AddWindowTree(window);
132 } 119 }
133 120
134 void AshDevToolsDOMAgent::OnWillRemoveView(views::Widget* widget,
135 views::View* view) {
136 if (view == widget->GetRootView())
137 RemoveViewTree(view, nullptr, true);
138 }
139
140 void AshDevToolsDOMAgent::OnChildViewRemoved(views::View* view,
141 views::View* parent) {
142 RemoveViewTree(view, parent, true);
143 }
144
145 void AshDevToolsDOMAgent::OnChildViewAdded(views::View* view) {
146 AddViewTree(view);
147 }
148
149 void AshDevToolsDOMAgent::OnChildViewReordered(views::View* view) {
150 RemoveViewTree(view, view->parent(), false);
151 AddViewTree(view);
152 }
153
154 WmWindow* AshDevToolsDOMAgent::GetWindowFromNodeId(int nodeId) { 121 WmWindow* AshDevToolsDOMAgent::GetWindowFromNodeId(int nodeId) {
155 return node_id_to_window_map_.count(nodeId) ? node_id_to_window_map_[nodeId] 122 return node_id_to_window_map_.count(nodeId) ? node_id_to_window_map_[nodeId]
156 : nullptr; 123 : nullptr;
157 } 124 }
158 125
159 views::Widget* AshDevToolsDOMAgent::GetWidgetFromNodeId(int nodeId) { 126 views::Widget* AshDevToolsDOMAgent::GetWidgetFromNodeId(int nodeId) {
160 return node_id_to_widget_map_.count(nodeId) ? node_id_to_widget_map_[nodeId] 127 return node_id_to_widget_map_.count(nodeId) ? node_id_to_widget_map_[nodeId]
161 : nullptr; 128 : nullptr;
162 } 129 }
163 130
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 return node; 175 return node;
209 } 176 }
210 177
211 std::unique_ptr<DOM::Node> AshDevToolsDOMAgent::BuildTreeForRootWidget( 178 std::unique_ptr<DOM::Node> AshDevToolsDOMAgent::BuildTreeForRootWidget(
212 views::Widget* widget) { 179 views::Widget* widget) {
213 DCHECK(!widget_to_node_id_map_.count(widget)); 180 DCHECK(!widget_to_node_id_map_.count(widget));
214 std::unique_ptr<Array<DOM::Node>> children = Array<DOM::Node>::create(); 181 std::unique_ptr<Array<DOM::Node>> children = Array<DOM::Node>::create();
215 children->addItem(BuildTreeForView(widget->GetRootView())); 182 children->addItem(BuildTreeForView(widget->GetRootView()));
216 std::unique_ptr<ui::devtools::protocol::DOM::Node> node = 183 std::unique_ptr<ui::devtools::protocol::DOM::Node> node =
217 BuildNode("Widget", GetAttributes(widget), std::move(children)); 184 BuildNode("Widget", GetAttributes(widget), std::move(children));
218 if (!widget->HasRemovalsObserver(this)) 185 // TODO(mhashmi): Add WidgetRemovalsObserver here
219 widget->AddRemovalsObserver(this);
220 widget_to_node_id_map_[widget] = node->getNodeId(); 186 widget_to_node_id_map_[widget] = node->getNodeId();
221 node_id_to_widget_map_[node->getNodeId()] = widget; 187 node_id_to_widget_map_[node->getNodeId()] = widget;
222 return node; 188 return node;
223 } 189 }
224 190
225 std::unique_ptr<DOM::Node> AshDevToolsDOMAgent::BuildTreeForView( 191 std::unique_ptr<DOM::Node> AshDevToolsDOMAgent::BuildTreeForView(
226 views::View* view) { 192 views::View* view) {
227 DCHECK(!view_to_node_id_map_.count(view)); 193 DCHECK(!view_to_node_id_map_.count(view));
228 std::unique_ptr<Array<DOM::Node>> children = Array<DOM::Node>::create(); 194 std::unique_ptr<Array<DOM::Node>> children = Array<DOM::Node>::create();
229 for (int i = 0, count = view->child_count(); i < count; i++) 195 for (int i = 0, count = view->child_count(); i < count; i++)
230 children->addItem(BuildTreeForView(view->child_at(i))); 196 children->addItem(BuildTreeForView(view->child_at(i)));
231 std::unique_ptr<ui::devtools::protocol::DOM::Node> node = 197 std::unique_ptr<ui::devtools::protocol::DOM::Node> node =
232 BuildNode("View", GetAttributes(view), std::move(children)); 198 BuildNode("View", GetAttributes(view), std::move(children));
233 if (!view->HasObserver(this)) 199 // TODO(mhashmi): Add ViewObserver here
234 view->AddObserver(this);
235 view_to_node_id_map_[view] = node->getNodeId(); 200 view_to_node_id_map_[view] = node->getNodeId();
236 node_id_to_view_map_[node->getNodeId()] = view; 201 node_id_to_view_map_[node->getNodeId()] = view;
237 return node; 202 return node;
238 } 203 }
239 204
240 void AshDevToolsDOMAgent::AddWindowTree(WmWindow* window) { 205 void AshDevToolsDOMAgent::AddWindowTree(WmWindow* window) {
241 DCHECK(window_to_node_id_map_.count(window->GetParent())); 206 DCHECK(window_to_node_id_map_.count(window->GetParent()));
242 WmWindow* prev_sibling = FindPreviousSibling(window); 207 WmWindow* prev_sibling = FindPreviousSibling(window);
243 frontend()->childNodeInserted( 208 frontend()->childNodeInserted(
244 window_to_node_id_map_[window->GetParent()], 209 window_to_node_id_map_[window->GetParent()],
(...skipping 21 matching lines...) Expand all
266 231
267 int node_id = window_to_node_id_it->second; 232 int node_id = window_to_node_id_it->second;
268 int parent_id = GetNodeIdFromWindow(window->GetParent()); 233 int parent_id = GetNodeIdFromWindow(window->GetParent());
269 234
270 NodeIdToWindowMap::iterator node_id_to_window_it = 235 NodeIdToWindowMap::iterator node_id_to_window_it =
271 node_id_to_window_map_.find(node_id); 236 node_id_to_window_map_.find(node_id);
272 DCHECK(node_id_to_window_it != node_id_to_window_map_.end()); 237 DCHECK(node_id_to_window_it != node_id_to_window_map_.end());
273 238
274 if (remove_observer) 239 if (remove_observer)
275 window->RemoveObserver(this); 240 window->RemoveObserver(this);
276
277 node_id_to_window_map_.erase(node_id_to_window_it); 241 node_id_to_window_map_.erase(node_id_to_window_it);
278 window_to_node_id_map_.erase(window_to_node_id_it); 242 window_to_node_id_map_.erase(window_to_node_id_it);
279 frontend()->childNodeRemoved(parent_id, node_id); 243 frontend()->childNodeRemoved(parent_id, node_id);
280 } 244 }
281 245
282 void AshDevToolsDOMAgent::RemoveWidgetTree(views::Widget* widget, 246 void AshDevToolsDOMAgent::RemoveWidgetTree(views::Widget* widget,
283 bool remove_observer) { 247 bool remove_observer) {
284 DCHECK(widget); 248 DCHECK(widget);
285 if (widget->GetRootView()) 249 if (widget->GetRootView())
286 RemoveViewTree(widget->GetRootView(), nullptr, remove_observer); 250 RemoveViewTree(widget->GetRootView(), nullptr, remove_observer);
287 RemoveWidgetNode(widget, remove_observer); 251 RemoveWidgetNode(widget, remove_observer);
288 } 252 }
289 253
290 void AshDevToolsDOMAgent::RemoveWidgetNode(views::Widget* widget, 254 void AshDevToolsDOMAgent::RemoveWidgetNode(views::Widget* widget,
291 bool remove_observer) { 255 bool remove_observer) {
292 WidgetToNodeIdMap::iterator widget_to_node_id_it = 256 WidgetToNodeIdMap::iterator widget_to_node_id_it =
293 widget_to_node_id_map_.find(widget); 257 widget_to_node_id_map_.find(widget);
294 DCHECK(widget_to_node_id_it != widget_to_node_id_map_.end()); 258 DCHECK(widget_to_node_id_it != widget_to_node_id_map_.end());
295 259
296 int node_id = widget_to_node_id_it->second; 260 int node_id = widget_to_node_id_it->second;
297 int parent_id = 261 int parent_id =
298 GetNodeIdFromWindow(WmLookup::Get()->GetWindowForWidget(widget)); 262 GetNodeIdFromWindow(WmLookup::Get()->GetWindowForWidget(widget));
299 263
300 if (remove_observer) 264 // TODO(mhashmi): Add WidgetRemovalsObserver and remove it here based on
301 widget->RemoveRemovalsObserver(this); 265 // |remove_observer|
302 266
303 NodeIdToWidgetMap::iterator node_id_to_widget_it = 267 NodeIdToWidgetMap::iterator node_id_to_widget_it =
304 node_id_to_widget_map_.find(node_id); 268 node_id_to_widget_map_.find(node_id);
305 DCHECK(node_id_to_widget_it != node_id_to_widget_map_.end()); 269 DCHECK(node_id_to_widget_it != node_id_to_widget_map_.end());
306 270
307 widget_to_node_id_map_.erase(widget_to_node_id_it); 271 widget_to_node_id_map_.erase(widget_to_node_id_it);
308 node_id_to_widget_map_.erase(node_id_to_widget_it); 272 node_id_to_widget_map_.erase(node_id_to_widget_it);
309 frontend()->childNodeRemoved(parent_id, node_id); 273 frontend()->childNodeRemoved(parent_id, node_id);
310 } 274 }
311 275
312 void AshDevToolsDOMAgent::AddViewTree(views::View* view) {
313 DCHECK(view_to_node_id_map_.count(view->parent()));
314 views::View* prev_sibling = FindPreviousSibling(view);
315 frontend()->childNodeInserted(
316 view_to_node_id_map_[view->parent()],
317 prev_sibling ? view_to_node_id_map_[prev_sibling] : 0,
318 BuildTreeForView(view));
319 }
320
321 void AshDevToolsDOMAgent::RemoveViewTree(views::View* view, 276 void AshDevToolsDOMAgent::RemoveViewTree(views::View* view,
322 views::View* parent, 277 views::View* parent,
323 bool remove_observer) { 278 bool remove_observer) {
324 DCHECK(view); 279 DCHECK(view);
325 for (int i = 0, count = view->child_count(); i < count; i++) 280 for (int i = 0, count = view->child_count(); i < count; i++)
326 RemoveViewTree(view->child_at(i), view, remove_observer); 281 RemoveViewTree(view->child_at(i), view, remove_observer);
327 RemoveViewNode(view, parent, remove_observer); 282 RemoveViewNode(view, parent, remove_observer);
328 } 283 }
329 284
330 void AshDevToolsDOMAgent::RemoveViewNode(views::View* view, 285 void AshDevToolsDOMAgent::RemoveViewNode(views::View* view,
331 views::View* parent, 286 views::View* parent,
332 bool remove_observer) { 287 bool remove_observer) {
333 ViewToNodeIdMap::iterator view_to_node_id_it = 288 ViewToNodeIdMap::iterator view_to_node_id_it =
334 view_to_node_id_map_.find(view); 289 view_to_node_id_map_.find(view);
335 DCHECK(view_to_node_id_it != view_to_node_id_map_.end()); 290 DCHECK(view_to_node_id_it != view_to_node_id_map_.end());
336 291
337 int node_id = view_to_node_id_it->second; 292 int node_id = view_to_node_id_it->second;
338 int parent_id = 0; 293 int parent_id = 0;
339 if (parent) 294 if (parent)
340 parent_id = GetNodeIdFromView(parent); 295 parent_id = GetNodeIdFromView(parent);
341 else // views::RootView 296 else // views::RootView
342 parent_id = GetNodeIdFromWidget(view->GetWidget()); 297 parent_id = GetNodeIdFromWidget(view->GetWidget());
343 298
344 if (remove_observer) 299 // TODO(mhashmi): Add ViewObserver and remove it here based on
345 view->RemoveObserver(this); 300 // |remove_observer|
346 301
347 NodeIdToViewMap::iterator node_id_to_view_it = 302 NodeIdToViewMap::iterator node_id_to_view_it =
348 node_id_to_view_map_.find(node_id); 303 node_id_to_view_map_.find(node_id);
349 DCHECK(node_id_to_view_it != node_id_to_view_map_.end()); 304 DCHECK(node_id_to_view_it != node_id_to_view_map_.end());
350 305
351 view_to_node_id_map_.erase(view_to_node_id_it); 306 view_to_node_id_map_.erase(view_to_node_id_it);
352 node_id_to_view_map_.erase(node_id_to_view_it); 307 node_id_to_view_map_.erase(node_id_to_view_it);
353 frontend()->childNodeRemoved(parent_id, node_id); 308 frontend()->childNodeRemoved(parent_id, node_id);
354 } 309 }
355 310
356 void AshDevToolsDOMAgent::RemoveObservers() { 311 void AshDevToolsDOMAgent::RemoveObserverFromAllWindows() {
357 for (auto& pair : window_to_node_id_map_) 312 for (auto& pair : window_to_node_id_map_)
358 pair.first->RemoveObserver(this); 313 pair.first->RemoveObserver(this);
359 for (auto& pair : widget_to_node_id_map_)
360 pair.first->RemoveRemovalsObserver(this);
361 for (auto& pair : view_to_node_id_map_)
362 pair.first->RemoveObserver(this);
363 } 314 }
364 315
365 void AshDevToolsDOMAgent::Reset() { 316 void AshDevToolsDOMAgent::Reset() {
366 RemoveObservers(); 317 RemoveObserverFromAllWindows();
367 window_to_node_id_map_.clear(); 318 window_to_node_id_map_.clear();
368 widget_to_node_id_map_.clear(); 319 widget_to_node_id_map_.clear();
369 view_to_node_id_map_.clear(); 320 view_to_node_id_map_.clear();
370 node_id_to_window_map_.clear(); 321 node_id_to_window_map_.clear();
371 node_id_to_widget_map_.clear(); 322 node_id_to_widget_map_.clear();
372 node_id_to_view_map_.clear(); 323 node_id_to_view_map_.clear();
373 node_ids = 1; 324 node_ids = 1;
374 } 325 }
375 326
376 } // namespace devtools 327 } // namespace devtools
377 } // namespace ash 328 } // namespace ash
OLDNEW
« no previous file with comments | « ash/common/devtools/ash_devtools_dom_agent.h ('k') | ash/common/devtools/ash_devtools_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698