| Index: netlog_viewer/log_grouper.js
|
| diff --git a/netlog_viewer/log_grouper.js b/netlog_viewer/log_grouper.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..423e9dc2f75f3dcb9647fcc205be71d512b22f2c
|
| --- /dev/null
|
| +++ b/netlog_viewer/log_grouper.js
|
| @@ -0,0 +1,102 @@
|
| +// 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;
|
| +})();
|
| +
|
|
|