blob: d0592480a3ba07469f37272ed9de9ef0a050cc00 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @fileoverview
* LogGroupEntry is a wrapper around log entries, which makes it easier to
* find the corresponding start/end of events.
*
* This is used internally by the log and timeline views to pretty print
* collections of log entries.
*/
// TODO(eroman): document these methods!
var LogGroupEntry = (function() {
'use strict';
function LogGroupEntry(origEntry, index) {
this.orig = origEntry;
this.index = index;
}
LogGroupEntry.prototype = {
isBegin: function() {
return this.orig.phase == EventPhase.PHASE_BEGIN;
},
isEnd: function() {
return this.orig.phase == EventPhase.PHASE_END;
},
getDepth: function() {
var depth = 0;
var p = this.parentEntry;
while (p) {
depth += 1;
p = p.parentEntry;
}
return depth;
}
};
function findParentIndex(parentStack, eventType) {
for (var i = parentStack.length - 1; i >= 0; --i) {
if (parentStack[i].orig.type == eventType)
return i;
}
return -1;
}
/**
* Returns a list of LogGroupEntrys. This basically wraps the original log
* entry, but makes it easier to find the start/end of the event.
*/
LogGroupEntry.createArrayFrom = function(origEntries) {
var groupedEntries = [];
// Stack of enclosing PHASE_BEGIN elements.
var parentStack = [];
for (var i = 0; i < origEntries.length; ++i) {
var origEntry = origEntries[i];
var groupEntry = new LogGroupEntry(origEntry, i);
groupedEntries.push(groupEntry);
// If this is the end of an event, match it to the start.
if (groupEntry.isEnd()) {
// Walk up the parent stack to find the corresponding BEGIN for this
// END.
var parentIndex = findParentIndex(parentStack, groupEntry.orig.type);
if (parentIndex == -1) {
// Unmatched end.
} else {
groupEntry.begin = parentStack[parentIndex];
// Consider this as the terminator for all open BEGINs up until
// parentIndex.
while (parentIndex < parentStack.length) {
var p = parentStack.pop();
p.end = groupEntry;
}
}
}
// Inherit the current parent.
if (parentStack.length > 0)
groupEntry.parentEntry = parentStack[parentStack.length - 1];
if (groupEntry.isBegin())
parentStack.push(groupEntry);
}
return groupedEntries;
};
return LogGroupEntry;
})();