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); |
} |
}, |