summaryrefslogtreecommitdiffstats
path: root/chrome/browser/resources/net_internals/loggrouper.js
blob: a3cf7a54c9d8c06fe5d4f9e1e56b4a4d90fb8f83 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// Copyright (c) 2010 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.

/**
 * 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.
 *
 * @fileoverview
 */

// TODO(eroman): document these methods!

function LogGroupEntry(origEntry, index) {
  this.orig = origEntry;
  this.index = index;
}

LogGroupEntry.prototype.isBegin = function() {
  return this.orig.type == LogEntryType.TYPE_EVENT &&
         this.orig.event.phase == LogEventPhase.PHASE_BEGIN;
};

LogGroupEntry.prototype.isEnd = function() {
  return this.orig.type == LogEntryType.TYPE_EVENT &&
         this.orig.event.phase == LogEventPhase.PHASE_END
};

LogGroupEntry.prototype.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.event.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.event.type);

      if (parentIndex == -1) {
        // Unmatched end.
      } else {
        groupEntry.begin = parentStack[parentIndex];

        // Consider this as the terminator for all open BEGINs up until
        // parentIndex.
        for (var j = 0; j < parentStack.length - parentIndex; ++j) {
          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;
}