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

Unified Diff: Source/devtools/front_end/sources/BreakpointsSidebarPane.js

Issue 321113005: DevTools: Support XHR event listener breakpoints on frontend. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 6 months 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 side-by-side diff with in-line comments
Download patch
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);
}
},

Powered by Google App Engine
This is Rietveld 408576698