Chromium Code Reviews| Index: Source/devtools/front_end/sources/BreakpointsSidebarPane.js |
| diff --git a/Source/devtools/front_end/sources/BreakpointsSidebarPane.js b/Source/devtools/front_end/sources/BreakpointsSidebarPane.js |
| index 79f5596fcf89e17835af5ebd54feb25ecd6d6bb3..54b43c63d60d125edf8570d7b805e05086f9eb69 100644 |
| --- a/Source/devtools/front_end/sources/BreakpointsSidebarPane.js |
| +++ b/Source/devtools/front_end/sources/BreakpointsSidebarPane.js |
| @@ -521,28 +521,30 @@ WebInspector.EventListenerBreakpointsSidebarPane = function() |
| this.categoriesTreeOutline = new TreeOutline(this.categoriesElement); |
| this.bodyElement.appendChild(this.categoriesElement); |
| - this._breakpointItems = {}; |
| + this._categoryItems = []; |
| // FIXME: uncomment following once inspector stops being drop targer in major ports. |
| // Otherwise, inspector page reacts on drop event and tries to load the event data. |
| - // this._createCategory(WebInspector.UIString("Drag"), true, ["drag", "drop", "dragstart", "dragend", "dragenter", "dragleave", "dragover"]); |
| - this._createCategory(WebInspector.UIString("Animation"), false, ["requestAnimationFrame", "cancelAnimationFrame", "animationFrameFired"]); |
| - this._createCategory(WebInspector.UIString("Control"), true, ["resize", "scroll", "zoom", "focus", "blur", "select", "change", "submit", "reset"]); |
| - this._createCategory(WebInspector.UIString("Clipboard"), true, ["copy", "cut", "paste", "beforecopy", "beforecut", "beforepaste"]); |
| - this._createCategory(WebInspector.UIString("DOM Mutation"), true, ["DOMActivate", "DOMFocusIn", "DOMFocusOut", "DOMAttrModified", "DOMCharacterDataModified", "DOMNodeInserted", "DOMNodeInsertedIntoDocument", "DOMNodeRemoved", "DOMNodeRemovedFromDocument", "DOMSubtreeModified", "DOMContentLoaded"]); |
| - this._createCategory(WebInspector.UIString("Device"), true, ["deviceorientation", "devicemotion"]); |
| - this._createCategory(WebInspector.UIString("Drag / drop"), true, ["dragenter", "dragover", "dragleave", "drop"]); |
| - this._createCategory(WebInspector.UIString("Keyboard"), true, ["keydown", "keyup", "keypress", "input"]); |
| - this._createCategory(WebInspector.UIString("Load"), true, ["load", "beforeunload", "unload", "abort", "error", "hashchange", "popstate"]); |
| - this._createCategory(WebInspector.UIString("Mouse"), true, ["click", "dblclick", "mousedown", "mouseup", "mouseover", "mousemove", "mouseout", "mousewheel", "wheel"]); |
| - this._createCategory(WebInspector.UIString("Timer"), false, ["setTimer", "clearTimer", "timerFired"]); |
| - this._createCategory(WebInspector.UIString("Touch"), true, ["touchstart", "touchmove", "touchend", "touchcancel"]); |
| - this._createCategory(WebInspector.UIString("WebGL"), false, ["webglErrorFired", "webglWarningFired"]); |
| + // this._createCategory(WebInspector.UIString("Drag"), ["drag", "drop", "dragstart", "dragend", "dragenter", "dragleave", "dragover"]); |
| + this._createCategory(WebInspector.UIString("Animation"), ["requestAnimationFrame", "cancelAnimationFrame", "animationFrameFired"], null); |
| + this._createCategory(WebInspector.UIString("Control"), ["resize", "scroll", "zoom", "focus", "blur", "select", "change", "submit", "reset"]); |
| + this._createCategory(WebInspector.UIString("Clipboard"), ["copy", "cut", "paste", "beforecopy", "beforecut", "beforepaste"]); |
| + this._createCategory(WebInspector.UIString("DOM Mutation"), ["DOMActivate", "DOMFocusIn", "DOMFocusOut", "DOMAttrModified", "DOMCharacterDataModified", "DOMNodeInserted", "DOMNodeInsertedIntoDocument", "DOMNodeRemoved", "DOMNodeRemovedFromDocument", "DOMSubtreeModified", "DOMContentLoaded"]); |
| + this._createCategory(WebInspector.UIString("Device"), ["deviceorientation", "devicemotion"]); |
| + this._createCategory(WebInspector.UIString("Drag / drop"), ["dragenter", "dragover", "dragleave", "drop"]); |
| + this._createCategory(WebInspector.UIString("Keyboard"), ["keydown", "keyup", "keypress", "input"]); |
| + this._createCategory(WebInspector.UIString("Load"), ["load", "beforeunload", "unload", "abort", "error", "hashchange", "popstate"]); |
| + this._createCategory(WebInspector.UIString("Mouse"), ["click", "dblclick", "mousedown", "mouseup", "mouseover", "mousemove", "mouseout", "mousewheel", "wheel"]); |
| + this._createCategory(WebInspector.UIString("Timer"), ["setTimer", "clearTimer", "timerFired"], null); |
|
yurys
2014/06/11 12:31:23
It was more clear with boolean isDOMEvent, may be
aandrey
2014/06/11 12:49:17
Done.
|
| + this._createCategory(WebInspector.UIString("Touch"), ["touchstart", "touchmove", "touchend", "touchcancel"]); |
| + this._createCategory(WebInspector.UIString("XHR"), ["readystatechange", "load", "loadstart", "loadend", "abort", "error", "progress", "timeout"], ["XMLHttpRequest", "XMLHttpRequestUpload"]); |
| + this._createCategory(WebInspector.UIString("WebGL"), ["webglErrorFired", "webglWarningFired"], null); |
| this._restoreBreakpoints(); |
| } |
| -WebInspector.EventListenerBreakpointsSidebarPane.categotyListener = "listener:"; |
| -WebInspector.EventListenerBreakpointsSidebarPane.categotyInstrumentation = "instrumentation:"; |
| +WebInspector.EventListenerBreakpointsSidebarPane.categoryListener = "listener:"; |
| +WebInspector.EventListenerBreakpointsSidebarPane.categoryInstrumentation = "instrumentation:"; |
| +WebInspector.EventListenerBreakpointsSidebarPane.eventTargetAny = "*"; |
| /** |
| * @param {string} eventName |
| @@ -575,7 +577,12 @@ WebInspector.EventListenerBreakpointsSidebarPane.eventNameForUI = function(event |
| } |
| WebInspector.EventListenerBreakpointsSidebarPane.prototype = { |
| - _createCategory: function(name, isDOMEvent, eventNames) |
| + /** |
| + * @param {string} name |
| + * @param {!Array.<string>} eventNames |
| + * @param {?Array.<string>=} targetNames |
| + */ |
| + _createCategory: function(name, eventNames, targetNames) |
| { |
| var labelNode = document.createElement("label"); |
| labelNode.textContent = name; |
| @@ -589,9 +596,10 @@ WebInspector.EventListenerBreakpointsSidebarPane.prototype = { |
| categoryItem.checkbox = this._createCheckbox(labelNode); |
| categoryItem.checkbox.addEventListener("click", this._categoryCheckboxClicked.bind(this, categoryItem), true); |
| + categoryItem.targetNames = this._stringArrayToLowerCase(targetNames || [WebInspector.EventListenerBreakpointsSidebarPane.eventTargetAny]); |
| categoryItem.children = {}; |
| for (var i = 0; i < eventNames.length; ++i) { |
| - var eventName = (isDOMEvent ? WebInspector.EventListenerBreakpointsSidebarPane.categotyListener : WebInspector.EventListenerBreakpointsSidebarPane.categotyInstrumentation) + eventNames[i]; |
| + var eventName = (targetNames === null ? WebInspector.EventListenerBreakpointsSidebarPane.categoryInstrumentation : WebInspector.EventListenerBreakpointsSidebarPane.categoryListener) + eventNames[i]; |
|
yurys
2014/06/11 12:31:23
Category evaluation can be moved out of the loop b
aandrey
2014/06/11 12:49:17
Done.
|
| var breakpointItem = {}; |
| var title = WebInspector.EventListenerBreakpointsSidebarPane.eventNameForUI(eventName); |
| @@ -602,21 +610,34 @@ WebInspector.EventListenerBreakpointsSidebarPane.prototype = { |
| breakpointItem.element = new TreeElement(labelNode); |
| categoryItem.element.appendChild(breakpointItem.element); |
| - var hitMarker = document.createElement("div"); |
| - hitMarker.className = "breakpoint-hit-marker"; |
| - breakpointItem.element.listItemElement.appendChild(hitMarker); |
| + breakpointItem.element.listItemElement.createChild("div", "breakpoint-hit-marker"); |
| breakpointItem.element.listItemElement.classList.add("source-code"); |
| breakpointItem.element.selectable = false; |
| breakpointItem.checkbox = this._createCheckbox(labelNode); |
| - breakpointItem.checkbox.addEventListener("click", this._breakpointCheckboxClicked.bind(this, eventName), true); |
| + breakpointItem.checkbox.addEventListener("click", this._breakpointCheckboxClicked.bind(this, eventName, categoryItem.targetNames), true); |
| breakpointItem.parent = categoryItem; |
| - this._breakpointItems[eventName] = breakpointItem; |
| categoryItem.children[eventName] = breakpointItem; |
| } |
| + this._categoryItems.push(categoryItem); |
| + }, |
| + |
| + /** |
| + * @param {!Array.<string>} array |
| + * @return {!Array.<string>} |
| + */ |
| + _stringArrayToLowerCase: function(array) |
| + { |
| + return array.map(function(value) { |
| + return value.toLowerCase(); |
| + }); |
| }, |
| + /** |
| + * @param {!Element} labelNode |
| + * @return {!Element} |
| + */ |
| _createCheckbox: function(labelNode) |
| { |
| var checkbox = document.createElement("input"); |
| @@ -635,65 +656,119 @@ WebInspector.EventListenerBreakpointsSidebarPane.prototype = { |
| if (breakpointItem.checkbox.checked === checked) |
| continue; |
| if (checked) |
| - this._setBreakpoint(eventName); |
| + this._setBreakpoint(eventName, categoryItem.targetNames); |
| else |
| - this._removeBreakpoint(eventName); |
| + this._removeBreakpoint(eventName, categoryItem.targetNames); |
| } |
| this._saveBreakpoints(); |
| }, |
| - _breakpointCheckboxClicked: function(eventName, event) |
| + /** |
| + * @param {string} eventName |
| + * @param {!Array.<string>} targetNames |
| + * @param {?Event} event |
| + */ |
| + _breakpointCheckboxClicked: function(eventName, targetNames, event) |
| { |
| if (event.target.checked) |
| - this._setBreakpoint(eventName); |
| + this._setBreakpoint(eventName, targetNames); |
| else |
| - this._removeBreakpoint(eventName); |
| + this._removeBreakpoint(eventName, targetNames); |
| this._saveBreakpoints(); |
| }, |
| - _setBreakpoint: function(eventName) |
| + /** |
| + * @param {string} eventName |
| + * @param {?Array.<string>=} targetNames |
| + */ |
| + _setBreakpoint: function(eventName, targetNames) |
| { |
| - var breakpointItem = this._breakpointItems[eventName]; |
| - if (!breakpointItem) |
| - return; |
| - breakpointItem.checkbox.checked = true; |
| - if (eventName.startsWith(WebInspector.EventListenerBreakpointsSidebarPane.categotyListener)) |
| - DOMDebuggerAgent.setEventListenerBreakpoint(eventName.substring(WebInspector.EventListenerBreakpointsSidebarPane.categotyListener.length)); |
| - else if (eventName.startsWith(WebInspector.EventListenerBreakpointsSidebarPane.categotyInstrumentation)) |
| - DOMDebuggerAgent.setInstrumentationBreakpoint(eventName.substring(WebInspector.EventListenerBreakpointsSidebarPane.categotyInstrumentation.length)); |
| - this._updateCategoryCheckbox(breakpointItem.parent); |
| + targetNames = targetNames || [WebInspector.EventListenerBreakpointsSidebarPane.eventTargetAny]; |
| + for (var i = 0; i < targetNames.length; ++i) { |
| + var targetName = targetNames[i]; |
| + var breakpointItem = this._findBreakpointItem(eventName, targetName); |
| + if (!breakpointItem) |
| + continue; |
| + breakpointItem.checkbox.checked = true; |
| + breakpointItem.parent.dirtyCheckbox = true; |
| + if (eventName.startsWith(WebInspector.EventListenerBreakpointsSidebarPane.categoryListener)) |
| + DOMDebuggerAgent.setEventListenerBreakpoint(eventName.substring(WebInspector.EventListenerBreakpointsSidebarPane.categoryListener.length), targetName); |
| + else if (eventName.startsWith(WebInspector.EventListenerBreakpointsSidebarPane.categoryInstrumentation)) |
| + DOMDebuggerAgent.setInstrumentationBreakpoint(eventName.substring(WebInspector.EventListenerBreakpointsSidebarPane.categoryInstrumentation.length)); |
| + } |
| + this._updateCategoryCheckboxes(); |
| + }, |
| + |
| + /** |
| + * @param {string} eventName |
| + * @param {?Array.<string>=} targetNames |
| + */ |
| + _removeBreakpoint: function(eventName, targetNames) |
| + { |
| + targetNames = targetNames || [WebInspector.EventListenerBreakpointsSidebarPane.eventTargetAny]; |
| + for (var i = 0; i < targetNames.length; ++i) { |
| + var targetName = targetNames[i]; |
| + var breakpointItem = this._findBreakpointItem(eventName, targetName); |
| + if (!breakpointItem) |
| + continue; |
| + breakpointItem.checkbox.checked = false; |
| + breakpointItem.parent.dirtyCheckbox = true; |
| + if (eventName.startsWith(WebInspector.EventListenerBreakpointsSidebarPane.categoryListener)) |
| + DOMDebuggerAgent.removeEventListenerBreakpoint(eventName.substring(WebInspector.EventListenerBreakpointsSidebarPane.categoryListener.length), targetName); |
| + else if (eventName.startsWith(WebInspector.EventListenerBreakpointsSidebarPane.categoryInstrumentation)) |
| + DOMDebuggerAgent.removeInstrumentationBreakpoint(eventName.substring(WebInspector.EventListenerBreakpointsSidebarPane.categoryInstrumentation.length)); |
| + } |
| + this._updateCategoryCheckboxes(); |
| }, |
| - _removeBreakpoint: function(eventName) |
| + _updateCategoryCheckboxes: function() |
| { |
| - var breakpointItem = this._breakpointItems[eventName]; |
| - if (!breakpointItem) |
| - return; |
| - breakpointItem.checkbox.checked = false; |
| - if (eventName.startsWith(WebInspector.EventListenerBreakpointsSidebarPane.categotyListener)) |
| - DOMDebuggerAgent.removeEventListenerBreakpoint(eventName.substring(WebInspector.EventListenerBreakpointsSidebarPane.categotyListener.length)); |
| - else if (eventName.startsWith(WebInspector.EventListenerBreakpointsSidebarPane.categotyInstrumentation)) |
| - DOMDebuggerAgent.removeInstrumentationBreakpoint(eventName.substring(WebInspector.EventListenerBreakpointsSidebarPane.categotyInstrumentation.length)); |
| - this._updateCategoryCheckbox(breakpointItem.parent); |
| + for (var i = 0; i < this._categoryItems.length; ++i) { |
| + var categoryItem = this._categoryItems[i]; |
| + if (!categoryItem.dirtyCheckbox) |
| + continue; |
| + delete categoryItem.dirtyCheckbox; |
| + var hasEnabled = false, hasDisabled = false; |
| + for (var eventName in categoryItem.children) { |
| + var breakpointItem = categoryItem.children[eventName]; |
| + if (breakpointItem.checkbox.checked) |
| + hasEnabled = true; |
| + else |
| + hasDisabled = true; |
| + } |
| + categoryItem.checkbox.checked = hasEnabled; |
| + categoryItem.checkbox.indeterminate = hasEnabled && hasDisabled; |
| + } |
| }, |
| - _updateCategoryCheckbox: function(categoryItem) |
| + /** |
| + * @param {string} eventName |
| + * @param {string=} targetName |
| + * @return {?Object} |
| + */ |
| + _findBreakpointItem: function(eventName, targetName) |
| { |
| - var hasEnabled = false, hasDisabled = false; |
| - for (var eventName in categoryItem.children) { |
| + targetName = (targetName || WebInspector.EventListenerBreakpointsSidebarPane.eventTargetAny).toLowerCase(); |
| + for (var i = 0; i < this._categoryItems.length; ++i) { |
| + var categoryItem = this._categoryItems[i]; |
| + if (categoryItem.targetNames.indexOf(targetName) === -1) |
| + continue; |
| var breakpointItem = categoryItem.children[eventName]; |
| - if (breakpointItem.checkbox.checked) |
| - hasEnabled = true; |
| - else |
| - hasDisabled = true; |
| + if (breakpointItem) |
| + return breakpointItem; |
| } |
| - categoryItem.checkbox.checked = hasEnabled; |
| - categoryItem.checkbox.indeterminate = hasEnabled && hasDisabled; |
| + return null; |
| }, |
| - highlightBreakpoint: function(eventName) |
| + /** |
| + * @param {string} eventName |
| + * @param {string=} targetName |
| + */ |
| + highlightBreakpoint: function(eventName, targetName) |
| { |
| - var breakpointItem = this._breakpointItems[eventName]; |
| + var breakpointItem = this._findBreakpointItem(eventName, targetName); |
| + if (!breakpointItem || !breakpointItem.checkbox.checked) |
| + breakpointItem = this._findBreakpointItem(eventName, WebInspector.EventListenerBreakpointsSidebarPane.eventTargetAny); |
| if (!breakpointItem) |
| return; |
| this.expand(); |
| @@ -713,9 +788,13 @@ WebInspector.EventListenerBreakpointsSidebarPane.prototype = { |
| _saveBreakpoints: function() |
| { |
| var breakpoints = []; |
| - for (var eventName in this._breakpointItems) { |
| - if (this._breakpointItems[eventName].checkbox.checked) |
| - breakpoints.push({ eventName: eventName }); |
| + for (var i = 0; i < this._categoryItems.length; ++i) { |
| + var categoryItem = this._categoryItems[i]; |
| + for (var eventName in categoryItem.children) { |
| + var breakpointItem = categoryItem.children[eventName]; |
| + if (breakpointItem.checkbox.checked) |
| + breakpoints.push({ eventName: eventName, targetNames: categoryItem.targetNames }); |
| + } |
| } |
| WebInspector.settings.eventListenerBreakpoints.set(breakpoints); |
| }, |
| @@ -726,7 +805,7 @@ WebInspector.EventListenerBreakpointsSidebarPane.prototype = { |
| for (var i = 0; i < breakpoints.length; ++i) { |
| var breakpoint = breakpoints[i]; |
| if (breakpoint && typeof breakpoint.eventName === "string") |
| - this._setBreakpoint(breakpoint.eventName); |
| + this._setBreakpoint(breakpoint.eventName, breakpoint.targetNames); |
| } |
| }, |