summaryrefslogtreecommitdiffstats
path: root/chrome/browser/resources/net_internals/logsview.js
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/resources/net_internals/logsview.js')
-rw-r--r--chrome/browser/resources/net_internals/logsview.js176
1 files changed, 176 insertions, 0 deletions
diff --git a/chrome/browser/resources/net_internals/logsview.js b/chrome/browser/resources/net_internals/logsview.js
new file mode 100644
index 0000000..032d4577
--- /dev/null
+++ b/chrome/browser/resources/net_internals/logsview.js
@@ -0,0 +1,176 @@
+// Copyright (c) 2011 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 network related log data and is specific fo ChromeOS.
+ * We get log data from chrome by filtering system logs for network related
+ * keywords. Logs are not fetched until we actually need them.
+ *
+ * @constructor
+ */
+function LogsView(mainBoxId, tableId, globalShowButtonId, globalHideButtonId,
+ refreshLogsButtonId) {
+ var tableDiv = document.getElementById(tableId);
+ this.rows = [];
+ this.PopulateTable(tableDiv, this.logFilterList);
+ document.getElementById(globalShowButtonId).addEventListener('click',
+ this.onGlobalChangeVisibleClick_.bind(this, true));
+ document.getElementById(globalHideButtonId).addEventListener('click',
+ this.onGlobalChangeVisibleClick_.bind(this, false));
+ document.getElementById(refreshLogsButtonId).addEventListener('click',
+ this.onLogsRefresh_.bind(this));
+ DivView.call(this, mainBoxId);
+};
+
+inherits(LogsView, DivView);
+
+/**
+ * Contains log keys we are interested in.
+ */
+LogsView.prototype.logFilterList = [
+ {
+ key:'syslog',
+ },
+ {
+ key:'ui_log',
+ },
+ {
+ key:'chrome_system_log',
+ },
+ {
+ key:'chrome_log',
+ },
+];
+
+/**
+ * Called during View's initialization. Creates the row of a table logs will be
+ * shown in. Each row has 4 cells.
+ *
+ * First cell's content will be set to |logKey|, second will contain a button
+ * that will be used to show or hide third cell, which will contain the filtered
+ * log.
+ * |logKey| also tells us which log we are getting data from.
+ */
+LogsView.prototype.CreateTableRow = function(logKey) {
+ var row = document.createElement('tr');
+
+ var cells = [];
+ for (var i = 0; i < 3; i++) {
+ var rowCell = document.createElement('td');
+ cells.push(rowCell);
+ row.appendChild(rowCell);
+ }
+ // Log key cell.
+ cells[0].className = 'logCellText';
+ cells[0].textContent = logKey;
+ // Cell log is displayed in. Log content is in div element that is initially
+ // hidden and empty.
+ cells[2].className = 'logCellText';
+ var logDiv = document.createElement('div');
+ logDiv.textContent = '';
+ logDiv.className = 'logCellLog';
+ logDiv.id = 'logsView.logCell.' + this.rows.length;
+ cells[2].appendChild(logDiv);
+
+ // Button that we use to show or hide div element with log content. Logs are
+ // not visible initially, so we initialize button accordingly.
+ var expandButton = document.createElement('button');
+ expandButton.textContent = 'Show...';
+ expandButton.className = 'logButton';
+ expandButton.addEventListener('click',
+ this.onButtonClicked_.bind(this, row));
+
+ // Cell that contains show/hide button.
+ cells[1].appendChild(expandButton);
+ cells[1].className = 'logTableButtonColumn';
+
+ // Initially, log is not visible.
+ row.className = 'logRowCollapsed';
+
+ // We will need those to process row buttons' onclick events.
+ row.logKey = logKey;
+ row.expandButton = expandButton;
+ row.logDiv = logDiv;
+ row.logVisible = false;
+ this.rows.push(row);
+
+ return row;
+};
+
+/**
+ * Initializes |tableDiv| to represent data from |logList| which should be of
+ * type LogsView.logFilterList.
+ */
+LogsView.prototype.PopulateTable = function(tableDiv, logList) {
+ for (var i = 0; i < logList.length; i++) {
+ var logSource = this.CreateTableRow(logList[i].key);
+ tableDiv.appendChild(logSource);
+ }
+};
+
+/**
+ * Processes clicks on buttons that show or hide log contents in log row.
+ * Row containing the clicked button is given to the method since it contains
+ * all data we need to process the click (unlike button object itself).
+ */
+LogsView.prototype.onButtonClicked_ = function(containingRow) {
+ if (!containingRow.logVisible) {
+ containingRow.className = 'logRowExpanded';
+ containingRow.expandButton.textContent = 'Hide...';
+ var logDiv = containingRow.logDiv;
+ if (logDiv.textContent == '') {
+ logDiv.textContent = 'Getting logs...';
+ // Callback will be executed by g_browser.
+ g_browser.getSystemLog(containingRow.logKey,
+ containingRow.logDiv.id);
+ }
+ } else {
+ containingRow.className = 'logRowCollapsed';
+ containingRow.expandButton.textContent = 'Show...';
+ }
+ containingRow.logVisible = !containingRow.logVisible;
+};
+
+/**
+ * Processes click on one of the buttons that are used to show or hide all logs
+ * we care about.
+ */
+LogsView.prototype.onGlobalChangeVisibleClick_ = function(isShowAll) {
+ for (var row in this.rows) {
+ if (isShowAll != this.rows[row].logVisible) {
+ this.onButtonClicked_(this.rows[row]);
+ }
+ }
+};
+
+/**
+ * Processes click event on the button we use to refresh fetched logs. we get
+ * the newest logs from libcros, and refresh content of the visible log cells.
+ */
+LogsView.prototype.onLogsRefresh_ = function() {
+ g_browser.refreshSystemLogs();
+
+ var visibleLogRows = [];
+ var hiddenLogRows = [];
+ for (var row in this.rows) {
+ if (this.rows[row].logVisible) {
+ visibleLogRows.push(this.rows[row]);
+ } else {
+ hiddenLogRows.push(this.rows[row]);
+ }
+ }
+
+ // We have to refresh text content in visible rows.
+ for (row in visibleLogRows) {
+ visibleLogRows[row].logDiv.textContent = 'Getting logs...';
+ g_browser.getSystemLog(visibleLogRows[row].logKey,
+ visibleLogRows[row].logDiv.id);
+ }
+
+ // In hidden rows we just clear potential log text, so we know we have to get
+ // new contents when we show the row next time.
+ for (row in hiddenLogRows) {
+ hiddenLogRows[row].logDiv.textContent = '';
+ }
+};