Index: Source/devtools/front_end/network/NetworkFilmStripView.js |
diff --git a/Source/devtools/front_end/network/NetworkFilmStripView.js b/Source/devtools/front_end/network/NetworkFilmStripView.js |
index 8ab9e9ebbb30566ad1679b219e64b975c21a57c5..cf9e44bbbf86a2f4b92c6f1f1ba0a80099959ae4 100644 |
--- a/Source/devtools/front_end/network/NetworkFilmStripView.js |
+++ b/Source/devtools/front_end/network/NetworkFilmStripView.js |
@@ -14,7 +14,6 @@ WebInspector.NetworkFilmStripView = function(calculator) |
this.registerRequiredCSS("network/networkFilmStripView.css"); |
this.element.classList.add("network-film-strip-view"); |
this.contentElement.classList.add("shadow-network-film-strip-view"); |
- |
/** @type {!WebInspector.NetworkTimeCalculator} */ |
this._calculator = calculator; |
@@ -77,8 +76,11 @@ WebInspector.NetworkFilmStripView.prototype = { |
} |
this._label.remove(); |
- for (var i = 0; i < frames.length; ++i) |
+ for (var i = 0; i < frames.length; ++i) { |
+ frames[i]._index = i; |
frames[i].show(this.contentElement); |
+ |
+ } |
this._frames = frames; |
this._updateTimeOffset(true); |
}, |
@@ -165,6 +167,14 @@ WebInspector.NetworkFilmStripView.prototype = { |
this._label.textContent = WebInspector.UIString("Recording frames..."); |
}, |
+ /** |
+ * @return {boolean} |
+ */ |
+ isRecording: function() |
+ { |
+ return !!this._target; |
+ }, |
+ |
stopRecording: function() |
{ |
if (!this._target) |
@@ -197,8 +207,10 @@ WebInspector.NetworkFilmStripFrame = function(parent, imageData, timestamp) |
this._timestamp = timestamp; |
this._element = createElementWithClass("div", "frame"); |
this._element.createChild("div", "thumbnail").createChild("img").src = "data:image/jpg;base64," + imageData; |
+ this._imageData = imageData; |
this._timeLabel = this._element.createChild("div", "time"); |
this._element.addEventListener("mousedown", this._onMouseDown.bind(this), false); |
+ this._element.addEventListener("dblclick", this._onDoubleClick.bind(this), false); |
} |
WebInspector.NetworkFilmStripFrame.prototype = { |
@@ -210,14 +222,16 @@ WebInspector.NetworkFilmStripFrame.prototype = { |
parent.appendChild(this._element); |
}, |
- /** |
- * @param {!Event} event |
- */ |
- _onMouseDown: function(event) |
+ _onMouseDown: function() |
{ |
this._parent._selectFrame(this); |
}, |
+ _onDoubleClick: function() |
+ { |
+ WebInspector.Dialog.show(WebInspector.Dialog.modalHostView().element, new WebInspector.NetworkFilmStripFrame.DialogDelegate(this._parent._frames, this._index)); |
+ }, |
+ |
/** |
* @return {number} |
*/ |
@@ -234,3 +248,113 @@ WebInspector.NetworkFilmStripFrame.prototype = { |
this._timeLabel.textContent = Number.secondsToString(this._timestamp - offset); |
} |
} |
+ |
+ |
+/** |
+ * @constructor |
+ * @extends {WebInspector.DialogDelegate} |
+ * @param {!Array<!WebInspector.NetworkFilmStripFrame>} frames |
+ * @param {number} index |
+ */ |
+WebInspector.NetworkFilmStripFrame.DialogDelegate = function(frames, index) |
+{ |
+ WebInspector.DialogDelegate.call(this); |
+ this.element.classList.add("network-filmstrip-preview"); |
+ this.element.tabIndex = 0; |
+ |
+ this._frames = frames; |
+ this._index = index; |
+ |
+ this._imageElement = this.element.createChild("img"); |
+ var footerElement = this.element.createChild("div", "network-filmstrip-preview-footer"); |
+ footerElement.createChild("div", "flex-auto"); |
+ var prevButton = createTextButton("\u25C0", this._onPrevFrame.bind(this), undefined, WebInspector.UIString("Previous frame")); |
+ footerElement.appendChild(prevButton); |
+ this._timeLabel = footerElement.createChild("div", "network-filmstrip-preview-label"); |
+ var nextButton = createTextButton("\u25B6", this._onNextFrame.bind(this), undefined, WebInspector.UIString("Next frame")); |
+ footerElement.appendChild(nextButton); |
+ footerElement.createChild("div", "flex-auto"); |
+ |
+ this._render(); |
+ this.element.addEventListener("keydown", this._keyDown.bind(this), false); |
+} |
+ |
+WebInspector.NetworkFilmStripFrame.DialogDelegate.prototype = { |
+ /** |
+ * @override |
+ */ |
+ focus: function() |
+ { |
+ this.element.focus(); |
+ }, |
+ |
+ /** |
+ * @param {!Event} event |
+ */ |
+ _keyDown: function(event) |
+ { |
+ if (event.keyIdentifier === "Left") { |
+ if (WebInspector.isMac() && event.metaKey) { |
+ this._onFirstFrame(); |
+ return; |
+ } |
+ |
+ this._onPrevFrame(); |
+ return; |
+ } |
+ |
+ if (event.keyIdentifier === "Right") { |
+ if (WebInspector.isMac() && event.metaKey) { |
+ this._onLastFrame(); |
+ return; |
+ } |
+ |
+ this._onNextFrame(); |
+ } |
+ |
+ if (event.keyIdentifier === "Home") { |
+ this._onFirstFrame(); |
+ return; |
+ } |
+ |
+ if (event.keyIdentifier === "End") { |
+ this._onLastFrame(); |
+ return; |
+ } |
+ }, |
+ |
+ _onPrevFrame: function() |
+ { |
+ if (this._index > 0) |
+ --this._index; |
+ this._render(); |
+ }, |
+ |
+ _onNextFrame: function() |
+ { |
+ if (this._index < this._frames.length - 1) |
+ ++this._index; |
+ this._render(); |
+ }, |
+ |
+ _onFirstFrame: function() |
+ { |
+ this._index = 0; |
+ this._render(); |
+ }, |
+ |
+ _onLastFrame: function() |
+ { |
+ this._index = this._frames.length - 1; |
+ this._render(); |
+ }, |
+ |
+ _render: function() |
+ { |
+ var frame = this._frames[this._index]; |
+ this._imageElement.src = "data:image/jpg;base64," + frame._imageData; |
+ this._timeLabel.textContent = frame._timeLabel.textContent; |
+ }, |
+ |
+ __proto__: WebInspector.DialogDelegate.prototype |
+} |