b237ca2f60e82da0a6022f1a138888a241c836f0
[WebKit-https.git] / Source / WebCore / inspector / front-end / BreakpointsSidebarPane.js
1 /*
2  * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 WebInspector.JavaScriptBreakpointsSidebarPane = function(title)
27 {
28     WebInspector.SidebarPane.call(this, WebInspector.UIString("Breakpoints"));
29
30     this.listElement = document.createElement("ol");
31     this.listElement.className = "breakpoint-list";
32
33     this.emptyElement = document.createElement("div");
34     this.emptyElement.className = "info";
35     this.emptyElement.textContent = WebInspector.UIString("No Breakpoints");
36
37     this.bodyElement.appendChild(this.emptyElement);
38
39     this._items = {};
40
41     WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.BreakpointAdded, this._breakpointAdded, this);
42     WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.BreakpointRemoved, this._breakpointRemoved, this);
43     WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerPaused, this._debuggerPaused, this);
44     WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerResumed, this._debuggerResumed, this);
45     WebInspector.breakpointManager.addEventListener(WebInspector.BreakpointManager.Events.ProjectChanged, this._projectChanged, this);
46 }
47
48 WebInspector.JavaScriptBreakpointsSidebarPane.prototype = {
49     _breakpointAdded: function(event)
50     {
51         var breakpoint = event.data;
52         var breakpointId = breakpoint.id;
53         var data = breakpoint.data;
54
55         var element = document.createElement("li");
56
57         var checkbox = document.createElement("input");
58         checkbox.className = "checkbox-elem";
59         checkbox.type = "checkbox";
60         checkbox.checked = breakpoint.enabled;
61         checkbox.addEventListener("click", this._breakpointItemCheckboxClicked.bind(this, breakpointId), false);
62         element.appendChild(checkbox);
63
64         var label = document.createElement("span");
65         element.appendChild(label);
66
67         element._data = data;
68         var currentElement = this.listElement.firstChild;
69         while (currentElement) {
70             if (currentElement._data && this._compareBreakpoints(currentElement._data, element._data) > 0)
71                 break;
72             currentElement = currentElement.nextSibling;
73         }
74         this._addListElement(element, currentElement);
75
76         element.addEventListener("contextmenu", this._contextMenuEventFired.bind(this, breakpointId), true);
77
78         this._setupBreakpointElement(data, element);
79
80         var breakpointItem = {};
81         breakpointItem.data = data;
82         breakpointItem.element = element;
83         breakpointItem.checkbox = checkbox;
84         this._items[breakpointId] = breakpointItem;
85
86         if (!this.expanded)
87             this.expanded = true;
88     },
89
90     _breakpointRemoved: function(event)
91     {
92         var breakpointId = event.data;
93         var breakpointItem = this._items[breakpointId];
94         if (breakpointItem) {
95             delete this._items[breakpointId];
96             this._removeListElement(breakpointItem.element);
97         }
98     },
99
100     _breakpointEnableChanged: function(enabled, event)
101     {
102         var breakpointId = event.data;
103         var breakpointItem = this._items[breakpointId];
104         if (breakpointItem)
105             breakpointItem.checkbox.checked = enabled;
106     },
107
108     _breakpointItemCheckboxClicked: function(breakpointId, event)
109     {
110         this._setBreakpointEnabled(breakpointId, event.target.checked);
111
112         // Breakpoint element may have it's own click handler.
113         event.stopPropagation();
114     },
115
116     _contextMenuEventFired: function(breakpointId, event)
117     {
118         var contextMenu = new WebInspector.ContextMenu();
119         contextMenu.appendItem(WebInspector.UIString("Remove Breakpoint"), this._removeBreakpoint.bind(this, breakpointId));
120         contextMenu.show(event);
121     },
122
123     _debuggerPaused: function(event)
124     {
125         var breakpointId = this._breakpointIdForDebuggerPausedEvent(event.data);
126         if (!breakpointId)
127             return;
128         var breakpointItem = this._items[breakpointId];
129         if (!breakpointItem)
130             return;
131         breakpointItem.element.addStyleClass("breakpoint-hit");
132         this._lastHitBreakpointItem = breakpointItem;
133     },
134
135     _debuggerResumed: function()
136     {
137         if (this._lastHitBreakpointItem) {
138             this._lastHitBreakpointItem.element.removeStyleClass("breakpoint-hit");
139             delete this._lastHitBreakpointItem;
140         }
141     },
142
143     _addListElement: function(element, beforeElement)
144     {
145         if (beforeElement)
146             this.listElement.insertBefore(element, beforeElement);
147         else {
148             if (!this.listElement.firstChild) {
149                 this.bodyElement.removeChild(this.emptyElement);
150                 this.bodyElement.appendChild(this.listElement);
151             }
152             this.listElement.appendChild(element);
153         }
154     },
155
156     _removeListElement: function(element)
157     {
158         this.listElement.removeChild(element);
159         if (!this.listElement.firstChild) {
160             this.bodyElement.removeChild(this.listElement);
161             this.bodyElement.appendChild(this.emptyElement);
162         }
163     },
164
165     _projectChanged: function()
166     {
167         this.listElement.removeChildren();
168         if (this.listElement.parentElement) {
169             this.bodyElement.removeChild(this.listElement);
170             this.bodyElement.appendChild(this.emptyElement);
171         }
172         this._items = {};
173     },
174
175     _compare: function(x, y)
176     {
177         if (x !== y)
178             return x < y ? -1 : 1;
179         return 0;
180     },
181
182     _compareBreakpoints: function(b1, b2)
183     {
184         return this._compare(b1.url, b2.url) || this._compare(b1.lineNumber, b2.lineNumber);
185     },
186
187     _setupBreakpointElement: function(data, element)
188     {
189         var displayName = data.url ? WebInspector.displayNameForURL(data.url) : WebInspector.UIString("(program)");
190         var labelElement = document.createTextNode(displayName + ":" + data.lineNumber);
191         element.appendChild(labelElement);
192
193         var sourceTextElement = document.createElement("div");
194         sourceTextElement.className = "source-text monospace";
195         element.appendChild(sourceTextElement);
196
197         function didGetSourceLine(text)
198         {
199             sourceTextElement.textContent = text;
200         }
201         var script = WebInspector.debuggerModel.scriptForSourceID(data.sourceID);
202         script.sourceLine(data.lineNumber, didGetSourceLine.bind(this));
203
204         element.addStyleClass("cursor-pointer");
205         var clickHandler = WebInspector.panels.scripts.showSourceLine.bind(WebInspector.panels.scripts, data.url, data.lineNumber);
206         element.addEventListener("click", clickHandler, false);
207     },
208
209     _breakpointIdForDebuggerPausedEvent: function(details)
210     {
211         var callFrame = details.callFrames[0];
212         var breakpoint = WebInspector.debuggerModel.findBreakpoint(callFrame.sourceID, callFrame.line);
213         if (breakpoint)
214             return breakpoint.id;
215    },
216
217     _setBreakpointEnabled: function(breakpointId, enabled)
218     {
219         var breakpoint = WebInspector.debuggerModel.breakpointForId(breakpointId);
220         WebInspector.debuggerModel.removeBreakpoint(breakpointId);
221         WebInspector.debuggerModel.setBreakpoint(breakpoint.sourceID, breakpoint.line, enabled, breakpoint.condition);
222     },
223
224     _removeBreakpoint: function(breakpointId)
225     {
226         WebInspector.debuggerModel.removeBreakpoint(breakpointId);
227     }
228 }
229
230 WebInspector.JavaScriptBreakpointsSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
231
232 WebInspector.NativeBreakpointsSidebarPane = function(title)
233 {
234     WebInspector.SidebarPane.call(this, title);
235
236     this.listElement = document.createElement("ol");
237     this.listElement.className = "breakpoint-list";
238
239     this.emptyElement = document.createElement("div");
240     this.emptyElement.className = "info";
241     this.emptyElement.textContent = WebInspector.UIString("No Breakpoints");
242
243     this.bodyElement.appendChild(this.emptyElement);
244
245     WebInspector.breakpointManager.addEventListener(WebInspector.BreakpointManager.Events.ProjectChanged, this._projectChanged, this);
246 }
247
248 WebInspector.NativeBreakpointsSidebarPane.prototype = {
249     addBreakpointItem: function(breakpointItem)
250     {
251         var element = breakpointItem.element;
252         element._breakpointItem = breakpointItem;
253
254         breakpointItem.addEventListener("breakpoint-hit", this.expand, this);
255         breakpointItem.addEventListener("removed", this._removeListElement.bind(this, element), this);
256
257         var currentElement = this.listElement.firstChild;
258         while (currentElement) {
259             if (currentElement._breakpointItem && currentElement._breakpointItem.compareTo(element._breakpointItem) > 0)
260                 break;
261             currentElement = currentElement.nextSibling;
262         }
263         this._addListElement(element, currentElement);
264
265         if (breakpointItem.click) {
266             element.addStyleClass("cursor-pointer");
267             element.addEventListener("click", breakpointItem.click.bind(breakpointItem), false);
268         }
269         element.addEventListener("contextmenu", this._contextMenuEventFired.bind(this, breakpointItem), true);
270     },
271
272     _contextMenuEventFired: function(breakpointItem, event)
273     {
274         var contextMenu = new WebInspector.ContextMenu();
275         contextMenu.appendItem(WebInspector.UIString("Remove Breakpoint"), breakpointItem.remove.bind(breakpointItem));
276         contextMenu.show(event);
277     },
278
279     _addListElement: function(element, beforeElement)
280     {
281         if (beforeElement)
282             this.listElement.insertBefore(element, beforeElement);
283         else {
284             if (!this.listElement.firstChild) {
285                 this.bodyElement.removeChild(this.emptyElement);
286                 this.bodyElement.appendChild(this.listElement);
287             }
288             this.listElement.appendChild(element);
289         }
290     },
291
292     _removeListElement: function(element)
293     {
294         this.listElement.removeChild(element);
295         if (!this.listElement.firstChild) {
296             this.bodyElement.removeChild(this.listElement);
297             this.bodyElement.appendChild(this.emptyElement);
298         }
299     },
300
301     _projectChanged: function()
302     {
303         this.listElement.removeChildren();
304         if (this.listElement.parentElement) {
305             this.bodyElement.removeChild(this.listElement);
306             this.bodyElement.appendChild(this.emptyElement);
307         }
308     }
309 }
310
311 WebInspector.NativeBreakpointsSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
312
313 WebInspector.XHRBreakpointsSidebarPane = function()
314 {
315     WebInspector.NativeBreakpointsSidebarPane.call(this, WebInspector.UIString("XHR Breakpoints"));
316
317     function addButtonClicked(event)
318     {
319         event.stopPropagation();
320         this._startEditingBreakpoint(null);
321     }
322
323     var addButton = document.createElement("button");
324     addButton.className = "add";
325     addButton.addEventListener("click", addButtonClicked.bind(this), false);
326     this.titleElement.appendChild(addButton);
327 }
328
329 WebInspector.XHRBreakpointsSidebarPane.prototype = {
330     addBreakpointItem: function(breakpointItem)
331     {
332         WebInspector.NativeBreakpointsSidebarPane.prototype.addBreakpointItem.call(this, breakpointItem);
333         breakpointItem._labelElement.addEventListener("dblclick", this._startEditingBreakpoint.bind(this, breakpointItem), false);
334     },
335
336     _startEditingBreakpoint: function(breakpointItem)
337     {
338         if (this._editingBreakpoint)
339             return;
340         this._editingBreakpoint = true;
341
342         if (!this.expanded)
343             this.expanded = true;
344
345         var inputElement = document.createElement("span");
346         inputElement.className = "breakpoint-condition editing";
347         if (breakpointItem) {
348             breakpointItem.populateEditElement(inputElement);
349             this.listElement.insertBefore(inputElement, breakpointItem.element);
350             breakpointItem.element.addStyleClass("hidden");
351         } else
352             this._addListElement(inputElement, this.listElement.firstChild);
353
354         var commitHandler = this._hideEditBreakpointDialog.bind(this, inputElement, true, breakpointItem);
355         var cancelHandler = this._hideEditBreakpointDialog.bind(this, inputElement, false, breakpointItem);
356         WebInspector.startEditing(inputElement, {
357             commitHandler: commitHandler,
358             cancelHandler: cancelHandler
359         });
360     },
361
362     _hideEditBreakpointDialog: function(inputElement, accept, breakpointItem)
363     {
364         this._removeListElement(inputElement);
365         this._editingBreakpoint = false;
366         if (accept) {
367             if (breakpointItem)
368                 breakpointItem.remove();
369             WebInspector.breakpointManager.createXHRBreakpoint(inputElement.textContent.toLowerCase());
370         } else if (breakpointItem)
371             breakpointItem.element.removeStyleClass("hidden");
372     }
373 }
374
375 WebInspector.XHRBreakpointsSidebarPane.prototype.__proto__ = WebInspector.NativeBreakpointsSidebarPane.prototype;
376
377 WebInspector.BreakpointItem = function(breakpoint)
378 {
379     this._breakpoint = breakpoint;
380
381     this._element = document.createElement("li");
382
383     var checkboxElement = document.createElement("input");
384     checkboxElement.className = "checkbox-elem";
385     checkboxElement.type = "checkbox";
386     checkboxElement.checked = this._breakpoint.enabled;
387     checkboxElement.addEventListener("click", this._checkboxClicked.bind(this), false);
388     this._element.appendChild(checkboxElement);
389
390     this._createLabelElement();
391
392     this._breakpoint.addEventListener("enable-changed", this._enableChanged, this);
393     this._breakpoint.addEventListener("hit-state-changed", this._hitStateChanged, this);
394     this._breakpoint.addEventListener("label-changed", this._labelChanged, this);
395     this._breakpoint.addEventListener("removed", this.dispatchEventToListeners.bind(this, "removed"));
396     if (breakpoint.click)
397         this.click = breakpoint.click.bind(breakpoint);
398 }
399
400 WebInspector.BreakpointItem.prototype = {
401     get element()
402     {
403         return this._element;
404     },
405
406     compareTo: function(other)
407     {
408         return this._breakpoint.compareTo(other._breakpoint);
409     },
410
411     populateEditElement: function(element)
412     {
413         this._breakpoint.populateEditElement(element);
414     },
415
416     remove: function()
417     {
418         this._breakpoint.remove();
419     },
420
421     _checkboxClicked: function(event)
422     {
423         this._breakpoint.enabled = !this._breakpoint.enabled;
424
425         // Breakpoint element may have it's own click handler.
426         event.stopPropagation();
427     },
428
429     _enableChanged: function(event)
430     {
431         var checkbox = this._element.firstChild;
432         checkbox.checked = this._breakpoint.enabled;
433     },
434
435     _hitStateChanged: function(event)
436     {
437         if (event.target.hit) {
438             this._element.addStyleClass("breakpoint-hit");
439             this.dispatchEventToListeners("breakpoint-hit");
440         } else
441             this._element.removeStyleClass("breakpoint-hit");
442     },
443
444     _labelChanged: function(event)
445     {
446         this._element.removeChild(this._labelElement);
447         this._createLabelElement();
448     },
449
450     _createLabelElement: function()
451     {
452         this._labelElement = document.createElement("span");
453         this._breakpoint.populateLabelElement(this._labelElement);
454         this._element.appendChild(this._labelElement);
455     }
456 }
457
458 WebInspector.BreakpointItem.prototype.__proto__ = WebInspector.Object.prototype;
459
460 WebInspector.EventListenerBreakpointsSidebarPane = function()
461 {
462     WebInspector.SidebarPane.call(this, WebInspector.UIString("Event Listener Breakpoints"));
463
464     this.categoriesElement = document.createElement("ol");
465     this.categoriesElement.tabIndex = 0;
466     this.categoriesElement.addStyleClass("properties-tree event-listener-breakpoints");
467     this.categoriesTreeOutline = new TreeOutline(this.categoriesElement);
468     this.bodyElement.appendChild(this.categoriesElement);
469
470     WebInspector.breakpointManager.addEventListener(WebInspector.BreakpointManager.Events.ProjectChanged, this._projectChanged, this);
471     WebInspector.breakpointManager.addEventListener(WebInspector.BreakpointManager.Events.EventListenerBreakpointAdded, this._breakpointAdded, this);
472
473     this._breakpointItems = {};
474     this._createCategory(WebInspector.UIString("Keyboard"), "listener", ["keydown", "keyup", "keypress", "textInput"]);
475     this._createCategory(WebInspector.UIString("Mouse"), "listener", ["click", "dblclick", "mousedown", "mouseup", "mouseover", "mousemove", "mouseout", "mousewheel"]);
476     // FIXME: uncomment following once inspector stops being drop targer in major ports.
477     // Otherwise, inspector page reacts on drop event and tries to load the event data.
478     // this._createCategory(WebInspector.UIString("Drag"), "listener", ["drag", "drop", "dragstart", "dragend", "dragenter", "dragleave", "dragover"]);
479     this._createCategory(WebInspector.UIString("Control"), "listener", ["resize", "scroll", "zoom", "focus", "blur", "select", "change", "submit", "reset"]);
480     this._createCategory(WebInspector.UIString("Clipboard"), "listener", ["copy", "cut", "paste", "beforecopy", "beforecut", "beforepaste"]);
481     this._createCategory(WebInspector.UIString("Load"), "listener", ["load", "unload", "abort", "error"]);
482     this._createCategory(WebInspector.UIString("DOM Mutation"), "listener", ["DOMActivate", "DOMFocusIn", "DOMFocusOut", "DOMAttrModified", "DOMCharacterDataModified", "DOMNodeInserted", "DOMNodeInsertedIntoDocument", "DOMNodeRemoved", "DOMNodeRemovedFromDocument", "DOMSubtreeModified", "DOMContentLoaded"]);
483     this._createCategory(WebInspector.UIString("Device"), "listener", ["deviceorientation", "devicemotion"]);
484     this._createCategory(WebInspector.UIString("Timer"), "instrumentation", ["setTimer", "clearTimer", "timerFired"]);
485 }
486
487 WebInspector.EventListenerBreakpointsSidebarPane.prototype = {
488     _createCategory: function(name, type, eventNames)
489     {
490         var categoryItem = {};
491         categoryItem.element = new TreeElement(name);
492         this.categoriesTreeOutline.appendChild(categoryItem.element);
493         categoryItem.element.listItemElement.addStyleClass("event-category");
494         categoryItem.element.selectable = true;
495
496         categoryItem.checkbox = this._createCheckbox(categoryItem.element);
497         categoryItem.checkbox.addEventListener("click", this._categoryCheckboxClicked.bind(this, categoryItem), true);
498
499         categoryItem.children = {};
500         for (var i = 0; i < eventNames.length; ++i) {
501             var eventName = type + ":" + eventNames[i];
502
503             var breakpointItem = {};
504             var title = WebInspector.EventListenerBreakpointView.eventNameForUI(eventName);
505             breakpointItem.element = new TreeElement(title);
506             categoryItem.element.appendChild(breakpointItem.element);
507             var hitMarker = document.createElement("div");
508             hitMarker.className = "breakpoint-hit-marker";
509             breakpointItem.element.listItemElement.appendChild(hitMarker);
510             breakpointItem.element.listItemElement.addStyleClass("source-code");
511             breakpointItem.element.selectable = true;
512
513             breakpointItem.checkbox = this._createCheckbox(breakpointItem.element);
514             breakpointItem.checkbox.addEventListener("click", this._breakpointCheckboxClicked.bind(this, breakpointItem), true);
515             breakpointItem.parent = categoryItem;
516             breakpointItem.eventName = eventName;
517
518             this._breakpointItems[eventName] = breakpointItem;
519             categoryItem.children[eventName] = breakpointItem;
520         }
521     },
522
523     _createCheckbox: function(treeElement)
524     {
525         var checkbox = document.createElement("input");
526         checkbox.className = "checkbox-elem";
527         checkbox.type = "checkbox";
528         treeElement.listItemElement.insertBefore(checkbox, treeElement.listItemElement.firstChild);
529         return checkbox;
530     },
531
532     _categoryCheckboxClicked: function(categoryItem)
533     {
534         var checked = categoryItem.checkbox.checked;
535         for (var eventName in categoryItem.children) {
536             var breakpointItem = categoryItem.children[eventName];
537             if (breakpointItem.checkbox.checked !== checked) {
538                 breakpointItem.checkbox.checked = checked;
539                 this._breakpointCheckboxClicked(breakpointItem);
540             }
541         }
542     },
543
544     _breakpointCheckboxClicked: function(breakpointItem)
545     {
546         if (breakpointItem.checkbox.checked)
547             WebInspector.breakpointManager.createEventListenerBreakpoint(breakpointItem.eventName);
548         else
549             breakpointItem.breakpoint.remove();
550     },
551
552     _breakpointAdded: function(event)
553     {
554         var breakpoint = event.data;
555
556         var breakpointItem = this._breakpointItems[breakpoint.eventName];
557         breakpointItem.breakpoint = breakpoint;
558         breakpoint.addEventListener("hit-state-changed", this._breakpointHitStateChanged.bind(this, breakpointItem));
559         breakpoint.addEventListener("removed", this._breakpointRemoved.bind(this, breakpointItem));
560         breakpointItem.checkbox.checked = true;
561         this._updateCategoryCheckbox(breakpointItem);
562     },
563
564     _breakpointHitStateChanged: function(breakpointItem, event)
565     {
566         if (event.target.hit) {
567             this.expanded = true;
568             var categoryItem = breakpointItem.parent;
569             categoryItem.element.expand();
570             breakpointItem.element.listItemElement.addStyleClass("breakpoint-hit");
571         } else
572             breakpointItem.element.listItemElement.removeStyleClass("breakpoint-hit");
573     },
574
575     _breakpointRemoved: function(breakpointItem)
576     {
577         breakpointItem.breakpoint = null;
578         breakpointItem.checkbox.checked = false;
579         this._updateCategoryCheckbox(breakpointItem);
580     },
581
582     _updateCategoryCheckbox: function(breakpointItem)
583     {
584         var categoryItem = breakpointItem.parent;
585         var hasEnabled = false, hasDisabled = false;
586         for (var eventName in categoryItem.children) {
587             var breakpointItem = categoryItem.children[eventName];
588             if (breakpointItem.checkbox.checked)
589                 hasEnabled = true;
590             else
591                 hasDisabled = true;
592         }
593         categoryItem.checkbox.checked = hasEnabled;
594         categoryItem.checkbox.indeterminate = hasEnabled && hasDisabled;
595     },
596
597     _projectChanged: function()
598     {
599         for (var eventName in this._breakpointItems) {
600             var breakpointItem = this._breakpointItems[eventName];
601             breakpointItem.breakpoint = null;
602             breakpointItem.checkbox.checked = false;
603             this._updateCategoryCheckbox(breakpointItem);
604         }
605     }
606 }
607
608 WebInspector.EventListenerBreakpointsSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;