diff options
Diffstat (limited to 'chrome/browser/resources/net_internals/sourceentry.js')
-rw-r--r-- | chrome/browser/resources/net_internals/sourceentry.js | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/chrome/browser/resources/net_internals/sourceentry.js b/chrome/browser/resources/net_internals/sourceentry.js new file mode 100644 index 0000000..72d3a44 --- /dev/null +++ b/chrome/browser/resources/net_internals/sourceentry.js @@ -0,0 +1,182 @@ +// 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. + +/** + * Each row in the filtered items list is backed by a SourceEntry. This + * instance contains all of the data pertaining to that row, and notifies + * its parent view (the RequestsView) whenever its data changes. + * + * @constructor + */ +function SourceEntry(parentView) { + this.entries_ = []; + this.parentView_ = parentView; + this.isSelected_ = false; + this.isMatchedByFilter_ = false; +} + +SourceEntry.prototype.isSelected = function() { + return this.isSelected_; +}; + +SourceEntry.prototype.setSelectedStyles = function(isSelected) { + changeClassName(this.row_, 'selected', isSelected); + this.getSelectionCheckbox().checked = isSelected; +}; + +SourceEntry.prototype.setMouseoverStyle = function(isMouseOver) { + changeClassName(this.row_, 'mouseover', isMouseOver); +}; + +SourceEntry.prototype.setIsMatchedByFilter = function(isMatchedByFilter) { + if (this.isMatchedByFilter() == isMatchedByFilter) + return; // No change. + + this.isMatchedByFilter_ = isMatchedByFilter; + + this.setFilterStyles(isMatchedByFilter); + + if (isMatchedByFilter) { + this.parentView_.incrementPostfilterCount(1); + } else { + this.parentView_.incrementPostfilterCount(-1); + // If we are filtering an entry away, make sure it is no longer + // part of the selection. + this.setSelected(false); + } +}; + +SourceEntry.prototype.isMatchedByFilter = function() { + return this.isMatchedByFilter_; +}; + +SourceEntry.prototype.setFilterStyles = function(isMatchedByFilter) { + // Hide rows which have been filtered away. + if (isMatchedByFilter) { + this.row_.style.display = ''; + } else { + this.row_.style.display = 'none'; + } +}; + +SourceEntry.prototype.update = function(logEntry) { + this.entries_.push(logEntry); + + if (this.entries_.length == 1) { + this.createRow_(); + + // Only apply the filter during the first update. + // TODO(eroman): once filters use other data, apply it on each update. + var matchesFilter = this.matchesFilter(this.parentView_.currentFilter_); + this.setIsMatchedByFilter(matchesFilter); + } +}; + +SourceEntry.prototype.onCheckboxToggled_ = function() { + this.setSelected(this.getSelectionCheckbox().checked); +}; + +SourceEntry.prototype.matchesFilter = function(filterText) { + // TODO(eroman): Support more advanced filter syntax. + if (filterText == '') + return true; + + var filterText = filterText.toLowerCase(); + + return this.getDescription().toLowerCase().indexOf(filterText) != -1 || + this.getSourceTypeString().toLowerCase().indexOf(filterText) != -1; +}; + +SourceEntry.prototype.setSelected = function(isSelected) { + if (isSelected == this.isSelected()) + return; + + this.isSelected_ = isSelected; + + this.setSelectedStyles(isSelected); + this.parentView_.modifySelectionArray(this, isSelected); + this.parentView_.onSelectionChanged(); +}; + +SourceEntry.prototype.onClicked_ = function() { + this.parentView_.clearSelection(); + this.setSelected(true); +}; + +SourceEntry.prototype.onMouseover_ = function() { + this.setMouseoverStyle(true); +}; + +SourceEntry.prototype.onMouseout_ = function() { + this.setMouseoverStyle(false); +}; + +SourceEntry.prototype.createRow_ = function() { + // Create a row. + var tr = addNode(this.parentView_.tableBody_, 'tr'); + tr.style.display = 'none'; + this.row_ = tr; + + var selectionCol = addNode(tr, 'td'); + var checkbox = addNode(selectionCol, 'input'); + checkbox.type = 'checkbox'; + + var idCell = addNode(tr, 'td'); + var typeCell = addNode(tr, 'td'); + var descriptionCell = addNode(tr, 'td'); + + // Connect listeners. + checkbox.onchange = this.onCheckboxToggled_.bind(this); + + var onclick = this.onClicked_.bind(this); + idCell.onclick = onclick; + typeCell.onclick = onclick; + descriptionCell.onclick = onclick; + + tr.onmouseover = this.onMouseover_.bind(this); + tr.onmouseout = this.onMouseout_.bind(this); + + // Set the cell values to match this source's data. + addTextNode(idCell, this.getSourceId()); + var sourceTypeString = this.getSourceTypeString(); + addTextNode(typeCell, sourceTypeString); + addTextNode(descriptionCell, this.getDescription()); + + // Add a CSS classname specific to this source type (so CSS can specify + // different stylings for different types). + changeClassName(this.row_, "source_" + sourceTypeString, true); +}; + +SourceEntry.prototype.getDescription = function() { + var e = this.entries_[0]; + if (e.type == LogEntryType.TYPE_EVENT && + e.event.phase == LogEventPhase.PHASE_BEGIN && + e.string != undefined) { + return e.string; // The URL / hostname / whatever. + } + return ''; +}; + +SourceEntry.prototype.getLogEntries = function() { + return this.entries_; +}; + +SourceEntry.prototype.getSourceTypeString = function() { + return getKeyWithValue(LogSourceType, this.entries_[0].source.type); +}; + +SourceEntry.prototype.getSelectionCheckbox = function() { + return this.row_.childNodes[0].firstChild; +}; + +SourceEntry.prototype.getSourceId = function() { + return this.entries_[0].source.id; +}; + +SourceEntry.prototype.remove = function() { + this.setSelected(false); + this.setIsMatchedByFilter(false); + this.row_.parentNode.removeChild(this.row_); +}; + |