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

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

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