blob: 4c5273390eb18b813de37226f9e19fddb2063cbf [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';
6import * as SDK from '../sdk/sdk.js';
7import * as TextUtils from '../text_utils/text_utils.js'; // eslint-disable-line no-unused-vars
8import * as UI from '../ui/ui.js';
9
Tim van der Lippeeaacb722020-01-10 12:16:0010import {ConsoleFilter, FilterType} from './ConsoleFilter.js';
11import {ConsoleViewMessage} from './ConsoleViewMessage.js'; // eslint-disable-line no-unused-vars
12
Tim van der Lippe9b2f8712020-02-12 17:46:2213export class ConsoleSidebar extends UI.Widget.VBox {
Tim van der Lippeb45d9a02019-11-05 17:24:4114 constructor() {
Blink Reformat4c46d092018-04-07 15:32:3715 super(true);
16 this.setMinimumSize(125, 0);
17
Tim van der Lippe9b2f8712020-02-12 17:46:2218 this._tree = new UI.TreeOutline.TreeOutlineInShadow();
Blink Reformat4c46d092018-04-07 15:32:3719 this._tree.registerRequiredCSS('console/consoleSidebar.css');
20 this._tree.addEventListener(UI.TreeOutline.Events.ElementSelected, this._selectionChanged.bind(this));
21 this.contentElement.appendChild(this._tree.element);
Tim van der Lippe9b2f8712020-02-12 17:46:2222 /** @type {?UI.TreeOutline.TreeElement} */
Blink Reformat4c46d092018-04-07 15:32:3723 this._selectedTreeElement = null;
Tim van der Lippeeaacb722020-01-10 12:16:0024 /** @type {!Array<!FilterTreeElement>} */
Blink Reformat4c46d092018-04-07 15:32:3725 this._treeElements = [];
Paul Lewis6bcdb182020-01-23 11:08:0526 const selectedFilterSetting = self.Common.settings.createSetting('console.sidebarSelectedFilter', null);
Blink Reformat4c46d092018-04-07 15:32:3727
Tim van der Lippe9b2f8712020-02-12 17:46:2228 const Levels = SDK.ConsoleModel.MessageLevel;
Tim van der Lippeeaacb722020-01-10 12:16:0029 const consoleAPIParsedFilters =
Tim van der Lippe9b2f8712020-02-12 17:46:2230 [{key: FilterType.Source, text: SDK.ConsoleModel.MessageSource.ConsoleAPI, negative: false}];
Blink Reformat4c46d092018-04-07 15:32:3731 this._appendGroup(
Tim van der Lippe9b2f8712020-02-12 17:46:2232 _groupName.All, [], ConsoleFilter.allLevelsFilterValue(), UI.Icon.Icon.create('mediumicon-list'),
Blink Reformat4c46d092018-04-07 15:32:3733 selectedFilterSetting);
34 this._appendGroup(
Tim van der Lippeeaacb722020-01-10 12:16:0035 _groupName.ConsoleAPI, consoleAPIParsedFilters, ConsoleFilter.allLevelsFilterValue(),
Tim van der Lippe9b2f8712020-02-12 17:46:2236 UI.Icon.Icon.create('mediumicon-account-circle'), selectedFilterSetting);
Paul Lewisbf7aa3c2019-11-20 17:03:3837 this._appendGroup(
Tim van der Lippe9b2f8712020-02-12 17:46:2238 _groupName.Error, [], ConsoleFilter.singleLevelMask(Levels.Error),
39 UI.Icon.Icon.create('mediumicon-error-circle'), selectedFilterSetting);
Blink Reformat4c46d092018-04-07 15:32:3740 this._appendGroup(
Tim van der Lippeeaacb722020-01-10 12:16:0041 _groupName.Warning, [], ConsoleFilter.singleLevelMask(Levels.Warning),
Tim van der Lippe9b2f8712020-02-12 17:46:2242 UI.Icon.Icon.create('mediumicon-warning-triangle'), selectedFilterSetting);
Blink Reformat4c46d092018-04-07 15:32:3743 this._appendGroup(
Tim van der Lippe9b2f8712020-02-12 17:46:2244 _groupName.Info, [], ConsoleFilter.singleLevelMask(Levels.Info), UI.Icon.Icon.create('mediumicon-info-circle'),
Tim van der Lippeeaacb722020-01-10 12:16:0045 selectedFilterSetting);
Blink Reformat4c46d092018-04-07 15:32:3746 this._appendGroup(
Tim van der Lippe9b2f8712020-02-12 17:46:2247 _groupName.Verbose, [], ConsoleFilter.singleLevelMask(Levels.Verbose), UI.Icon.Icon.create('mediumicon-bug'),
Paul Lewisbf7aa3c2019-11-20 17:03:3848 selectedFilterSetting);
Blink Reformat4c46d092018-04-07 15:32:3749 const selectedTreeElementName = selectedFilterSetting.get();
50 const defaultTreeElement =
51 this._treeElements.find(x => x.name() === selectedTreeElementName) || this._treeElements[0];
52 defaultTreeElement.select();
53 }
54
55 /**
56 * @param {string} name
Tim van der Lippe9b2f8712020-02-12 17:46:2257 * @param {!Array<!TextUtils.TextUtils.ParsedFilter>} parsedFilters
Blink Reformat4c46d092018-04-07 15:32:3758 * @param {!Object<string, boolean>} levelsMask
59 * @param {!Element} icon
Tim van der Lippe9b2f8712020-02-12 17:46:2260 * @param {!Common.Settings.Setting} selectedFilterSetting
Blink Reformat4c46d092018-04-07 15:32:3761 */
Tim van der Lippeb45d9a02019-11-05 17:24:4162 _appendGroup(name, parsedFilters, levelsMask, icon, selectedFilterSetting) {
Tim van der Lippeeaacb722020-01-10 12:16:0063 const filter = new ConsoleFilter(name, parsedFilters, null, levelsMask);
Paul Lewisbf7aa3c2019-11-20 17:03:3864 const treeElement = new FilterTreeElement(filter, icon, selectedFilterSetting);
Blink Reformat4c46d092018-04-07 15:32:3765 this._tree.appendChild(treeElement);
66 this._treeElements.push(treeElement);
67 }
68
69 clear() {
Tim van der Lippe1d6e57a2019-09-30 11:55:3470 for (const treeElement of this._treeElements) {
Blink Reformat4c46d092018-04-07 15:32:3771 treeElement.clear();
Tim van der Lippe1d6e57a2019-09-30 11:55:3472 }
Blink Reformat4c46d092018-04-07 15:32:3773 }
74
75 /**
Tim van der Lippeeaacb722020-01-10 12:16:0076 * @param {!ConsoleViewMessage} viewMessage
Blink Reformat4c46d092018-04-07 15:32:3777 */
78 onMessageAdded(viewMessage) {
Tim van der Lippe1d6e57a2019-09-30 11:55:3479 for (const treeElement of this._treeElements) {
Blink Reformat4c46d092018-04-07 15:32:3780 treeElement.onMessageAdded(viewMessage);
Tim van der Lippe1d6e57a2019-09-30 11:55:3481 }
Blink Reformat4c46d092018-04-07 15:32:3782 }
83
84 /**
Tim van der Lippeeaacb722020-01-10 12:16:0085 * @param {!ConsoleViewMessage} viewMessage
Blink Reformat4c46d092018-04-07 15:32:3786 * @return {boolean}
87 */
88 shouldBeVisible(viewMessage) {
Tim van der Lippe1d6e57a2019-09-30 11:55:3489 if (!this._selectedTreeElement) {
Blink Reformat4c46d092018-04-07 15:32:3790 return true;
Tim van der Lippe1d6e57a2019-09-30 11:55:3491 }
Blink Reformat4c46d092018-04-07 15:32:3792 return this._selectedTreeElement._filter.shouldBeVisible(viewMessage);
93 }
94
95 /**
Tim van der Lippec02a97c2020-02-14 14:39:2796 * @param {!Common.EventTarget.EventTargetEvent} event
Blink Reformat4c46d092018-04-07 15:32:3797 */
98 _selectionChanged(event) {
Tim van der Lippe9b2f8712020-02-12 17:46:2299 this._selectedTreeElement = /** @type {!UI.TreeOutline.TreeElement} */ (event.data);
Paul Lewisbf7aa3c2019-11-20 17:03:38100 this.dispatchEventToListeners(Events.FilterSelected);
Blink Reformat4c46d092018-04-07 15:32:37101 }
Paul Lewisbf7aa3c2019-11-20 17:03:38102}
Blink Reformat4c46d092018-04-07 15:32:37103
104/** @enum {symbol} */
Paul Lewisbf7aa3c2019-11-20 17:03:38105export const Events = {
Blink Reformat4c46d092018-04-07 15:32:37106 FilterSelected: Symbol('FilterSelected')
107};
108
Tim van der Lippe9b2f8712020-02-12 17:46:22109export class URLGroupTreeElement extends UI.TreeOutline.TreeElement {
Blink Reformat4c46d092018-04-07 15:32:37110 /**
Tim van der Lippeeaacb722020-01-10 12:16:00111 * @param {!ConsoleFilter} filter
Blink Reformat4c46d092018-04-07 15:32:37112 */
Tim van der Lippeb45d9a02019-11-05 17:24:41113 constructor(filter) {
Blink Reformat4c46d092018-04-07 15:32:37114 super(filter.name);
115 this._filter = filter;
116 this._countElement = this.listItemElement.createChild('span', 'count');
Tim van der Lippe9b2f8712020-02-12 17:46:22117 const leadingIcons = [UI.Icon.Icon.create('largeicon-navigator-file')];
Blink Reformat4c46d092018-04-07 15:32:37118 this.setLeadingIcons(leadingIcons);
119 this._messageCount = 0;
120 }
121
122 incrementAndUpdateCounter() {
123 this._messageCount++;
124 this._countElement.textContent = this._messageCount;
125 }
Paul Lewisbf7aa3c2019-11-20 17:03:38126}
Blink Reformat4c46d092018-04-07 15:32:37127
Tim van der Lippe9b2f8712020-02-12 17:46:22128export class FilterTreeElement extends UI.TreeOutline.TreeElement {
Blink Reformat4c46d092018-04-07 15:32:37129 /**
Tim van der Lippeeaacb722020-01-10 12:16:00130 * @param {!ConsoleFilter} filter
Blink Reformat4c46d092018-04-07 15:32:37131 * @param {!Element} icon
Tim van der Lippe9b2f8712020-02-12 17:46:22132 * @param {!Common.Settings.Setting} selectedFilterSetting
Blink Reformat4c46d092018-04-07 15:32:37133 */
Tim van der Lippeb45d9a02019-11-05 17:24:41134 constructor(filter, icon, selectedFilterSetting) {
Blink Reformat4c46d092018-04-07 15:32:37135 super(filter.name);
136 this._filter = filter;
Blink Reformat4c46d092018-04-07 15:32:37137 this._selectedFilterSetting = selectedFilterSetting;
Tim van der Lippeeaacb722020-01-10 12:16:00138 /** @type {!Map<?string, !URLGroupTreeElement>} */
Blink Reformat4c46d092018-04-07 15:32:37139 this._urlTreeElements = new Map();
140 this.setLeadingIcons([icon]);
141 this._messageCount = 0;
142 this._updateCounter();
143 }
144
145 clear() {
146 this._urlTreeElements.clear();
147 this.removeChildren();
148 this._messageCount = 0;
149 this._updateCounter();
150 }
151
152 /**
153 * @return {string}
154 */
155 name() {
156 return this._filter.name;
157 }
158
159 /**
160 * @param {boolean=} selectedByUser
161 * @return {boolean}
162 * @override
163 */
164 onselect(selectedByUser) {
165 this._selectedFilterSetting.set(this._filter.name);
166 return super.onselect(selectedByUser);
167 }
168
169 _updateCounter() {
Christy Chenc891ec62019-10-09 00:31:07170 if (!this._messageCount) {
Paul Lewisbf7aa3c2019-11-20 17:03:38171 this.title = _groupNoMessageTitleMap.get(this._filter.name);
Christy Chenc891ec62019-10-09 00:31:07172 } else if (this._messageCount === 1) {
Paul Lewisbf7aa3c2019-11-20 17:03:38173 this.title = _groupSingularTitleMap.get(this._filter.name);
Christy Chenc891ec62019-10-09 00:31:07174 } else {
Paul Lewisbf7aa3c2019-11-20 17:03:38175 this.title = String.sprintf(_groupPluralTitleMap.get(this._filter.name), this._messageCount);
Christy Chenc891ec62019-10-09 00:31:07176 }
177
Blink Reformat4c46d092018-04-07 15:32:37178 this.setExpandable(!!this.childCount());
179 }
180
181 /**
Tim van der Lippeeaacb722020-01-10 12:16:00182 * @param {!ConsoleViewMessage} viewMessage
Blink Reformat4c46d092018-04-07 15:32:37183 */
184 onMessageAdded(viewMessage) {
185 const message = viewMessage.consoleMessage();
Tim van der Lippe9b2f8712020-02-12 17:46:22186 const shouldIncrementCounter = message.type !== SDK.ConsoleModel.MessageType.Command &&
187 message.type !== SDK.ConsoleModel.MessageType.Result && !message.isGroupMessage();
Tim van der Lippe1d6e57a2019-09-30 11:55:34188 if (!this._filter.shouldBeVisible(viewMessage) || !shouldIncrementCounter) {
Blink Reformat4c46d092018-04-07 15:32:37189 return;
Tim van der Lippe1d6e57a2019-09-30 11:55:34190 }
Blink Reformat4c46d092018-04-07 15:32:37191 const child = this._childElement(message.url);
192 child.incrementAndUpdateCounter();
193 this._messageCount++;
194 this._updateCounter();
195 }
196
197 /**
198 * @param {string=} url
Tim van der Lippeeaacb722020-01-10 12:16:00199 * @return {!URLGroupTreeElement}
Blink Reformat4c46d092018-04-07 15:32:37200 */
201 _childElement(url) {
202 const urlValue = url || null;
203 let child = this._urlTreeElements.get(urlValue);
Tim van der Lippe1d6e57a2019-09-30 11:55:34204 if (child) {
Blink Reformat4c46d092018-04-07 15:32:37205 return child;
Tim van der Lippe1d6e57a2019-09-30 11:55:34206 }
Blink Reformat4c46d092018-04-07 15:32:37207
208 const filter = this._filter.clone();
Tim van der Lippe9b2f8712020-02-12 17:46:22209 const parsedURL = urlValue ? Common.ParsedURL.ParsedURL.fromString(urlValue) : null;
Tim van der Lippe1d6e57a2019-09-30 11:55:34210 if (urlValue) {
Blink Reformat4c46d092018-04-07 15:32:37211 filter.name = parsedURL ? parsedURL.displayName : urlValue;
Tim van der Lippe1d6e57a2019-09-30 11:55:34212 } else {
Tim van der Lippe9b2f8712020-02-12 17:46:22213 filter.name = Common.UIString.UIString('<other>');
Tim van der Lippe1d6e57a2019-09-30 11:55:34214 }
Tim van der Lippeeaacb722020-01-10 12:16:00215 filter.parsedFilters.push({key: FilterType.Url, text: urlValue, negative: false});
Paul Lewisbf7aa3c2019-11-20 17:03:38216 child = new URLGroupTreeElement(filter);
Tim van der Lippe1d6e57a2019-09-30 11:55:34217 if (urlValue) {
Blink Reformat4c46d092018-04-07 15:32:37218 child.tooltip = urlValue;
Tim van der Lippe1d6e57a2019-09-30 11:55:34219 }
Blink Reformat4c46d092018-04-07 15:32:37220 this._urlTreeElements.set(urlValue, child);
221 this.appendChild(child);
222 return child;
223 }
Paul Lewisbf7aa3c2019-11-20 17:03:38224}
Blink Reformat4c46d092018-04-07 15:32:37225
226/** @enum {string} */
Tim van der Lippec96ccd92019-11-29 16:23:54227const _groupName = {
Christy Chenc891ec62019-10-09 00:31:07228 ConsoleAPI: 'user message',
229 All: 'message',
230 Error: 'error',
231 Warning: 'warning',
232 Info: 'info',
233 Verbose: 'verbose'
Blink Reformat4c46d092018-04-07 15:32:37234};
235
236/** @const {!Map<string, string>} */
Tim van der Lippec96ccd92019-11-29 16:23:54237const _groupSingularTitleMap = new Map([
Paul Lewisbf7aa3c2019-11-20 17:03:38238 [_groupName.ConsoleAPI, ls`1 user message`], [_groupName.All, ls`1 message`], [_groupName.Error, ls`1 error`],
239 [_groupName.Warning, ls`1 warning`], [_groupName.Info, ls`1 info`], [_groupName.Verbose, ls`1 verbose`]
Christy Chenc891ec62019-10-09 00:31:07240]);
241
242/** @const {!Map<string, string>} */
Tim van der Lippec96ccd92019-11-29 16:23:54243const _groupPluralTitleMap = new Map([
Paul Lewisbf7aa3c2019-11-20 17:03:38244 [_groupName.ConsoleAPI, ls`%d user messages`], [_groupName.All, ls`%d messages`], [_groupName.Error, ls`%d errors`],
245 [_groupName.Warning, ls`%d warnings`], [_groupName.Info, ls`%d info`], [_groupName.Verbose, ls`%d verbose`]
Christy Chenc891ec62019-10-09 00:31:07246]);
247
248/** @const {!Map<string, string>} */
Tim van der Lippec96ccd92019-11-29 16:23:54249const _groupNoMessageTitleMap = new Map([
Paul Lewisbf7aa3c2019-11-20 17:03:38250 [_groupName.ConsoleAPI, ls`No user messages`], [_groupName.All, ls`No messages`], [_groupName.Error, ls`No errors`],
251 [_groupName.Warning, ls`No warnings`], [_groupName.Info, ls`No info`], [_groupName.Verbose, ls`No verbose`]
Blink Reformat4c46d092018-04-07 15:32:37252]);