| // 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; |