summaryrefslogtreecommitdiff
path: root/chromium/chrome/browser/resources/net_internals/cros_log_visualizer_view.js
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/chrome/browser/resources/net_internals/cros_log_visualizer_view.js')
-rw-r--r--chromium/chrome/browser/resources/net_internals/cros_log_visualizer_view.js374
1 files changed, 0 insertions, 374 deletions
diff --git a/chromium/chrome/browser/resources/net_internals/cros_log_visualizer_view.js b/chromium/chrome/browser/resources/net_internals/cros_log_visualizer_view.js
deleted file mode 100644
index 6a0bf4840f3..00000000000
--- a/chromium/chrome/browser/resources/net_internals/cros_log_visualizer_view.js
+++ /dev/null
@@ -1,374 +0,0 @@
-// Copyright 2013 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 the log messages from various resources in an
- * interactive log visualizer
- *
- * - Filter checkboxes
- * - Filter text inputs
- * - Display the log by different sections: time|level|process|description
- *
- */
-var CrosLogVisualizerView = (function() {
- 'use strict';
-
- // Inherits from DivView.
- var superClass = DivView;
-
- // Special classes (defined in log_visualizer_view.css)
- var LOG_CONTAINER_CLASSNAME = 'cros-log-visualizer-container';
- var LOG_FILTER_PNAME_BLOCK_CLASSNAME =
- 'cros-log-visualizer-filter-pname-block';
- var LOG_CELL_HEADER_CLASSNAME = 'cros-log-visualizer-td-head';
- var LOG_CELL_TIME_CLASSNAME = 'cros-log-visualizer-td-time';
- var LOG_CELL_PNAME_CLASSNAME = 'cros-log-visualizer-td-pname';
- var LOG_CELL_PID_CLASSNAME = 'cros-log-visualizer-td-pid';
- var LOG_CELL_DESCRIPTION_CLASSNAME = 'cros-log-visualizer-td-description';
- var LOG_CELL_LEVEL_CLASSNAME = 'cros-log-visualizer-td-level';
- var LOG_CELL_LEVEL_CLASSNAME_LIST = {
- 'Error': 'cros-log-visualizer-td-level-error',
- 'Warning': 'cros-log-visualizer-td-level-warning',
- 'Info': 'cros-log-visualizer-td-level-info',
- 'Unknown': 'cros-log-visualizer-td-level-unknown'
- };
-
- /**
- * @constructor
- */
- function CrosLogVisualizerView() {
- assertFirstConstructorCall(CrosLogVisualizerView);
-
- // Call superclass's constructor.
- superClass.call(this, CrosLogVisualizerView.MAIN_BOX_ID);
-
- // Stores log entry objects
- this.logEntries = [];
- // Stores current search query
- this.currentQuery = '';
- // Stores raw text data of log
- this.logData = '';
- // Stores all the unique process names
- this.pNames = [];
- // References to special HTML elements in log_visualizer_view.html
- this.pNameCheckboxes = {};
- this.levelCheckboxes = {};
- this.tableEntries = [];
-
- this.initialize();
- }
-
- CrosLogVisualizerView.TAB_ID = 'tab-handle-cros-log-visualizer';
- CrosLogVisualizerView.TAB_NAME = 'Log Visualizer';
- CrosLogVisualizerView.TAB_HASH = '#visualizer';
-
- // IDs for special HTML elements in log_visualizer_view.html
- CrosLogVisualizerView.MAIN_BOX_ID = 'cros-log-visualizer-tab-content';
- CrosLogVisualizerView.LOG_TABLE_ID = 'cros-log-visualizer-log-table';
- CrosLogVisualizerView.LOG_FILTER_PNAME_ID =
- 'cros-log-visualizer-filter-pname';
- CrosLogVisualizerView.LOG_SEARCH_INPUT_ID =
- 'cros-log-visualizer-search-input';
- CrosLogVisualizerView.LOG_SEARCH_SAVE_BTN_ID = 'cros-log-visualizer-save-btn';
- CrosLogVisualizerView.LOG_VISUALIZER_CONTAINER_ID =
- 'cros-log-visualizer-visualizer-container';
-
- cr.addSingletonGetter(CrosLogVisualizerView);
-
- /**
- * Contains types of logs we are interested in
- */
- var LOGS_LIST = {
- 'NETWORK_LOG': 1,
- 'SYSTEM_LOG': 2
- };
-
- /**
- * Contains headers of the log table
- */
- var TABLE_HEADERS_LIST = ['Level', 'Time', 'Process', 'PID', 'Description'];
-
- CrosLogVisualizerView.prototype = {
- // Inherit the superclass's methods.
- __proto__: superClass.prototype,
-
- /**
- * Called during the initialization of the View. Adds the system log
- * listener into Browser_Bridge so that the system log can be retrieved.
- */
- initialize: function() {
- g_browser.addSystemLogObserver(this);
- $(CrosLogVisualizerView.LOG_SEARCH_INPUT_ID).addEventListener('keyup',
- this.onSearchQueryChange_.bind(this));
- $(CrosLogVisualizerView.LOG_SEARCH_SAVE_BTN_ID).addEventListener(
- 'click', this.onSaveBtnClicked_.bind(this));
- },
-
- /**
- * Called when the save button is clicked. Saves the current filter query
- * to the mark history. And highlights the matched text with colors.
- */
- onSaveBtnClicked_: function() {
- this.marker.addMarkHistory(this.currentQuery);
- // Clears the filter query
- $(CrosLogVisualizerView.LOG_SEARCH_INPUT_ID).value = '';
- this.currentQuery = '';
- // Refresh the table
- this.populateTable();
- this.filterLog();
- },
-
- onSearchQueryChange_: function() {
- var inputField = $(CrosLogVisualizerView.LOG_SEARCH_INPUT_ID);
- this.currentQuery = inputField.value;
- this.filterLog();
- },
-
- /**
- * Creates the log table where each row represents a entry of log.
- * This function is called if and only if the log is received from system
- * level.
- */
- populateTable: function() {
- var logTable = $(CrosLogVisualizerView.LOG_TABLE_ID);
- logTable.innerHTML = '';
- this.tableEntries.length = 0;
- // Create entries
- for (var i = 0; i < this.logEntries.length; i++) {
- this.logEntries[i].rowNum = i;
- var row = this.createTableRow(this.logEntries[i]);
- logTable.appendChild(row);
- }
- },
-
- /**
- * Creates the single row of the table where each row is a representation
- * of the logEntry object.
- */
- createTableRow: function(entry) {
- var row = document.createElement('tr');
- for (var i = 0; i < 5; i++) {
- // Creates rows
- addNode(row, 'td');
- }
- var cells = row.childNodes;
- // Level cell
- cells[0].className = LOG_CELL_LEVEL_CLASSNAME;
- var levelTag = addNodeWithText(cells[0], 'p', entry.level);
- levelTag.className = LOG_CELL_LEVEL_CLASSNAME_LIST[entry.level];
-
- // Time cell
- cells[1].className = LOG_CELL_TIME_CLASSNAME;
- cells[1].textContent = entry.getTime();
-
- // Process name cell
- cells[2].className = LOG_CELL_PNAME_CLASSNAME;
- this.marker.getHighlightedEntry(entry, 'processName', cells[2]);
-
- // Process ID cell
- cells[3].className = LOG_CELL_PID_CLASSNAME;
- this.marker.getHighlightedEntry(entry, 'processID', cells[3]);
-
- // Description cell
- cells[4].className = LOG_CELL_DESCRIPTION_CLASSNAME;
- this.marker.getHighlightedEntry(entry, 'description', cells[4]);
-
- // Add the row into this.tableEntries for future reference
- this.tableEntries.push(row);
- return row;
- },
-
- /**
- * Regenerates the table and filter.
- */
- refresh: function() {
- this.createFilter();
- this.createLogMaker();
- this.populateTable();
- this.createVisualizer();
- },
-
- /**
- * Uses the search query to match the pattern in different fields of entry.
- */
- patternMatch: function(entry, pattern) {
- return entry.processID.match(pattern) ||
- entry.processName.match(pattern) ||
- entry.level.match(pattern) ||
- entry.description.match(pattern);
- },
-
- /**
- * Filters the log to show/hide the rows in the table.
- * Each logEntry instance has a visibility property. This function
- * shows or hides the row only based on this property.
- */
- filterLog: function() {
- // Supports regular expression
- var pattern = new RegExp(this.currentQuery, 'i');
- for (var i = 0; i < this.logEntries.length; i++) {
- var entry = this.logEntries[i];
- // Filters the result by pname and level
- var pNameCheckbox = this.pNameCheckboxes[entry.processName];
- var levelCheckbox = this.levelCheckboxes[entry.level];
- entry.visibility = pNameCheckbox.checked && levelCheckbox.checked &&
- !this.visualizer.isOutOfBound(entry);
- if (this.currentQuery) {
- // If the search query is not empty, filter the result by query
- entry.visibility = entry.visibility &&
- this.patternMatch(entry, pattern);
- }
- // Changes style of HTML row based on the visibility of logEntry
- if (entry.visibility) {
- this.tableEntries[i].style.display = 'table-row';
- } else {
- this.tableEntries[i].style.display = 'none';
- }
- }
- this.filterVisualizer();
- },
-
- /**
- * Initializes filter tags and checkboxes. There are two types of filters:
- * Level and Process. Level filters are static that we have only 4 levels
- * in total but process filters are dynamically changing based on the log.
- * The filter layout looks like:
- * |-----------------------------------------------------------------|
- * | |
- * | Section of process filter |
- * | |
- * |-----------------------------------------------------------------|
- * | |
- * | Section of level filter |
- * | |
- * |-----------------------------------------------------------------|
- */
- createFilter: function() {
- this.createFilterByPName();
- this.levelCheckboxes = {
- 'Error': $('checkbox-error'),
- 'Warning': $('checkbox-warning'),
- 'Info': $('checkbox-info'),
- 'Unknown': $('checkbox-unknown')
- };
-
- for (var level in this.levelCheckboxes) {
- this.levelCheckboxes[level].addEventListener(
- 'change', this.onFilterChange_.bind(this));
- }
- },
-
- /**
- * Helper function of createFilter(). Create filter section of
- * process filters.
- */
- createFilterByPName: function() {
- var filterContainerDiv = $(CrosLogVisualizerView.LOG_FILTER_PNAME_ID);
- filterContainerDiv.innerHTML = 'Process: ';
- for (var i = 0; i < this.pNames.length; i++) {
- var pNameBlock = this.createPNameBlock(this.pNames[i]);
- filterContainerDiv.appendChild(pNameBlock);
- }
- },
-
- /**
- * Helper function of createFilterByPName(). Create a single filter block in
- * the section of process filters.
- */
- createPNameBlock: function(pName) {
- var block = document.createElement('span');
- block.className = LOG_FILTER_PNAME_BLOCK_CLASSNAME;
-
- var tag = document.createElement('label');
- var span = document.createElement('span');
- span.textContent = pName;
-
- var checkbox = document.createElement('input');
- checkbox.type = 'checkbox';
- checkbox.name = pName;
- checkbox.value = pName;
- checkbox.checked = true;
- checkbox.addEventListener('change', this.onFilterChange_.bind(this));
- this.pNameCheckboxes[pName] = checkbox;
-
- tag.appendChild(checkbox);
- tag.appendChild(span);
- block.appendChild(tag);
-
- return block;
- },
-
- /**
- * Click handler for filter checkboxes. Everytime a checkbox is clicked,
- * the visibility of related logEntries are changed.
- */
- onFilterChange_: function() {
- this.filterLog();
- },
-
- /**
- * Creates a visualizer that visualizes the logs as a timeline graph
- * during the initialization of the View.
- */
- createVisualizer: function() {
- this.visualizer = new CrosLogVisualizer(this,
- CrosLogVisualizerView.LOG_VISUALIZER_CONTAINER_ID);
- this.visualizer.updateEvents(this.logEntries);
- },
-
- /**
- * Sync the visibility of log entries with the visualizer.
- */
- filterVisualizer: function() {
- this.visualizer.updateEvents(this.logEntries);
- },
-
- /**
- * Called during the initialization. It creates the log marker that
- * highlights log text.
- */
- createLogMaker: function() {
- this.marker = new CrosLogMarker(this);
- },
-
- /**
- * Given a row text line of log, a logEntry instance is initialized and used
- * for parsing. After the text is parsed, we put the instance into
- * logEntries which is an array for storing. This function is called when
- * the data is received from Browser Bridge.
- */
- addLogEntry: function(logType, textEntry) {
- var newEntry = new CrosLogEntry();
- if (logType == LOGS_LIST.NETWORK_LOG) {
- newEntry.tokenizeNetworkLog(textEntry);
- } else {
- //TODO(shinfan): Add more if cases here
- }
- this.logEntries.push(newEntry);
-
- // Record pname
- var pName = newEntry.processName;
- if (this.pNames.indexOf(pName) == -1) {
- this.pNames.push(pName);
- }
- },
-
- /*
- * Asynchronous call back function from Browser Bridge.
- */
- onSystemLogChanged: function(callback) {
- if (callback.log == this.logData) return;
- this.logData = callback.log;
- // Clear the old array by setting length to zero
- this.logEntries.length = 0;
- var entries = callback.log.split('\n');
- for (var i = 1; i < entries.length; i++) {
- this.addLogEntry(LOGS_LIST.NETWORK_LOG, entries[i]);
- }
- this.refresh();
- }
- };
-
- return CrosLogVisualizerView;
-})();