blob: 3c73150f263b64e924dbbe26f3c96b24b5622379 [file] [log] [blame]
// 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.
/**
* 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.
*/
var LogsView = (function() {
'use strict';
// Special classes (defined in logs_view.css).
var LOG_ROW_COLLAPSED_CLASSNAME = 'logs-view-log-row-collapsed';
var LOG_ROW_EXPANDED_CLASSNAME = 'logs-view-log-row-expanded';
var LOG_CELL_TEXT_CLASSNAME = 'logs-view-log-cell-text';
var LOG_CELL_LOG_CLASSNAME = 'logs-view-log-cell-log';
var LOG_TABLE_BUTTON_COLUMN_CLASSNAME = 'logs-view-log-table-button-column';
var LOG_BUTTON_CLASSNAME = 'logs-view-log-button';
// We inherit from DivView.
var superClass = DivView;
/**
* @constructor
*/
function LogsView() {
assertFirstConstructorCall(LogsView);
// Call superclass's constructor.
superClass.call(this, LogsView.MAIN_BOX_ID);
var tableDiv = $(LogsView.TABLE_ID);
this.rows = [];
this.populateTable(tableDiv, LOG_FILTER_LIST);
$(LogsView.GLOBAL_SHOW_BUTTON_ID).addEventListener('click',
this.onGlobalChangeVisibleClick_.bind(this, true));
$(LogsView.GLOBAL_HIDE_BUTTON_ID).addEventListener('click',
this.onGlobalChangeVisibleClick_.bind(this, false));
$(LogsView.REFRESH_LOGS_BUTTON_ID).addEventListener('click',
this.onLogsRefresh_.bind(this));
}
LogsView.TAB_ID = 'tab-handle-logs';
LogsView.TAB_NAME = 'Logs';
LogsView.TAB_HASH = '#logs';
// IDs for special HTML elements in logs_view.html
LogsView.MAIN_BOX_ID = 'logs-view-tab-content';
LogsView.TABLE_ID = 'logs-view-log-table';
LogsView.GLOBAL_SHOW_BUTTON_ID = 'logs-view-global-show-btn';
LogsView.GLOBAL_HIDE_BUTTON_ID = 'logs-view-global-hide-btn';
LogsView.REFRESH_LOGS_BUTTON_ID = 'logs-view-refresh-btn';
cr.addSingletonGetter(LogsView);
/**
* Contains log keys we are interested in.
*/
var LOG_FILTER_LIST = [
{
key: 'syslog',
},
{
key: 'ui_log',
},
{
key: 'chrome_system_log',
},
{
key: 'chrome_log',
}
];
LogsView.prototype = {
// Inherit the superclass's methods.
__proto__: superClass.prototype,
/**
* 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.
*/
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 = LOG_CELL_TEXT_CLASSNAME;
cells[0].textContent = logKey;
// Cell log is displayed in. Log content is in div element that is
// initially hidden and empty.
cells[2].className = LOG_CELL_TEXT_CLASSNAME;
var logDiv = document.createElement('div');
logDiv.textContent = '';
logDiv.className = LOG_CELL_LOG_CLASSNAME;
logDiv.id = 'logs-view.log-cell.' + 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 = LOG_BUTTON_CLASSNAME;
expandButton.addEventListener('click',
this.onButtonClicked_.bind(this, row));
// Cell that contains show/hide button.
cells[1].appendChild(expandButton);
cells[1].className = LOG_TABLE_BUTTON_COLUMN_CLASSNAME;
// Initially, log is not visible.
row.className = LOG_ROW_COLLAPSED_CLASSNAME;
// 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 LOG_FILTER_LIST.
*/
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).
*/
onButtonClicked_: function(containingRow) {
if (!containingRow.logVisible) {
containingRow.className = LOG_ROW_EXPANDED_CLASSNAME;
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 = LOG_ROW_COLLAPSED_CLASSNAME;
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.
*/
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.
*/
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 = '';
}
}
};
return LogsView;
})();