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 |