| 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 * @implements {UI.ContextFlavorListener} | |
| 6 * @implements {UI.ToolbarItem.ItemsProvider} | |
| 7 * @unrestricted | |
| 8 */ | |
| 9 Sources.XHRBreakpointsSidebarPane = class extends Components.BreakpointsSidebarP
aneBase { | |
| 10 constructor() { | |
| 11 super(); | |
| 12 /** @type {!Map.<string, !Element>} */ | |
| 13 this._breakpointElements = new Map(); | |
| 14 | |
| 15 this._addButton = new UI.ToolbarButton(Common.UIString('Add breakpoint'), 'l
argeicon-add'); | |
| 16 this._addButton.addEventListener(UI.ToolbarButton.Events.Click, this._addBut
tonClicked.bind(this)); | |
| 17 | |
| 18 this.emptyElement.addEventListener('contextmenu', this._emptyElementContextM
enu.bind(this), true); | |
| 19 this._restoreBreakpoints(); | |
| 20 this._update(); | |
| 21 } | |
| 22 | |
| 23 /** | |
| 24 * @override | |
| 25 * @return {!Array<!UI.ToolbarItem>} | |
| 26 */ | |
| 27 toolbarItems() { | |
| 28 return [this._addButton]; | |
| 29 } | |
| 30 | |
| 31 _emptyElementContextMenu(event) { | |
| 32 var contextMenu = new UI.ContextMenu(event); | |
| 33 contextMenu.appendItem(Common.UIString.capitalize('Add ^breakpoint'), this._
addButtonClicked.bind(this)); | |
| 34 contextMenu.show(); | |
| 35 } | |
| 36 | |
| 37 _addButtonClicked() { | |
| 38 UI.viewManager.showView('sources.xhrBreakpoints'); | |
| 39 | |
| 40 var inputElementContainer = createElementWithClass('p', 'breakpoint-conditio
n'); | |
| 41 inputElementContainer.textContent = Common.UIString('Break when URL contains
:'); | |
| 42 | |
| 43 var inputElement = inputElementContainer.createChild('span'); | |
| 44 inputElement.id = 'breakpoint-condition-input'; | |
| 45 this.addListElement(inputElementContainer, /** @type {?Element} */ (this.lis
tElement.firstChild)); | |
| 46 | |
| 47 /** | |
| 48 * @param {boolean} accept | |
| 49 * @param {!Element} e | |
| 50 * @param {string} text | |
| 51 * @this {Sources.XHRBreakpointsSidebarPane} | |
| 52 */ | |
| 53 function finishEditing(accept, e, text) { | |
| 54 this.removeListElement(inputElementContainer); | |
| 55 if (accept) { | |
| 56 SDK.domDebuggerManager.addXHRBreakpoint(text, true); | |
| 57 this._setBreakpoint(text, true); | |
| 58 } | |
| 59 } | |
| 60 | |
| 61 var config = new UI.InplaceEditor.Config(finishEditing.bind(this, true), fin
ishEditing.bind(this, false)); | |
| 62 UI.InplaceEditor.startEditing(inputElement, config); | |
| 63 } | |
| 64 | |
| 65 /** | |
| 66 * @param {string} url | |
| 67 * @param {boolean} enabled | |
| 68 */ | |
| 69 _setBreakpoint(url, enabled) { | |
| 70 if (this._breakpointElements.has(url)) { | |
| 71 this._breakpointElements.get(url)._checkboxElement.checked = enabled; | |
| 72 return; | |
| 73 } | |
| 74 | |
| 75 var element = createElement('li'); | |
| 76 element._url = url; | |
| 77 element.addEventListener('contextmenu', this._contextMenu.bind(this, url), t
rue); | |
| 78 | |
| 79 var title = url ? Common.UIString('URL contains "%s"', url) : Common.UIStrin
g('Any XHR'); | |
| 80 var label = UI.CheckboxLabel.create(title, enabled); | |
| 81 element.appendChild(label); | |
| 82 label.checkboxElement.addEventListener('click', this._checkboxClicked.bind(t
his, url), false); | |
| 83 element._checkboxElement = label.checkboxElement; | |
| 84 | |
| 85 label.classList.add('cursor-auto'); | |
| 86 label.textElement.addEventListener('dblclick', this._labelClicked.bind(this,
url), false); | |
| 87 | |
| 88 var currentElement = /** @type {?Element} */ (this.listElement.firstChild); | |
| 89 while (currentElement) { | |
| 90 if (currentElement._url && currentElement._url < element._url) | |
| 91 break; | |
| 92 currentElement = /** @type {?Element} */ (currentElement.nextSibling); | |
| 93 } | |
| 94 this.addListElement(element, currentElement); | |
| 95 this._breakpointElements.set(url, element); | |
| 96 } | |
| 97 | |
| 98 /** | |
| 99 * @param {string} url | |
| 100 */ | |
| 101 _removeBreakpoint(url) { | |
| 102 var element = this._breakpointElements.get(url); | |
| 103 if (!element) | |
| 104 return; | |
| 105 | |
| 106 this.removeListElement(element); | |
| 107 this._breakpointElements.delete(url); | |
| 108 } | |
| 109 | |
| 110 _contextMenu(url, event) { | |
| 111 var contextMenu = new UI.ContextMenu(event); | |
| 112 | |
| 113 /** | |
| 114 * @this {Sources.XHRBreakpointsSidebarPane} | |
| 115 */ | |
| 116 function removeBreakpoint() { | |
| 117 SDK.domDebuggerManager.removeXHRBreakpoint(url); | |
| 118 this._removeBreakpoint(url); | |
| 119 } | |
| 120 | |
| 121 /** | |
| 122 * @this {Sources.XHRBreakpointsSidebarPane} | |
| 123 */ | |
| 124 function removeAllBreakpoints() { | |
| 125 for (var url of this._breakpointElements.keys()) { | |
| 126 SDK.domDebuggerManager.removeXHRBreakpoint(url); | |
| 127 this._removeBreakpoint(url); | |
| 128 } | |
| 129 } | |
| 130 var removeAllTitle = Common.UIString.capitalize('Remove ^all ^breakpoints'); | |
| 131 | |
| 132 contextMenu.appendItem(Common.UIString.capitalize('Add ^breakpoint'), this._
addButtonClicked.bind(this)); | |
| 133 contextMenu.appendItem(Common.UIString.capitalize('Remove ^breakpoint'), rem
oveBreakpoint.bind(this)); | |
| 134 contextMenu.appendItem(removeAllTitle, removeAllBreakpoints.bind(this)); | |
| 135 contextMenu.show(); | |
| 136 } | |
| 137 | |
| 138 _checkboxClicked(url, event) { | |
| 139 SDK.domDebuggerManager.toggleXHRBreakpoint(url, event.target.checked); | |
| 140 } | |
| 141 | |
| 142 _labelClicked(url) { | |
| 143 var element = this._breakpointElements.get(url) || null; | |
| 144 var inputElement = createElementWithClass('span', 'breakpoint-condition'); | |
| 145 inputElement.textContent = url; | |
| 146 this.listElement.insertBefore(inputElement, element); | |
| 147 element.classList.add('hidden'); | |
| 148 | |
| 149 /** | |
| 150 * @param {boolean} accept | |
| 151 * @param {!Element} e | |
| 152 * @param {string} text | |
| 153 * @this {Sources.XHRBreakpointsSidebarPane} | |
| 154 */ | |
| 155 function finishEditing(accept, e, text) { | |
| 156 this.removeListElement(inputElement); | |
| 157 if (accept) { | |
| 158 SDK.domDebuggerManager.removeXHRBreakpoint(url); | |
| 159 this._removeBreakpoint(url); | |
| 160 var enabled = element ? element._checkboxElement.checked : true; | |
| 161 SDK.domDebuggerManager.addXHRBreakpoint(text, enabled); | |
| 162 this._setBreakpoint(text, enabled); | |
| 163 } else { | |
| 164 element.classList.remove('hidden'); | |
| 165 } | |
| 166 } | |
| 167 | |
| 168 UI.InplaceEditor.startEditing( | |
| 169 inputElement, new UI.InplaceEditor.Config(finishEditing.bind(this, true)
, finishEditing.bind(this, false))); | |
| 170 } | |
| 171 | |
| 172 /** | |
| 173 * @override | |
| 174 * @param {?Object} object | |
| 175 */ | |
| 176 flavorChanged(object) { | |
| 177 this._update(); | |
| 178 } | |
| 179 | |
| 180 _update() { | |
| 181 var details = UI.context.flavor(SDK.DebuggerPausedDetails); | |
| 182 if (!details || details.reason !== SDK.DebuggerModel.BreakReason.XHR) { | |
| 183 if (this._highlightedElement) { | |
| 184 this._highlightedElement.classList.remove('breakpoint-hit'); | |
| 185 delete this._highlightedElement; | |
| 186 } | |
| 187 return; | |
| 188 } | |
| 189 var url = details.auxData['breakpointURL']; | |
| 190 var element = this._breakpointElements.get(url); | |
| 191 if (!element) | |
| 192 return; | |
| 193 UI.viewManager.showView('sources.xhrBreakpoints'); | |
| 194 element.classList.add('breakpoint-hit'); | |
| 195 this._highlightedElement = element; | |
| 196 } | |
| 197 | |
| 198 _restoreBreakpoints() { | |
| 199 var breakpoints = SDK.domDebuggerManager.xhrBreakpoints(); | |
| 200 for (var url of breakpoints.keys()) | |
| 201 this._setBreakpoint(url, breakpoints.get(url)); | |
| 202 } | |
| 203 }; | |
| OLD | NEW |