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

Side by Side Diff: Source/devtools/front_end/network/NetworkFilmStripView.js

Issue 1097163004: DevTools: zoom frames upon double click, iterate over frames using arrows. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 8 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 /** 5 /**
6 * @constructor 6 * @constructor
7 * @extends {WebInspector.HBox} 7 * @extends {WebInspector.HBox}
8 * @implements {WebInspector.TracingManagerClient} 8 * @implements {WebInspector.TracingManagerClient}
9 * @param {!WebInspector.NetworkTimeCalculator} calculator 9 * @param {!WebInspector.NetworkTimeCalculator} calculator
10 */ 10 */
11 WebInspector.NetworkFilmStripView = function(calculator) 11 WebInspector.NetworkFilmStripView = function(calculator)
12 { 12 {
13 WebInspector.HBox.call(this, true); 13 WebInspector.HBox.call(this, true);
14 this.registerRequiredCSS("network/networkFilmStripView.css"); 14 this.registerRequiredCSS("network/networkFilmStripView.css");
15 this.element.classList.add("network-film-strip-view"); 15 this.element.classList.add("network-film-strip-view");
16 this.contentElement.classList.add("shadow-network-film-strip-view"); 16 this.contentElement.classList.add("shadow-network-film-strip-view");
17
18 /** @type {!WebInspector.NetworkTimeCalculator} */ 17 /** @type {!WebInspector.NetworkTimeCalculator} */
19 this._calculator = calculator; 18 this._calculator = calculator;
20 19
21 this.reset(); 20 this.reset();
22 } 21 }
23 22
24 WebInspector.NetworkFilmStripView._maximumFrameCount = 60; 23 WebInspector.NetworkFilmStripView._maximumFrameCount = 60;
25 24
26 WebInspector.NetworkFilmStripView.Events = { 25 WebInspector.NetworkFilmStripView.Events = {
27 FrameSelected: "FrameSelected", 26 FrameSelected: "FrameSelected",
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 } 69 }
71 } 70 }
72 } 71 }
73 72
74 if (!frames.length) { 73 if (!frames.length) {
75 this.reset(); 74 this.reset();
76 return; 75 return;
77 } 76 }
78 this._label.remove(); 77 this._label.remove();
79 78
80 for (var i = 0; i < frames.length; ++i) 79 for (var i = 0; i < frames.length; ++i) {
80 frames[i]._prevFrame = frames[i - 1];
81 frames[i]._nextFrame = frames[i + 1];
81 frames[i].show(this.contentElement); 82 frames[i].show(this.contentElement);
83
84 }
82 this._frames = frames; 85 this._frames = frames;
83 this._updateTimeOffset(true); 86 this._updateTimeOffset(true);
84 }, 87 },
85 88
86 reset: function() 89 reset: function()
87 { 90 {
88 this.contentElement.removeChildren(); 91 this.contentElement.removeChildren();
89 /** @type {?number} */ 92 /** @type {?number} */
90 this._timeOffset = null; 93 this._timeOffset = null;
91 /** @type {!Array.<!WebInspector.NetworkFilmStripFrame>} */ 94 /** @type {!Array.<!WebInspector.NetworkFilmStripFrame>} */
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 if (this._target) 161 if (this._target)
159 return; 162 return;
160 163
161 this.reset(); 164 this.reset();
162 this._target = WebInspector.targetManager.mainTarget(); 165 this._target = WebInspector.targetManager.mainTarget();
163 this._tracingModel = new WebInspector.TracingModel(new WebInspector.Temp FileBackingStorage("tracing")); 166 this._tracingModel = new WebInspector.TracingModel(new WebInspector.Temp FileBackingStorage("tracing"));
164 this._target.tracingManager.start(this, "-*,disabled-by-default-devtools .screenshot", ""); 167 this._target.tracingManager.start(this, "-*,disabled-by-default-devtools .screenshot", "");
165 this._label.textContent = WebInspector.UIString("Recording frames..."); 168 this._label.textContent = WebInspector.UIString("Recording frames...");
166 }, 169 },
167 170
171 /**
172 * @return {boolean}
173 */
174 isRecording: function()
175 {
176 return !!this._target;
177 },
178
168 stopRecording: function() 179 stopRecording: function()
169 { 180 {
170 if (!this._target) 181 if (!this._target)
171 return; 182 return;
172 183
173 this._target.tracingManager.stop(); 184 this._target.tracingManager.stop();
174 this._target = null; 185 this._target = null;
175 }, 186 },
176 187
177 /** 188 /**
(...skipping 12 matching lines...) Expand all
190 * @param {!WebInspector.NetworkFilmStripView} parent 201 * @param {!WebInspector.NetworkFilmStripView} parent
191 * @param {?string} imageData 202 * @param {?string} imageData
192 * @param {number} timestamp 203 * @param {number} timestamp
193 */ 204 */
194 WebInspector.NetworkFilmStripFrame = function(parent, imageData, timestamp) 205 WebInspector.NetworkFilmStripFrame = function(parent, imageData, timestamp)
195 { 206 {
196 this._parent = parent; 207 this._parent = parent;
197 this._timestamp = timestamp; 208 this._timestamp = timestamp;
198 this._element = createElementWithClass("div", "frame"); 209 this._element = createElementWithClass("div", "frame");
199 this._element.createChild("div", "thumbnail").createChild("img").src = "data :image/jpg;base64," + imageData; 210 this._element.createChild("div", "thumbnail").createChild("img").src = "data :image/jpg;base64," + imageData;
211 this._imageData = imageData;
200 this._timeLabel = this._element.createChild("div", "time"); 212 this._timeLabel = this._element.createChild("div", "time");
201 this._element.addEventListener("mousedown", this._onMouseDown.bind(this), fa lse); 213 this._element.addEventListener("mousedown", this._onMouseDown.bind(this), fa lse);
214 this._element.addEventListener("dblclick", this._onDoubleClick.bind(this), f alse);
202 } 215 }
203 216
204 WebInspector.NetworkFilmStripFrame.prototype = { 217 WebInspector.NetworkFilmStripFrame.prototype = {
205 /** 218 /**
206 * @param {!Element} parent 219 * @param {!Element} parent
207 */ 220 */
208 show: function(parent) 221 show: function(parent)
209 { 222 {
210 parent.appendChild(this._element); 223 parent.appendChild(this._element);
211 }, 224 },
212 225
213 /** 226 _onMouseDown: function()
214 * @param {!Event} event
215 */
216 _onMouseDown: function(event)
217 { 227 {
218 this._parent._selectFrame(this); 228 this._parent._selectFrame(this);
219 }, 229 },
220 230
231 _onDoubleClick: function()
232 {
233 WebInspector.Dialog.show(WebInspector.Dialog.modalHostView().element, ne w WebInspector.NetworkFilmStripFrame.DialogDelegate(this));
dgozman 2015/04/22 10:16:54 First parameter should be NetworkPanel.element.
pfeldman 2015/04/22 12:13:12 I was thinking that we introduced WebInspector.Dia
234 },
235
221 /** 236 /**
222 * @return {number} 237 * @return {number}
223 */ 238 */
224 timestamp: function() 239 timestamp: function()
225 { 240 {
226 return this._timestamp; 241 return this._timestamp;
227 }, 242 },
228 243
229 /** 244 /**
230 * @param {number} offset 245 * @param {number} offset
231 */ 246 */
232 _setTimeOffset: function(offset) 247 _setTimeOffset: function(offset)
233 { 248 {
234 this._timeLabel.textContent = Number.secondsToString(this._timestamp - o ffset); 249 this._timeLabel.textContent = Number.secondsToString(this._timestamp - o ffset);
235 } 250 }
236 } 251 }
252
253
254 /**
255 * @constructor
256 * @extends {WebInspector.DialogDelegate}
257 * @param {!WebInspector.NetworkFilmStripFrame} frame
258 */
259 WebInspector.NetworkFilmStripFrame.DialogDelegate = function(frame)
260 {
261 WebInspector.DialogDelegate.call(this, createElementWithClass("div", "networ k-filmstrip-preview"));
262 this.element.tabIndex = 0;
263 this._frame = frame;
264 this._imageElement = this.element.createChild("img");
265
266 var footerElement = this.element.createChild("div", "network-filmstrip-previ ew-footer");
267 footerElement.createChild("div", "flex-auto");
268 var prevButton = createTextButton("\u25C0", this._onPrevFrame.bind(this), un defined, WebInspector.UIString("Previous frame"));
269 footerElement.appendChild(prevButton);
270 this._timeLabel = footerElement.createChild("div", "network-filmstrip-previe w-label");
271 var nextButton = createTextButton("\u25B6", this._onNextFrame.bind(this), un defined, WebInspector.UIString("Next frame"));
272 footerElement.appendChild(nextButton);
273 footerElement.createChild("div", "flex-auto");
274
275 this._render();
276 this.element.addEventListener("keydown", this._keyDown.bind(this), false);
277 }
278
279 WebInspector.NetworkFilmStripFrame.DialogDelegate.prototype = {
280 /**
281 * @override
282 */
283 focus: function()
284 {
285 this.element.focus();
286 },
287
288 /**
289 * @param {!Event} event
290 */
291 _keyDown: function(event)
292 {
dgozman 2015/04/22 10:16:54 Would be nice to support Home/End as well.
pfeldman 2015/04/22 12:13:12 Done.
293 if (event.keyIdentifier === "Left") {
294 this._onPrevFrame();
295 return;
296 }
297
298 if (event.keyIdentifier === "Right")
299 this._onNextFrame();
300 },
301
302 _onPrevFrame: function()
303 {
304 var prevFrame = this._frame._prevFrame;
305 if (prevFrame) {
306 this._frame = prevFrame;
307 this._render();
308 }
309 },
310
311 _onNextFrame: function()
312 {
313 var nextFrame = this._frame._nextFrame;
314 if (nextFrame) {
315 this._frame = nextFrame;
316 this._render();
317 }
318 },
319
320 _render: function()
321 {
322 this._imageElement.src = "data:image/jpg;base64," + this._frame._imageDa ta;
323 this._timeLabel.textContent = this._frame._timeLabel.textContent;
324 },
325
326 __proto__: WebInspector.DialogDelegate.prototype
327 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698