summaryrefslogtreecommitdiffstats
path: root/chrome/browser/resources/net_internals/dataview.js
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/resources/net_internals/dataview.js')
-rw-r--r--chrome/browser/resources/net_internals/dataview.js201
1 files changed, 201 insertions, 0 deletions
diff --git a/chrome/browser/resources/net_internals/dataview.js b/chrome/browser/resources/net_internals/dataview.js
new file mode 100644
index 0000000..18eadd7
--- /dev/null
+++ b/chrome/browser/resources/net_internals/dataview.js
@@ -0,0 +1,201 @@
+// Copyright (c) 2010 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.
+
+/**
+ * This view displays options for importing/exporting the captured data. Its
+ * primarily usefulness is to allow users to copy-paste their data in an easy
+ * to read format for bug reports.
+ *
+ * - Has a button to generate a text report.
+ * - Has a button to generate a raw JSON dump (most useful for testing).
+ *
+ * @constructor
+ */
+function DataView(mainBoxId, outputTextBoxId, exportTextButtonId) {
+ DivView.call(this, mainBoxId);
+
+ this.textPre_ = document.getElementById(outputTextBoxId);
+ var exportTextButton = document.getElementById(exportTextButtonId);
+
+ exportTextButton.onclick = this.onExportToText_.bind(this);
+}
+
+inherits(DataView, DivView);
+
+/**
+ * Presents the captured data as formatted text.
+ */
+DataView.prototype.onExportToText_ = function() {
+ this.setText_("Generating...");
+
+ var text = [];
+
+ // Print some basic information about our environment.
+ text.push('Data exported on: ' + (new Date()).toLocaleString());
+ text.push('');
+ text.push('Number of passively captured events: ' +
+ g_browser.getAllPassivelyCapturedEvents().length);
+ text.push('Number of actively captured events: ' +
+ g_browser.getAllActivelyCapturedEvents().length);
+ text.push('');
+
+ text.push('Chrome version: ' + ClientInfo.version +
+ ' (' + ClientInfo.official +
+ ' ' + ClientInfo.cl +
+ ') ' + ClientInfo.version_mod);
+ text.push('Command line: ' + ClientInfo.command_line);
+
+ text.push('');
+ text.push('----------------------------------------------');
+ text.push(' Proxy settings');
+ text.push('----------------------------------------------');
+ text.push('');
+
+ text.push(g_browser.proxySettings_.currentData_);
+
+ text.push('');
+ text.push('----------------------------------------------');
+ text.push(' Bad proxies cache');
+ text.push('----------------------------------------------');
+
+ var badProxiesList = g_browser.badProxies_.currentData_;
+ if (badProxiesList.length == 0) {
+ text.push('');
+ text.push('None');
+ } else {
+ for (var i = 0; i < badProxiesList.length; ++i) {
+ var e = badProxiesList[i];
+ text.push('');
+ text.push('(' + (i+1) + ')');
+ text.push('Proxy: ' + e.proxy_uri);
+ text.push('Bad until: ' + this.formatExpirationTime_(e.bad_until));
+ }
+ }
+
+ text.push('');
+ text.push('----------------------------------------------');
+ text.push(' Host resolver cache');
+ text.push('----------------------------------------------');
+ text.push('');
+
+ var hostResolverCache = g_browser.hostResolverCache_.currentData_;
+
+ text.push('Capcity: ' + hostResolverCache.capacity);
+ text.push('Time to live for successful resolves (ms): ' +
+ hostResolverCache.ttl_success_ms);
+ text.push('Time to live for failed resolves (ms): ' +
+ hostResolverCache.ttl_failure_ms);
+
+ if (hostResolverCache.entries.length > 0) {
+ for (var i = 0; i < hostResolverCache.entries.length; ++i) {
+ var e = hostResolverCache.entries[i];
+
+ text.push('');
+ text.push('(' + (i+1) + ')');
+ text.push('Hostname: ' + e.hostname);
+ text.push('Address family: ' + e.address_family);
+
+ if (e.error != undefined) {
+ text.push('Error: ' + e.error);
+ } else {
+ for (var j = 0; j < e.addresses.length; ++j) {
+ text.push('Address ' + (j + 1) + ': ' + e.addresses[j]);
+ }
+ }
+
+ text.push('Valid until: ' + this.formatExpirationTime_(e.expiration));
+ }
+ } else {
+ text.push('');
+ text.push('None');
+ }
+
+ text.push('');
+ text.push('----------------------------------------------');
+ text.push(' Requests');
+ text.push('----------------------------------------------');
+ text.push('');
+
+ this.appendRequestsPrintedAsText_(text);
+
+ text.push('');
+ text.push('----------------------------------------------');
+ text.push(' Http cache stats');
+ text.push('----------------------------------------------');
+ text.push('');
+
+ var httpCacheStats = g_browser.httpCacheInfo_.currentData_.stats;
+ for (var statName in httpCacheStats)
+ text.push(statName + ': ' + httpCacheStats[statName]);
+
+ // Open a new window to display this text.
+ this.setText_(text.join('\n'));
+};
+
+DataView.prototype.appendRequestsPrintedAsText_ = function(out) {
+ // Concatenate the passively captured events with the actively captured events
+ // into a single array.
+ var allEvents = g_browser.getAllPassivelyCapturedEvents().concat(
+ g_browser.getAllActivelyCapturedEvents());
+
+ // Group the events into buckets by source ID, and buckets by source type.
+ var sourceIds = [];
+ var sourceIdToEventList = {};
+ var sourceTypeToSourceIdList = {}
+
+ for (var i = 0; i < allEvents.length; ++i) {
+ var e = allEvents[i];
+ var eventList = sourceIdToEventList[e.source.id];
+ if (!eventList) {
+ eventList = [];
+ sourceIdToEventList[e.source.id] = eventList;
+
+ // Update sourceIds
+ sourceIds.push(e.source.id);
+
+ // Update the sourceTypeToSourceIdList list.
+ var idList = sourceTypeToSourceIdList[e.source.type];
+ if (!idList) {
+ idList = [];
+ sourceTypeToSourceIdList[e.source.type] = idList;
+ }
+ idList.push(e.source.id);
+ }
+ eventList.push(e);
+ }
+
+
+ // For each source (ordered by when that source was first started).
+ for (var i = 0; i < sourceIds.length; ++i) {
+ var sourceId = sourceIds[i];
+ var eventList = sourceIdToEventList[sourceId];
+ var sourceType = eventList[0].source.type;
+
+ out.push('------------------------------');
+ out.push(getKeyWithValue(LogSourceType, sourceType) +
+ ' (id=' + sourceId + ')');
+ out.push('------------------------------');
+
+ out.push(PrintSourceEntriesAsText(eventList));
+ }
+};
+
+/**
+ * Helper function to set this view's content to |text|.
+ */
+DataView.prototype.setText_ = function(text) {
+ this.textPre_.innerHTML = '';
+ addTextNode(this.textPre_, text);
+};
+
+/**
+ * Format a time ticks count as a timestamp.
+ */
+DataView.prototype.formatExpirationTime_ = function(timeTicks) {
+ var d = g_browser.convertTimeTicksToDate(timeTicks);
+ var isExpired = d.getTime() < (new Date()).getTime();
+ return 't=' + d.getTime() + (isExpired ? ' [EXPIRED]' : '');
+};
+
+