blob: 0ab6bfcdd9ca56b3e13b54827f0e6c0c174f7a94 [file] [log] [blame]
Blink Reformat4c46d092018-04-07 15:32:371// Copyright 2017 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Tim van der Lippe9b2f8712020-02-12 17:46:225import * as Common from '../common/common.js';
Tim van der Lippe93b57c32020-02-20 17:38:446import * as Platform from '../platform/platform.js';
Tim van der Lippe9b2f8712020-02-12 17:46:227import * as SDK from '../sdk/sdk.js';
8import * as TextUtils from '../text_utils/text_utils.js'; // eslint-disable-line no-unused-vars
9import * as UI from '../ui/ui.js';
10
Tim van der Lippeeaacb722020-01-10 12:16:0011import {ConsoleFilter, FilterType} from './ConsoleFilter.js';
12import {ConsoleViewMessage} from './ConsoleViewMessage.js'; // eslint-disable-line no-unused-vars
13
Tim van der Lippe9b2f8712020-02-12 17:46:2214export class ConsoleSidebar extends UI.Widget.VBox {
Tim van der Lippeb45d9a02019-11-05 17:24:4115 constructor() {
Blink Reformat4c46d092018-04-07 15:32:3716 super(true);
17 this.setMinimumSize(125, 0);
18
Tim van der Lippe9b2f8712020-02-12 17:46:2219 this._tree = new UI.TreeOutline.TreeOutlineInShadow();
Blink Reformat4c46d092018-04-07 15:32:3720 this._tree.registerRequiredCSS('console/consoleSidebar.css');
21 this._tree.addEventListener(UI.TreeOutline.Events.ElementSelected, this._selectionChanged.bind(this));
22 this.contentElement.appendChild(this._tree.element);
Tim van der Lippe9b2f8712020-02-12 17:46:2223 /** @type {?UI.TreeOutline.TreeElement} */
Blink Reformat4c46d092018-04-07 15:32:3724 this._selectedTreeElement = null;
Tim van der Lippeeaacb722020-01-10 12:16:0025 /** @type {!Array<!FilterTreeElement>} */
Blink Reformat4c46d092018-04-07 15:32:3726 this._treeElements = [];
Paul Lewis6bcdb182020-01-23 11:08:0527 const selectedFilterSetting = self.Common.settings.createSetting('console.sidebarSelectedFilter', null);
Blink Reformat4c46d092018-04-07 15:32:3728
Tim van der Lippe9b2f8712020-02-12 17:46:2229 const Levels = SDK.ConsoleModel.MessageLevel;
Tim van der Lippeeaacb722020-01-10 12:16:0030 const consoleAPIParsedFilters =
Tim van der Lippe9b2f8712020-02-12 17:46:2231 [{key: FilterType.Source, text: SDK.ConsoleModel.MessageSource.ConsoleAPI, negative: false}];
Blink Reformat4c46d092018-04-07 15:32:3732 this._appendGroup(
Tim van der Lippe9b2f8712020-02-12 17:46:2233 _groupName.All, [], ConsoleFilter.allLevelsFilterValue(), UI.Icon.Icon.create('mediumicon-list'),
Blink Reformat4c46d092018-04-07 15:32:3734 selectedFilterSetting);
35 this._appendGroup(
Tim van der Lippeeaacb722020-01-10 12:16:0036 _groupName.ConsoleAPI, consoleAPIParsedFilters, ConsoleFilter.allLevelsFilterValue(),
Tim van der Lippe9b2f8712020-02-12 17:46:2237 UI.Icon.Icon.create('mediumicon-account-circle'), selectedFilterSetting);
Paul Lewisbf7aa3c2019-11-20 17:03:3838 this._appendGroup(
Tim van der Lippe9b2f8712020-02-12 17:46:2239 _groupName.Error, [], ConsoleFilter.singleLevelMask(Levels.Error),
40 UI.Icon.Icon.create('mediumicon-error-circle'), selectedFilterSetting);
Blink Reformat4c46d092018-04-07 15:32:3741 this._appendGroup(
Tim van der Lippeeaacb722020-01-10 12:16:0042 _groupName.Warning, [], ConsoleFilter.singleLevelMask(Levels.Warning),
Tim van der Lippe9b2f8712020-02-12 17:46:2243 UI.Icon.Icon.create('mediumicon-warning-triangle'), selectedFilterSetting);
Blink Reformat4c46d092018-04-07 15:32:3744 this._appendGroup(
Tim van der Lippe9b2f8712020-02-12 17:46:2245 _groupName.Info, [], ConsoleFilter.singleLevelMask(Levels.Info), UI.Icon.Icon.create('mediumicon-info-circle'),
Tim van der Lippeeaacb722020-01-10 12:16:0046 selectedFilterSetting);
Blink Reformat4c46d092018-04-07 15:32:3747 this._appendGroup(
Tim van der Lippe9b2f8712020-02-12 17:46:2248 _groupName.Verbose, [], ConsoleFilter.singleLevelMask(Levels.Verbose), UI.Icon.Icon.create('mediumicon-bug'),
Paul Lewisbf7aa3c2019-11-20 17:03:3849 selectedFilterSetting);
Blink Reformat4c46d092018-04-07 15:32:3750 const selectedTreeElementName = selectedFilterSetting.get();
51 const defaultTreeElement =
52 this._treeElements.find(x => x.name() === selectedTreeElementName) || this._treeElements[0];
53 defaultTreeElement.select();
54 }
55
56 /**
57 * @param {string} name
Tim van der Lippe9b2f8712020-02-12 17:46:2258 * @param {!Array<!TextUtils.TextUtils.ParsedFilter>} parsedFilters
Blink Reformat4c46d092018-04-07 15:32:3759 * @param {!Object<string, boolean>} levelsMask
60 * @param {!Element} icon
Tim van der Lippe9b2f8712020-02-12 17:46:2261 * @param {!Common.Settings.Setting} selectedFilterSetting
Blink Reformat4c46d092018-04-07 15:32:3762 */
Tim van der Lippeb45d9a02019-11-05 17:24:4163 _appendGroup(name, parsedFilters, levelsMask, icon, selectedFilterSetting) {
Tim van der Lippeeaacb722020-01-10 12:16:0064 const filter = new ConsoleFilter(name, parsedFilters, null, levelsMask);
Paul Lewisbf7aa3c2019-11-20 17:03:3865 const treeElement = new FilterTreeElement(filter, icon, selectedFilterSetting);
Blink Reformat4c46d092018-04-07 15:32:3766 this._tree.appendChild(treeElement);
67 this._treeElements.push(treeElement);
68 }
69
70 clear() {
Tim van der Lippe1d6e57a2019-09-30 11:55:3471 for (const treeElement of this._treeElements) {
Blink Reformat4c46d092018-04-07 15:32:3772 treeElement.clear();
Tim van der Lippe1d6e57a2019-09-30 11:55:3473 }
Blink Reformat4c46d092018-04-07 15:32:3774 }
75
76 /**
Tim van der Lippeeaacb722020-01-10 12:16:0077 * @param {!ConsoleViewMessage} viewMessage
Blink Reformat4c46d092018-04-07 15:32:3778 */
79 onMessageAdded(viewMessage) {
Tim van der Lippe1d6e57a2019-09-30 11:55:3480 for (const treeElement of this._treeElements) {
Blink Reformat4c46d092018-04-07 15:32:3781 treeElement.onMessageAdded(viewMessage);
Tim van der Lippe1d6e57a2019-09-30 11:55:3482 }
Blink Reformat4c46d092018-04-07 15:32:3783 }
84
85 /**
Tim van der Lippeeaacb722020-01-10 12:16:0086 * @param {!ConsoleViewMessage} viewMessage
Blink Reformat4c46d092018-04-07 15:32:3787 * @return {boolean}
88 */
89 shouldBeVisible(viewMessage) {
Tim van der Lippe1d6e57a2019-09-30 11:55:3490 if (!this._selectedTreeElement) {
Blink Reformat4c46d092018-04-07 15:32:3791 return true;
Tim van der Lippe1d6e57a2019-09-30 11:55:3492 }
Blink Reformat4c46d092018-04-07 15:32:3793 return this._selectedTreeElement._filter.shouldBeVisible(viewMessage);
94 }
95
96 /**
Tim van der Lippec02a97c2020-02-14 14:39:2797 * @param {!Common.EventTarget.EventTargetEvent} event
Blink Reformat4c46d092018-04-07 15:32:3798 */
99 _selectionChanged(event) {
Tim van der Lippe9b2f8712020-02-12 17:46:22100 this._selectedTreeElement = /** @type {!UI.TreeOutline.TreeElement} */ (event.data);
Paul Lewisbf7aa3c2019-11-20 17:03:38101 this.dispatchEventToListeners(Events.FilterSelected);
Blink Reformat4c46d092018-04-07 15:32:37102 }
Paul Lewisbf7aa3c2019-11-20 17:03:38103}
Blink Reformat4c46d092018-04-07 15:32:37104
105/** @enum {symbol} */
Paul Lewisbf7aa3c2019-11-20 17:03:38106export const Events = {
Blink Reformat4c46d092018-04-07 15:32:37107 FilterSelected: Symbol('FilterSelected')
108};
109
Tim van der Lippe9b2f8712020-02-12 17:46:22110export class URLGroupTreeElement extends UI.TreeOutline.TreeElement {
Blink Reformat4c46d092018-04-07 15:32:37111 /**
Tim van der Lippeeaacb722020-01-10 12:16:00112 * @param {!ConsoleFilter} filter
Blink Reformat4c46d092018-04-07 15:32:37113 */
Tim van der Lippeb45d9a02019-11-05 17:24:41114 constructor(filter) {
Blink Reformat4c46d092018-04-07 15:32:37115 super(filter.name);
116 this._filter = filter;
117 this._countElement = this.listItemElement.createChild('span', 'count');
Tim van der Lippe9b2f8712020-02-12 17:46:22118 const leadingIcons = [UI.Icon.Icon.create('largeicon-navigator-file')];
Blink Reformat4c46d092018-04-07 15:32:37119 this.setLeadingIcons(leadingIcons);
120 this._messageCount = 0;
121 }
122
123 incrementAndUpdateCounter() {
124 this._messageCount++;
125 this._countElement.textContent = this._messageCount;
126 }
Paul Lewisbf7aa3c2019-11-20 17:03:38127}
Blink Reformat4c46d092018-04-07 15:32:37128
Tim van der Lippe9b2f8712020-02-12 17:46:22129export class FilterTreeElement extends UI.TreeOutline.TreeElement {
Blink Reformat4c46d092018-04-07 15:32:37130 /**
Tim van der Lippeeaacb722020-01-10 12:16:00131 * @param {!ConsoleFilter} filter
Blink Reformat4c46d092018-04-07 15:32:37132 * @param {!Element} icon
Tim van der Lippe9b2f8712020-02-12 17:46:22133 * @param {!Common.Settings.Setting} selectedFilterSetting
Blink Reformat4c46d092018-04-07 15:32:37134 */
Tim van der Lippeb45d9a02019-11-05 17:24:41135 constructor(filter, icon, selectedFilterSetting) {
Blink Reformat4c46d092018-04-07 15:32:37136 super(filter.name);
137 this._filter = filter;
Blink Reformat4c46d092018-04-07 15:32:37138 this._selectedFilterSetting = selectedFilterSetting;
Tim van der Lippeeaacb722020-01-10 12:16:00139 /** @type {!Map<?string, !URLGroupTreeElement>} */
Blink Reformat4c46d092018-04-07 15:32:37140 this._urlTreeElements = new Map();
141 this.setLeadingIcons([icon]);
142 this._messageCount = 0;
143 this._updateCounter();
144 }
145
146 clear() {
147 this._urlTreeElements.clear();
148 this.removeChildren();
149 this._messageCount = 0;
150 this._updateCounter();
151 }
152
153 /**
154 * @return {string}
155 */
156 name() {
157 return this._filter.name;
158 }
159
160 /**
161 * @param {boolean=} selectedByUser
162 * @return {boolean}
163 * @override
164 */
165 onselect(selectedByUser) {
166 this._selectedFilterSetting.set(this._filter.name);
167 return super.onselect(selectedByUser);
168 }
169
170 _updateCounter() {
Christy Chenc891ec62019-10-09 00:31:07171 if (!this._messageCount) {
Paul Lewisbf7aa3c2019-11-20 17:03:38172 this.title = _groupNoMessageTitleMap.get(this._filter.name);
Christy Chenc891ec62019-10-09 00:31:07173 } else if (this._messageCount === 1) {
Paul Lewisbf7aa3c2019-11-20 17:03:38174 this.title = _groupSingularTitleMap.get(this._filter.name);
Christy Chenc891ec62019-10-09 00:31:07175 } else {
Tim van der Lippe93b57c32020-02-20 17:38:44176 this.title = Platform.StringUtilities.sprintf(_groupPluralTitleMap.get(this._filter.name), this._messageCount);
Christy Chenc891ec62019-10-09 00:31:07177 }
178
Blink Reformat4c46d092018-04-07 15:32:37179 this.setExpandable(!!this.childCount());
180 }
181
182 /**
Tim van der Lippeeaacb722020-01-10 12:16:00183 * @param {!ConsoleViewMessage} viewMessage
Blink Reformat4c46d092018-04-07 15:32:37184 */
185 onMessageAdded(viewMessage) {
186 const message = viewMessage.consoleMessage();
Tim van der Lippe9b2f8712020-02-12 17:46:22187 const shouldIncrementCounter = message.type !== SDK.ConsoleModel.MessageType.Command &&
188 message.type !== SDK.ConsoleModel.MessageType.Result && !message.isGroupMessage();
Tim van der Lippe1d6e57a2019-09-30 11:55:34189 if (!this._filter.shouldBeVisible(viewMessage) || !shouldIncrementCounter) {
Blink Reformat4c46d092018-04-07 15:32:37190 return;
Tim van der Lippe1d6e57a2019-09-30 11:55:34191 }
Blink Reformat4c46d092018-04-07 15:32:37192 const child = this._childElement(message.url);
193 child.incrementAndUpdateCounter();
194 this._messageCount++;
195 this._updateCounter();
196 }
197
198 /**
199 * @param {string=} url
Tim van der Lippeeaacb722020-01-10 12:16:00200 * @return {!URLGroupTreeElement}
Blink Reformat4c46d092018-04-07 15:32:37201 */
202 _childElement(url) {
203 const urlValue = url || null;
204 let child = this._urlTreeElements.get(urlValue);
Tim van der Lippe1d6e57a2019-09-30 11:55:34205 if (child) {
Blink Reformat4c46d092018-04-07 15:32:37206 return child;
Tim van der Lippe1d6e57a2019-09-30 11:55:34207 }
Blink Reformat4c46d092018-04-07 15:32:37208
209 const filter = this._filter.clone();
Tim van der Lippe9b2f8712020-02-12 17:46:22210 const parsedURL = urlValue ? Common.ParsedURL.ParsedURL.fromString(urlValue) : null;
Tim van der Lippe1d6e57a2019-09-30 11:55:34211 if (urlValue) {
Blink Reformat4c46d092018-04-07 15:32:37212 filter.name = parsedURL ? parsedURL.displayName : urlValue;
Tim van der Lippe1d6e57a2019-09-30 11:55:34213 } else {
Tim van der Lippe9b2f8712020-02-12 17:46:22214 filter.name = Common.UIString.UIString('<other>');
Tim van der Lippe1d6e57a2019-09-30 11:55:34215 }
Tim van der Lippeeaacb722020-01-10 12:16:00216 filter.parsedFilters.push({key: FilterType.Url, text: urlValue, negative: false});
Paul Lewisbf7aa3c2019-11-20 17:03:38217 child = new URLGroupTreeElement(filter);
Tim van der Lippe1d6e57a2019-09-30 11:55:34218 if (urlValue) {
Blink Reformat4c46d092018-04-07 15:32:37219 child.tooltip = urlValue;
Tim van der Lippe1d6e57a2019-09-30 11:55:34220 }
Blink Reformat4c46d092018-04-07 15:32:37221 this._urlTreeElements.set(urlValue, child);
222 this.appendChild(child);
223 return child;
224 }
Paul Lewisbf7aa3c2019-11-20 17:03:38225}
Blink Reformat4c46d092018-04-07 15:32:37226
227/** @enum {string} */
Tim van der Lippec96ccd92019-11-29 16:23:54228const _groupName = {
Christy Chenc891ec62019-10-09 00:31:07229 ConsoleAPI: 'user message',
230 All: 'message',
231 Error: 'error',
232 Warning: 'warning',
233 Info: 'info',
234 Verbose: 'verbose'
Blink Reformat4c46d092018-04-07 15:32:37235};
236
237/** @const {!Map<string, string>} */
Tim van der Lippec96ccd92019-11-29 16:23:54238const _groupSingularTitleMap = new Map([
Paul Lewisbf7aa3c2019-11-20 17:03:38239 [_groupName.ConsoleAPI, ls`1 user message`], [_groupName.All, ls`1 message`], [_groupName.Error, ls`1 error`],
240 [_groupName.Warning, ls`1 warning`], [_groupName.Info, ls`1 info`], [_groupName.Verbose, ls`1 verbose`]
Christy Chenc891ec62019-10-09 00:31:07241]);
242
243/** @const {!Map<string, string>} */
Tim van der Lippec96ccd92019-11-29 16:23:54244const _groupPluralTitleMap = new Map([
Paul Lewisbf7aa3c2019-11-20 17:03:38245 [_groupName.ConsoleAPI, ls`%d user messages`], [_groupName.All, ls`%d messages`], [_groupName.Error, ls`%d errors`],
246 [_groupName.Warning, ls`%d warnings`], [_groupName.Info, ls`%d info`], [_groupName.Verbose, ls`%d verbose`]
Christy Chenc891ec62019-10-09 00:31:07247]);
248
249/** @const {!Map<string, string>} */
Tim van der Lippec96ccd92019-11-29 16:23:54250const _groupNoMessageTitleMap = new Map([
Paul Lewisbf7aa3c2019-11-20 17:03:38251 [_groupName.ConsoleAPI, ls`No user messages`], [_groupName.All, ls`No messages`], [_groupName.Error, ls`No errors`],
252 [_groupName.Warning, ls`No warnings`], [_groupName.Info, ls`No info`], [_groupName.Verbose, ls`No verbose`]
Blink Reformat4c46d092018-04-07 15:32:37253]);