OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
11 * copyright notice, this list of conditions and the following disclaimer | 11 * copyright notice, this list of conditions and the following disclaimer |
12 * in the documentation and/or other materials provided with the | 12 * in the documentation and/or other materials provided with the |
13 * distribution. | 13 * distribution. |
14 * * Neither the name of Google Inc. nor the names of its | 14 * * Neither the name of Google Inc. nor the names of its |
15 * contributors may be used to endorse or promote products derived from | 15 * contributors may be used to endorse or promote products derived from |
16 * this software without specific prior written permission. | 16 * this software without specific prior written permission. |
17 * | 17 * |
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
29 */ | 29 */ |
30 | |
31 /** | 30 /** |
32 * @constructor | |
33 * @extends {WebInspector.VBox} | |
34 * @implements {WebInspector.TargetManager.Observer} | 31 * @implements {WebInspector.TargetManager.Observer} |
35 * @param {!WebInspector.ProfilesPanel} profilesPanel | 32 * @unrestricted |
36 */ | 33 */ |
37 WebInspector.ProfileLauncherView = function(profilesPanel) | 34 WebInspector.ProfileLauncherView = class extends WebInspector.VBox { |
38 { | 35 /** |
39 WebInspector.VBox.call(this); | 36 * @param {!WebInspector.ProfilesPanel} profilesPanel |
| 37 */ |
| 38 constructor(profilesPanel) { |
| 39 super(); |
40 | 40 |
41 this._panel = profilesPanel; | 41 this._panel = profilesPanel; |
42 | 42 |
43 this.element.classList.add("profile-launcher-view"); | 43 this.element.classList.add('profile-launcher-view'); |
44 this.element.classList.add("panel-enabler-view"); | 44 this.element.classList.add('panel-enabler-view'); |
45 | 45 |
46 this._contentElement = this.element.createChild("div", "profile-launcher-vie
w-content"); | 46 this._contentElement = this.element.createChild('div', 'profile-launcher-vie
w-content'); |
47 this._innerContentElement = this._contentElement.createChild("div"); | 47 this._innerContentElement = this._contentElement.createChild('div'); |
48 var targetSpan = this._contentElement.createChild("span"); | 48 var targetSpan = this._contentElement.createChild('span'); |
49 var selectTargetText = targetSpan.createChild("span"); | 49 var selectTargetText = targetSpan.createChild('span'); |
50 selectTargetText.textContent = WebInspector.UIString("Target:"); | 50 selectTargetText.textContent = WebInspector.UIString('Target:'); |
51 var targetsSelect = targetSpan.createChild("select", "chrome-select"); | 51 var targetsSelect = targetSpan.createChild('select', 'chrome-select'); |
52 new WebInspector.TargetsComboBoxController(targetsSelect, targetSpan); | 52 new WebInspector.TargetsComboBoxController(targetsSelect, targetSpan); |
53 this._controlButton = createTextButton("", this._controlButtonClicked.bind(t
his), "control-profiling"); | 53 this._controlButton = createTextButton('', this._controlButtonClicked.bind(t
his), 'control-profiling'); |
54 this._contentElement.appendChild(this._controlButton); | 54 this._contentElement.appendChild(this._controlButton); |
55 this._recordButtonEnabled = true; | 55 this._recordButtonEnabled = true; |
56 this._loadButton = createTextButton(WebInspector.UIString("Load"), this._loa
dButtonClicked.bind(this), "load-profile"); | 56 this._loadButton = |
| 57 createTextButton(WebInspector.UIString('Load'), this._loadButtonClicked.
bind(this), 'load-profile'); |
57 this._contentElement.appendChild(this._loadButton); | 58 this._contentElement.appendChild(this._loadButton); |
58 WebInspector.targetManager.observeTargets(this); | 59 WebInspector.targetManager.observeTargets(this); |
| 60 } |
| 61 |
| 62 /** |
| 63 * @return {?WebInspector.SearchableView} |
| 64 */ |
| 65 searchableView() { |
| 66 return null; |
| 67 } |
| 68 |
| 69 /** |
| 70 * @override |
| 71 * @param {!WebInspector.Target} target |
| 72 */ |
| 73 targetAdded(target) { |
| 74 this._updateLoadButtonLayout(); |
| 75 } |
| 76 |
| 77 /** |
| 78 * @override |
| 79 * @param {!WebInspector.Target} target |
| 80 */ |
| 81 targetRemoved(target) { |
| 82 this._updateLoadButtonLayout(); |
| 83 } |
| 84 |
| 85 _updateLoadButtonLayout() { |
| 86 this._loadButton.classList.toggle( |
| 87 'multi-target', WebInspector.targetManager.targets(WebInspector.Target.C
apability.JS).length > 1); |
| 88 } |
| 89 |
| 90 /** |
| 91 * @param {!WebInspector.ProfileType} profileType |
| 92 */ |
| 93 addProfileType(profileType) { |
| 94 var descriptionElement = this._innerContentElement.createChild('h1'); |
| 95 descriptionElement.textContent = profileType.description; |
| 96 var decorationElement = profileType.decorationElement(); |
| 97 if (decorationElement) |
| 98 this._innerContentElement.appendChild(decorationElement); |
| 99 this._isInstantProfile = profileType.isInstantProfile(); |
| 100 this._isEnabled = profileType.isEnabled(); |
| 101 } |
| 102 |
| 103 _controlButtonClicked() { |
| 104 this._panel.toggleRecord(); |
| 105 } |
| 106 |
| 107 _loadButtonClicked() { |
| 108 this._panel.showLoadFromFileDialog(); |
| 109 } |
| 110 |
| 111 _updateControls() { |
| 112 if (this._isEnabled && this._recordButtonEnabled) |
| 113 this._controlButton.removeAttribute('disabled'); |
| 114 else |
| 115 this._controlButton.setAttribute('disabled', ''); |
| 116 this._controlButton.title = this._recordButtonEnabled ? '' : WebInspector.an
otherProfilerActiveLabel(); |
| 117 if (this._isInstantProfile) { |
| 118 this._controlButton.classList.remove('running'); |
| 119 this._controlButton.textContent = WebInspector.UIString('Take Snapshot'); |
| 120 } else if (this._isProfiling) { |
| 121 this._controlButton.classList.add('running'); |
| 122 this._controlButton.textContent = WebInspector.UIString('Stop'); |
| 123 } else { |
| 124 this._controlButton.classList.remove('running'); |
| 125 this._controlButton.textContent = WebInspector.UIString('Start'); |
| 126 } |
| 127 } |
| 128 |
| 129 profileStarted() { |
| 130 this._isProfiling = true; |
| 131 this._updateControls(); |
| 132 } |
| 133 |
| 134 profileFinished() { |
| 135 this._isProfiling = false; |
| 136 this._updateControls(); |
| 137 } |
| 138 |
| 139 /** |
| 140 * @param {!WebInspector.ProfileType} profileType |
| 141 * @param {boolean} recordButtonEnabled |
| 142 */ |
| 143 updateProfileType(profileType, recordButtonEnabled) { |
| 144 this._isInstantProfile = profileType.isInstantProfile(); |
| 145 this._recordButtonEnabled = recordButtonEnabled; |
| 146 this._isEnabled = profileType.isEnabled(); |
| 147 this._updateControls(); |
| 148 } |
59 }; | 149 }; |
60 | 150 |
61 WebInspector.ProfileLauncherView.prototype = { | |
62 /** | |
63 * @return {?WebInspector.SearchableView} | |
64 */ | |
65 searchableView: function() | |
66 { | |
67 return null; | |
68 }, | |
69 | |
70 /** | |
71 * @override | |
72 * @param {!WebInspector.Target} target | |
73 */ | |
74 targetAdded: function(target) | |
75 { | |
76 this._updateLoadButtonLayout(); | |
77 }, | |
78 | |
79 /** | |
80 * @override | |
81 * @param {!WebInspector.Target} target | |
82 */ | |
83 targetRemoved: function(target) | |
84 { | |
85 this._updateLoadButtonLayout(); | |
86 }, | |
87 | |
88 _updateLoadButtonLayout: function() | |
89 { | |
90 this._loadButton.classList.toggle("multi-target", WebInspector.targetMan
ager.targets(WebInspector.Target.Capability.JS).length > 1); | |
91 }, | |
92 | |
93 /** | |
94 * @param {!WebInspector.ProfileType} profileType | |
95 */ | |
96 addProfileType: function(profileType) | |
97 { | |
98 var descriptionElement = this._innerContentElement.createChild("h1"); | |
99 descriptionElement.textContent = profileType.description; | |
100 var decorationElement = profileType.decorationElement(); | |
101 if (decorationElement) | |
102 this._innerContentElement.appendChild(decorationElement); | |
103 this._isInstantProfile = profileType.isInstantProfile(); | |
104 this._isEnabled = profileType.isEnabled(); | |
105 }, | |
106 | |
107 _controlButtonClicked: function() | |
108 { | |
109 this._panel.toggleRecord(); | |
110 }, | |
111 | |
112 _loadButtonClicked: function() | |
113 { | |
114 this._panel.showLoadFromFileDialog(); | |
115 }, | |
116 | |
117 _updateControls: function() | |
118 { | |
119 if (this._isEnabled && this._recordButtonEnabled) | |
120 this._controlButton.removeAttribute("disabled"); | |
121 else | |
122 this._controlButton.setAttribute("disabled", ""); | |
123 this._controlButton.title = this._recordButtonEnabled ? "" : WebInspecto
r.anotherProfilerActiveLabel(); | |
124 if (this._isInstantProfile) { | |
125 this._controlButton.classList.remove("running"); | |
126 this._controlButton.textContent = WebInspector.UIString("Take Snapsh
ot"); | |
127 } else if (this._isProfiling) { | |
128 this._controlButton.classList.add("running"); | |
129 this._controlButton.textContent = WebInspector.UIString("Stop"); | |
130 } else { | |
131 this._controlButton.classList.remove("running"); | |
132 this._controlButton.textContent = WebInspector.UIString("Start"); | |
133 } | |
134 }, | |
135 | |
136 profileStarted: function() | |
137 { | |
138 this._isProfiling = true; | |
139 this._updateControls(); | |
140 }, | |
141 | |
142 profileFinished: function() | |
143 { | |
144 this._isProfiling = false; | |
145 this._updateControls(); | |
146 }, | |
147 | |
148 /** | |
149 * @param {!WebInspector.ProfileType} profileType | |
150 * @param {boolean} recordButtonEnabled | |
151 */ | |
152 updateProfileType: function(profileType, recordButtonEnabled) | |
153 { | |
154 this._isInstantProfile = profileType.isInstantProfile(); | |
155 this._recordButtonEnabled = recordButtonEnabled; | |
156 this._isEnabled = profileType.isEnabled(); | |
157 this._updateControls(); | |
158 }, | |
159 | |
160 __proto__: WebInspector.VBox.prototype | |
161 }; | |
162 | |
163 | |
164 /** | 151 /** |
165 * @constructor | 152 * @unrestricted |
166 * @extends {WebInspector.ProfileLauncherView} | |
167 * @param {!WebInspector.ProfilesPanel} profilesPanel | |
168 */ | 153 */ |
169 WebInspector.MultiProfileLauncherView = function(profilesPanel) | 154 WebInspector.MultiProfileLauncherView = class extends WebInspector.ProfileLaunch
erView { |
170 { | 155 /** |
171 WebInspector.ProfileLauncherView.call(this, profilesPanel); | 156 * @param {!WebInspector.ProfilesPanel} profilesPanel |
172 | 157 */ |
173 this._selectedProfileTypeSetting = WebInspector.settings.createSetting("sele
ctedProfileType", "CPU"); | 158 constructor(profilesPanel) { |
174 | 159 super(profilesPanel); |
175 var header = this._innerContentElement.createChild("h1"); | 160 |
176 header.textContent = WebInspector.UIString("Select profiling type"); | 161 this._selectedProfileTypeSetting = WebInspector.settings.createSetting('sele
ctedProfileType', 'CPU'); |
177 | 162 |
178 this._profileTypeSelectorForm = this._innerContentElement.createChild("form"
); | 163 var header = this._innerContentElement.createChild('h1'); |
179 | 164 header.textContent = WebInspector.UIString('Select profiling type'); |
180 this._innerContentElement.createChild("div", "flexible-space"); | 165 |
| 166 this._profileTypeSelectorForm = this._innerContentElement.createChild('form'
); |
| 167 |
| 168 this._innerContentElement.createChild('div', 'flexible-space'); |
181 | 169 |
182 this._typeIdToOptionElement = {}; | 170 this._typeIdToOptionElement = {}; |
| 171 } |
| 172 |
| 173 /** |
| 174 * @override |
| 175 * @param {!WebInspector.ProfileType} profileType |
| 176 */ |
| 177 addProfileType(profileType) { |
| 178 var labelElement = createRadioLabel('profile-type', profileType.name); |
| 179 this._profileTypeSelectorForm.appendChild(labelElement); |
| 180 var optionElement = labelElement.radioElement; |
| 181 this._typeIdToOptionElement[profileType.id] = optionElement; |
| 182 optionElement._profileType = profileType; |
| 183 optionElement.style.hidden = true; |
| 184 optionElement.addEventListener('change', this._profileTypeChanged.bind(this,
profileType), false); |
| 185 var descriptionElement = labelElement.createChild('p'); |
| 186 descriptionElement.textContent = profileType.description; |
| 187 var decorationElement = profileType.decorationElement(); |
| 188 if (decorationElement) |
| 189 labelElement.appendChild(decorationElement); |
| 190 } |
| 191 |
| 192 restoreSelectedProfileType() { |
| 193 var typeId = this._selectedProfileTypeSetting.get(); |
| 194 if (!(typeId in this._typeIdToOptionElement)) |
| 195 typeId = Object.keys(this._typeIdToOptionElement)[0]; |
| 196 this._typeIdToOptionElement[typeId].checked = true; |
| 197 var type = this._typeIdToOptionElement[typeId]._profileType; |
| 198 this.dispatchEventToListeners(WebInspector.MultiProfileLauncherView.Events.P
rofileTypeSelected, type); |
| 199 } |
| 200 |
| 201 /** |
| 202 * @override |
| 203 */ |
| 204 _controlButtonClicked() { |
| 205 this._panel.toggleRecord(); |
| 206 } |
| 207 |
| 208 /** |
| 209 * @override |
| 210 */ |
| 211 _updateControls() { |
| 212 super._updateControls(); |
| 213 var items = this._profileTypeSelectorForm.elements; |
| 214 for (var i = 0; i < items.length; ++i) { |
| 215 if (items[i].type === 'radio') |
| 216 items[i].disabled = this._isProfiling; |
| 217 } |
| 218 } |
| 219 |
| 220 /** |
| 221 * @param {!WebInspector.ProfileType} profileType |
| 222 */ |
| 223 _profileTypeChanged(profileType) { |
| 224 this.dispatchEventToListeners(WebInspector.MultiProfileLauncherView.Events.P
rofileTypeSelected, profileType); |
| 225 this._isInstantProfile = profileType.isInstantProfile(); |
| 226 this._isEnabled = profileType.isEnabled(); |
| 227 this._updateControls(); |
| 228 this._selectedProfileTypeSetting.set(profileType.id); |
| 229 } |
| 230 |
| 231 /** |
| 232 * @override |
| 233 */ |
| 234 profileStarted() { |
| 235 this._isProfiling = true; |
| 236 this._updateControls(); |
| 237 } |
| 238 |
| 239 /** |
| 240 * @override |
| 241 */ |
| 242 profileFinished() { |
| 243 this._isProfiling = false; |
| 244 this._updateControls(); |
| 245 } |
183 }; | 246 }; |
184 | 247 |
185 /** @enum {symbol} */ | 248 /** @enum {symbol} */ |
186 WebInspector.MultiProfileLauncherView.Events = { | 249 WebInspector.MultiProfileLauncherView.Events = { |
187 ProfileTypeSelected: Symbol("ProfileTypeSelected") | 250 ProfileTypeSelected: Symbol('ProfileTypeSelected') |
188 }; | 251 }; |
189 | |
190 WebInspector.MultiProfileLauncherView.prototype = { | |
191 /** | |
192 * @override | |
193 * @param {!WebInspector.ProfileType} profileType | |
194 */ | |
195 addProfileType: function(profileType) | |
196 { | |
197 var labelElement = createRadioLabel("profile-type", profileType.name); | |
198 this._profileTypeSelectorForm.appendChild(labelElement); | |
199 var optionElement = labelElement.radioElement; | |
200 this._typeIdToOptionElement[profileType.id] = optionElement; | |
201 optionElement._profileType = profileType; | |
202 optionElement.style.hidden = true; | |
203 optionElement.addEventListener("change", this._profileTypeChanged.bind(t
his, profileType), false); | |
204 var descriptionElement = labelElement.createChild("p"); | |
205 descriptionElement.textContent = profileType.description; | |
206 var decorationElement = profileType.decorationElement(); | |
207 if (decorationElement) | |
208 labelElement.appendChild(decorationElement); | |
209 }, | |
210 | |
211 restoreSelectedProfileType: function() | |
212 { | |
213 var typeId = this._selectedProfileTypeSetting.get(); | |
214 if (!(typeId in this._typeIdToOptionElement)) | |
215 typeId = Object.keys(this._typeIdToOptionElement)[0]; | |
216 this._typeIdToOptionElement[typeId].checked = true; | |
217 var type = this._typeIdToOptionElement[typeId]._profileType; | |
218 this.dispatchEventToListeners(WebInspector.MultiProfileLauncherView.Even
ts.ProfileTypeSelected, type); | |
219 }, | |
220 | |
221 _controlButtonClicked: function() | |
222 { | |
223 this._panel.toggleRecord(); | |
224 }, | |
225 | |
226 _updateControls: function() | |
227 { | |
228 WebInspector.ProfileLauncherView.prototype._updateControls.call(this); | |
229 var items = this._profileTypeSelectorForm.elements; | |
230 for (var i = 0; i < items.length; ++i) { | |
231 if (items[i].type === "radio") | |
232 items[i].disabled = this._isProfiling; | |
233 } | |
234 }, | |
235 | |
236 /** | |
237 * @param {!WebInspector.ProfileType} profileType | |
238 */ | |
239 _profileTypeChanged: function(profileType) | |
240 { | |
241 this.dispatchEventToListeners(WebInspector.MultiProfileLauncherView.Even
ts.ProfileTypeSelected, profileType); | |
242 this._isInstantProfile = profileType.isInstantProfile(); | |
243 this._isEnabled = profileType.isEnabled(); | |
244 this._updateControls(); | |
245 this._selectedProfileTypeSetting.set(profileType.id); | |
246 }, | |
247 | |
248 profileStarted: function() | |
249 { | |
250 this._isProfiling = true; | |
251 this._updateControls(); | |
252 }, | |
253 | |
254 profileFinished: function() | |
255 { | |
256 this._isProfiling = false; | |
257 this._updateControls(); | |
258 }, | |
259 | |
260 __proto__: WebInspector.ProfileLauncherView.prototype | |
261 }; | |
OLD | NEW |