blob: 0bc2b61ec56c3ee52418e56285840e72ceef580d [file] [log] [blame]
// Copyright 2017 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.
export default class ConsoleFilter {
/**
* @param {string} name
* @param {!Array<!TextUtils.FilterParser.ParsedFilter>} parsedFilters
* @param {?SDK.ExecutionContext} executionContext
* @param {!Object<string, boolean>=} levelsMask
*/
constructor(name, parsedFilters, executionContext, levelsMask) {
this.name = name;
this.parsedFilters = parsedFilters;
this.executionContext = executionContext;
this.levelsMask = levelsMask || Console.ConsoleFilter.defaultLevelsFilterValue();
}
/**
* @return {!Object<string, boolean>}
*/
static allLevelsFilterValue() {
const result = {};
for (const name of Object.values(SDK.ConsoleMessage.MessageLevel)) {
result[name] = true;
}
return result;
}
/**
* @return {!Object<string, boolean>}
*/
static defaultLevelsFilterValue() {
const result = Console.ConsoleFilter.allLevelsFilterValue();
result[SDK.ConsoleMessage.MessageLevel.Verbose] = false;
return result;
}
/**
* @param {string} level
* @return {!Object<string, boolean>}
*/
static singleLevelMask(level) {
const result = {};
result[level] = true;
return result;
}
/**
* @return {!Console.ConsoleFilter}
*/
clone() {
const parsedFilters = this.parsedFilters.map(TextUtils.FilterParser.cloneFilter);
const levelsMask = Object.assign({}, this.levelsMask);
return new Console.ConsoleFilter(this.name, parsedFilters, this.executionContext, levelsMask);
}
/**
* @param {!Console.ConsoleViewMessage} viewMessage
* @return {boolean}
*/
shouldBeVisible(viewMessage) {
const message = viewMessage.consoleMessage();
if (this.executionContext &&
(this.executionContext.runtimeModel !== message.runtimeModel() ||
this.executionContext.id !== message.executionContextId)) {
return false;
}
if (message.type === SDK.ConsoleMessage.MessageType.Command ||
message.type === SDK.ConsoleMessage.MessageType.Result || message.isGroupMessage()) {
return true;
}
if (message.level && !this.levelsMask[/** @type {string} */ (message.level)]) {
return false;
}
for (const filter of this.parsedFilters) {
if (!filter.key) {
if (filter.regex && viewMessage.matchesFilterRegex(filter.regex) === filter.negative) {
return false;
}
if (filter.text && viewMessage.matchesFilterText(filter.text) === filter.negative) {
return false;
}
} else {
switch (filter.key) {
case FilterType.Context:
if (!passesFilter(filter, message.context, false /* exactMatch */)) {
return false;
}
break;
case FilterType.Source:
const sourceNameForMessage = message.source ?
SDK.ConsoleMessage.MessageSourceDisplayName.get(
/** @type {!SDK.ConsoleMessage.MessageSource} */ (message.source)) :
message.source;
if (!passesFilter(filter, sourceNameForMessage, true /* exactMatch */)) {
return false;
}
break;
case FilterType.Url:
if (!passesFilter(filter, message.url, false /* exactMatch */)) {
return false;
}
break;
}
}
}
return true;
/**
* @param {!TextUtils.FilterParser.ParsedFilter} filter
* @param {?string|undefined} value
* @param {boolean} exactMatch
* @return {boolean}
*/
function passesFilter(filter, value, exactMatch) {
if (!filter.text) {
return !!value === filter.negative;
}
if (!value) {
return !filter.text === !filter.negative;
}
const filterText = /** @type {string} */ (filter.text).toLowerCase();
const lowerCaseValue = value.toLowerCase();
if (exactMatch && (lowerCaseValue === filterText) === filter.negative) {
return false;
}
if (!exactMatch && lowerCaseValue.includes(filterText) === filter.negative) {
return false;
}
return true;
}
}
}
/** @enum {string} */
export const FilterType = {
Context: 'context',
Source: 'source',
Url: 'url'
};
/* Legacy exported object */
self.Console = self.Console || {};
/* Legacy exported object */
Console = Console || {};
/**
* @constructor
*/
Console.ConsoleFilter = ConsoleFilter;
/** @enum {string} */
Console.ConsoleFilter.FilterType = FilterType;