Index: Source/devtools/front_end/components_lazy/FilmStripView.js |
diff --git a/Source/devtools/front_end/components_lazy/FilmStripView.js b/Source/devtools/front_end/components_lazy/FilmStripView.js |
index f465199a78133c6e3611504a7015d46a87d0775f..ca1c8b5ae0c9ae05c7744ec36c6608a954306dcf 100644 |
--- a/Source/devtools/front_end/components_lazy/FilmStripView.js |
+++ b/Source/devtools/front_end/components_lazy/FilmStripView.js |
@@ -57,19 +57,27 @@ WebInspector.FilmStripView.prototype = { |
/** |
* @param {!WebInspector.FilmStripModel.Frame} frame |
- * @return {!Element} |
+ * @return {!Promise<!Element>} |
*/ |
createFrameElement: function(frame) |
{ |
var time = frame.timestamp; |
var element = createElementWithClass("div", "frame"); |
- element.createChild("div", "thumbnail").createChild("img").src = "data:image/jpg;base64," + frame.imageData; |
+ var imageElement = element.createChild("div", "thumbnail").createChild("img"); |
element.createChild("div", "time").textContent = Number.millisToString(time - this._zeroTime); |
element.addEventListener("mousedown", this._onMouseEvent.bind(this, WebInspector.FilmStripView.Events.FrameSelected, time), false); |
element.addEventListener("mouseenter", this._onMouseEvent.bind(this, WebInspector.FilmStripView.Events.FrameEnter, time), false); |
element.addEventListener("mouseout", this._onMouseEvent.bind(this, WebInspector.FilmStripView.Events.FrameExit, time), false); |
element.addEventListener("dblclick", this._onDoubleClick.bind(this, frame), false); |
- return element; |
+ |
+ return frame.imageDataPromise().then(WebInspector.FilmStripView._setImageData.bind(null, imageElement)).then(returnElement); |
+ /** |
+ * @return {!Element} |
+ */ |
+ function returnElement() |
+ { |
+ return element; |
+ } |
}, |
/** |
@@ -101,26 +109,44 @@ WebInspector.FilmStripView.prototype = { |
var frames = this._model.frames(); |
if (!frames.length) |
return; |
+ |
this.contentElement.removeChildren(); |
this._statusLabel.remove(); |
if (this._mode === WebInspector.FilmStripView.Modes.FrameBased) { |
- frames.map(this.createFrameElement.bind(this)).forEach(this.contentElement.appendChild.bind(this.contentElement)); |
+ Promise.all(frames.map(this.createFrameElement.bind(this))).spread(this.contentElement.appendChildren.bind(this.contentElement)); |
return; |
} |
var width = this.contentElement.clientWidth; |
var scale = this._spanTime / width; |
- var element0 = this.createFrameElement(frames[0]); // Calculate frame width basing on the first frame. |
- var frameWidth = Math.ceil(WebInspector.measurePreferredSize(element0, this.contentElement).width); |
- if (!frameWidth) |
- return; |
+ this.createFrameElement(frames[0]).then(continueWhenFrameImageLoaded.bind(this)); // Calculate frame width basing on the first frame. |
- for (var pos = frameWidth; pos < width; pos += frameWidth) { |
- var time = pos * scale + this._zeroTime; |
- var frame = this.frameByTime(time); |
- var element = this.contentElement.appendChild(this.createFrameElement(frame)); |
- element.style.width = frameWidth + "px"; |
+ /** |
+ * @this {WebInspector.FilmStripView} |
+ * @param {!Element} element0 |
+ */ |
+ function continueWhenFrameImageLoaded(element0) |
+ { |
+ var frameWidth = Math.ceil(WebInspector.measurePreferredSize(element0, this.contentElement).width); |
+ if (!frameWidth) |
+ return; |
+ |
+ var promises = []; |
+ for (var pos = frameWidth; pos < width; pos += frameWidth) { |
+ var time = pos * scale + this._zeroTime; |
+ promises.push(this.createFrameElement(this.frameByTime(time)).then(fixWidth)); |
+ } |
+ Promise.all(promises).spread(this.contentElement.appendChildren.bind(this.contentElement)); |
+ /** |
+ * @param {!Element} element |
+ * @return {!Element} |
+ */ |
+ function fixWidth(element) |
+ { |
+ element.style.width = frameWidth + "px"; |
+ return element; |
+ } |
} |
}, |
@@ -174,6 +200,16 @@ WebInspector.FilmStripView.prototype = { |
} |
/** |
+ * @param {!Element} imageElement |
+ * @param {?string} data |
+ */ |
+WebInspector.FilmStripView._setImageData = function(imageElement, data) |
+{ |
+ if (data) |
+ imageElement.src = "data:image/jpg;base64," + data; |
+} |
+ |
+/** |
* @constructor |
* @extends {WebInspector.DialogDelegate} |
* @param {!WebInspector.FilmStripModel.Frame} filmStripFrame |
@@ -273,7 +309,7 @@ WebInspector.FilmStripView.DialogDelegate.prototype = { |
_render: function() |
{ |
var frame = this._frames[this._index]; |
- this._imageElement.src = "data:image/jpg;base64," + frame.imageData; |
+ frame.imageDataPromise().then(WebInspector.FilmStripView._setImageData.bind(null, this._imageElement)); |
this._timeLabel.textContent = Number.millisToString(frame.timestamp - this._zeroTime); |
}, |