OLD | NEW |
(Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 /** |
| 6 * @constructor |
| 7 * @extends {WebInspector.BreakpointsSidebarPaneBase} |
| 8 * @implements {WebInspector.TargetManager.Observer} |
| 9 */ |
| 10 WebInspector.XHRBreakpointsSidebarPane = function() |
| 11 { |
| 12 WebInspector.BreakpointsSidebarPaneBase.call(this, WebInspector.UIString("XH
R Breakpoints")); |
| 13 |
| 14 /** @type {!Map.<string, !Element>} */ |
| 15 this._breakpointElements = new Map(); |
| 16 |
| 17 var addButton = this.titleElement.createChild("button", "pane-title-button a
dd"); |
| 18 addButton.title = WebInspector.UIString("Add XHR breakpoint"); |
| 19 addButton.addEventListener("click", this._addButtonClicked.bind(this), false
); |
| 20 |
| 21 this.emptyElement.addEventListener("contextmenu", this._emptyElementContextM
enu.bind(this), true); |
| 22 |
| 23 WebInspector.targetManager.observeTargets(this); |
| 24 } |
| 25 |
| 26 WebInspector.XHRBreakpointsSidebarPane.prototype = { |
| 27 /** |
| 28 * @override |
| 29 * @param {!WebInspector.Target} target |
| 30 */ |
| 31 targetAdded: function(target) |
| 32 { |
| 33 this._restoreBreakpoints(target); |
| 34 }, |
| 35 |
| 36 /** |
| 37 * @override |
| 38 * @param {!WebInspector.Target} target |
| 39 */ |
| 40 targetRemoved: function(target) { }, |
| 41 |
| 42 _emptyElementContextMenu: function(event) |
| 43 { |
| 44 var contextMenu = new WebInspector.ContextMenu(event); |
| 45 contextMenu.appendItem(WebInspector.UIString.capitalize("Add ^breakpoint
"), this._addButtonClicked.bind(this)); |
| 46 contextMenu.show(); |
| 47 }, |
| 48 |
| 49 _addButtonClicked: function(event) |
| 50 { |
| 51 if (event) |
| 52 event.consume(); |
| 53 |
| 54 this.expand(); |
| 55 |
| 56 var inputElementContainer = createElementWithClass("p", "breakpoint-cond
ition"); |
| 57 inputElementContainer.textContent = WebInspector.UIString("Break when UR
L contains:"); |
| 58 |
| 59 var inputElement = inputElementContainer.createChild("span", "editing"); |
| 60 inputElement.id = "breakpoint-condition-input"; |
| 61 this.addListElement(inputElementContainer, /** @type {?Element} */ (this
.listElement.firstChild)); |
| 62 |
| 63 /** |
| 64 * @param {boolean} accept |
| 65 * @param {!Element} e |
| 66 * @param {string} text |
| 67 * @this {WebInspector.XHRBreakpointsSidebarPane} |
| 68 */ |
| 69 function finishEditing(accept, e, text) |
| 70 { |
| 71 this.removeListElement(inputElementContainer); |
| 72 if (accept) { |
| 73 this._setBreakpoint(text, true); |
| 74 this._saveBreakpoints(); |
| 75 } |
| 76 } |
| 77 |
| 78 var config = new WebInspector.InplaceEditor.Config(finishEditing.bind(th
is, true), finishEditing.bind(this, false)); |
| 79 WebInspector.InplaceEditor.startEditing(inputElement, config); |
| 80 }, |
| 81 |
| 82 /** |
| 83 * @param {string} url |
| 84 * @param {boolean} enabled |
| 85 * @param {!WebInspector.Target=} target |
| 86 */ |
| 87 _setBreakpoint: function(url, enabled, target) |
| 88 { |
| 89 if (enabled) |
| 90 this._updateBreakpointOnTarget(url, true, target); |
| 91 |
| 92 if (this._breakpointElements.has(url)) |
| 93 return; |
| 94 |
| 95 var element = createElement("li"); |
| 96 element._url = url; |
| 97 element.addEventListener("contextmenu", this._contextMenu.bind(this, url
), true); |
| 98 |
| 99 var label = createCheckboxLabel(undefined, enabled); |
| 100 label.classList.add("checkbox-elem"); |
| 101 element.appendChild(label); |
| 102 label.checkboxElement.addEventListener("click", this._checkboxClicked.bi
nd(this, url), false); |
| 103 element._checkboxElement = label.checkboxElement; |
| 104 |
| 105 var labelElement = label.createChild("span", "cursor-auto"); |
| 106 if (!url) |
| 107 labelElement.textContent = WebInspector.UIString("Any XHR"); |
| 108 else |
| 109 labelElement.textContent = WebInspector.UIString("URL contains \"%s\
"", url); |
| 110 labelElement.addEventListener("dblclick", this._labelClicked.bind(this,
url), false); |
| 111 |
| 112 var currentElement = /** @type {?Element} */ (this.listElement.firstChil
d); |
| 113 while (currentElement) { |
| 114 if (currentElement._url && currentElement._url < element._url) |
| 115 break; |
| 116 currentElement = /** @type {?Element} */ (currentElement.nextSibling
); |
| 117 } |
| 118 this.addListElement(element, currentElement); |
| 119 this._breakpointElements.set(url, element); |
| 120 }, |
| 121 |
| 122 /** |
| 123 * @param {string} url |
| 124 * @param {!WebInspector.Target=} target |
| 125 */ |
| 126 _removeBreakpoint: function(url, target) |
| 127 { |
| 128 var element = this._breakpointElements.get(url); |
| 129 if (!element) |
| 130 return; |
| 131 |
| 132 this.removeListElement(element); |
| 133 this._breakpointElements.delete(url); |
| 134 if (element._checkboxElement.checked) |
| 135 this._updateBreakpointOnTarget(url, false, target); |
| 136 }, |
| 137 |
| 138 /** |
| 139 * @param {string} url |
| 140 * @param {boolean} enable |
| 141 * @param {!WebInspector.Target=} target |
| 142 */ |
| 143 _updateBreakpointOnTarget: function(url, enable, target) |
| 144 { |
| 145 var targets = target ? [target] : WebInspector.targetManager.targets(); |
| 146 for (var i = 0; i < targets.length; ++i) { |
| 147 if (enable) |
| 148 targets[i].domdebuggerAgent().setXHRBreakpoint(url); |
| 149 else |
| 150 targets[i].domdebuggerAgent().removeXHRBreakpoint(url); |
| 151 } |
| 152 }, |
| 153 |
| 154 _contextMenu: function(url, event) |
| 155 { |
| 156 var contextMenu = new WebInspector.ContextMenu(event); |
| 157 |
| 158 /** |
| 159 * @this {WebInspector.XHRBreakpointsSidebarPane} |
| 160 */ |
| 161 function removeBreakpoint() |
| 162 { |
| 163 this._removeBreakpoint(url); |
| 164 this._saveBreakpoints(); |
| 165 } |
| 166 |
| 167 /** |
| 168 * @this {WebInspector.XHRBreakpointsSidebarPane} |
| 169 */ |
| 170 function removeAllBreakpoints() |
| 171 { |
| 172 for (var url of this._breakpointElements.keys()) |
| 173 this._removeBreakpoint(url); |
| 174 this._saveBreakpoints(); |
| 175 } |
| 176 var removeAllTitle = WebInspector.UIString.capitalize("Remove ^all ^brea
kpoints"); |
| 177 |
| 178 contextMenu.appendItem(WebInspector.UIString.capitalize("Add ^breakpoint
"), this._addButtonClicked.bind(this)); |
| 179 contextMenu.appendItem(WebInspector.UIString.capitalize("Remove ^breakpo
int"), removeBreakpoint.bind(this)); |
| 180 contextMenu.appendItem(removeAllTitle, removeAllBreakpoints.bind(this)); |
| 181 contextMenu.show(); |
| 182 }, |
| 183 |
| 184 _checkboxClicked: function(url, event) |
| 185 { |
| 186 this._updateBreakpointOnTarget(url, event.target.checked); |
| 187 this._saveBreakpoints(); |
| 188 }, |
| 189 |
| 190 _labelClicked: function(url) |
| 191 { |
| 192 var element = this._breakpointElements.get(url); |
| 193 var inputElement = createElementWithClass("span", "breakpoint-condition
editing"); |
| 194 inputElement.textContent = url; |
| 195 this.listElement.insertBefore(inputElement, element); |
| 196 element.classList.add("hidden"); |
| 197 |
| 198 /** |
| 199 * @param {boolean} accept |
| 200 * @param {!Element} e |
| 201 * @param {string} text |
| 202 * @this {WebInspector.XHRBreakpointsSidebarPane} |
| 203 */ |
| 204 function finishEditing(accept, e, text) |
| 205 { |
| 206 this.removeListElement(inputElement); |
| 207 if (accept) { |
| 208 this._removeBreakpoint(url); |
| 209 this._setBreakpoint(text, element._checkboxElement.checked); |
| 210 this._saveBreakpoints(); |
| 211 } else |
| 212 element.classList.remove("hidden"); |
| 213 } |
| 214 |
| 215 WebInspector.InplaceEditor.startEditing(inputElement, new WebInspector.I
nplaceEditor.Config(finishEditing.bind(this, true), finishEditing.bind(this, fal
se))); |
| 216 }, |
| 217 |
| 218 highlightBreakpoint: function(url) |
| 219 { |
| 220 var element = this._breakpointElements.get(url); |
| 221 if (!element) |
| 222 return; |
| 223 this.expand(); |
| 224 element.classList.add("breakpoint-hit"); |
| 225 this._highlightedElement = element; |
| 226 }, |
| 227 |
| 228 clearBreakpointHighlight: function() |
| 229 { |
| 230 if (this._highlightedElement) { |
| 231 this._highlightedElement.classList.remove("breakpoint-hit"); |
| 232 delete this._highlightedElement; |
| 233 } |
| 234 }, |
| 235 |
| 236 _saveBreakpoints: function() |
| 237 { |
| 238 var breakpoints = []; |
| 239 for (var url of this._breakpointElements.keys()) |
| 240 breakpoints.push({ url: url, enabled: this._breakpointElements.get(u
rl)._checkboxElement.checked }); |
| 241 WebInspector.settings.xhrBreakpoints.set(breakpoints); |
| 242 }, |
| 243 |
| 244 /** |
| 245 * @param {!WebInspector.Target} target |
| 246 */ |
| 247 _restoreBreakpoints: function(target) |
| 248 { |
| 249 var breakpoints = WebInspector.settings.xhrBreakpoints.get(); |
| 250 for (var i = 0; i < breakpoints.length; ++i) { |
| 251 var breakpoint = breakpoints[i]; |
| 252 if (breakpoint && typeof breakpoint.url === "string") |
| 253 this._setBreakpoint(breakpoint.url, breakpoint.enabled, target); |
| 254 } |
| 255 }, |
| 256 |
| 257 __proto__: WebInspector.BreakpointsSidebarPaneBase.prototype |
| 258 } |
OLD | NEW |