| Index: netlog_viewer/events_tracker.js
|
| diff --git a/netlog_viewer/events_tracker.js b/netlog_viewer/events_tracker.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6efd2c836b510ad3db505f515155e9b5ea5c52f0
|
| --- /dev/null
|
| +++ b/netlog_viewer/events_tracker.js
|
| @@ -0,0 +1,123 @@
|
| +// 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.
|
| +
|
| +var EventsTracker = (function() {
|
| + 'use strict';
|
| +
|
| + /**
|
| + * This class keeps track of all NetLog events.
|
| + * It receives events from the browser and when loading a log file, and passes
|
| + * them on to all its observers.
|
| + *
|
| + * @constructor
|
| + */
|
| + function EventsTracker() {
|
| + assertFirstConstructorCall(EventsTracker);
|
| +
|
| + this.capturedEvents_ = [];
|
| + this.observers_ = [];
|
| +
|
| + // Controls how large |capturedEvents_| can grow.
|
| + this.softLimit_ = Infinity;
|
| + this.hardLimit_ = Infinity;
|
| + }
|
| +
|
| + cr.addSingletonGetter(EventsTracker);
|
| +
|
| + EventsTracker.prototype = {
|
| + /**
|
| + * Returns a list of all captured events.
|
| + */
|
| + getAllCapturedEvents: function() {
|
| + return this.capturedEvents_;
|
| + },
|
| +
|
| + /**
|
| + * Returns the number of events that were captured.
|
| + */
|
| + getNumCapturedEvents: function() {
|
| + return this.capturedEvents_.length;
|
| + },
|
| +
|
| + /**
|
| + * Deletes all the tracked events, and notifies any observers.
|
| + */
|
| + deleteAllLogEntries: function() {
|
| + timeutil.clearBaseTime();
|
| + this.capturedEvents_ = [];
|
| + for (var i = 0; i < this.observers_.length; ++i)
|
| + this.observers_[i].onAllLogEntriesDeleted();
|
| + },
|
| +
|
| + /**
|
| + * Adds captured events, and broadcasts them to any observers.
|
| + */
|
| + addLogEntries: function(logEntries) {
|
| + // When reloading a page, it's possible to receive events before
|
| + // Constants. Discard those events, as they can cause the fake
|
| + // "REQUEST_ALIVE" events for pre-existing requests not be the first
|
| + // events for those requests.
|
| + if (Constants == null)
|
| + return;
|
| + // This can happen when loading logs with no events.
|
| + if (!logEntries.length)
|
| + return;
|
| +
|
| + if (!timeutil.isBaseTimeSet()) {
|
| + timeutil.setBaseTime(
|
| + timeutil.convertTimeTicksToTime(logEntries[0].time));
|
| + }
|
| +
|
| + this.capturedEvents_ = this.capturedEvents_.concat(logEntries);
|
| + for (var i = 0; i < this.observers_.length; ++i) {
|
| + this.observers_[i].onReceivedLogEntries(logEntries);
|
| + }
|
| +
|
| + // Check that we haven't grown too big. If so, toss out older events.
|
| + if (this.getNumCapturedEvents() > this.hardLimit_) {
|
| + var originalEvents = this.capturedEvents_;
|
| + this.deleteAllLogEntries();
|
| + // Delete the oldest events until we reach the soft limit.
|
| + originalEvents.splice(0, originalEvents.length - this.softLimit_);
|
| + this.addLogEntries(originalEvents);
|
| + }
|
| + },
|
| +
|
| + /**
|
| + * Adds a listener of log entries. |observer| will be called back when new
|
| + * log data arrives or all entries are deleted:
|
| + *
|
| + * observer.onReceivedLogEntries(entries)
|
| + * observer.onAllLogEntriesDeleted()
|
| + */
|
| + addLogEntryObserver: function(observer) {
|
| + this.observers_.push(observer);
|
| + },
|
| +
|
| + /**
|
| + * Set bounds on the maximum number of events that will be tracked. This
|
| + * helps to bound the total amount of memory usage, since otherwise
|
| + * long-running capture sessions can exhaust the renderer's memory and
|
| + * crash.
|
| + *
|
| + * Once |hardLimit| number of events have been captured we do a garbage
|
| + * collection and toss out old events, bringing our count down to
|
| + * |softLimit|.
|
| + *
|
| + * To log observers this will look like all the events got deleted, and
|
| + * then subsequently a bunch of new events were received. In other words, it
|
| + * behaves the same as if the user had simply started logging a bit later
|
| + * in time!
|
| + */
|
| + setLimits: function(softLimit, hardLimit) {
|
| + if (hardLimit != Infinity && softLimit >= hardLimit)
|
| + throw 'hardLimit must be greater than softLimit';
|
| +
|
| + this.softLimit_ = softLimit;
|
| + this.hardLimit_ = hardLimit;
|
| + }
|
| + };
|
| +
|
| + return EventsTracker;
|
| +})();
|
|
|