| Index: chrome/browser/resources/net_internals/main.js
|
| ===================================================================
|
| --- chrome/browser/resources/net_internals/main.js (revision 45858)
|
| +++ chrome/browser/resources/net_internals/main.js (working copy)
|
| @@ -57,6 +57,10 @@
|
| "hostResolverCacheTTLSuccess",
|
| "hostResolverCacheTTLFailure");
|
|
|
| + // Create a view which will display import/export options to control the
|
| + // captured data.
|
| + var dataView = new DataView("dataTabContent", "exportToJson", "exportToText");
|
| +
|
| // Create a view which lets you tab between the different sub-views.
|
| var categoryTabSwitcher =
|
| new TabSwitcherView(new DivView('categoryTabHandles'));
|
| @@ -69,6 +73,7 @@
|
| false);
|
| categoryTabSwitcher.addTab('httpCacheTab',
|
| new DivView('httpCacheTabContent'), false);
|
| + categoryTabSwitcher.addTab('dataTab', dataView, false);
|
|
|
| // Build a map from the anchor name of each tab handle to its "tab ID".
|
| // We will consider navigations to the #hash as a switch tab request.
|
| @@ -109,14 +114,15 @@
|
| function BrowserBridge() {
|
| // List of observers for various bits of browser state.
|
| this.logObservers_ = [];
|
| - this.proxySettingsObservers_ = [];
|
| - this.badProxiesObservers_ = [];
|
| - this.hostResolverCacheObservers_ = [];
|
| + this.proxySettings_ = new PollableDataHelper('onProxySettingsChanged');
|
| + this.badProxies_ = new PollableDataHelper('onBadProxiesChanged');
|
| + this.hostResolverCache_ = new PollableDataHelper('onHostResolverCacheChanged');
|
|
|
| - // Map from observer method name (i.e. 'onProxySettingsChanged',
|
| - // 'onBadProxiesChanged') to the previously received data for that type. Used
|
| - // to tell if the data has actually changed since we last polled it.
|
| - this.prevPollData_ = {};
|
| + // Cache of the data received.
|
| + // TODO(eroman): the controls to clear data in the "Requests" tab should be
|
| + // affecting this as well.
|
| + this.passivelyCapturedEvents_ = [];
|
| + this.activelyCapturedEvents_ = [];
|
| }
|
|
|
| /**
|
| @@ -169,7 +175,11 @@
|
| // Messages received from the browser
|
| //------------------------------------------------------------------------------
|
|
|
| -BrowserBridge.prototype.receivedLogEntry = function(logEntry) {
|
| +BrowserBridge.prototype.receivedLogEntry = function(logEntry,
|
| + wasCapturedPassively) {
|
| + if (!wasCapturedPassively) {
|
| + this.activelyCapturedEvents_.push(logEntry);
|
| + }
|
| for (var i = 0; i < this.logObservers_.length; ++i)
|
| this.logObservers_[i].onLogEntryAdded(logEntry);
|
| };
|
| @@ -193,25 +203,23 @@
|
| };
|
|
|
| BrowserBridge.prototype.receivedProxySettings = function(proxySettings) {
|
| - this.dispatchToObserversFromPoll_(
|
| - this.proxySettingsObservers_, 'onProxySettingsChanged', proxySettings);
|
| + this.proxySettings_.update(proxySettings);
|
| };
|
|
|
| BrowserBridge.prototype.receivedBadProxies = function(badProxies) {
|
| - this.dispatchToObserversFromPoll_(
|
| - this.badProxiesObservers_, 'onBadProxiesChanged', badProxies);
|
| + this.badProxies_.update(badProxies);
|
| };
|
|
|
| BrowserBridge.prototype.receivedHostResolverCache =
|
| function(hostResolverCache) {
|
| - this.dispatchToObserversFromPoll_(
|
| - this.hostResolverCacheObservers_, 'onHostResolverCacheChanged',
|
| - hostResolverCache);
|
| + this.hostResolverCache_.update(hostResolverCache);
|
| };
|
|
|
| BrowserBridge.prototype.receivedPassiveLogEntries = function(entries) {
|
| + this.passivelyCapturedEvents_ =
|
| + this.passivelyCapturedEvents_.concat(entries);
|
| for (var i = 0; i < entries.length; ++i)
|
| - this.receivedLogEntry(entries[i]);
|
| + this.receivedLogEntry(entries[i], true);
|
| };
|
|
|
| //------------------------------------------------------------------------------
|
| @@ -236,7 +244,7 @@
|
| * TODO(eroman): send a dictionary instead.
|
| */
|
| BrowserBridge.prototype.addProxySettingsObserver = function(observer) {
|
| - this.proxySettingsObservers_.push(observer);
|
| + this.proxySettings_.addObserver(observer);
|
| };
|
|
|
| /**
|
| @@ -251,7 +259,7 @@
|
| * bad. Note the time is in time ticks.
|
| */
|
| BrowserBridge.prototype.addBadProxiesObsever = function(observer) {
|
| - this.badProxiesObservers_.push(observer);
|
| + this.badProxies_.addObserver(observer);
|
| };
|
|
|
| /**
|
| @@ -261,7 +269,7 @@
|
| * observer.onHostResolverCacheChanged(hostResolverCache)
|
| */
|
| BrowserBridge.prototype.addHostResolverCacheObserver = function(observer) {
|
| - this.hostResolverCacheObservers_.push(observer);
|
| + this.hostResolverCache_.addObserver(observer);
|
| };
|
|
|
| /**
|
| @@ -280,6 +288,22 @@
|
| return d;
|
| };
|
|
|
| +/**
|
| + * Returns a list of all the events that were captured while we were
|
| + * listening for events.
|
| + */
|
| +BrowserBridge.prototype.getAllActivelyCapturedEvents = function() {
|
| + return this.activelyCapturedEvents_;
|
| +};
|
| +
|
| +/**
|
| + * Returns a list of all the events that were captured passively by the
|
| + * browser prior to when the net-internals page was started.
|
| + */
|
| +BrowserBridge.prototype.getAllPassivelyCapturedEvents = function() {
|
| + return this.passivelyCapturedEvents_;
|
| +};
|
| +
|
| BrowserBridge.prototype.doPolling_ = function() {
|
| // TODO(eroman): Optimize this by using a separate polling frequency for the
|
| // data consumed by the currently active view. Everything else can be on a low
|
| @@ -290,21 +314,37 @@
|
| };
|
|
|
| /**
|
| + * This is a helper class used by BrowserBridge, to keep track of:
|
| + * - the list of observers interested in some piece of data.
|
| + * - the last known value of that piece of data.
|
| + * - the name of the callback method to invoke on observers.
|
| + * @constructor
|
| + */
|
| +function PollableDataHelper(observerMethodName) {
|
| + this.observerMethodName_ = observerMethodName;
|
| + this.observers_ = [];
|
| +}
|
| +
|
| +PollableDataHelper.prototype.addObserver = function(observer) {
|
| + this.observers_.push(observer);
|
| +};
|
| +
|
| +/**
|
| * Helper function to handle calling all the observers, but ONLY if the data has
|
| * actually changed since last time. This is used for data we received from
|
| * browser on a poll loop.
|
| */
|
| -BrowserBridge.prototype.dispatchToObserversFromPoll_ = function(
|
| - observerList, method, data) {
|
| - var prevData = this.prevPollData_[method];
|
| +PollableDataHelper.prototype.update = function(data) {
|
| + var prevData = this.currentData_;
|
|
|
| // If the data hasn't changed since last time, no need to notify observers.
|
| if (prevData && JSON.stringify(prevData) == JSON.stringify(data))
|
| return;
|
|
|
| - this.prevPollData_[method] = data;
|
| + this.currentData_ = data;
|
|
|
| // Ok, notify the observers of the change.
|
| - for (var i = 0; i < observerList.length; ++i)
|
| - observerList[i][method](data);
|
| + for (var i = 0; i < this.observers_.length; ++i)
|
| + var observer = this.observers_[i];
|
| + observer[this.observerMethodName_](data);
|
| };
|
|
|