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

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/sources/ThreadsSidebarPane.js

Issue 2431223003: [DevTools]: Require explicit connection (Closed)
Patch Set: Comments were addressed 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
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 * @implements {WebInspector.TargetManager.Observer} 5 * @implements {WebInspector.TargetManager.Observer}
6 * @unrestricted 6 * @unrestricted
7 */ 7 */
8 WebInspector.ThreadsSidebarPane = class extends WebInspector.VBox { 8 WebInspector.ThreadsSidebarPane = class extends WebInspector.VBox {
9 constructor() { 9 constructor() {
10 super(); 10 super();
11 11
12 /** @type {!Map.<!WebInspector.DebuggerModel, !WebInspector.UIList.Item>} */
13 this._debuggerModelToListItems = new Map();
14 /** @type {!Map.<!WebInspector.UIList.Item, !WebInspector.Target>} */
15 this._listItemsToTargets = new Map();
16 /** @type {?WebInspector.UIList.Item} */ 12 /** @type {?WebInspector.UIList.Item} */
17 this._selectedListItem = null; 13 this._selectedListItem = null;
14 /** @type {!Map<!WebInspector.PendingTarget, !WebInspector.UIList.Item>} */
15 this._pendingToListItem = new Map();
16 /** @type {!Map<!WebInspector.Target, !WebInspector.PendingTarget>} */
17 this._targetToPending = new Map();
18 /** @type {?WebInspector.PendingTarget} */
19 this._mainTargetPending = null;
18 this.threadList = new WebInspector.UIList(); 20 this.threadList = new WebInspector.UIList();
19 this.threadList.show(this.element); 21 this.threadList.show(this.element);
20 WebInspector.targetManager.addModelListener( 22 WebInspector.targetManager.addModelListener(
21 WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.DebuggerPa used, this._onDebuggerStateChanged, 23 WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.DebuggerPa used, this._onDebuggerStateChanged,
22 this); 24 this);
23 WebInspector.targetManager.addModelListener( 25 WebInspector.targetManager.addModelListener(
24 WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.DebuggerRe sumed, this._onDebuggerStateChanged, 26 WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.DebuggerRe sumed, this._onDebuggerStateChanged,
25 this); 27 this);
26 WebInspector.targetManager.addModelListener( 28 WebInspector.targetManager.addModelListener(
27 WebInspector.RuntimeModel, WebInspector.RuntimeModel.Events.ExecutionCon textChanged, 29 WebInspector.RuntimeModel, WebInspector.RuntimeModel.Events.ExecutionCon textChanged,
28 this._onExecutionContextChanged, this); 30 this._onExecutionContextChanged, this);
29 WebInspector.context.addFlavorChangeListener(WebInspector.Target, this._targ etChanged, this); 31 WebInspector.context.addFlavorChangeListener(WebInspector.Target, this._targ etChanged, this);
30 WebInspector.targetManager.addEventListener( 32 WebInspector.targetManager.addEventListener(
31 WebInspector.TargetManager.Events.NameChanged, this._targetNameChanged, this); 33 WebInspector.TargetManager.Events.NameChanged, this._targetNameChanged, this);
34 WebInspector.targetManager.addModelListener(WebInspector.SubTargetsManager, WebInspector.SubTargetsManager.Events.SubTargetAdded, this._subTargetAdded, this );
35 WebInspector.targetManager.addModelListener(WebInspector.SubTargetsManager, WebInspector.SubTargetsManager.Events.SubTargetRemoved, this._subTargetRemoved, this);
36 WebInspector.targetManager.addModelListener(WebInspector.SubTargetsManager, WebInspector.SubTargetsManager.Events.SubTargetAttached, this._subTargetAdded, t his);
37 WebInspector.targetManager.addModelListener(WebInspector.SubTargetsManager, WebInspector.SubTargetsManager.Events.SubTargetDetached, this._targetDetached, t his);
32 WebInspector.targetManager.observeTargets(this); 38 WebInspector.targetManager.observeTargets(this);
39
40 var pendingTargets = [];
41 for (var target of WebInspector.targetManager.targets(WebInspector.Target.Ca pability.Target))
42 pendingTargets = pendingTargets.concat(WebInspector.SubTargetsManager.from Target(target).pendingTargets());
43
44 pendingTargets
45 .sort(WebInspector.ThreadsSidebarPane._subTargetsComparator)
46 .forEach(pendingTarget => this._addListItem(pendingTarget));
47 }
48
49 /**
50 * @return {boolean}
51 */
52 static shouldBeShown() {
53 if (WebInspector.targetManager.targets(WebInspector.Target.Capability.JS).le ngth > 1)
54 return true;
55 for (var target of WebInspector.targetManager.targets(WebInspector.Target.Ca pability.Target)) {
56 var pendingTargets = WebInspector.SubTargetsManager.fromTarget(target).pen dingTargets();
57 if (pendingTargets.some(pendingTarget => pendingTarget.canConnect()))
58 return true;
59 }
60 return false;
61 }
62
63 /**
64 * Sorts show tha connected targets appear first, followed by pending subtarge ts.
65 *
66 * @param {!WebInspector.PendingTarget} c1
67 * @param {!WebInspector.PendingTarget} c2
68 * @return {number}
69 */
70 static _subTargetsComparator(c1, c2)
71 {
72 var t1 = c1.target();
73 var t2 = c2.target();
74 var name1 = t1 ? t1.name() : c1.name();
75 var name2 = t2 ? t2.name() : c2.name();
76 if (!!t1 === !!t2) { // Either both are connected or disconnected
77 return name1.toLowerCase().localeCompare(name2.toLowerCase());
78 } else if (t1) {
79 return -1;
80 }
81 return 1;
82 }
83
84 /**
85 * @param {!WebInspector.Event} event
86 */
87 _subTargetAdded(event) {
88 this._addListItem(/** @type {!WebInspector.PendingTarget} */ (event.data));
89 }
90
91 /**
92 * @param {!WebInspector.Event} event
93 */
94 _subTargetRemoved(event) {
95 this._removeListItem(/** @type {!WebInspector.PendingTarget} */ (event.data) );
96 }
97
98 /**
99 * @param {!WebInspector.Event} event
100 */
101 _targetDetached(event) {
102 this._targetRemoved(/** @type {!WebInspector.PendingTarget} */ (event.data)) ;
103 }
104
105 /**
106 * @param {!WebInspector.PendingTarget} pendingTarget
107 */
108 _addListItem(pendingTarget) {
109 var target = pendingTarget.target();
110 if (!pendingTarget.canConnect() && !(target && target.hasJSCapability()))
111 return;
112
113 var listItem = this._pendingToListItem.get(pendingTarget);
114 if (!listItem) {
115 listItem = new WebInspector.UIList.Item('', '', false);
116 listItem[WebInspector.ThreadsSidebarPane._pendingTargetSymbol] = pendingTa rget;
117 listItem[WebInspector.ThreadsSidebarPane._targetSymbol] = target;
118 this._pendingToListItem.set(pendingTarget, listItem);
119 this.threadList.addItem(listItem);
120 listItem.element.addEventListener('click', this._onListItemClick.bind(this , listItem), false);
121 }
122 this._updateListItem(listItem, pendingTarget);
123 this._updateDebuggerState(pendingTarget);
124 var currentTarget = WebInspector.context.flavor(WebInspector.Target);
125 if (currentTarget === target)
126 this._selectListItem(listItem);
127 if (target)
128 this._targetToPending.set(target, pendingTarget);
33 } 129 }
34 130
35 /** 131 /**
36 * @override 132 * @override
37 * @param {!WebInspector.Target} target 133 * @param {!WebInspector.Target} target
38 */ 134 */
39 targetAdded(target) { 135 targetAdded(target) {
40 var debuggerModel = WebInspector.DebuggerModel.fromTarget(target); 136 if (target !== WebInspector.targetManager.mainTarget())
41 if (!debuggerModel)
42 return; 137 return;
43 138 console.assert(!this._mainTargetPending);
44 var listItem = new WebInspector.UIList.Item(this._titleForTarget(target), '' ); 139 this._mainTargetPending = new WebInspector.ThreadsSidebarPane.MainTargetConn ection(target);
45 listItem.element.addEventListener('click', this._onListItemClick.bind(this, listItem), false); 140 this._addListItem(this._mainTargetPending);
46 var currentTarget = WebInspector.context.flavor(WebInspector.Target);
47 if (currentTarget === target)
48 this._selectListItem(listItem);
49
50 this._debuggerModelToListItems.set(debuggerModel, listItem);
51 this._listItemsToTargets.set(listItem, target);
52 this.threadList.addItem(listItem);
53 this._updateDebuggerState(debuggerModel);
54 } 141 }
55 142
56 /** 143 /**
57 * @override 144 * @override
58 * @param {!WebInspector.Target} target 145 * @param {!WebInspector.Target} target
59 */ 146 */
60 targetRemoved(target) { 147 targetRemoved(target) {
61 var debuggerModel = WebInspector.DebuggerModel.fromTarget(target); 148 var subtargetManager = WebInspector.SubTargetsManager.fromTarget(target);
62 if (!debuggerModel) 149 var pendingTargets = subtargetManager ? subtargetManager.pendingTargets() : [];
63 return; 150 for (var pendingTarget of pendingTargets) {
64 var listItem = this._debuggerModelToListItems.remove(debuggerModel); 151 if (pendingTarget.target())
65 if (listItem) { 152 this._targetRemoved(pendingTarget);
66 this._listItemsToTargets.remove(listItem);
67 this.threadList.removeItem(listItem);
68 } 153 }
154 if (target === WebInspector.targetManager.mainTarget() && this._mainTargetPe nding)
155 this._targetRemoved(this._mainTargetPending);
dgozman 2016/11/03 21:21:30 this._mainTargetPending = null;
eostroukhov 2016/11/03 22:44:50 Thanks! Missed that one.
69 } 156 }
70 157
71 /** 158 /**
72 * @param {!WebInspector.Event} event 159 * @param {!WebInspector.Event} event
73 */ 160 */
74 _targetNameChanged(event) { 161 _targetNameChanged(event) {
75 var target = /** @type {!WebInspector.Target} */ (event.data); 162 var target = /** @type {!WebInspector.Target} */ (event.data);
76 var listItem = this._listItemForTarget(target); 163 var listItem = this._listItemForTarget(target);
77 if (listItem) 164 if (listItem)
78 listItem.setTitle(this._titleForTarget(target)); 165 listItem.setTitle(this._titleForSubtarget(this._targetToPending.get(target )));
79 } 166 }
80 167
81 /** 168 /**
82 * @param {!WebInspector.Event} event 169 * @param {!WebInspector.Event} event
83 */ 170 */
84 _targetChanged(event) { 171 _targetChanged(event) {
85 var listItem = this._listItemForTarget(/** @type {!WebInspector.Target} */ ( event.data)); 172 var listItem = this._listItemForTarget(/** @type {!WebInspector.Target} */ ( event.data));
86 if (listItem) 173 if (listItem)
87 this._selectListItem(listItem); 174 this._selectListItem(listItem);
88 } 175 }
89 176
90 /** 177 /**
91 * @param {!WebInspector.Target} target 178 * @param {!WebInspector.Target} target
92 * @return {?WebInspector.UIList.Item} 179 * @return {?WebInspector.UIList.Item}
93 */ 180 */
94 _listItemForTarget(target) { 181 _listItemForTarget(target) {
95 var debuggerModel = WebInspector.DebuggerModel.fromTarget(target); 182 var pendingTarget = this._targetToPending.get(target);
96 if (!debuggerModel) 183 return this._pendingToListItem.get(pendingTarget) || null;
97 return null;
98 return this._debuggerModelToListItems.get(debuggerModel) || null;
99 } 184 }
100 185
101 /** 186 /**
102 * @param {!WebInspector.Target} target 187 * @param {!WebInspector.PendingTarget} pendingTarget
103 * @return {string} 188 * @return {string}
104 */ 189 */
105 _titleForTarget(target) { 190 _titleForSubtarget(pendingTarget) {
dgozman 2016/11/03 21:21:30 _titleForPending
eostroukhov 2016/11/03 22:44:50 Done.
191 var target = pendingTarget.target();
192 if (!target)
193 return pendingTarget.name();
106 var executionContext = target.runtimeModel.defaultExecutionContext(); 194 var executionContext = target.runtimeModel.defaultExecutionContext();
107 return executionContext && executionContext.label() ? executionContext.label () : target.name(); 195 return executionContext && executionContext.label() ? executionContext.label () : target.name();
108 } 196 }
109 197
110 /** 198 /**
111 * @param {!WebInspector.Event} event 199 * @param {!WebInspector.Event} event
112 */ 200 */
113 _onDebuggerStateChanged(event) { 201 _onDebuggerStateChanged(event) {
114 var debuggerModel = /** @type {!WebInspector.DebuggerModel} */ (event.target ); 202 var debuggerModel = /** @type {!WebInspector.DebuggerModel} */ (event.target );
115 this._updateDebuggerState(debuggerModel); 203 var pendingTarget = this._targetToPending.get(debuggerModel.target());
204 this._updateDebuggerState(pendingTarget);
116 } 205 }
117 206
118 /** 207 /**
119 * @param {!WebInspector.Event} event 208 * @param {!WebInspector.Event} event
120 */ 209 */
121 _onExecutionContextChanged(event) { 210 _onExecutionContextChanged(event) {
122 var executionContext = /** @type {!WebInspector.ExecutionContext} */ (event. data); 211 var executionContext = /** @type {!WebInspector.ExecutionContext} */ (event. data);
123 if (!executionContext.isDefault) 212 if (!executionContext.isDefault)
124 return; 213 return;
125 var debuggerModel = 214 var pendingTarget = this._targetToPending.get(executionContext.target());
126 /** @type {!WebInspector.DebuggerModel} */ (WebInspector.DebuggerModel.f romTarget(executionContext.target())); 215 var listItem = this._pendingToListItem.get(pendingTarget);
127 var listItem = this._debuggerModelToListItems.get(debuggerModel);
128 if (listItem && executionContext.label()) 216 if (listItem && executionContext.label())
129 listItem.setTitle(executionContext.label()); 217 listItem.setTitle(executionContext.label());
130 } 218 }
131 219
132 /** 220 /**
133 * @param {!WebInspector.DebuggerModel} debuggerModel 221 * @param {!WebInspector.PendingTarget} pendingTarget
134 */ 222 */
135 _updateDebuggerState(debuggerModel) { 223 _updateDebuggerState(pendingTarget) {
136 var listItem = this._debuggerModelToListItems.get(debuggerModel); 224 var listItem = this._pendingToListItem.get(pendingTarget);
137 listItem.setSubtitle(WebInspector.UIString(debuggerModel.isPaused() ? 'pause d' : '')); 225 var target = pendingTarget.target();
226 var debuggerModel = target && WebInspector.DebuggerModel.fromTarget(target);
227 var isPaused = !!debuggerModel && debuggerModel.isPaused();
228 listItem.setSubtitle(WebInspector.UIString(isPaused ? 'paused' : ''));
138 } 229 }
139 230
140 /** 231 /**
141 * @param {!WebInspector.UIList.Item} listItem 232 * @param {!WebInspector.UIList.Item} listItem
142 */ 233 */
143 _selectListItem(listItem) { 234 _selectListItem(listItem) {
144 if (listItem === this._selectedListItem) 235 if (listItem === this._selectedListItem)
145 return; 236 return;
146 237
147 if (this._selectedListItem) 238 if (this._selectedListItem)
148 this._selectedListItem.setSelected(false); 239 this._selectedListItem.setSelected(false);
149 240
150 this._selectedListItem = listItem; 241 this._selectedListItem = listItem;
151 listItem.setSelected(true); 242 listItem.setSelected(true);
152 } 243 }
153 244
154 /** 245 /**
155 * @param {!WebInspector.UIList.Item} listItem 246 * @param {!WebInspector.UIList.Item} listItem
156 */ 247 */
157 _onListItemClick(listItem) { 248 _onListItemClick(listItem) {
158 WebInspector.context.setFlavor(WebInspector.Target, this._listItemsToTargets .get(listItem)); 249 var pendingTarget = listItem[WebInspector.ThreadsSidebarPane._pendingTargetS ymbol];
250 var target = pendingTarget.target();
251 if (!target)
252 return;
253 WebInspector.context.setFlavor(WebInspector.Target, target);
159 listItem.element.scrollIntoViewIfNeeded(); 254 listItem.element.scrollIntoViewIfNeeded();
160 } 255 }
256
257 /**
258 * @param {!WebInspector.UIList.Item} item
259 * @param {!WebInspector.PendingTarget} pendingTarget
260 */
261 _updateListItem(item, pendingTarget) {
262 item.setTitle(this._titleForSubtarget(pendingTarget));
263 item.setSubtitle('');
264 var target = pendingTarget.target();
265 var action = null;
266 var actionLabel = null;
267 if (pendingTarget.canConnect()) {
268 actionLabel = target ? 'Disconnect' : 'Connect';
269 action = this._toggleConnection.bind(this, pendingTarget);
270 }
271 item.setAction(actionLabel, action);
272 item.setDimmed(!target);
273 }
274
275 /**
276 * @param {!WebInspector.Target} target
277 */
278 _selectNewlyAddedTarget(target) {
279 setTimeout(() => WebInspector.context.setFlavor(WebInspector.Target, target) );
280 }
281
282 /**
283 * @param {!WebInspector.PendingTarget} pendingTarget
284 */
285 _toggleConnection(pendingTarget) {
286 var target = pendingTarget.target();
287 if (target)
288 pendingTarget.disconnect();
289 else
290 pendingTarget.connect().then(target => this._selectNewlyAddedTarget(target ));
291 }
292
293 /**
294 * @param {!WebInspector.PendingTarget} pendingTarget
295 */
296 _targetRemoved(pendingTarget) {
297 var item = this._pendingToListItem.get(pendingTarget);
298 if (!item) // Not all targets are represented in the UI.
299 return;
300 var target = item[WebInspector.ThreadsSidebarPane._targetSymbol];
301 item[WebInspector.ThreadsSidebarPane._targetSymbol] = null;
302 this._targetToPending.remove(target);
303 if (pendingTarget.canConnect())
304 this._updateListItem(item, pendingTarget);
305 else
306 this._removeListItem(pendingTarget);
307 }
308
309 /**
310 * @param {!WebInspector.PendingTarget} pendingTarget
311 */
312 _removeListItem(pendingTarget) {
313 var item = this._pendingToListItem.get(pendingTarget);
314 if (!item)
315 return;
316 this.threadList.removeItem(item);
317 this._pendingToListItem.delete(pendingTarget);
318 }
161 }; 319 };
320
321 WebInspector.ThreadsSidebarPane._pendingTargetSymbol = Symbol('_subtargetSymbol' );
322 WebInspector.ThreadsSidebarPane._targetSymbol = Symbol('_targetSymbol');
323
324 /**
325 * @unrestricted
326 */
327 WebInspector.ThreadsSidebarPane.MainTargetConnection = class extends WebInspecto r.PendingTarget {
328 /**
329 * @param {!WebInspector.Target} target
330 */
331 constructor(target) {
332 super('main-target-list-node-' + target.id(), target.title, false, null);
333 this._target = target;
334 }
335
336 /**
337 * @override
338 * @return {!WebInspector.Target}
339 */
340 target() {
341 return this._target;
342 }
343
344 /**
345 * @override
346 * @return {string}
347 */
348 name() {
349 return this._target.name();
350 }
351 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698