Index: Source/devtools/front_end/timeline/TimelineModel.js |
diff --git a/Source/devtools/front_end/timeline/TimelineModel.js b/Source/devtools/front_end/timeline/TimelineModel.js |
index 5a89c30ce9720acb3016b4e2ea07a8c84a1fb9ce..60e4220eb7a1fa9ba2f5f57a501b8e4eaa0df745 100644 |
--- a/Source/devtools/front_end/timeline/TimelineModel.js |
+++ b/Source/devtools/front_end/timeline/TimelineModel.js |
@@ -1196,7 +1196,7 @@ WebInspector.TimelineModel.prototype = { |
{ |
var delegate = new WebInspector.TimelineModelLoadFromFileDelegate(this, progress); |
var fileReader = this._createFileReader(file, delegate); |
- var loader = this.createLoader(fileReader, progress); |
+ var loader = new WebInspector.TracingModelLoader(this, new WebInspector.ProgressStub(), fileReader.cancel.bind(fileReader)); |
fileReader.start(loader); |
}, |
@@ -1282,16 +1282,6 @@ WebInspector.TimelineModel.prototype = { |
}, |
/** |
- * @param {!WebInspector.ChunkedFileReader} fileReader |
- * @param {!WebInspector.Progress} progress |
- * @return {!WebInspector.OutputStream} |
- */ |
- createLoader: function(fileReader, progress) |
- { |
- return new WebInspector.TracingModelLoader(this, fileReader, progress); |
- }, |
- |
- /** |
* @return {boolean} |
*/ |
isEmpty: function() |
@@ -1539,19 +1529,28 @@ WebInspector.ExclusiveTraceEventNameFilter.prototype = { |
* @constructor |
* @implements {WebInspector.OutputStream} |
* @param {!WebInspector.TimelineModel} model |
- * @param {!{cancel: function()}} reader |
* @param {!WebInspector.Progress} progress |
+ * @param {function()=} canceledCallback |
*/ |
-WebInspector.TracingModelLoader = function(model, reader, progress) |
+WebInspector.TracingModelLoader = function(model, progress, canceledCallback) |
{ |
this._model = model; |
- this._reader = reader; |
+ this._loader = new WebInspector.TracingModel.Loader(model._tracingModel); |
+ |
+ this._canceledCallback = canceledCallback; |
this._progress = progress; |
- this._buffer = ""; |
+ this._progress.setTitle(WebInspector.UIString("Loading")); |
+ this._progress.setTotalWork(WebInspector.TracingModelLoader._totalProgress); // Unknown, will loop the values. |
+ |
this._firstChunk = true; |
- this._loader = new WebInspector.TracingModel.Loader(model._tracingModel); |
+ this._wasCanceledOnce = false; |
+ |
+ this._loadedBytes = 0; |
+ this._jsonTokenizer = new WebInspector.TextUtils.BalancedJSONTokenizer(this._writeBalancedJSON.bind(this), true); |
} |
+WebInspector.TracingModelLoader._totalProgress = 100000; |
+ |
WebInspector.TracingModelLoader.prototype = { |
/** |
* @override |
@@ -1559,19 +1558,23 @@ WebInspector.TracingModelLoader.prototype = { |
*/ |
write: function(chunk) |
{ |
- var data = this._buffer + chunk; |
- var lastIndex = 0; |
- var index; |
- do { |
- index = lastIndex; |
- lastIndex = WebInspector.TextUtils.findBalancedCurlyBrackets(data, index); |
- } while (lastIndex !== -1); |
- |
- var json = data.slice(0, index) + "]"; |
- this._buffer = data.slice(index); |
- |
- if (!index) |
+ this._loadedBytes += chunk.length; |
+ if (this._progress.isCanceled() && !this._wasCanceledOnce) { |
+ this._wasCanceled = true; |
+ this._reportErrorAndCancelLoading(); |
return; |
+ } |
+ this._progress.setWorked(this._loadedBytes % WebInspector.TracingModelLoader._totalProgress, |
+ WebInspector.UIString("Loaded %s", Number.bytesToString(this._loadedBytes))); |
+ this._jsonTokenizer.write(chunk); |
+ }, |
+ |
+ /** |
+ * @param {string} data |
+ */ |
+ _writeBalancedJSON: function(data) |
+ { |
+ var json = data + "]"; |
if (this._firstChunk) { |
this._model._startCollectingTraceEvents(true); |
@@ -1586,14 +1589,14 @@ WebInspector.TracingModelLoader.prototype = { |
try { |
items = /** @type {!Array.<!WebInspector.TracingManager.EventPayload>} */ (JSON.parse(json)); |
} catch (e) { |
- this._reportErrorAndCancelLoading("Malformed timeline data: " + e); |
+ this._reportErrorAndCancelLoading(WebInspector.UIString("Malformed timeline data: " + e)); |
return; |
} |
if (this._firstChunk) { |
this._firstChunk = false; |
if (this._looksLikeAppVersion(items[0])) { |
- this._reportErrorAndCancelLoading("Old Timeline format is not supported."); |
+ this._reportErrorAndCancelLoading(WebInspector.UIString("Legacy Timeline format is not supported.")); |
return; |
} |
} |
@@ -1601,17 +1604,22 @@ WebInspector.TracingModelLoader.prototype = { |
try { |
this._loader.loadNextChunk(items); |
} catch(e) { |
- this._reportErrorAndCancelLoading("Malformed timeline data: " + e); |
+ this._reportErrorAndCancelLoading(WebInspector.UIString("Malformed timeline data: " + e)); |
return; |
} |
}, |
- _reportErrorAndCancelLoading: function(messsage) |
+ /** |
+ * @param {string=} message |
+ */ |
+ _reportErrorAndCancelLoading: function(message) |
{ |
- WebInspector.console.error(messsage); |
+ if (message) |
+ WebInspector.console.error(message); |
this._model.tracingComplete(); |
this._model.reset(); |
- this._reader.cancel(); |
+ if (this._canceledCallback) |
+ this._canceledCallback(); |
this._progress.done(); |
}, |
@@ -1627,6 +1635,8 @@ WebInspector.TracingModelLoader.prototype = { |
{ |
this._loader.finish(); |
this._model.tracingComplete(); |
+ if (this._progress) |
+ this._progress.done(); |
} |
} |