// 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; })();