Index: netlog_viewer/source_tracker.js |
diff --git a/netlog_viewer/source_tracker.js b/netlog_viewer/source_tracker.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8a7c14ecbd9cde3c7f4353953f157a341b087a9e |
--- /dev/null |
+++ b/netlog_viewer/source_tracker.js |
@@ -0,0 +1,193 @@ |
+// 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 SourceTracker = (function() { |
+ 'use strict'; |
+ |
+ /** |
+ * This class keeps track of all NetLog events, grouped into per-source |
+ * streams. It receives events from EventsTracker, and passes |
+ * them on to all its observers. |
+ * |
+ * @constructor |
+ */ |
+ function SourceTracker() { |
+ assertFirstConstructorCall(SourceTracker); |
+ |
+ // Observers that only want to receive lists of updated SourceEntries. |
+ this.sourceEntryObservers_ = []; |
+ |
+ // True when cookies and authentication information should be removed from |
+ // displayed events. When true, such information should be hidden from |
+ // all pages. |
+ this.privacyStripping_ = true; |
+ |
+ // True when times should be displayed as milliseconds since the first |
+ // event, as opposed to milliseconds since January 1, 1970. |
+ this.useRelativeTimes_ = true; |
+ |
+ this.clearEntries_(); |
+ |
+ EventsTracker.getInstance().addLogEntryObserver(this); |
+ } |
+ |
+ cr.addSingletonGetter(SourceTracker); |
+ |
+ SourceTracker.prototype = { |
+ /** |
+ * Clears all log entries and SourceEntries and related state. |
+ */ |
+ clearEntries_: function() { |
+ // Used for sorting entries with automatically assigned IDs. |
+ this.maxReceivedSourceId_ = 0; |
+ |
+ // Next unique id to be assigned to a log entry without a source. |
+ // Needed to identify associated GUI elements, etc. |
+ this.nextSourcelessEventId_ = -1; |
+ |
+ // Ordered list of log entries. Needed to maintain original order when |
+ // generating log dumps |
+ this.capturedEvents_ = []; |
+ |
+ this.sourceEntries_ = {}; |
+ }, |
+ |
+ /** |
+ * Returns a list of all SourceEntries. |
+ */ |
+ getAllSourceEntries: function() { |
+ return this.sourceEntries_; |
+ }, |
+ |
+ /** |
+ * Returns the description of the specified SourceEntry, or an empty string |
+ * if it doesn't exist. |
+ */ |
+ getDescription: function(id) { |
+ var entry = this.getSourceEntry(id); |
+ if (entry) |
+ return entry.getDescription(); |
+ return ''; |
+ }, |
+ |
+ /** |
+ * Returns the specified SourceEntry. |
+ */ |
+ getSourceEntry: function(id) { |
+ return this.sourceEntries_[id]; |
+ }, |
+ |
+ /** |
+ * Sends each entry to all observers and updates |capturedEvents_|. |
+ * Also assigns unique ids to log entries without a source. |
+ */ |
+ onReceivedLogEntries: function(logEntries) { |
+ // List source entries with new log entries. Sorted chronologically, by |
+ // first new log entry. |
+ var updatedSourceEntries = []; |
+ |
+ var updatedSourceEntryIdMap = {}; |
+ |
+ for (var e = 0; e < logEntries.length; ++e) { |
+ var logEntry = logEntries[e]; |
+ |
+ // Assign unique ID, if needed. |
+ // TODO(mmenke): Remove this, and all other code to handle 0 source |
+ // IDs when M19 hits stable. |
+ if (logEntry.source.id == 0) { |
+ logEntry.source.id = this.nextSourcelessEventId_; |
+ --this.nextSourcelessEventId_; |
+ } else if (this.maxReceivedSourceId_ < logEntry.source.id) { |
+ this.maxReceivedSourceId_ = logEntry.source.id; |
+ } |
+ |
+ // Create/update SourceEntry object. |
+ var sourceEntry = this.sourceEntries_[logEntry.source.id]; |
+ if (!sourceEntry) { |
+ sourceEntry = new SourceEntry(logEntry, this.maxReceivedSourceId_); |
+ this.sourceEntries_[logEntry.source.id] = sourceEntry; |
+ } else { |
+ sourceEntry.update(logEntry); |
+ } |
+ |
+ // Add to updated SourceEntry list, if not already in it. |
+ if (!updatedSourceEntryIdMap[logEntry.source.id]) { |
+ updatedSourceEntryIdMap[logEntry.source.id] = sourceEntry; |
+ updatedSourceEntries.push(sourceEntry); |
+ } |
+ } |
+ |
+ this.capturedEvents_ = this.capturedEvents_.concat(logEntries); |
+ for (var i = 0; i < this.sourceEntryObservers_.length; ++i) { |
+ this.sourceEntryObservers_[i].onSourceEntriesUpdated( |
+ updatedSourceEntries); |
+ } |
+ }, |
+ |
+ /** |
+ * Called when all log events have been deleted. |
+ */ |
+ onAllLogEntriesDeleted: function() { |
+ this.clearEntries_(); |
+ for (var i = 0; i < this.sourceEntryObservers_.length; ++i) |
+ this.sourceEntryObservers_[i].onAllSourceEntriesDeleted(); |
+ }, |
+ |
+ /** |
+ * Sets the value of |privacyStripping_| and informs log observers |
+ * of the change. |
+ */ |
+ setPrivacyStripping: function(privacyStripping) { |
+ this.privacyStripping_ = privacyStripping; |
+ for (var i = 0; i < this.sourceEntryObservers_.length; ++i) { |
+ if (this.sourceEntryObservers_[i].onPrivacyStrippingChanged) |
+ this.sourceEntryObservers_[i].onPrivacyStrippingChanged(); |
+ } |
+ }, |
+ |
+ /** |
+ * Returns whether or not cookies and authentication information should be |
+ * displayed for events that contain them. |
+ */ |
+ getPrivacyStripping: function() { |
+ return this.privacyStripping_; |
+ }, |
+ |
+ /** |
+ * Sets the value of |useRelativeTimes_| and informs log observers |
+ * of the change. |
+ */ |
+ setUseRelativeTimes: function(useRelativeTimes) { |
+ this.useRelativeTimes_ = useRelativeTimes; |
+ for (var i = 0; i < this.sourceEntryObservers_.length; ++i) { |
+ if (this.sourceEntryObservers_[i].onUseRelativeTimesChanged) |
+ this.sourceEntryObservers_[i].onUseRelativeTimesChanged(); |
+ } |
+ }, |
+ |
+ /** |
+ * Returns true if times should be displayed as milliseconds since the first |
+ * event. |
+ */ |
+ getUseRelativeTimes: function() { |
+ return this.useRelativeTimes_; |
+ }, |
+ |
+ /** |
+ * Adds a listener of SourceEntries. |observer| will be called back when |
+ * SourceEntries are added or modified, source entries are deleted, or |
+ * privacy stripping changes: |
+ * |
+ * observer.onSourceEntriesUpdated(sourceEntries) |
+ * observer.onAllSourceEntriesDeleted() |
+ * observer.onPrivacyStrippingChanged() |
+ */ |
+ addSourceEntryObserver: function(observer) { |
+ this.sourceEntryObservers_.push(observer); |
+ } |
+ }; |
+ |
+ return SourceTracker; |
+})(); |
+ |