blob: 09e79da2d8ced841643089c1edf70ff20106b441 [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();
Jack Franklin71519f82020-11-03 12:08:5920 this._tree.registerRequiredCSS('console/consoleSidebar.css', {enableLegacyPatching: true});
Blink Reformat4c46d092018-04-07 15:32:3721 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 = [];
Sigurd Schneidera3e99b02020-10-08 11:15:3727 /** @type {!Common.Settings.Setting<string>} */
Paul Lewis2d7d65c2020-03-16 17:26:3028 const selectedFilterSetting =
29 Common.Settings.Settings.instance().createSetting('console.sidebarSelectedFilter', null);
Blink Reformat4c46d092018-04-07 15:32:3730
Tim van der Lippe9b2f8712020-02-12 17:46:2231 const Levels = SDK.ConsoleModel.MessageLevel;
Tim van der Lippeeaacb722020-01-10 12:16:0032 const consoleAPIParsedFilters =
Sigurd Schneidera3e99b02020-10-08 11:15:3733 [{key: FilterType.Source, text: SDK.ConsoleModel.MessageSource.ConsoleAPI, negative: false, regex: undefined}];
Blink Reformat4c46d092018-04-07 15:32:3734 this._appendGroup(
Tim van der Lippe9b2f8712020-02-12 17:46:2235 _groupName.All, [], ConsoleFilter.allLevelsFilterValue(), UI.Icon.Icon.create('mediumicon-list'),
Blink Reformat4c46d092018-04-07 15:32:3736 selectedFilterSetting);
37 this._appendGroup(
Tim van der Lippeeaacb722020-01-10 12:16:0038 _groupName.ConsoleAPI, consoleAPIParsedFilters, ConsoleFilter.allLevelsFilterValue(),
Tim van der Lippe9b2f8712020-02-12 17:46:2239 UI.Icon.Icon.create('mediumicon-account-circle'), selectedFilterSetting);
Paul Lewisbf7aa3c2019-11-20 17:03:3840 this._appendGroup(
Tim van der Lippe9b2f8712020-02-12 17:46:2241 _groupName.Error, [], ConsoleFilter.singleLevelMask(Levels.Error),
42 UI.Icon.Icon.create('mediumicon-error-circle'), selectedFilterSetting);
Blink Reformat4c46d092018-04-07 15:32:3743 this._appendGroup(
Tim van der Lippeeaacb722020-01-10 12:16:0044 _groupName.Warning, [], ConsoleFilter.singleLevelMask(Levels.Warning),
Tim van der Lippe9b2f8712020-02-12 17:46:2245 UI.Icon.Icon.create('mediumicon-warning-triangle'), selectedFilterSetting);
Blink Reformat4c46d092018-04-07 15:32:3746 this._appendGroup(
Tim van der Lippe9b2f8712020-02-12 17:46:2247 _groupName.Info, [], ConsoleFilter.singleLevelMask(Levels.Info), UI.Icon.Icon.create('mediumicon-info-circle'),
Tim van der Lippeeaacb722020-01-10 12:16:0048 selectedFilterSetting);
Blink Reformat4c46d092018-04-07 15:32:3749 this._appendGroup(
Tim van der Lippe9b2f8712020-02-12 17:46:2250 _groupName.Verbose, [], ConsoleFilter.singleLevelMask(Levels.Verbose), UI.Icon.Icon.create('mediumicon-bug'),
Paul Lewisbf7aa3c2019-11-20 17:03:3851 selectedFilterSetting);
Blink Reformat4c46d092018-04-07 15:32:3752 const selectedTreeElementName = selectedFilterSetting.get();
53 const defaultTreeElement =
54 this._treeElements.find(x => x.name() === selectedTreeElementName) || this._treeElements[0];
55 defaultTreeElement.select();
56 }
57
58 /**
59 * @param {string} name
Tim van der Lippe9b2f8712020-02-12 17:46:2260 * @param {!Array<!TextUtils.TextUtils.ParsedFilter>} parsedFilters
Blink Reformat4c46d092018-04-07 15:32:3761 * @param {!Object<string, boolean>} levelsMask
Sigurd Schneidera3e99b02020-10-08 11:15:3762 * @param {!UI.Icon.Icon} icon
63 * @param {!Common.Settings.Setting<string>} selectedFilterSetting
Blink Reformat4c46d092018-04-07 15:32:3764 */
Tim van der Lippeb45d9a02019-11-05 17:24:4165 _appendGroup(name, parsedFilters, levelsMask, icon, selectedFilterSetting) {
Tim van der Lippeeaacb722020-01-10 12:16:0066 const filter = new ConsoleFilter(name, parsedFilters, null, levelsMask);
Paul Lewisbf7aa3c2019-11-20 17:03:3867 const treeElement = new FilterTreeElement(filter, icon, selectedFilterSetting);
Blink Reformat4c46d092018-04-07 15:32:3768 this._tree.appendChild(treeElement);
69 this._treeElements.push(treeElement);
70 }
71
72 clear() {
Tim van der Lippe1d6e57a2019-09-30 11:55:3473 for (const treeElement of this._treeElements) {
Blink Reformat4c46d092018-04-07 15:32:3774 treeElement.clear();
Tim van der Lippe1d6e57a2019-09-30 11:55:3475 }
Blink Reformat4c46d092018-04-07 15:32:3776 }
77
78 /**
Tim van der Lippeeaacb722020-01-10 12:16:0079 * @param {!ConsoleViewMessage} viewMessage
Blink Reformat4c46d092018-04-07 15:32:3780 */
81 onMessageAdded(viewMessage) {
Tim van der Lippe1d6e57a2019-09-30 11:55:3482 for (const treeElement of this._treeElements) {
Blink Reformat4c46d092018-04-07 15:32:3783 treeElement.onMessageAdded(viewMessage);
Tim van der Lippe1d6e57a2019-09-30 11:55:3484 }
Blink Reformat4c46d092018-04-07 15:32:3785 }
86
87 /**
Tim van der Lippeeaacb722020-01-10 12:16:0088 * @param {!ConsoleViewMessage} viewMessage
Blink Reformat4c46d092018-04-07 15:32:3789 * @return {boolean}
90 */
91 shouldBeVisible(viewMessage) {
Sigurd Schneidera3e99b02020-10-08 11:15:3792 if (this._selectedTreeElement instanceof ConsoleSidebarTreeElement) {
93 return this._selectedTreeElement.filter().shouldBeVisible(viewMessage);
Tim van der Lippe1d6e57a2019-09-30 11:55:3494 }
Sigurd Schneidera3e99b02020-10-08 11:15:3795 return true;
Blink Reformat4c46d092018-04-07 15:32:3796 }
97
98 /**
Tim van der Lippec02a97c2020-02-14 14:39:2799 * @param {!Common.EventTarget.EventTargetEvent} event
Blink Reformat4c46d092018-04-07 15:32:37100 */
101 _selectionChanged(event) {
Tim van der Lippe9b2f8712020-02-12 17:46:22102 this._selectedTreeElement = /** @type {!UI.TreeOutline.TreeElement} */ (event.data);
Paul Lewisbf7aa3c2019-11-20 17:03:38103 this.dispatchEventToListeners(Events.FilterSelected);
Blink Reformat4c46d092018-04-07 15:32:37104 }
Paul Lewisbf7aa3c2019-11-20 17:03:38105}
Blink Reformat4c46d092018-04-07 15:32:37106
107/** @enum {symbol} */
Paul Lewisbf7aa3c2019-11-20 17:03:38108export const Events = {
Blink Reformat4c46d092018-04-07 15:32:37109 FilterSelected: Symbol('FilterSelected')
110};
111
Sigurd Schneidera3e99b02020-10-08 11:15:37112class ConsoleSidebarTreeElement extends UI.TreeOutline.TreeElement {
113 /**
114 * @param {string|!Node} title
115 * @param {!ConsoleFilter} filter
116 */
117 constructor(title, filter) {
118 super(title);
119 this._filter = filter;
120 }
121
122 filter() {
123 return this._filter;
124 }
125}
126
127export class URLGroupTreeElement extends ConsoleSidebarTreeElement {
Blink Reformat4c46d092018-04-07 15:32:37128 /**
Tim van der Lippeeaacb722020-01-10 12:16:00129 * @param {!ConsoleFilter} filter
Blink Reformat4c46d092018-04-07 15:32:37130 */
Tim van der Lippeb45d9a02019-11-05 17:24:41131 constructor(filter) {
Sigurd Schneidera3e99b02020-10-08 11:15:37132 super(filter.name, filter);
Blink Reformat4c46d092018-04-07 15:32:37133 this._countElement = this.listItemElement.createChild('span', 'count');
Tim van der Lippe9b2f8712020-02-12 17:46:22134 const leadingIcons = [UI.Icon.Icon.create('largeicon-navigator-file')];
Blink Reformat4c46d092018-04-07 15:32:37135 this.setLeadingIcons(leadingIcons);
136 this._messageCount = 0;
137 }
138
139 incrementAndUpdateCounter() {
140 this._messageCount++;
Sigurd Schneidera3e99b02020-10-08 11:15:37141 this._countElement.textContent = `${this._messageCount}`;
Blink Reformat4c46d092018-04-07 15:32:37142 }
Paul Lewisbf7aa3c2019-11-20 17:03:38143}
Blink Reformat4c46d092018-04-07 15:32:37144
Sigurd Schneidera3e99b02020-10-08 11:15:37145export class FilterTreeElement extends ConsoleSidebarTreeElement {
Blink Reformat4c46d092018-04-07 15:32:37146 /**
Tim van der Lippeeaacb722020-01-10 12:16:00147 * @param {!ConsoleFilter} filter
Sigurd Schneidera3e99b02020-10-08 11:15:37148 * @param {!UI.Icon.Icon} icon
149 * @param {!Common.Settings.Setting<string>} selectedFilterSetting
Blink Reformat4c46d092018-04-07 15:32:37150 */
Tim van der Lippeb45d9a02019-11-05 17:24:41151 constructor(filter, icon, selectedFilterSetting) {
Sigurd Schneidera3e99b02020-10-08 11:15:37152 super(filter.name, filter);
Blink Reformat4c46d092018-04-07 15:32:37153 this._selectedFilterSetting = selectedFilterSetting;
Tim van der Lippeeaacb722020-01-10 12:16:00154 /** @type {!Map<?string, !URLGroupTreeElement>} */
Blink Reformat4c46d092018-04-07 15:32:37155 this._urlTreeElements = new Map();
156 this.setLeadingIcons([icon]);
157 this._messageCount = 0;
158 this._updateCounter();
159 }
160
161 clear() {
162 this._urlTreeElements.clear();
163 this.removeChildren();
164 this._messageCount = 0;
165 this._updateCounter();
166 }
167
168 /**
169 * @return {string}
170 */
171 name() {
172 return this._filter.name;
173 }
174
175 /**
176 * @param {boolean=} selectedByUser
177 * @return {boolean}
178 * @override
179 */
180 onselect(selectedByUser) {
181 this._selectedFilterSetting.set(this._filter.name);
182 return super.onselect(selectedByUser);
183 }
184
185 _updateCounter() {
Christy Chenc891ec62019-10-09 00:31:07186 if (!this._messageCount) {
Sigurd Schneidera3e99b02020-10-08 11:15:37187 this.title = _groupNoMessageTitleMap.get(this._filter.name) || '';
Christy Chenc891ec62019-10-09 00:31:07188 } else if (this._messageCount === 1) {
Sigurd Schneidera3e99b02020-10-08 11:15:37189 this.title = _groupSingularTitleMap.get(this._filter.name) || '';
Christy Chenc891ec62019-10-09 00:31:07190 } else {
Sigurd Schneidera3e99b02020-10-08 11:15:37191 this.title =
192 Platform.StringUtilities.sprintf(_groupPluralTitleMap.get(this._filter.name) || '', this._messageCount);
Christy Chenc891ec62019-10-09 00:31:07193 }
194
Blink Reformat4c46d092018-04-07 15:32:37195 this.setExpandable(!!this.childCount());
196 }
197
198 /**
Tim van der Lippeeaacb722020-01-10 12:16:00199 * @param {!ConsoleViewMessage} viewMessage
Blink Reformat4c46d092018-04-07 15:32:37200 */
201 onMessageAdded(viewMessage) {
202 const message = viewMessage.consoleMessage();
Tim van der Lippe9b2f8712020-02-12 17:46:22203 const shouldIncrementCounter = message.type !== SDK.ConsoleModel.MessageType.Command &&
204 message.type !== SDK.ConsoleModel.MessageType.Result && !message.isGroupMessage();
Tim van der Lippe1d6e57a2019-09-30 11:55:34205 if (!this._filter.shouldBeVisible(viewMessage) || !shouldIncrementCounter) {
Blink Reformat4c46d092018-04-07 15:32:37206 return;
Tim van der Lippe1d6e57a2019-09-30 11:55:34207 }
Blink Reformat4c46d092018-04-07 15:32:37208 const child = this._childElement(message.url);
209 child.incrementAndUpdateCounter();
210 this._messageCount++;
211 this._updateCounter();
212 }
213
214 /**
215 * @param {string=} url
Tim van der Lippeeaacb722020-01-10 12:16:00216 * @return {!URLGroupTreeElement}
Blink Reformat4c46d092018-04-07 15:32:37217 */
218 _childElement(url) {
219 const urlValue = url || null;
220 let child = this._urlTreeElements.get(urlValue);
Tim van der Lippe1d6e57a2019-09-30 11:55:34221 if (child) {
Blink Reformat4c46d092018-04-07 15:32:37222 return child;
Tim van der Lippe1d6e57a2019-09-30 11:55:34223 }
Blink Reformat4c46d092018-04-07 15:32:37224
225 const filter = this._filter.clone();
Tim van der Lippe9b2f8712020-02-12 17:46:22226 const parsedURL = urlValue ? Common.ParsedURL.ParsedURL.fromString(urlValue) : null;
Tim van der Lippe1d6e57a2019-09-30 11:55:34227 if (urlValue) {
Blink Reformat4c46d092018-04-07 15:32:37228 filter.name = parsedURL ? parsedURL.displayName : urlValue;
Tim van der Lippe1d6e57a2019-09-30 11:55:34229 } else {
Tim van der Lippe9b2f8712020-02-12 17:46:22230 filter.name = Common.UIString.UIString('<other>');
Tim van der Lippe1d6e57a2019-09-30 11:55:34231 }
Sigurd Schneidera3e99b02020-10-08 11:15:37232 filter.parsedFilters.push({key: FilterType.Url, text: urlValue, negative: false, regex: undefined});
Paul Lewisbf7aa3c2019-11-20 17:03:38233 child = new URLGroupTreeElement(filter);
Tim van der Lippe1d6e57a2019-09-30 11:55:34234 if (urlValue) {
Blink Reformat4c46d092018-04-07 15:32:37235 child.tooltip = urlValue;
Tim van der Lippe1d6e57a2019-09-30 11:55:34236 }
Blink Reformat4c46d092018-04-07 15:32:37237 this._urlTreeElements.set(urlValue, child);
238 this.appendChild(child);
239 return child;
240 }
Paul Lewisbf7aa3c2019-11-20 17:03:38241}
Blink Reformat4c46d092018-04-07 15:32:37242
243/** @enum {string} */
Tim van der Lippec96ccd92019-11-29 16:23:54244const _groupName = {
Christy Chenc891ec62019-10-09 00:31:07245 ConsoleAPI: 'user message',
246 All: 'message',
247 Error: 'error',
248 Warning: 'warning',
249 Info: 'info',
250 Verbose: 'verbose'
Blink Reformat4c46d092018-04-07 15:32:37251};
252
253/** @const {!Map<string, string>} */
Tim van der Lippec96ccd92019-11-29 16:23:54254const _groupSingularTitleMap = new Map([
Paul Lewisbf7aa3c2019-11-20 17:03:38255 [_groupName.ConsoleAPI, ls`1 user message`], [_groupName.All, ls`1 message`], [_groupName.Error, ls`1 error`],
256 [_groupName.Warning, ls`1 warning`], [_groupName.Info, ls`1 info`], [_groupName.Verbose, ls`1 verbose`]
Christy Chenc891ec62019-10-09 00:31:07257]);
258
259/** @const {!Map<string, string>} */
Tim van der Lippec96ccd92019-11-29 16:23:54260const _groupPluralTitleMap = new Map([
Paul Lewisbf7aa3c2019-11-20 17:03:38261 [_groupName.ConsoleAPI, ls`%d user messages`], [_groupName.All, ls`%d messages`], [_groupName.Error, ls`%d errors`],
262 [_groupName.Warning, ls`%d warnings`], [_groupName.Info, ls`%d info`], [_groupName.Verbose, ls`%d verbose`]
Christy Chenc891ec62019-10-09 00:31:07263]);
264
265/** @const {!Map<string, string>} */
Tim van der Lippec96ccd92019-11-29 16:23:54266const _groupNoMessageTitleMap = new Map([
Paul Lewisbf7aa3c2019-11-20 17:03:38267 [_groupName.ConsoleAPI, ls`No user messages`], [_groupName.All, ls`No messages`], [_groupName.Error, ls`No errors`],
268 [_groupName.Warning, ls`No warnings`], [_groupName.Info, ls`No info`], [_groupName.Verbose, ls`No verbose`]
Blink Reformat4c46d092018-04-07 15:32:37269]);