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

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

Issue 2491983002: [DevTools] reworked JavaScriptBreakpointsSidebarPane.js (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 | « third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/script-formatter-breakpoints-3.html ('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 (c) 2015 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2015 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.ContextFlavorListener} 5 * @implements {WebInspector.ContextFlavorListener}
6 * @unrestricted 6 * @unrestricted
7 */ 7 */
8 WebInspector.JavaScriptBreakpointsSidebarPane = class extends WebInspector.VBox { 8 WebInspector.JavaScriptBreakpointsSidebarPane = class extends WebInspector.VBox {
9 constructor() { 9 constructor() {
10 super(); 10 super();
11 this.registerRequiredCSS('components/breakpointsList.css'); 11 this.registerRequiredCSS('components/breakpointsList.css');
12 12
13 this._breakpointManager = WebInspector.breakpointManager; 13 this._breakpointManager = WebInspector.breakpointManager;
14 14 this._locationSymbol = Symbol('location');
lushnikov 2016/11/11 04:24:53 let's make this static
kozy 2016/11/11 17:21:13 Done.
15 /** @type {!Map<!WebInspector.UISourceCode, !Map<number, !WebInspector.JavaS criptBreakpointsSidebarPane.BreakpointItem>>} */
16 this._items = new Map();
15 this._listElement = createElementWithClass('ol', 'breakpoint-list'); 17 this._listElement = createElementWithClass('ol', 'breakpoint-list');
18 /** @type {!Map<string, !WebInspector.UILocation>} */
19 this._scheduledUpdates = new Map();
16 20
17 this.emptyElement = this.element.createChild('div', 'gray-info-message'); 21 this.emptyElement = this.element.createChild('div', 'gray-info-message');
18 this.emptyElement.textContent = WebInspector.UIString('No Breakpoints'); 22 this.emptyElement.textContent = WebInspector.UIString('No Breakpoints');
23 this.emptyElement.addEventListener('contextmenu', this._emptyElementContextM enu.bind(this), true);
19 24
20 this._items = new Map(); 25 this._breakpointManager.addEventListener(
26 WebInspector.BreakpointManager.Events.BreakpointAdded, this._breakpointC hanged.bind(this), this);
27 this._breakpointManager.addEventListener(
28 WebInspector.BreakpointManager.Events.BreakpointRemoved, this._breakpoin tChanged.bind(this), this);
29 this._breakpointManager.addEventListener(
30 WebInspector.BreakpointManager.Events.BreakpointsActiveStateChanged, thi s._breakpointsActiveStateChanged, this);
21 31
22 var breakpointLocations = this._breakpointManager.allBreakpointLocations(); 32 var breakpointLocations = this._breakpointManager.allBreakpointLocations();
23 for (var i = 0; i < breakpointLocations.length; ++i) 33 for (var i = 0; i < breakpointLocations.length; ++i)
24 this._addBreakpoint(breakpointLocations[i].breakpoint, breakpointLocations [i].uiLocation); 34 this._scheduleUpdate(breakpointLocations[i].uiLocation);
25 35
26 this._breakpointManager.addEventListener(
27 WebInspector.BreakpointManager.Events.BreakpointAdded, this._breakpointA dded, this);
28 this._breakpointManager.addEventListener(
29 WebInspector.BreakpointManager.Events.BreakpointRemoved, this._breakpoin tRemoved, this);
30
31 this.emptyElement.addEventListener('contextmenu', this._emptyElementContextM enu.bind(this), true);
32 this._breakpointManager.addEventListener(
33 WebInspector.BreakpointManager.Events.BreakpointsActiveStateChanged, thi s._breakpointsActiveStateChanged, this);
34 this._breakpointsActiveStateChanged(); 36 this._breakpointsActiveStateChanged();
35 this._update(); 37 this._update();
36 } 38 }
37 39
38 _emptyElementContextMenu(event) { 40 _emptyElementContextMenu(event) {
39 var contextMenu = new WebInspector.ContextMenu(event); 41 var contextMenu = new WebInspector.ContextMenu(event);
40 this._appendBreakpointActiveItem(contextMenu); 42 this._appendBreakpointActiveItem(contextMenu);
41 contextMenu.show(); 43 contextMenu.show();
42 } 44 }
43 45
44 /** 46 /**
45 * @param {!WebInspector.ContextMenu} contextMenu 47 * @param {!WebInspector.ContextMenu} contextMenu
46 */ 48 */
47 _appendBreakpointActiveItem(contextMenu) { 49 _appendBreakpointActiveItem(contextMenu) {
48 var breakpointActive = this._breakpointManager.breakpointsActive(); 50 var breakpointActive = this._breakpointManager.breakpointsActive();
49 var breakpointActiveTitle = breakpointActive ? WebInspector.UIString.capital ize('Deactivate ^breakpoints') : 51 var breakpointActiveTitle = breakpointActive ? WebInspector.UIString.capital ize('Deactivate breakpoints') :
50 WebInspector.UIString.capital ize('Activate ^breakpoints'); 52 WebInspector.UIString.capital ize('Activate breakpoints');
51 contextMenu.appendItem( 53 contextMenu.appendItem(
52 breakpointActiveTitle, 54 breakpointActiveTitle,
53 this._breakpointManager.setBreakpointsActive.bind(this._breakpointManage r, !breakpointActive)); 55 this._breakpointManager.setBreakpointsActive.bind(this._breakpointManage r, !breakpointActive));
54 } 56 }
55 57
56 /** 58 /**
57 * @param {!WebInspector.Event} event 59 * @param {!WebInspector.Event} event
58 */ 60 */
59 _breakpointAdded(event) { 61 _breakpointChanged(event) {
60 this._breakpointRemoved(event); 62 this._scheduleUpdate(/** @type {!WebInspector.UILocation} */ (event.data.uiL ocation));
61
62 var breakpoint = /** @type {!WebInspector.BreakpointManager.Breakpoint} */ ( event.data.breakpoint);
63 var uiLocation = /** @type {!WebInspector.UILocation} */ (event.data.uiLocat ion);
64 this._addBreakpoint(breakpoint, uiLocation);
65 } 63 }
66 64
67 /** 65 /**
68 * @param {!WebInspector.BreakpointManager.Breakpoint} breakpoint
69 * @param {!WebInspector.UILocation} uiLocation 66 * @param {!WebInspector.UILocation} uiLocation
70 */ 67 */
71 _addBreakpoint(breakpoint, uiLocation) { 68 _scheduleUpdate(uiLocation) {
69 var locationDescriptor = uiLocation.uiSourceCode.url() + ':' + uiLocation.li neNumber;
70 if (this._scheduledUpdates.has(locationDescriptor))
71 return;
72 if (!this._scheduledUpdates.size)
73 setImmediate(this._updateBreakpointItems.bind(this));
74 this._scheduledUpdates.set(locationDescriptor, uiLocation);
75 }
76
77 _updateBreakpointItems() {
78 for (var uiLocation of this._scheduledUpdates.valuesArray()) {
79 var breakpoints = this._breakpointManager.findBreakpoints(uiLocation.uiSou rceCode, uiLocation.lineNumber);
80 var hasEnabled = breakpoints.some(breakpoint => breakpoint.enabled());
81 var hasDisabled = breakpoints.some(breakpoint => !breakpoint.enabled());
82 if (breakpoints.length)
83 this._addBreakpointItem(uiLocation, hasEnabled, hasDisabled);
84 else
85 this._removeBreakpointItem(uiLocation);
86 }
87 this._scheduledUpdates.clear();
88 this._breakpointsWasUpdatedForTest();
89 }
90
91 _breakpointsWasUpdatedForTest() {
92 }
93
94 /**
95 * @param {!WebInspector.UILocation} uiLocation
96 * @param {boolean} hasEnabled
97 * @param {boolean} hasDisabled
98 */
99 _addBreakpointItem(uiLocation, hasEnabled, hasDisabled) {
100 if (!this._items.has(uiLocation.uiSourceCode))
101 this._items.set(uiLocation.uiSourceCode, new Map());
102 var uiSourceCodeItems = this._items.get(uiLocation.uiSourceCode);
103 if (!uiSourceCodeItems.has(uiLocation.lineNumber)) {
104 var breakpointItem = this._createBreakpointItem(uiLocation);
105
106 var newElementLocation = breakpointItem.element[this._locationSymbol];
107 var currentElement = this._listElement.firstChild;
108 while (currentElement) {
109 var currentElementLocation = currentElement[this._locationSymbol];
110 if (currentElementLocation && currentElementLocation.compareTo(newElemen tLocation) > 0)
111 break;
112 currentElement = currentElement.nextSibling;
113 }
114 this._addListElement(breakpointItem.element, currentElement);
115
116 uiSourceCodeItems.set(uiLocation.lineNumber, breakpointItem);
117 }
118 var breakpointItem = uiSourceCodeItems.get(uiLocation.lineNumber);
119 breakpointItem.checkbox.checked = hasEnabled;
120 breakpointItem.checkbox.indeterminate = hasEnabled && hasDisabled;
121 }
122
123 /**
124 * @param {!WebInspector.UILocation} uiLocation
125 * @return {!WebInspector.JavaScriptBreakpointsSidebarPane.BreakpointItem}
126 */
127 _createBreakpointItem(uiLocation) {
72 var element = createElementWithClass('li', 'cursor-pointer'); 128 var element = createElementWithClass('li', 'cursor-pointer');
73 element.addEventListener('contextmenu', this._breakpointContextMenu.bind(thi s, breakpoint), true); 129 element.addEventListener('contextmenu', this._breakpointContextMenu.bind(thi s, uiLocation), true);
74 element.addEventListener('click', this._breakpointClicked.bind(this, uiLocat ion), false); 130 element.addEventListener('click', this._breakpointClicked.bind(this, uiLocat ion), false);
131 element[this._locationSymbol] = uiLocation;
75 132
76 var checkboxLabel = createCheckboxLabel(uiLocation.linkText(), breakpoint.en abled()); 133 var checkboxLabel = createCheckboxLabel(uiLocation.linkText(), false);
77 element.appendChild(checkboxLabel); 134 element.appendChild(checkboxLabel);
78 checkboxLabel.addEventListener('click', this._breakpointCheckboxClicked.bind (this, breakpoint), false); 135 checkboxLabel.addEventListener('click', this._breakpointCheckboxClicked.bind (this, uiLocation), false);
79 136
80 var snippetElement = element.createChild('div', 'source-text monospace'); 137 var snippetElement = element.createChild('div', 'source-text monospace');
138 uiLocation.uiSourceCode.requestContent().then(fillSnippetElement.bind(this, snippetElement));
81 139
82 /** 140 /**
141 * @param {!Element} snippetElement
83 * @param {?string} content 142 * @param {?string} content
84 * @this {WebInspector.JavaScriptBreakpointsSidebarPane} 143 * @this {WebInspector.JavaScriptBreakpointsSidebarPane}
85 */ 144 */
86 function didRequestContent(content) { 145 function fillSnippetElement(snippetElement, content) {
87 var lineNumber = uiLocation.lineNumber; 146 var lineNumber = uiLocation.lineNumber;
88 var columnNumber = uiLocation.columnNumber;
89 var text = new WebInspector.Text(content || ''); 147 var text = new WebInspector.Text(content || '');
90 if (lineNumber < text.lineCount()) { 148 if (lineNumber < text.lineCount()) {
91 var lineText = text.lineAt(lineNumber); 149 var lineText = text.lineAt(lineNumber);
92 var maxSnippetLength = 200; 150 var maxSnippetLength = 200;
93 var snippetStartIndex = columnNumber > 100 ? columnNumber : 0; 151 snippetElement.textContent = lineText.substr(0).trimEnd(maxSnippetLength );
94 snippetElement.textContent = lineText.substr(snippetStartIndex).trimEnd( maxSnippetLength);
95 } 152 }
96 this.didReceiveBreakpointLineForTest(uiLocation.uiSourceCode, lineNumber, columnNumber); 153 this.didReceiveBreakpointLineForTest(uiLocation.uiSourceCode, lineNumber, 0);
97 } 154 }
98 155
99 uiLocation.uiSourceCode.requestContent().then(didRequestContent.bind(this)); 156 return { element: element, checkbox: checkboxLabel.checkboxElement };
100
101 element._data = uiLocation;
102 var currentElement = this._listElement.firstChild;
103 while (currentElement) {
104 if (currentElement._data && this._compareBreakpoints(currentElement._data, element._data) > 0)
105 break;
106 currentElement = currentElement.nextSibling;
107 }
108 this._addListElement(element, currentElement);
109
110 var breakpointItem = {element: element, checkbox: checkboxLabel.checkboxElem ent};
111 this._items.set(breakpoint, breakpointItem);
112 } 157 }
113 158
114 /** 159 /**
160 * @param {!WebInspector.UILocation} uiLocation
161 */
162 _removeBreakpointItem(uiLocation) {
163 var uiSourceCodeItems = this._items.get(uiLocation.uiSourceCode);
164 if (!uiSourceCodeItems)
165 return;
166 var breakpointItem = uiSourceCodeItems.get(uiLocation.lineNumber);
167 if (!breakpointItem)
168 return;
169 uiSourceCodeItems.delete(uiLocation.lineNumber);
170 if (!uiSourceCodeItems.size)
171 this._items.delete(uiLocation.uiSourceCode);
172 this._removeListElement(breakpointItem.element);
173 }
174
175 /**
115 * @param {!WebInspector.UISourceCode} uiSourceCode 176 * @param {!WebInspector.UISourceCode} uiSourceCode
116 * @param {number} lineNumber 177 * @param {number} lineNumber
117 * @param {number} columnNumber 178 * @param {number} columnNumber
118 */ 179 */
119 didReceiveBreakpointLineForTest(uiSourceCode, lineNumber, columnNumber) { 180 didReceiveBreakpointLineForTest(uiSourceCode, lineNumber, columnNumber) {
120 } 181 }
121 182
122 /** 183 /**
123 * @param {!WebInspector.Event} event
124 */
125 _breakpointRemoved(event) {
126 var breakpoint = /** @type {!WebInspector.BreakpointManager.Breakpoint} */ ( event.data.breakpoint);
127 var breakpointItem = this._items.get(breakpoint);
128 if (!breakpointItem)
129 return;
130 this._items.remove(breakpoint);
131 this._removeListElement(breakpointItem.element);
132 }
133
134 /**
135 * @override 184 * @override
136 * @param {?Object} object 185 * @param {?Object} object
137 */ 186 */
138 flavorChanged(object) { 187 flavorChanged(object) {
139 this._update(); 188 this._update();
140 } 189 }
141 190
142 _update() { 191 _update() {
143 var details = WebInspector.context.flavor(WebInspector.DebuggerPausedDetails ); 192 var details = WebInspector.context.flavor(WebInspector.DebuggerPausedDetails );
144 var uiLocation = details && details.callFrames.length ? 193 var uiLocation = details && details.callFrames.length ?
145 WebInspector.debuggerWorkspaceBinding.rawLocationToUILocation(details.ca llFrames[0].location()) : 194 WebInspector.debuggerWorkspaceBinding.rawLocationToUILocation(details.ca llFrames[0].location()) :
146 null; 195 null;
147 var breakpoint = uiLocation ? 196 var breakpointItem;
148 this._breakpointManager.findBreakpoint( 197 if (uiLocation && this._items.has(uiLocation.uiSourceCode)) {
149 uiLocation.uiSourceCode, uiLocation.lineNumber, uiLocation.columnNum ber) : 198 var uiSourceCodeItems = this._items.get(uiLocation.uiSourceCode);
150 null; 199 breakpointItem = uiSourceCodeItems.get(uiLocation.lineNumber) || null;
151 var breakpointItem = this._items.get(breakpoint); 200 }
152 if (!breakpointItem) { 201 if (!breakpointItem) {
153 if (this._highlightedBreakpointItem) { 202 if (this._highlightedBreakpointItem) {
154 this._highlightedBreakpointItem.element.classList.remove('breakpoint-hit '); 203 this._highlightedBreakpointItem.element.classList.remove('breakpoint-hit ');
155 delete this._highlightedBreakpointItem; 204 delete this._highlightedBreakpointItem;
156 } 205 }
157 return; 206 return;
158 } 207 }
159 208
160 breakpointItem.element.classList.add('breakpoint-hit'); 209 breakpointItem.element.classList.add('breakpoint-hit');
161 this._highlightedBreakpointItem = breakpointItem; 210 this._highlightedBreakpointItem = breakpointItem;
162 WebInspector.viewManager.showView('sources.jsBreakpoints'); 211 WebInspector.viewManager.showView('sources.jsBreakpoints');
163 } 212 }
164 213
165 _breakpointsActiveStateChanged() { 214 _breakpointsActiveStateChanged() {
166 this._listElement.classList.toggle('breakpoints-list-deactivated', !this._br eakpointManager.breakpointsActive()); 215 this._listElement.classList.toggle('breakpoints-list-deactivated', !this._br eakpointManager.breakpointsActive());
167 } 216 }
168 217
169 /** 218 /**
170 * @param {!WebInspector.UILocation} uiLocation 219 * @param {!WebInspector.UILocation} uiLocation
171 */ 220 */
172 _breakpointClicked(uiLocation) { 221 _breakpointClicked(uiLocation) {
173 WebInspector.Revealer.reveal(uiLocation); 222 WebInspector.Revealer.reveal(uiLocation);
174 } 223 }
175 224
176 /** 225 /**
177 * @param {!WebInspector.BreakpointManager.Breakpoint} breakpoint 226 * @param {!WebInspector.UILocation} uiLocation
178 * @param {!Event} event 227 * @param {!Event} event
179 */ 228 */
180 _breakpointCheckboxClicked(breakpoint, event) { 229 _breakpointCheckboxClicked(uiLocation, event) {
181 // Breakpoint element has it's own click handler. 230 // Breakpoint element has it's own click handler.
182 event.consume(); 231 event.consume();
183 breakpoint.setEnabled(event.target.checkboxElement.checked); 232 var breakpoints = this._breakpointManager.findBreakpoints(uiLocation.uiSourc eCode, uiLocation.lineNumber);
233 var newState = event.target.checkboxElement.checked;
234 for (var breakpoint of breakpoints)
235 breakpoint.setEnabled(newState);
184 } 236 }
185 237
186 /** 238 /**
187 * @param {!WebInspector.BreakpointManager.Breakpoint} breakpoint 239 * @param {!WebInspector.UILocation} uiLocation
188 * @param {!Event} event 240 * @param {!Event} event
189 */ 241 */
190 _breakpointContextMenu(breakpoint, event) { 242 _breakpointContextMenu(uiLocation, event) {
191 var breakpoints = this._items.valuesArray(); 243 var breakpoints = this._breakpointManager.findBreakpoints(uiLocation.uiSourc eCode, uiLocation.lineNumber);
244
192 var contextMenu = new WebInspector.ContextMenu(event); 245 var contextMenu = new WebInspector.ContextMenu(event);
193 contextMenu.appendItem(WebInspector.UIString.capitalize('Remove ^breakpoint' ), breakpoint.remove.bind(breakpoint)); 246 contextMenu.appendItem(WebInspector.UIString.capitalize('Remove breakpoints in line'), () => breakpoints.map(breakpoint => breakpoint.remove()));
194 if (breakpoints.length > 1) { 247
195 var removeAllTitle = WebInspector.UIString.capitalize('Remove ^all ^breakp oints'); 248 var removeAllTitle = WebInspector.UIString.capitalize('Remove all breakpoint s');
196 contextMenu.appendItem( 249 contextMenu.appendItem(
197 removeAllTitle, this._breakpointManager.removeAllBreakpoints.bind(this ._breakpointManager)); 250 removeAllTitle, this._breakpointManager.removeAllBreakpoints.bind(this._ breakpointManager));
198 }
199 251
200 contextMenu.appendSeparator(); 252 contextMenu.appendSeparator();
201 this._appendBreakpointActiveItem(contextMenu); 253 this._appendBreakpointActiveItem(contextMenu);
202 254
203 function enabledBreakpointCount(breakpoints) { 255 contextMenu.appendSeparator();
204 var count = 0; 256
205 for (var i = 0; i < breakpoints.length; ++i) { 257 if (breakpoints.some(breakpoint => !breakpoint.enabled())) {
206 if (breakpoints[i].checkbox.checked) 258 var enableTitle = WebInspector.UIString.capitalize('Enable all breakpoints ');
207 count++; 259 contextMenu.appendItem(
208 } 260 enableTitle, this._breakpointManager.toggleAllBreakpoints.bind(this._b reakpointManager, true));
209 return count;
210 } 261 }
211 if (breakpoints.length > 1) { 262 if (breakpoints.some(breakpoint => breakpoint.enabled())) {
212 var enableBreakpointCount = enabledBreakpointCount(breakpoints); 263 var disableTitle = WebInspector.UIString.capitalize('Disable all breakpoin ts');
213 var enableTitle = WebInspector.UIString.capitalize('Enable ^all ^breakpoin ts');
214 var disableTitle = WebInspector.UIString.capitalize('Disable ^all ^breakpo ints');
215
216 contextMenu.appendSeparator();
217
218 contextMenu.appendItem( 264 contextMenu.appendItem(
219 enableTitle, this._breakpointManager.toggleAllBreakpoints.bind(this._b reakpointManager, true), 265 disableTitle, this._breakpointManager.toggleAllBreakpoints.bind(this._ breakpointManager, false));
220 !(enableBreakpointCount !== breakpoints.length));
221 contextMenu.appendItem(
222 disableTitle, this._breakpointManager.toggleAllBreakpoints.bind(this._ breakpointManager, false),
223 !(enableBreakpointCount > 1));
224 } 266 }
225
226 contextMenu.show(); 267 contextMenu.show();
227 } 268 }
228 269
229 _addListElement(element, beforeElement) { 270 _addListElement(element, beforeElement) {
230 if (beforeElement) 271 if (beforeElement)
231 this._listElement.insertBefore(element, beforeElement); 272 this._listElement.insertBefore(element, beforeElement);
232 else { 273 else {
233 if (!this._listElement.firstChild) { 274 if (!this._listElement.firstChild) {
234 this.element.removeChild(this.emptyElement); 275 this.element.removeChild(this.emptyElement);
235 this.element.appendChild(this._listElement); 276 this.element.appendChild(this._listElement);
236 } 277 }
237 this._listElement.appendChild(element); 278 this._listElement.appendChild(element);
238 } 279 }
239 } 280 }
240 281
241 _removeListElement(element) { 282 _removeListElement(element) {
242 this._listElement.removeChild(element); 283 this._listElement.removeChild(element);
243 if (!this._listElement.firstChild) { 284 if (!this._listElement.firstChild) {
244 this.element.removeChild(this._listElement); 285 this.element.removeChild(this._listElement);
245 this.element.appendChild(this.emptyElement); 286 this.element.appendChild(this.emptyElement);
246 } 287 }
247 } 288 }
248 289
249 _compare(x, y) {
250 if (x !== y)
251 return x < y ? -1 : 1;
252 return 0;
253 }
254
255 _compareBreakpoints(b1, b2) {
256 return this._compare(b1.uiSourceCode.url(), b2.uiSourceCode.url()) || this._ compare(b1.lineNumber, b2.lineNumber);
257 }
258
259 reset() { 290 reset() {
260 this._listElement.removeChildren(); 291 this._listElement.removeChildren();
261 if (this._listElement.parentElement) { 292 if (this._listElement.parentElement) {
262 this.element.removeChild(this._listElement); 293 this.element.removeChild(this._listElement);
263 this.element.appendChild(this.emptyElement); 294 this.element.appendChild(this.emptyElement);
264 } 295 }
265 this._items.clear(); 296 this._items.clear();
266 } 297 }
267 }; 298 };
299
300 /** @typedef {{ element: !Element, checkbox: !Element}} */
301 WebInspector.JavaScriptBreakpointsSidebarPane.BreakpointItem;
OLDNEW
« no previous file with comments | « third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/script-formatter-breakpoints-3.html ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698