Disable view source for Developer Tools.
[chromium-blink-merge.git] / chrome / browser / resources / net_internals / events_tracker.js
blob6efd2c836b510ad3db505f515155e9b5ea5c52f0
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 var EventsTracker = (function() {
6   'use strict';
8   /**
9    * This class keeps track of all NetLog events.
10    * It receives events from the browser and when loading a log file, and passes
11    * them on to all its observers.
12    *
13    * @constructor
14    */
15   function EventsTracker() {
16     assertFirstConstructorCall(EventsTracker);
18     this.capturedEvents_ = [];
19     this.observers_ = [];
21     // Controls how large |capturedEvents_| can grow.
22     this.softLimit_ = Infinity;
23     this.hardLimit_ = Infinity;
24   }
26   cr.addSingletonGetter(EventsTracker);
28   EventsTracker.prototype = {
29     /**
30      * Returns a list of all captured events.
31      */
32     getAllCapturedEvents: function() {
33       return this.capturedEvents_;
34     },
36     /**
37      * Returns the number of events that were captured.
38      */
39     getNumCapturedEvents: function() {
40       return this.capturedEvents_.length;
41     },
43     /**
44      * Deletes all the tracked events, and notifies any observers.
45      */
46     deleteAllLogEntries: function() {
47       timeutil.clearBaseTime();
48       this.capturedEvents_ = [];
49       for (var i = 0; i < this.observers_.length; ++i)
50         this.observers_[i].onAllLogEntriesDeleted();
51     },
53     /**
54      * Adds captured events, and broadcasts them to any observers.
55      */
56     addLogEntries: function(logEntries) {
57       // When reloading a page, it's possible to receive events before
58       // Constants.  Discard those events, as they can cause the fake
59       // "REQUEST_ALIVE" events for pre-existing requests not be the first
60       // events for those requests.
61       if (Constants == null)
62         return;
63       // This can happen when loading logs with no events.
64       if (!logEntries.length)
65         return;
67       if (!timeutil.isBaseTimeSet()) {
68         timeutil.setBaseTime(
69             timeutil.convertTimeTicksToTime(logEntries[0].time));
70       }
72       this.capturedEvents_ = this.capturedEvents_.concat(logEntries);
73       for (var i = 0; i < this.observers_.length; ++i) {
74         this.observers_[i].onReceivedLogEntries(logEntries);
75       }
77       // Check that we haven't grown too big. If so, toss out older events.
78       if (this.getNumCapturedEvents() > this.hardLimit_) {
79         var originalEvents = this.capturedEvents_;
80         this.deleteAllLogEntries();
81         // Delete the oldest events until we reach the soft limit.
82         originalEvents.splice(0, originalEvents.length - this.softLimit_);
83         this.addLogEntries(originalEvents);
84       }
85     },
87     /**
88      * Adds a listener of log entries. |observer| will be called back when new
89      * log data arrives or all entries are deleted:
90      *
91      *   observer.onReceivedLogEntries(entries)
92      *   observer.onAllLogEntriesDeleted()
93      */
94     addLogEntryObserver: function(observer) {
95       this.observers_.push(observer);
96     },
98     /**
99      * Set bounds on the maximum number of events that will be tracked. This
100      * helps to bound the total amount of memory usage, since otherwise
101      * long-running capture sessions can exhaust the renderer's memory and
102      * crash.
103      *
104      * Once |hardLimit| number of events have been captured we do a garbage
105      * collection and toss out old events, bringing our count down to
106      * |softLimit|.
107      *
108      * To log observers this will look like all the events got deleted, and
109      * then subsequently a bunch of new events were received. In other words, it
110      * behaves the same as if the user had simply started logging a bit later
111      * in time!
112      */
113     setLimits: function(softLimit, hardLimit) {
114       if (hardLimit != Infinity && softLimit >= hardLimit)
115         throw 'hardLimit must be greater than softLimit';
117       this.softLimit_ = softLimit;
118       this.hardLimit_ = hardLimit;
119     }
120   };
122   return EventsTracker;
123 })();