1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * LogGroupEntry is a wrapper around log entries, which makes it easier to
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * find the corresponding start/end of events.
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * This is used internally by the log and timeline views to pretty print
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * collections of log entries.
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * @fileoverview
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(eroman): document these methods!
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochfunction LogGroupEntry(origEntry, index) {
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  this.orig = origEntry;
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  this.index = index;
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochLogGroupEntry.prototype.isBegin = function() {
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return this.orig.phase == LogEventPhase.PHASE_BEGIN;
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochLogGroupEntry.prototype.isEnd = function() {
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return this.orig.phase == LogEventPhase.PHASE_END
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochLogGroupEntry.prototype.getDepth = function() {
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  var depth = 0;
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  var p = this.parentEntry;
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  while (p) {
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    depth += 1;
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    p = p.parentEntry;
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return depth;
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochfunction findParentIndex(parentStack, eventType) {
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (var i = parentStack.length - 1; i >= 0; --i) {
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (parentStack[i].orig.type == eventType)
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return i;
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return -1;
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Returns a list of LogGroupEntrys. This basically wraps the original log
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * entry, but makes it easier to find the start/end of the event.
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochLogGroupEntry.createArrayFrom = function(origEntries) {
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  var groupedEntries = [];
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Stack of enclosing PHASE_BEGIN elements.
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  var parentStack = [];
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (var i = 0; i < origEntries.length; ++i) {
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    var origEntry = origEntries[i];
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    var groupEntry = new LogGroupEntry(origEntry, i);
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    groupedEntries.push(groupEntry);
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // If this is the end of an event, match it to the start.
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (groupEntry.isEnd()) {
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // Walk up the parent stack to find the corresponding BEGIN for this END.
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      var parentIndex =
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          findParentIndex(parentStack, groupEntry.orig.type);
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (parentIndex == -1) {
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        // Unmatched end.
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      } else {
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        groupEntry.begin = parentStack[parentIndex];
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        // Consider this as the terminator for all open BEGINs up until
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        // parentIndex.
773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        while (parentIndex < parentStack.length) {
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          var p = parentStack.pop();
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          p.end = groupEntry;
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        }
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Inherit the current parent.
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (parentStack.length > 0)
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      groupEntry.parentEntry = parentStack[parentStack.length - 1];
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (groupEntry.isBegin())
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      parentStack.push(groupEntry);
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return groupedEntries;
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
94