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

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

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

Powered by Google App Engine
This is Rietveld 408576698