Enable no-case-declarations lint rule

Lexical declarations in `case` and `default` clauses are a footgun,
since they are visible in the entire switch block, but they only
get initialized upon assignment, which only happens if the relevant
`case` is actually reached.

To ensure that such lexical declarations only apply to the current
`case` (which is usually the intention), `case` clauses containing
them should be wrapped in curly braces to create an explicit block.

More information:
https://eslint.org/docs/rules/no-case-declarations

Change-Id: I63d9341fcd76d4b9ce8281bd0e6573b886577f08
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/2119685
Reviewed-by: Tim van der Lippe <tvanderlippe@chromium.org>
Commit-Queue: Mathias Bynens <mathias@chromium.org>
This commit is contained in:
Mathias Bynens
2020-03-25 15:26:13 +00:00
committed by Commit Bot
parent e07f9eed89
commit 88e8f15748
26 changed files with 421 additions and 196 deletions
+1
View File
@@ -49,6 +49,7 @@ module.exports = {
// anti-patterns
'no-caller': 2,
'no-case-declarations': 2,
'no-cond-assign': 2,
'no-console': [2, {'allow': ['assert', 'context', 'error', 'timeStamp', 'time', 'timeEnd', 'warn']}],
'no-debugger': 2,
+20 -10
View File
@@ -577,44 +577,51 @@ export class Color {
}
switch (format) {
case Format.Original:
case Format.Original: {
return this._originalText;
case Format.RGB:
}
case Format.RGB: {
if (this.hasAlpha()) {
return null;
}
return Platform.StringUtilities.sprintf(
'rgb(%d, %d, %d)', toRgbValue(this._rgba[0]), toRgbValue(this._rgba[1]), toRgbValue(this._rgba[2]));
case Format.RGBA:
}
case Format.RGBA: {
return Platform.StringUtilities.sprintf(
'rgba(%d, %d, %d, %f)', toRgbValue(this._rgba[0]), toRgbValue(this._rgba[1]), toRgbValue(this._rgba[2]),
this._rgba[3]);
case Format.HSL:
}
case Format.HSL: {
if (this.hasAlpha()) {
return null;
}
const hsl = this.hsla();
return Platform.StringUtilities.sprintf(
'hsl(%d, %d%, %d%)', Math.round(hsl[0] * 360), Math.round(hsl[1] * 100), Math.round(hsl[2] * 100));
case Format.HSLA:
}
case Format.HSLA: {
const hsla = this.hsla();
return Platform.StringUtilities.sprintf(
'hsla(%d, %d%, %d%, %f)', Math.round(hsla[0] * 360), Math.round(hsla[1] * 100), Math.round(hsla[2] * 100),
hsla[3]);
case Format.HEXA:
}
case Format.HEXA: {
return Platform.StringUtilities
.sprintf(
'#%s%s%s%s', toHexValue(this._rgba[0]), toHexValue(this._rgba[1]), toHexValue(this._rgba[2]),
toHexValue(this._rgba[3]))
.toLowerCase();
case Format.HEX:
}
case Format.HEX: {
if (this.hasAlpha()) {
return null;
}
return Platform.StringUtilities
.sprintf('#%s%s%s', toHexValue(this._rgba[0]), toHexValue(this._rgba[1]), toHexValue(this._rgba[2]))
.toLowerCase();
case Format.ShortHEXA:
}
case Format.ShortHEXA: {
const hexFormat = this.detectHEXFormat();
if (hexFormat !== Format.ShortHEXA && hexFormat !== Format.ShortHEX) {
return null;
@@ -624,7 +631,8 @@ export class Color {
'#%s%s%s%s', toShortHexValue(this._rgba[0]), toShortHexValue(this._rgba[1]),
toShortHexValue(this._rgba[2]), toShortHexValue(this._rgba[3]))
.toLowerCase();
case Format.ShortHEX:
}
case Format.ShortHEX: {
if (this.hasAlpha()) {
return null;
}
@@ -636,8 +644,10 @@ export class Color {
'#%s%s%s', toShortHexValue(this._rgba[0]), toShortHexValue(this._rgba[1]),
toShortHexValue(this._rgba[2]))
.toLowerCase();
case Format.Nickname:
}
case Format.Nickname: {
return this.nickname();
}
}
return this._originalText;
+6 -3
View File
@@ -91,12 +91,13 @@ export class ConsoleFilter {
}
} else {
switch (filter.key) {
case FilterType.Context:
case FilterType.Context: {
if (!passesFilter(filter, message.context, false /* exactMatch */)) {
return false;
}
break;
case FilterType.Source:
}
case FilterType.Source: {
const sourceNameForMessage = message.source ?
SDK.ConsoleModel.MessageSourceDisplayName.get(
/** @type {!SDK.ConsoleModel.MessageSource} */ (message.source)) :
@@ -105,11 +106,13 @@ export class ConsoleFilter {
return false;
}
break;
case FilterType.Url:
}
case FilterType.Url: {
if (!passesFilter(filter, message.url, false /* exactMatch */)) {
return false;
}
break;
}
}
}
}
+12 -6
View File
@@ -214,7 +214,7 @@ export class ConsolePrompt extends UI.Widget.Widget {
const cursorY = this._editor.visualCoordinates(selection.endLine, selection.endColumn).y;
switch (keyboardEvent.keyCode) {
case UI.KeyboardShortcut.Keys.Up.code:
case UI.KeyboardShortcut.Keys.Up.code: {
const startY = this._editor.visualCoordinates(0, 0).y;
if (keyboardEvent.shiftKey || !selection.isEmpty() || cursorY !== startY) {
break;
@@ -222,7 +222,8 @@ export class ConsolePrompt extends UI.Widget.Widget {
newText = this._history.previous(this.text());
isPrevious = true;
break;
case UI.KeyboardShortcut.Keys.Down.code:
}
case UI.KeyboardShortcut.Keys.Down.code: {
const fullRange = this._editor.fullRange();
const endY = this._editor.visualCoordinates(fullRange.endLine, fullRange.endColumn).y;
if (keyboardEvent.shiftKey || !selection.isEmpty() || cursorY !== endY) {
@@ -230,27 +231,32 @@ export class ConsolePrompt extends UI.Widget.Widget {
}
newText = this._history.next();
break;
case UI.KeyboardShortcut.Keys.P.code: // Ctrl+P = Previous
}
case UI.KeyboardShortcut.Keys.P.code: { // Ctrl+P = Previous
if (Host.Platform.isMac() && keyboardEvent.ctrlKey && !keyboardEvent.metaKey && !keyboardEvent.altKey &&
!keyboardEvent.shiftKey) {
newText = this._history.previous(this.text());
isPrevious = true;
}
break;
case UI.KeyboardShortcut.Keys.N.code: // Ctrl+N = Next
}
case UI.KeyboardShortcut.Keys.N.code: { // Ctrl+N = Next
if (Host.Platform.isMac() && keyboardEvent.ctrlKey && !keyboardEvent.metaKey && !keyboardEvent.altKey &&
!keyboardEvent.shiftKey) {
newText = this._history.next();
}
break;
case UI.KeyboardShortcut.Keys.Enter.code:
}
case UI.KeyboardShortcut.Keys.Enter.code: {
this._enterKeyPressed(keyboardEvent);
break;
case UI.KeyboardShortcut.Keys.Tab.code:
}
case UI.KeyboardShortcut.Keys.Tab.code: {
if (!this.text()) {
keyboardEvent.consume();
}
break;
}
}
if (newText === undefined) {
+10 -5
View File
@@ -292,7 +292,7 @@ export class GridNode extends DataGrid.SortableDataGrid.SortableDataGridNode {
createCell(columnId) {
const cell = this.createTD(columnId);
switch (columnId) {
case 'url':
case 'url': {
cell.title = this._url;
const outer = cell.createChild('div', 'url-outer');
const prefix = outer.createChild('div', 'url-prefix');
@@ -305,7 +305,8 @@ export class GridNode extends DataGrid.SortableDataGrid.SortableDataGridNode {
}
this.setCellAccessibleName(this._url, cell, columnId);
break;
case 'type':
}
case 'type': {
cell.textContent = CoverageListView._typeToString(this._coverageInfo.type());
if (this._coverageInfo.type() & CoverageType.JavaScriptPerFunction) {
cell.title = ls
@@ -315,14 +316,16 @@ export class GridNode extends DataGrid.SortableDataGrid.SortableDataGridNode {
`JS coverage with per block granularity: Once a block of JavaScript was executed, that block is marked as covered.`;
}
break;
case 'size':
}
case 'size': {
const sizeSpan = cell.createChild('span');
sizeSpan.textContent = Number.withThousandsSeparator(this._coverageInfo.size() || 0);
const sizeAccessibleName =
(this._coverageInfo.size() === 1) ? ls`1 byte` : ls`${this._coverageInfo.size() || 0} bytes`;
this.setCellAccessibleName(sizeAccessibleName, cell, columnId);
break;
case 'unusedSize':
}
case 'unusedSize': {
const unusedSize = this._coverageInfo.unusedSize() || 0;
const unusedSizeSpan = cell.createChild('span');
const unusedPercentsSpan = cell.createChild('span', 'percent-value');
@@ -333,7 +336,8 @@ export class GridNode extends DataGrid.SortableDataGrid.SortableDataGridNode {
ls`${unusedSize} bytes, ${unusedPercentFormatted}`;
this.setCellAccessibleName(unusedAccessibleName, cell, columnId);
break;
case 'bars':
}
case 'bars': {
const barContainer = cell.createChild('div', 'bar-container');
const unusedPercent = this._percentageString(this._coverageInfo.unusedPercentage());
const usedPercent = this._percentageString(this._coverageInfo.usedPercentage());
@@ -361,6 +365,7 @@ export class GridNode extends DataGrid.SortableDataGrid.SortableDataGridNode {
}
this.setCellAccessibleName(
ls`${unusedPercent} % of file unused, ${usedPercent} % of file used`, cell, columnId);
}
}
return cell;
}
@@ -335,29 +335,33 @@ export class CSSOverviewCompletedView extends UI.Panel.PanelWithSidebar {
let tabTitle = '';
switch (type) {
case 'color':
case 'color': {
const {section, color} = evt.data;
id = `${section}-${color}`;
tabTitle = `${color.toUpperCase()} (${section})`;
break;
}
case 'unused-declarations':
case 'unused-declarations': {
const {declaration} = evt.data;
id = `${declaration}`;
tabTitle = `${declaration}`;
break;
}
case 'media-queries':
case 'media-queries': {
const {text} = evt.data;
id = `${text}`;
tabTitle = `${text}`;
break;
}
case 'font-info':
case 'font-info': {
const {name} = evt.data;
id = `${name}`;
tabTitle = `${name}`;
break;
}
}
let view = this._viewMap.get(id);
+13 -6
View File
@@ -1574,7 +1574,7 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
titleDOM, /** @type {string} */ (node.name), /** @type {string} */ (node.value), updateRecord, true);
break;
case Node.ELEMENT_NODE:
case Node.ELEMENT_NODE: {
const pseudoType = node.pseudoType();
if (pseudoType) {
this._buildPseudoElementDOM(titleDOM, pseudoType);
@@ -1619,6 +1619,7 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
this._buildTagDOM(titleDOM, tagName, true, false, updateRecord);
}
break;
}
case Node.TEXT_NODE:
if (node.parentNode && node.parentNode.nodeName().toLowerCase() === 'script') {
@@ -1648,12 +1649,13 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
}
break;
case Node.COMMENT_NODE:
case Node.COMMENT_NODE: {
const commentElement = titleDOM.createChild('span', 'webkit-html-comment');
commentElement.createTextChild('<!--' + node.nodeValue() + '-->');
break;
}
case Node.DOCUMENT_TYPE_NODE:
case Node.DOCUMENT_TYPE_NODE: {
const docTypeElement = titleDOM.createChild('span', 'webkit-html-doctype');
docTypeElement.createTextChild('<!DOCTYPE ' + node.nodeName());
if (node.publicId) {
@@ -1671,19 +1673,24 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
docTypeElement.createTextChild('>');
break;
}
case Node.CDATA_SECTION_NODE:
case Node.CDATA_SECTION_NODE: {
const cdataElement = titleDOM.createChild('span', 'webkit-html-text-node');
cdataElement.createTextChild('<![CDATA[' + node.nodeValue() + ']]>');
break;
}
case Node.DOCUMENT_FRAGMENT_NODE:
case Node.DOCUMENT_FRAGMENT_NODE: {
const fragmentElement = titleDOM.createChild('span', 'webkit-html-fragment');
fragmentElement.textContent = Platform.StringUtilities.collapseWhitespace(node.nodeNameInCorrectCase());
break;
default:
}
default: {
const nameWithSpaceCollapsed = Platform.StringUtilities.collapseWhitespace(node.nodeNameInCorrectCase());
titleDOM.createTextChild(nameWithSpaceCollapsed);
}
}
/**
+14 -8
View File
@@ -241,11 +241,12 @@ export class StylesSidebarPane extends ElementsSidebarPane {
switch (event.key) {
case 'ArrowUp':
case 'ArrowLeft':
case 'ArrowLeft': {
const sectionToFocus = section.previousSibling() || section.lastSibling();
sectionToFocus.element.focus();
event.consume(true);
break;
}
case 'ArrowDown':
case 'ArrowRight': {
const sectionToFocus = section.nextSibling() || section.firstSibling();
@@ -253,14 +254,16 @@ export class StylesSidebarPane extends ElementsSidebarPane {
event.consume(true);
break;
}
case 'Home':
case 'Home': {
section.firstSibling().element.focus();
event.consume(true);
break;
case 'End':
}
case 'End': {
section.lastSibling().element.focus();
event.consume(true);
break;
}
}
}
@@ -1413,10 +1416,11 @@ export class StylePropertiesSection {
const mediaTextElement = mediaContainerElement.createChild('span', 'media-text');
switch (media.source) {
case SDK.CSSMedia.Source.LINKED_SHEET:
case SDK.CSSMedia.Source.INLINE_SHEET:
mediaTextElement.textContent = 'media="' + media.text + '"';
case SDK.CSSMedia.Source.INLINE_SHEET: {
mediaTextElement.textContent = `media="${media.text}"`;
break;
case SDK.CSSMedia.Source.MEDIA_RULE:
}
case SDK.CSSMedia.Source.MEDIA_RULE: {
const decoration = mediaContainerElement.createChild('span');
mediaContainerElement.insertBefore(decoration, mediaTextElement);
decoration.textContent = '@media ';
@@ -1427,9 +1431,11 @@ export class StylePropertiesSection {
'click', this._handleMediaRuleClick.bind(this, media, mediaTextElement), false);
}
break;
case SDK.CSSMedia.Source.IMPORT_RULE:
mediaTextElement.textContent = '@import ' + media.text;
}
case SDK.CSSMedia.Source.IMPORT_RULE: {
mediaTextElement.textContent = `@import ${media.text}`;
break;
}
}
}
}
@@ -337,7 +337,7 @@ export function argumentsList(content) {
const expression = parsed.body[0].expression;
let params = null;
switch (expression.type) {
case 'ClassExpression':
case 'ClassExpression': {
if (!expression.body.body) {
break;
}
@@ -346,16 +346,19 @@ export function argumentsList(content) {
params = constructor.value.params;
}
break;
case 'ObjectExpression':
}
case 'ObjectExpression': {
if (!expression.properties[0] || !expression.properties[0].value) {
break;
}
params = expression.properties[0].value.params;
break;
}
case 'FunctionExpression':
case 'ArrowFunctionExpression':
case 'ArrowFunctionExpression': {
params = expression.params;
break;
}
}
if (!params) {
return [];
@@ -62,13 +62,15 @@ export class HeapSnapshotWorkerDispatcher {
const response = {callId: data.callId};
try {
switch (data.disposition) {
case 'create':
case 'create': {
const constructorFunction = this._findFunction(data.methodName);
this._objects[data.objectId] = new constructorFunction(this);
break;
case 'dispose':
}
case 'dispose': {
delete this._objects[data.objectId];
break;
}
case 'getter': {
const object = this._objects[data.objectId];
const result = object[data.methodName];
@@ -89,17 +91,18 @@ export class HeapSnapshotWorkerDispatcher {
response.result = object[data.methodName].apply(object, data.methodArguments);
break;
}
case 'evaluateForTest':
case 'evaluateForTest': {
try {
response.result = self.eval(data.source);
} catch (e) {
response.result = e.toString();
} catch (error) {
response.result = error.toString();
}
break;
}
}
} catch (e) {
response.error = e.toString();
response.errorCallStack = e.stack;
} catch (error) {
response.error = error.toString();
response.errorCallStack = error.stack;
if (data.methodName) {
response.errorMethodName = data.methodName;
}
+50 -25
View File
@@ -904,64 +904,83 @@ export class NetworkRequestNode extends NetworkNode {
*/
renderCell(cell, columnId) {
switch (columnId) {
case 'name':
case 'name': {
this._renderPrimaryCell(cell, columnId);
break;
case 'path':
}
case 'path': {
this._renderPrimaryCell(cell, columnId, this._request.pathname);
break;
case 'url':
}
case 'url': {
this._renderPrimaryCell(cell, columnId, this._request.url());
break;
case 'method':
}
case 'method': {
this._setTextAndTitle(cell, this._request.requestMethod);
break;
case 'status':
}
case 'status': {
this._renderStatusCell(cell);
break;
case 'protocol':
}
case 'protocol': {
this._setTextAndTitle(cell, this._request.protocol);
break;
case 'scheme':
}
case 'scheme': {
this._setTextAndTitle(cell, this._request.scheme);
break;
case 'domain':
}
case 'domain': {
this._setTextAndTitle(cell, this._request.domain);
break;
case 'remoteaddress':
}
case 'remoteaddress': {
this._setTextAndTitle(cell, this._request.remoteAddress());
break;
case 'cookies':
}
case 'cookies': {
this._setTextAndTitle(cell, this._arrayLength(this._request.requestCookies));
break;
case 'setcookies':
}
case 'setcookies': {
this._setTextAndTitle(cell, this._arrayLength(this._request.responseCookies));
break;
case 'priority':
}
case 'priority': {
const priority = this._request.priority();
this._setTextAndTitle(cell, priority ? PerfUI.NetworkPriorities.uiLabelForNetworkPriority(priority) : '');
break;
case 'connectionid':
}
case 'connectionid': {
this._setTextAndTitle(cell, this._request.connectionId);
break;
case 'type':
}
case 'type': {
this._setTextAndTitle(cell, this.displayType());
break;
case 'initiator':
}
case 'initiator': {
this._renderInitiatorCell(cell);
break;
case 'size':
}
case 'size': {
this._renderSizeCell(cell);
break;
case 'time':
}
case 'time': {
this._renderTimeCell(cell);
break;
case 'timeline':
}
case 'timeline': {
this._setTextAndTitle(cell, '');
break;
default:
}
default: {
this._setTextAndTitle(cell, this._request.responseHeaderValue(columnId) || '');
break;
}
}
}
@@ -1159,7 +1178,7 @@ export class NetworkRequestNode extends NetworkNode {
cell.appendChild(createTextNode(Common.UIString.UIString('Push / ')));
}
switch (initiator.type) {
case SDK.NetworkRequest.InitiatorType.Parser:
case SDK.NetworkRequest.InitiatorType.Parser: {
cell.title = initiator.url + ':' + (initiator.lineNumber + 1);
const uiSourceCode = Workspace.Workspace.WorkspaceImpl.instance().uiSourceCodeForURL(initiator.url);
cell.appendChild(Components.Linkifier.Linkifier.linkifyURL(initiator.url, {
@@ -1169,8 +1188,9 @@ export class NetworkRequestNode extends NetworkNode {
}));
this._appendSubtitle(cell, Common.UIString.UIString('Parser'));
break;
}
case SDK.NetworkRequest.InitiatorType.Redirect:
case SDK.NetworkRequest.InitiatorType.Redirect: {
cell.title = initiator.url;
const redirectSource = /** @type {!SDK.NetworkRequest.NetworkRequest} */ (request.redirectSource());
console.assert(redirectSource);
@@ -1182,8 +1202,9 @@ export class NetworkRequestNode extends NetworkNode {
}
this._appendSubtitle(cell, Common.UIString.UIString('Redirect'));
break;
}
case SDK.NetworkRequest.InitiatorType.Script:
case SDK.NetworkRequest.InitiatorType.Script: {
const networkManager = SDK.NetworkManager.NetworkManager.forRequest(request);
/**
* @type {!Components.Linkifier.Linkifier}
@@ -1204,22 +1225,26 @@ export class NetworkRequestNode extends NetworkNode {
cell.classList.add('network-script-initiated');
cell.request = request;
break;
}
case SDK.NetworkRequest.InitiatorType.Preload:
case SDK.NetworkRequest.InitiatorType.Preload: {
cell.title = Common.UIString.UIString('Preload');
cell.classList.add('network-dim-cell');
cell.appendChild(createTextNode(Common.UIString.UIString('Preload')));
break;
}
case SDK.NetworkRequest.InitiatorType.SignedExchange:
case SDK.NetworkRequest.InitiatorType.SignedExchange: {
cell.appendChild(Components.Linkifier.Linkifier.linkifyURL(initiator.url));
this._appendSubtitle(cell, Common.UIString.UIString('signed-exchange'));
break;
}
default:
default: {
cell.title = Common.UIString.UIString('Other');
cell.classList.add('network-dim-cell');
cell.appendChild(createTextNode(Common.UIString.UIString('Other')));
}
}
}
+6 -3
View File
@@ -835,17 +835,19 @@ export class ActionDelegate {
const panel = self.UI.context.flavor(NetworkPanel);
console.assert(panel && panel instanceof NetworkPanel);
switch (actionId) {
case 'network.toggle-recording':
case 'network.toggle-recording': {
panel._toggleRecording();
return true;
case 'network.hide-request-details':
}
case 'network.hide-request-details': {
if (!panel._networkItemView) {
return false;
}
panel._hideRequestPanel();
panel._networkLogView.resetFocus();
return true;
case 'network.search':
}
case 'network.search': {
const selection = self.UI.inspectorView.element.window().getSelection();
let queryCandidate = '';
if (selection.rangeCount) {
@@ -853,6 +855,7 @@ export class ActionDelegate {
}
SearchNetworkView.openSearch(queryCandidate);
return true;
}
}
return false;
}
+8 -4
View File
@@ -166,17 +166,19 @@ export class ProfileDataGridNode extends DataGrid.DataGrid.DataGridNode {
createCell(columnId) {
let cell;
switch (columnId) {
case 'self':
case 'self': {
cell = this._createValueCell(this.self, this.selfPercent, columnId);
cell.classList.toggle('highlight', this._searchMatchedSelfColumn);
break;
}
case 'total':
case 'total': {
cell = this._createValueCell(this.total, this.totalPercent, columnId);
cell.classList.toggle('highlight', this._searchMatchedTotalColumn);
break;
}
case 'function':
case 'function': {
cell = this.createTD(columnId);
cell.classList.toggle('highlight', this._searchMatchedFunctionColumn);
if (this._deoptReason) {
@@ -197,10 +199,12 @@ export class ProfileDataGridNode extends DataGrid.DataGrid.DataGridNode {
cell.appendChild(urlElement);
this.linkElement = urlElement;
break;
}
default:
default: {
cell = super.createCell(columnId);
break;
}
}
return cell;
}
+6 -3
View File
@@ -498,7 +498,7 @@ export class IDBDataGridNode extends DataGrid.DataGrid.DataGridNode {
const value = /** @type {!SDK.RemoteObject.RemoteObject} */ (this.data[columnIdentifier]);
switch (columnIdentifier) {
case 'value':
case 'value': {
cell.removeChildren();
const objectPropSection =
ObjectUI.ObjectPropertiesSection.ObjectPropertiesSection.defaultObjectPropertiesSection(
@@ -506,14 +506,17 @@ export class IDBDataGridNode extends DataGrid.DataGrid.DataGridNode {
cell.appendChild(objectPropSection.element);
this.valueObjectPresentation = objectPropSection;
break;
}
case 'key':
case 'primaryKey':
case 'primaryKey': {
cell.removeChildren();
const objectElement = ObjectUI.ObjectPropertiesSection.ObjectPropertiesSection.defaultObjectPresentation(
value, undefined /* linkifier */, true /* skipProto */, true /* readOnly */);
cell.appendChild(objectElement);
break;
default:
}
default: {
}
}
return cell;
+6 -3
View File
@@ -178,7 +178,7 @@ export class ServerTiming {
*/
static getParserForParameter(paramName) {
switch (paramName) {
case 'dur':
case 'dur': {
/**
* @param {!Object<string, *>} entry
* @param {*} paramValue
@@ -195,8 +195,9 @@ export class ServerTiming {
}
}
return durParser;
}
case 'desc':
case 'desc': {
/**
* @param {!Object<string, *>} entry
* @param {?string} paramValue
@@ -205,9 +206,11 @@ export class ServerTiming {
entry.desc = paramValue || '';
}
return descParser;
}
default:
default: {
return null;
}
}
}
+18 -9
View File
@@ -246,20 +246,24 @@ export class TracingModel {
}
switch (payload.name) {
case MetadataEvent.ProcessSortIndex:
case MetadataEvent.ProcessSortIndex: {
process._setSortIndex(payload.args['sort_index']);
break;
case MetadataEvent.ProcessName:
}
case MetadataEvent.ProcessName: {
const processName = payload.args['name'];
process._setName(processName);
this._processByName.set(processName, process);
break;
case MetadataEvent.ThreadSortIndex:
}
case MetadataEvent.ThreadSortIndex: {
process.threadById(payload.tid)._setSortIndex(payload.args['sort_index']);
break;
case MetadataEvent.ThreadName:
}
case MetadataEvent.ThreadName: {
process.threadById(payload.tid)._setName(payload.args['name']);
break;
}
}
}
@@ -371,7 +375,7 @@ export class TracingModel {
let openEventsStack = this._openNestableAsyncEvents.get(key);
switch (event.phase) {
case phase.NestableAsyncBegin:
case phase.NestableAsyncBegin: {
if (!openEventsStack) {
openEventsStack = [];
this._openNestableAsyncEvents.set(key, openEventsStack);
@@ -380,14 +384,16 @@ export class TracingModel {
openEventsStack.push(asyncEvent);
event.thread._addAsyncEvent(asyncEvent);
break;
}
case phase.NestableAsyncInstant:
case phase.NestableAsyncInstant: {
if (openEventsStack && openEventsStack.length) {
openEventsStack.peekLast()._addStep(event);
}
break;
}
case phase.NestableAsyncEnd:
case phase.NestableAsyncEnd: {
if (!openEventsStack || !openEventsStack.length) {
break;
}
@@ -398,6 +404,7 @@ export class TracingModel {
break;
}
top._addStep(event);
}
}
}
@@ -927,7 +934,7 @@ export class Thread extends NamedObject {
const e = this._events[i];
e.ordinal = i;
switch (e.phase) {
case phases.End:
case phases.End: {
this._events[i] = null; // Mark for removal.
// Quietly ignore unbalanced close events, they're legit (we could have missed start one).
if (!stack.length) {
@@ -942,9 +949,11 @@ export class Thread extends NamedObject {
top._complete(e);
}
break;
case phases.Begin:
}
case phases.Begin: {
stack.push(e);
break;
}
}
}
while (stack.length) {
+10 -5
View File
@@ -313,7 +313,7 @@ export class XMLViewNode extends UI.TreeOutline.TreeElement {
_updateTitle() {
const node = this._node;
switch (node.nodeType) {
case 1: // ELEMENT
case 1: { // ELEMENT
const tag = node.tagName;
if (this._closeTag) {
this._setTitle(['</' + tag + '>', 'shadow-xml-view-tag']);
@@ -343,20 +343,25 @@ export class XMLViewNode extends UI.TreeOutline.TreeElement {
titleItems.push('>', 'shadow-xml-view-tag');
this._setTitle(titleItems);
return;
case 3: // TEXT
}
case 3: { // TEXT
this._setTitle([node.nodeValue, 'shadow-xml-view-text']);
return;
case 4: // CDATA
}
case 4: { // CDATA
this._setTitle([
'<![CDATA[', 'shadow-xml-view-cdata', node.nodeValue, 'shadow-xml-view-text', ']]>', 'shadow-xml-view-cdata'
]);
return;
case 7: // PROCESSING_INSTRUCTION
}
case 7: { // PROCESSING_INSTRUCTION
this._setTitle(['<?' + node.nodeName + ' ' + node.nodeValue + '?>', 'shadow-xml-view-processing-instruction']);
return;
case 8: // COMMENT
}
case 8: { // COMMENT
this._setTitle(['<!--' + node.nodeValue + '-->', 'shadow-xml-view-comment']);
return;
}
}
}
+14 -7
View File
@@ -1198,25 +1198,31 @@ export class DebuggingActionDelegate {
handleAction(context, actionId) {
const panel = SourcesPanel.instance();
switch (actionId) {
case 'debugger.step-over':
case 'debugger.step-over': {
panel._stepOver();
return true;
case 'debugger.step-into':
}
case 'debugger.step-into': {
panel._stepIntoAsync();
return true;
case 'debugger.step':
}
case 'debugger.step': {
panel._stepInto();
return true;
case 'debugger.step-out':
}
case 'debugger.step-out': {
panel._stepOut();
return true;
case 'debugger.run-snippet':
}
case 'debugger.run-snippet': {
panel._runSnippet();
return true;
case 'debugger.toggle-breakpoints-active':
}
case 'debugger.toggle-breakpoints-active': {
panel._toggleBreakpointsActive();
return true;
case 'debugger.evaluate-selection':
}
case 'debugger.evaluate-selection': {
const frame = self.UI.context.flavor(UISourceCodeFrame);
if (frame) {
let text = frame.textEditor.text(frame.textEditor.selection());
@@ -1229,6 +1235,7 @@ export class DebuggingActionDelegate {
}
}
return true;
}
}
return false;
}
+8 -4
View File
@@ -162,12 +162,13 @@ export class TimelineDetailsView extends UI.Widget.VBox {
return;
}
switch (this._selection.type()) {
case TimelineSelection.Type.TraceEvent:
case TimelineSelection.Type.TraceEvent: {
const event = /** @type {!SDK.TracingModel.Event} */ (this._selection.object());
TimelineUIUtils.buildTraceEventDetails(event, this._model.timelineModel(), this._detailsLinkifier, true)
.then(fragment => this._appendDetailsTabsForTraceEventAndShowDetails(event, fragment));
break;
case TimelineSelection.Type.Frame:
}
case TimelineSelection.Type.Frame: {
const frame = /** @type {!TimelineModel.TimelineFrameModel.TimelineFrame} */ (this._selection.object());
const filmStripFrame = this._model.filmStripModelFrame(frame);
this._setContent(TimelineUIUtils.generateDetailsContentForFrame(frame, filmStripFrame));
@@ -179,14 +180,17 @@ export class TimelineDetailsView extends UI.Widget.VBox {
}
}
break;
case TimelineSelection.Type.NetworkRequest:
}
case TimelineSelection.Type.NetworkRequest: {
const request = /** @type {!TimelineModel.TimelineModel.NetworkRequest} */ (this._selection.object());
TimelineUIUtils.buildNetworkRequestDetails(request, this._model.timelineModel(), this._detailsLinkifier)
.then(this._setContent.bind(this));
break;
case TimelineSelection.Type.Range:
}
case TimelineSelection.Type.Range: {
this._updateSelectedRangeStats(this._selection.startTime(), this._selection.endTime());
break;
}
}
this._updateContents();
@@ -294,28 +294,36 @@ export class TimelineFlameChartDataProvider extends Common.ObjectWrapper.ObjectW
let rasterCount = 0;
for (const track of tracks) {
switch (track.type) {
case TimelineModel.TimelineModel.TrackType.Input:
case TimelineModel.TimelineModel.TrackType.Input: {
this._appendAsyncEventsGroup(
track, ls`Input`, track.asyncEvents, this._interactionsHeaderLevel2, eventEntryType,
false /* selectable */);
break;
case TimelineModel.TimelineModel.TrackType.Animation:
}
case TimelineModel.TimelineModel.TrackType.Animation: {
this._appendAsyncEventsGroup(
track, ls`Animation`, track.asyncEvents, this._interactionsHeaderLevel2, eventEntryType,
false /* selectable */);
break;
case TimelineModel.TimelineModel.TrackType.Timings:
}
case TimelineModel.TimelineModel.TrackType.Timings: {
const group = this._appendHeader(ls`Timings`, this._timingsHeader, true /* selectable */);
group._track = track;
this._appendPageMetrics();
this._appendAsyncEventsGroup(
track, null, track.asyncEvents, this._timingsHeader, eventEntryType, true /* selectable */);
break;
case TimelineModel.TimelineModel.TrackType.Console:
}
case TimelineModel.TimelineModel.TrackType.Console: {
this._appendAsyncEventsGroup(
track, ls`Console`, track.asyncEvents, this._headerLevel1, eventEntryType, true /* selectable */);
break;
case TimelineModel.TimelineModel.TrackType.MainThread:
}
case TimelineModel.TimelineModel.TrackType.MainThread: {
if (track.forMainFrame) {
const group = this._appendSyncEvents(
track, track.events, track.url ? ls`Main \u2014 ${track.url}` : ls`Main`, this._headerLevel1,
@@ -329,12 +337,16 @@ export class TimelineFlameChartDataProvider extends Common.ObjectWrapper.ObjectW
eventEntryType, true /* selectable */);
}
break;
case TimelineModel.TimelineModel.TrackType.Worker:
}
case TimelineModel.TimelineModel.TrackType.Worker: {
this._appendSyncEvents(
track, track.events, track.url ? ls`Worker \u2014 ${track.url}` : ls`Dedicated Worker`,
this._headerLevel1, eventEntryType, true /* selectable */);
break;
case TimelineModel.TimelineModel.TrackType.Raster:
}
case TimelineModel.TimelineModel.TrackType.Raster: {
if (!rasterCount) {
this._appendHeader(ls`Raster`, this._headerLevel1, false /* selectable */);
}
@@ -343,16 +355,21 @@ export class TimelineFlameChartDataProvider extends Common.ObjectWrapper.ObjectW
track, track.events, ls`Rasterizer Thread ${rasterCount}`, this._headerLevel2, eventEntryType,
true /* selectable */);
break;
case TimelineModel.TimelineModel.TrackType.GPU:
}
case TimelineModel.TimelineModel.TrackType.GPU: {
this._appendSyncEvents(
track, track.events, ls`GPU`, this._headerLevel1, eventEntryType, true /* selectable */);
break;
case TimelineModel.TimelineModel.TrackType.Other:
}
case TimelineModel.TimelineModel.TrackType.Other: {
this._appendSyncEvents(
track, track.events, track.name || ls`Thread`, this._headerLevel1, eventEntryType, true /* selectable */);
this._appendAsyncEventsGroup(
track, track.name, track.asyncEvents, this._headerLevel1, eventEntryType, true /* selectable */);
break;
}
}
}
if (this._timelineData.selectedGroup) {
+102 -35
View File
@@ -669,9 +669,11 @@ export class TimelineUIUtils {
case recordType.WebSocketCreate:
case recordType.WebSocketSendHandshakeRequest:
case recordType.WebSocketReceiveHandshakeResponse:
case recordType.WebSocketDestroy:
case recordType.WebSocketDestroy: {
detailsText = await TimelineUIUtils.buildDetailsTextForTraceEvent(event, target);
break;
}
case recordType.PaintImage:
case recordType.DecodeImage:
case recordType.ResizeImage:
@@ -689,8 +691,9 @@ export class TimelineUIUtils {
}
break;
}
case recordType.FunctionCall:
case recordType.JSFrame:
case recordType.JSFrame: {
details = createElement('span');
details.createTextChild(TimelineUIUtils.frameDisplayName(eventData));
const location = linkifyLocation(
@@ -700,9 +703,13 @@ export class TimelineUIUtils {
details.appendChild(location);
}
break;
case recordType.CompileModule:
}
case recordType.CompileModule: {
details = linkifyLocation('', event.args['fileName'], 0, 0);
break;
}
case recordType.CompileScript:
case recordType.EvaluateScript: {
const url = eventData['url'];
@@ -711,6 +718,7 @@ export class TimelineUIUtils {
}
break;
}
case recordType.StreamingCompileScript: {
const url = eventData['url'];
if (url) {
@@ -718,13 +726,15 @@ export class TimelineUIUtils {
}
break;
}
default:
default: {
if (event.hasCategory(TimelineModel.TimelineModel.TimelineModelImpl.Category.Console)) {
detailsText = null;
} else {
details = linkifyTopCallFrame();
}
break;
}
}
if (!details && detailsText) {
@@ -868,34 +878,42 @@ export class TimelineUIUtils {
switch (event.name) {
case recordTypes.GCEvent:
case recordTypes.MajorGC:
case recordTypes.MinorGC:
case recordTypes.MinorGC: {
const delta = event.args['usedHeapSizeBefore'] - event.args['usedHeapSizeAfter'];
contentHelper.appendTextRow(ls`Collected`, Number.bytesToString(delta));
break;
}
case recordTypes.JSFrame:
case recordTypes.FunctionCall:
case recordTypes.FunctionCall: {
const detailsNode = await TimelineUIUtils.buildDetailsNodeForTraceEvent(event, model.targetByEvent(event), linkifier);
if (detailsNode) {
contentHelper.appendElementRow(ls`Function`, detailsNode);
}
break;
}
case recordTypes.TimerFire:
case recordTypes.TimerInstall:
case recordTypes.TimerRemove:
case recordTypes.TimerRemove: {
contentHelper.appendTextRow(ls`Timer ID`, eventData['timerId']);
if (event.name === recordTypes.TimerInstall) {
contentHelper.appendTextRow(ls`Timeout`, Number.millisToString(eventData['timeout']));
contentHelper.appendTextRow(ls`Repeats`, !eventData['singleShot']);
}
break;
case recordTypes.FireAnimationFrame:
}
case recordTypes.FireAnimationFrame: {
contentHelper.appendTextRow(ls`Callback ID`, eventData['id']);
break;
}
case recordTypes.ResourceWillSendRequest:
case recordTypes.ResourceSendRequest:
case recordTypes.ResourceReceiveResponse:
case recordTypes.ResourceReceivedData:
case recordTypes.ResourceFinish:
case recordTypes.ResourceFinish: {
url = timelineData.url;
if (url) {
contentHelper.appendElementRow(ls`Resource`, Components.Linkifier.Linkifier.linkifyURL(url, {tabStop: true}));
@@ -920,10 +938,14 @@ export class TimelineUIUtils {
contentHelper.appendTextRow(ls`Decoded Body`, ls`${eventData['decodedBodyLength']} Bytes`);
}
break;
case recordTypes.CompileModule:
}
case recordTypes.CompileModule: {
contentHelper.appendLocationRow(ls`Module`, event.args['fileName'], 0);
break;
case recordTypes.CompileScript:
}
case recordTypes.CompileScript: {
url = eventData && eventData['url'];
if (url) {
contentHelper.appendLocationRow(ls`Script`, url, eventData['lineNumber'], eventData['columnNumber']);
@@ -940,17 +962,21 @@ export class TimelineUIUtils {
contentHelper.appendTextRow(ls`Cache Rejected`, eventData['cacheRejected']);
}
break;
case recordTypes.EvaluateScript:
}
case recordTypes.EvaluateScript: {
url = eventData && eventData['url'];
if (url) {
contentHelper.appendLocationRow(ls`Script`, url, eventData['lineNumber'], eventData['columnNumber']);
}
break;
}
case recordTypes.WasmStreamFromResponseCallback:
case recordTypes.WasmCompiledModule:
case recordTypes.WasmCachedModule:
case recordTypes.WasmModuleCacheHit:
case recordTypes.WasmModuleCacheInvalid:
case recordTypes.WasmModuleCacheInvalid: {
if (eventData) {
url = event.args['url'];
if (url) {
@@ -966,24 +992,29 @@ export class TimelineUIUtils {
}
}
break;
case recordTypes.Paint:
}
case recordTypes.Paint: {
const clip = eventData['clip'];
contentHelper.appendTextRow(ls`Location`, ls`(${clip[0]}, ${clip[1]})`);
const clipWidth = TimelineUIUtils.quadWidth(clip);
const clipHeight = TimelineUIUtils.quadHeight(clip);
contentHelper.appendTextRow(ls`Dimensions`, ls`${clipWidth} × ${clipHeight}`);
// Fall-through intended.
}
case recordTypes.PaintSetup:
case recordTypes.Rasterize:
case recordTypes.ScrollLayer:
case recordTypes.ScrollLayer: {
relatedNodeLabel = ls`Layer Root`;
break;
}
case recordTypes.PaintImage:
case recordTypes.DecodeLazyPixelRef:
case recordTypes.DecodeImage:
case recordTypes.ResizeImage:
case recordTypes.DrawLazyPixelRef:
case recordTypes.DrawLazyPixelRef: {
relatedNodeLabel = ls`Owner Element`;
url = timelineData.url;
if (url) {
@@ -991,30 +1022,40 @@ export class TimelineUIUtils {
ls`Image URL`, Components.Linkifier.Linkifier.linkifyURL(url, {tabStop: true}));
}
break;
case recordTypes.ParseAuthorStyleSheet:
}
case recordTypes.ParseAuthorStyleSheet: {
url = eventData['styleSheetUrl'];
if (url) {
contentHelper.appendElementRow(
ls`Stylesheet URL`, Components.Linkifier.Linkifier.linkifyURL(url, {tabStop: true}));
}
break;
}
case recordTypes.UpdateLayoutTree: // We don't want to see default details.
case recordTypes.RecalculateStyles:
case recordTypes.RecalculateStyles: {
contentHelper.appendTextRow(ls`Elements Affected`, event.args['elementCount']);
break;
case recordTypes.Layout:
}
case recordTypes.Layout: {
const beginData = event.args['beginData'];
contentHelper.appendTextRow(
ls`Nodes That Need Layout`, ls`${beginData['dirtyObjects']} of ${beginData['totalObjects']}`);
relatedNodeLabel = ls`Layout root`;
break;
case recordTypes.ConsoleTime:
}
case recordTypes.ConsoleTime: {
contentHelper.appendTextRow(ls`Message`, event.name);
break;
}
case recordTypes.WebSocketCreate:
case recordTypes.WebSocketSendHandshakeRequest:
case recordTypes.WebSocketReceiveHandshakeResponse:
case recordTypes.WebSocketDestroy:
case recordTypes.WebSocketDestroy: {
const initiatorData = initiator ? initiator.args['data'] : eventData;
if (typeof initiatorData['webSocketURL'] !== 'undefined') {
contentHelper.appendTextRow(ls`URL`, initiatorData['webSocketURL']);
@@ -1026,14 +1067,20 @@ export class TimelineUIUtils {
contentHelper.appendTextRow(ls`Message`, eventData['message']);
}
break;
case recordTypes.EmbedderCallback:
}
case recordTypes.EmbedderCallback: {
contentHelper.appendTextRow(ls`Callback Function`, eventData['callbackName']);
break;
case recordTypes.Animation:
}
case recordTypes.Animation: {
if (event.phase === SDK.TracingModel.Phase.NestableAsyncInstant) {
contentHelper.appendTextRow(ls`State`, eventData['state']);
}
break;
}
case recordTypes.ParseHTML: {
const beginData = event.args['beginData'];
const startLine = beginData['startLine'] - 1;
@@ -1045,32 +1092,39 @@ export class TimelineUIUtils {
break;
}
case recordTypes.FireIdleCallback:
case recordTypes.FireIdleCallback: {
contentHelper.appendTextRow(ls`Allotted Time`, Number.millisToString(eventData['allottedMilliseconds']));
contentHelper.appendTextRow(ls`Invoked by Timeout`, eventData['timedOut']);
// Fall-through intended.
}
case recordTypes.RequestIdleCallback:
case recordTypes.CancelIdleCallback:
case recordTypes.CancelIdleCallback: {
contentHelper.appendTextRow(ls`Callback ID`, eventData['id']);
break;
case recordTypes.EventDispatch:
}
case recordTypes.EventDispatch: {
contentHelper.appendTextRow(ls`Type`, eventData['type']);
break;
}
case recordTypes.MarkLCPCandidate:
case recordTypes.MarkLCPCandidate: {
contentHelper.appendTextRow(ls`Type`, String(eventData['type']));
contentHelper.appendTextRow(ls`Size`, String(eventData['size']));
// Fall-through intended.
}
case recordTypes.MarkFirstPaint:
case recordTypes.MarkFCP:
case recordTypes.MarkFMP:
case recordTypes.MarkLoad:
case recordTypes.MarkDOMContent:
case recordTypes.MarkDOMContent: {
contentHelper.appendTextRow(
ls`Timestamp`, Number.preciseMillisToString(event.startTime - model.minimumRecordTime(), 1));
contentHelper.appendElementRow(ls`Details`, TimelineUIUtils.buildDetailsNodeForPerformanceEvent(event));
break;
}
default: {
const detailsNode = await TimelineUIUtils.buildDetailsNodeForTraceEvent(event, model.targetByEvent(event), linkifier);
@@ -2018,36 +2072,49 @@ export class TimelineUIUtils {
switch (warning) {
case warnings.ForcedStyle:
case warnings.ForcedLayout:
case warnings.ForcedLayout: {
const forcedReflowLink = UI.UIUtils.createDocumentationLink(
'../../fundamentals/performance/rendering/avoid-large-complex-layouts-and-layout-thrashing#avoid-forced-synchronous-layouts',
ls`Forced reflow`);
span.appendChild(UI.UIUtils.formatLocalized('%s is a likely performance bottleneck.', [forcedReflowLink]));
break;
case warnings.IdleDeadlineExceeded:
}
case warnings.IdleDeadlineExceeded: {
const exceededMs = Number.millisToString(event.duration - eventData['allottedMilliseconds'], true);
span.textContent = ls`Idle callback execution extended beyond deadline by ${exceededMs}`;
break;
case warnings.LongHandler:
}
case warnings.LongHandler: {
span.textContent = Common.UIString.UIString('Handler took %s', Number.millisToString(event.duration, true));
break;
case warnings.LongRecurringHandler:
}
case warnings.LongRecurringHandler: {
span.textContent =
Common.UIString.UIString('Recurring handler took %s', Number.millisToString(event.duration, true));
break;
case warnings.LongTask:
}
case warnings.LongTask: {
const longTaskLink = UI.UIUtils.createDocumentationLink(
'../../fundamentals/performance/rail#goals-and-guidelines', ls`Long task`);
span.appendChild(
UI.UIUtils.formatLocalized('%s took %s.', [longTaskLink, Number.millisToString(event.duration, true)]));
break;
case warnings.V8Deopt:
}
case warnings.V8Deopt: {
span.appendChild(UI.XLink.XLink.create(
'https://github.com/GoogleChrome/devtools-docs/issues/53', Common.UIString.UIString('Not optimized')));
span.createTextChild(Common.UIString.UIString(': %s', eventData['deoptReason']));
break;
default:
}
default: {
console.assert(false, 'Unhandled TimelineModel.WarningType');
}
}
return span;
}
+34 -20
View File
@@ -798,17 +798,19 @@ export class TimelineModelImpl {
switch (event.name) {
case recordTypes.ResourceSendRequest:
case recordTypes.WebSocketCreate:
case recordTypes.WebSocketCreate: {
timelineData.setInitiator(eventStack.peekLast() || null);
timelineData.url = eventData['url'];
break;
}
case recordTypes.ScheduleStyleRecalculation:
case recordTypes.ScheduleStyleRecalculation: {
this._lastScheduleStyleRecalculation[eventData['frame']] = event;
break;
}
case recordTypes.UpdateLayoutTree:
case recordTypes.RecalculateStyles:
case recordTypes.RecalculateStyles: {
this._invalidationTracker.didRecalcStyle(event);
if (event.args['beginData']) {
timelineData.setInitiator(this._lastScheduleStyleRecalculation[event.args['beginData']['frame']]);
@@ -818,13 +820,15 @@ export class TimelineModelImpl {
this._currentTaskLayoutAndRecalcEvents.push(event);
}
break;
}
case recordTypes.ScheduleStyleInvalidationTracking:
case recordTypes.StyleRecalcInvalidationTracking:
case recordTypes.StyleInvalidatorInvalidationTracking:
case recordTypes.LayoutInvalidationTracking:
case recordTypes.LayoutInvalidationTracking: {
this._invalidationTracker.addInvalidation(new InvalidationTrackingEvent(event));
break;
}
case recordTypes.InvalidateLayout: {
// Consider style recalculation as a reason for layout invalidation,
@@ -854,26 +858,29 @@ export class TimelineModelImpl {
break;
}
case recordTypes.Task:
case recordTypes.Task: {
if (event.duration > TimelineModelImpl.Thresholds.LongTask) {
timelineData.warning = TimelineModelImpl.WarningType.LongTask;
}
break;
}
case recordTypes.EventDispatch:
case recordTypes.EventDispatch: {
if (event.duration > TimelineModelImpl.Thresholds.RecurringHandler) {
timelineData.warning = TimelineModelImpl.WarningType.LongHandler;
}
break;
}
case recordTypes.TimerFire:
case recordTypes.FireAnimationFrame:
case recordTypes.FireAnimationFrame: {
if (event.duration > TimelineModelImpl.Thresholds.RecurringHandler) {
timelineData.warning = TimelineModelImpl.WarningType.LongRecurringHandler;
}
break;
}
case recordTypes.FunctionCall:
case recordTypes.FunctionCall: {
// Compatibility with old format.
if (typeof eventData['scriptName'] === 'string') {
eventData['url'] = eventData['scriptName'];
@@ -881,29 +888,30 @@ export class TimelineModelImpl {
if (typeof eventData['scriptLine'] === 'number') {
eventData['lineNumber'] = eventData['scriptLine'];
}
// Fallthrough.
// Fallthrough intended.
}
case recordTypes.EvaluateScript:
case recordTypes.CompileScript:
case recordTypes.CompileScript: {
if (typeof eventData['lineNumber'] === 'number') {
--eventData['lineNumber'];
}
if (typeof eventData['columnNumber'] === 'number') {
--eventData['columnNumber'];
}
// Fallthrough intended.
}
// Fallthrough intended.
case recordTypes.RunMicrotasks:
case recordTypes.RunMicrotasks: {
// Microtasks technically are not necessarily scripts, but for purpose of
// forced sync style recalc or layout detection they are.
if (!this._currentScriptEvent) {
this._currentScriptEvent = event;
}
break;
}
case recordTypes.SetLayerTreeId:
case recordTypes.SetLayerTreeId: {
// This is to support old traces.
if (this._sessionId && eventData['sessionId'] && this._sessionId === eventData['sessionId']) {
this._mainFrameLayerTreeId = eventData['layerTreeId'];
@@ -918,6 +926,7 @@ export class TimelineModelImpl {
}
this._mainFrameLayerTreeId = eventData['layerTreeId'];
break;
}
case recordTypes.Paint: {
this._invalidationTracker.didPaint(event);
@@ -945,14 +954,16 @@ export class TimelineModelImpl {
break;
}
case recordTypes.ScrollLayer:
case recordTypes.ScrollLayer: {
timelineData.backendNodeId = eventData['nodeId'];
break;
}
case recordTypes.PaintImage:
case recordTypes.PaintImage: {
timelineData.backendNodeId = eventData['nodeId'];
timelineData.url = eventData['url'];
break;
}
case recordTypes.DecodeImage:
case recordTypes.ResizeImage: {
@@ -983,15 +994,17 @@ export class TimelineModelImpl {
break;
}
case recordTypes.FrameStartedLoading:
case recordTypes.FrameStartedLoading: {
if (timelineData.frameId !== event.args['frame']) {
return false;
}
break;
}
case recordTypes.MarkLCPCandidate:
case recordTypes.MarkLCPCandidate: {
timelineData.backendNodeId = eventData['nodeId'];
break;
}
case recordTypes.MarkDOMContent:
case recordTypes.MarkLoad: {
@@ -1030,11 +1043,12 @@ export class TimelineModelImpl {
break;
}
case recordTypes.FireIdleCallback:
case recordTypes.FireIdleCallback: {
if (event.duration > eventData['allottedMilliseconds'] + TimelineModelImpl.Thresholds.IdleCallbackAddon) {
timelineData.warning = TimelineModelImpl.WarningType.IdleDeadlineExceeded;
}
break;
}
}
return true;
}
+6 -3
View File
@@ -88,7 +88,7 @@ export class Item {
*/
_buildDescriptor() {
switch (this._type) {
case 'item':
case 'item': {
const result = {type: 'item', id: this._id, label: this._label, enabled: !this._disabled};
if (this._customElement) {
result.element = this._customElement;
@@ -97,10 +97,13 @@ export class Item {
result.shortcut = this._shortcut;
}
return result;
case 'separator':
}
case 'separator': {
return {type: 'separator'};
case 'checkbox':
}
case 'checkbox': {
return {type: 'checkbox', id: this._id, label: this._label, checked: !!this._checked, enabled: !this._disabled};
}
}
throw new Error('Invalid item type:' + this._type);
}
+2 -2
View File
@@ -1975,7 +1975,7 @@ export class ThemeSupport {
const alpha = hsla[3];
switch (this._themeName) {
case 'dark':
case 'dark': {
const minCap = colorUsage & ThemeSupport.ColorUsage.Background ? 0.14 : 0;
const maxCap = colorUsage & ThemeSupport.ColorUsage.Foreground ? 0.9 : 1;
lit = 1 - lit;
@@ -1984,8 +1984,8 @@ export class ThemeSupport {
} else if (lit > 2 * maxCap - 1) {
lit = maxCap - 1 / 2 + lit / 2;
}
break;
}
}
hsla[0] = Platform.NumberUtilities.clamp(hue, 0, 1);
hsla[1] = Platform.NumberUtilities.clamp(sat, 0, 1);
+8 -3
View File
@@ -195,7 +195,7 @@ function analyzeNode(parentNode, node, filePath, errors) {
const code = escodegen.generate(node);
switch (locCase) {
case 'Common.UIString':
case 'UI.formatLocalized':
case 'UI.formatLocalized': {
const firstArgType = node.arguments[0].type;
if (firstArgType !== esprimaTypes.LITERAL && firstArgType !== esprimaTypes.TEMP_LITERAL &&
firstArgType !== esprimaTypes.IDENTIFIER && !excludeErrors.includes(code)) {
@@ -212,7 +212,9 @@ function analyzeNode(parentNode, node, filePath, errors) {
errors);
}
break;
case 'Tagged Template':
}
case 'Tagged Template': {
if (includesConditionalExpression(node.quasi.expressions)) {
addError(
`${localizationUtils.getRelativeFilePathFromSrc(filePath)}${
@@ -221,10 +223,13 @@ function analyzeNode(parentNode, node, filePath, errors) {
errors);
}
break;
default:
}
default: {
// String concatenation to localization call(s) should be changed
checkConcatenation(parentNode, node, filePath, errors);
break;
}
}
for (const key of objKeys) {
@@ -327,23 +327,28 @@ function parseLocalizableStringFromNode(node, filePath) {
const locCase = localizationUtils.getLocalizationCase(node);
switch (locCase) {
case 'Common.UIString':
case 'Common.UIStringFormat':
case 'Common.UIStringFormat': {
handleCommonUIString(node, filePath);
break;
case 'UI.formatLocalized':
}
case 'UI.formatLocalized': {
if (node.arguments !== undefined && node.arguments[1] !== undefined && node.arguments[1].elements !== undefined) {
handleCommonUIString(node, filePath, node.arguments[1].elements);
}
break;
case 'Tagged Template':
}
case 'Tagged Template': {
handleTemplateLiteral(node.quasi, escodegen.generate(node), filePath);
break;
case null:
}
case null: {
break;
default:
}
default: {
throw new Error(
`${filePath}${localizationUtils.getLocationMessage(node.loc)}: unexpected localization case for node: ${
escodegen.generate(node)}`);
}
}
for (const key of objKeys) {
@@ -358,15 +363,18 @@ function handleCommonUIString(node, filePath, argumentNodes) {
}
const firstArgType = node.arguments[0].type;
switch (firstArgType) {
case esprimaTypes.LITERAL:
case esprimaTypes.LITERAL: {
const message = node.arguments[0].value;
addString(message, escodegen.generate(node), filePath, node.loc, argumentNodes);
break;
case esprimaTypes.TEMP_LITERAL:
}
case esprimaTypes.TEMP_LITERAL: {
handleTemplateLiteral(node.arguments[0], escodegen.generate(node), filePath, argumentNodes);
break;
default:
}
default: {
break;
}
}
}