| Index: Source/devtools/front_end/network/NetworkPanel.js
|
| diff --git a/Source/devtools/front_end/network/NetworkPanel.js b/Source/devtools/front_end/network/NetworkPanel.js
|
| index e8f3d6df911f9e1a2e261c0c262fe9434291a433..a785a757b3cbcf5c033bc885fb79b0e1cbf4e01a 100644
|
| --- a/Source/devtools/front_end/network/NetworkPanel.js
|
| +++ b/Source/devtools/front_end/network/NetworkPanel.js
|
| @@ -3195,3 +3195,85 @@ WebInspector.NetworkPanelFactory.prototype = {
|
| return WebInspector.NetworkPanel._instance();
|
| }
|
| }
|
| +
|
| +/**
|
| + * @constructor
|
| + */
|
| +WebInspector.HARWriter = function()
|
| +{
|
| +}
|
| +
|
| +WebInspector.HARWriter.prototype = {
|
| + /**
|
| + * @param {!WebInspector.OutputStream} stream
|
| + * @param {!Array.<!WebInspector.NetworkRequest>} requests
|
| + * @param {!WebInspector.Progress} progress
|
| + */
|
| + write: function(stream, requests, progress)
|
| + {
|
| + this._stream = stream;
|
| + this._harLog = (new WebInspector.HARLog(requests)).build();
|
| + this._pendingRequests = 1; // Guard against completing resource transfer before all requests are made.
|
| + var entries = this._harLog.entries;
|
| + for (var i = 0; i < entries.length; ++i) {
|
| + var content = requests[i].content;
|
| + if (typeof content === "undefined" && requests[i].finished) {
|
| + ++this._pendingRequests;
|
| + requests[i].requestContent(this._onContentAvailable.bind(this, entries[i]));
|
| + } else if (content !== null)
|
| + entries[i].response.content.text = content;
|
| + }
|
| + var compositeProgress = new WebInspector.CompositeProgress(progress);
|
| + this._writeProgress = compositeProgress.createSubProgress();
|
| + if (--this._pendingRequests) {
|
| + this._requestsProgress = compositeProgress.createSubProgress();
|
| + this._requestsProgress.setTitle(WebInspector.UIString("Collecting content…"));
|
| + this._requestsProgress.setTotalWork(this._pendingRequests);
|
| + } else
|
| + this._beginWrite();
|
| + },
|
| +
|
| + /**
|
| + * @param {!Object} entry
|
| + * @param {?string} content
|
| + */
|
| + _onContentAvailable: function(entry, content)
|
| + {
|
| + if (content !== null)
|
| + entry.response.content.text = content;
|
| + if (this._requestsProgress)
|
| + this._requestsProgress.worked();
|
| + if (!--this._pendingRequests) {
|
| + this._requestsProgress.done();
|
| + this._beginWrite();
|
| + }
|
| + },
|
| +
|
| + _beginWrite: function()
|
| + {
|
| + const jsonIndent = 2;
|
| + this._text = JSON.stringify({log: this._harLog}, null, jsonIndent);
|
| + this._writeProgress.setTitle(WebInspector.UIString("Writing file…"));
|
| + this._writeProgress.setTotalWork(this._text.length);
|
| + this._bytesWritten = 0;
|
| + this._writeNextChunk(this._stream);
|
| + },
|
| +
|
| + /**
|
| + * @param {!WebInspector.OutputStream} stream
|
| + * @param {string=} error
|
| + */
|
| + _writeNextChunk: function(stream, error)
|
| + {
|
| + if (this._bytesWritten >= this._text.length || error) {
|
| + stream.close();
|
| + this._writeProgress.done();
|
| + return;
|
| + }
|
| + const chunkSize = 100000;
|
| + var text = this._text.substring(this._bytesWritten, this._bytesWritten + chunkSize);
|
| + this._bytesWritten += text.length;
|
| + stream.write(text, this._writeNextChunk.bind(this));
|
| + this._writeProgress.setWorked(this._bytesWritten);
|
| + }
|
| +}
|
|
|