From 4a1c2aebdb9949f8a1e26df9daf865a3a665f5cf Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 3 Nov 2025 12:32:53 +0100 Subject: [PATCH] debt - enable `no-restricted-syntax` for all our code and use local overrides (#274722) --- eslint.config.js | 160 +++--------------- src/vs/base/browser/dom.ts | 1 + src/vs/base/browser/markdownRenderer.ts | 6 + src/vs/base/browser/ui/button/button.ts | 2 + src/vs/base/browser/ui/dialog/dialog.ts | 5 + src/vs/base/browser/ui/iconLabel/iconLabel.ts | 1 + src/vs/base/browser/ui/list/listWidget.ts | 1 + src/vs/base/browser/ui/sash/sash.ts | 1 + src/vs/base/browser/ui/splitview/paneview.ts | 1 + .../test/browser/markdownRenderer.test.ts | 2 + .../browser/ui/splitview/splitview.test.ts | 2 + .../browser/ui/tree/asyncDataTree.test.ts | 2 + .../test/browser/ui/tree/objectTree.test.ts | 2 + .../editorMarkdownCodeBlockRenderer.ts | 1 + .../documentSymbols/browser/outlineModel.ts | 2 + .../editor/contrib/find/browser/findWidget.ts | 4 + .../hover/browser/contentHoverWidget.ts | 1 + .../contrib/hover/browser/glyphHoverWidget.ts | 1 + .../test/browser/hoverCopyButton.test.ts | 2 + .../browser/parameterHintsWidget.ts | 1 + .../test/browser/controller/imeRecorder.ts | 2 + .../actionWidget/browser/actionList.ts | 1 + .../quickinput/browser/quickInputList.ts | 1 + .../workbench/browser/actions/listCommands.ts | 4 + src/vs/workbench/browser/layout.ts | 1 + .../browser/parts/titlebar/titlebarPart.ts | 1 + .../workbench/browser/parts/views/treeView.ts | 1 + .../actions/chatAccessibilityActions.ts | 1 + .../chat/browser/actions/chatCopyActions.ts | 2 + .../chat/browser/chatAttachmentWidgets.ts | 2 + .../browser/chatContentMarkdownRenderer.ts | 1 + .../chatAttachmentsContentPart.ts | 1 + .../chatChangesSummaryPart.ts | 1 + .../chatMarkdownContentPart.ts | 3 + .../chatMcpServersInteractionContentPart.ts | 1 + .../chatMultiDiffContentPart.ts | 1 + .../chatReferencesContentPart.ts | 3 + .../chatThinkingContentPart.ts | 2 + .../chatTerminalToolProgressPart.ts | 1 + .../chatEditing/simpleBrowserEditorOverlay.ts | 1 + .../contrib/chat/browser/chatEditor.ts | 1 + .../chat/browser/chatInlineAnchorWidget.ts | 1 + .../contrib/chat/browser/chatInputPart.ts | 8 + .../chatMarkdownDecorationsRenderer.ts | 1 + .../chatSessions/view/sessionsTreeRenderer.ts | 3 + .../viewsWelcome/chatViewWelcomeController.ts | 1 + .../test/browser/chatTodoListWidget.test.ts | 2 + .../emptyTextEditorHint.ts | 1 + .../suggestEnabledInput.ts | 1 + .../comments/browser/commentsTreeViewer.ts | 2 + .../debug/test/browser/baseDebugView.test.ts | 2 + .../files/browser/views/explorerView.ts | 2 + .../files/browser/views/explorerViewer.ts | 2 + .../files/browser/views/openEditorsView.ts | 1 + .../issue/browser/baseIssueReporterService.ts | 75 ++++++++ .../issue/browser/issueReporterService.ts | 2 + .../electron-browser/issueReporterService.ts | 8 + .../languageStatus/browser/languageStatus.ts | 3 + .../markdown/browser/markedKatexSupport.ts | 1 + .../contrib/markers/browser/markersTable.ts | 1 + .../browser/contrib/troubleshoot/layout.ts | 2 + .../view/cellParts/cellDragRenderer.ts | 1 + .../browser/view/cellParts/cellExecution.ts | 1 + .../preferences/browser/settingsEditor2.ts | 7 + .../preferences/browser/settingsTree.ts | 7 + .../browser/processExplorerControl.ts | 3 + .../search/browser/searchResultsView.ts | 1 + .../contrib/search/browser/searchWidget.ts | 4 + .../contrib/splash/browser/partsSplash.ts | 2 + .../terminal/browser/terminalTabsList.ts | 1 + .../terminal/browser/xterm/decorationAddon.ts | 1 + .../terminal/browser/xterm/xtermTerminal.ts | 1 + .../terminal.commandGuide.contribution.ts | 2 + .../browser/terminalStickyScrollOverlay.ts | 1 + .../browser/terminal.suggest.contribution.ts | 1 + .../suggest/browser/terminalSuggestAddon.ts | 1 + .../testing/test/browser/testObjectTree.ts | 1 + .../electron-browser/webviewCommands.ts | 1 + .../browser/gettingStarted.ts | 21 +++ .../browser/walkThroughPart.ts | 6 + .../services/driver/browser/driver.ts | 8 + .../builtinExtensionsScannerService.ts | 1 + .../themes/browser/workbenchThemeService.ts | 1 + src/vs/workbench/test/browser/part.test.ts | 2 + 84 files changed, 292 insertions(+), 132 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index b87edea83e9..3ce955187d0 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1480,6 +1480,34 @@ export default tseslint.config( { 'selector': `MemberExpression[object.name='document'][property.name='execCommand']`, 'message': 'Use .document.execCommand to support multi-window scenarios. Resolve targetWindow with DOM.getWindow(element) or DOM.getActiveWindow() or use the predefined mainWindow constant.' + }, + { + 'selector': 'CallExpression[callee.property.name=\'querySelector\']', + 'message': 'querySelector should not be used as relying on selectors is very fragile. Use dom.ts h() to build your elements and access them directly.' + }, + { + 'selector': 'CallExpression[callee.property.name=\'querySelectorAll\']', + 'message': 'querySelectorAll should not be used as relying on selectors is very fragile. Use dom.ts h() to build your elements and access them directly.' + }, + { + 'selector': 'CallExpression[callee.property.name=\'getElementById\']', + 'message': 'getElementById should not be used as relying on selectors is very fragile. Use dom.ts h() to build your elements and access them directly.' + }, + { + 'selector': 'CallExpression[callee.property.name=\'getElementsByClassName\']', + 'message': 'getElementsByClassName should not be used as relying on selectors is very fragile. Use dom.ts h() to build your elements and access them directly.' + }, + { + 'selector': 'CallExpression[callee.property.name=\'getElementsByTagName\']', + 'message': 'getElementsByTagName should not be used as relying on selectors is very fragile. Use dom.ts h() to build your elements and access them directly.' + }, + { + 'selector': 'CallExpression[callee.property.name=\'getElementsByName\']', + 'message': 'getElementsByName should not be used as relying on selectors is very fragile. Use dom.ts h() to build your elements and access them directly.' + }, + { + 'selector': 'CallExpression[callee.property.name=\'getElementsByTagNameNS\']', + 'message': 'getElementsByTagNameNS should not be used as relying on selectors is very fragile. Use dom.ts h() to build your elements and access them directly.' } ], 'no-restricted-globals': [ @@ -1644,138 +1672,6 @@ export default tseslint.config( ] } }, - // browser/electron-browser layer - { - files: [ - 'src/**/{browser,electron-browser}/**/*.ts' - ], - ignores: [ - // Base - 'src/vs/base/browser/dom.ts', - 'src/vs/base/browser/markdownRenderer.ts', - 'src/vs/base/browser/ui/button/button.ts', - 'src/vs/base/browser/ui/dialog/dialog.ts', - 'src/vs/base/browser/ui/iconLabel/iconLabel.ts', - 'src/vs/base/browser/ui/list/listWidget.ts', - 'src/vs/base/browser/ui/sash/sash.ts', - 'src/vs/base/browser/ui/splitview/paneview.ts', - // Editor - 'src/vs/editor/browser/controller/editContext/native/debugEditContext.ts', - 'src/vs/editor/browser/widget/markdownRenderer/browser/editorMarkdownCodeBlockRenderer.ts', - 'src/vs/editor/contrib/documentSymbols/browser/outlineModel.ts', - 'src/vs/editor/contrib/find/browser/findWidget.ts', - 'src/vs/editor/contrib/hover/browser/contentHoverWidget.ts', - 'src/vs/editor/contrib/hover/browser/glyphHoverWidget.ts', - 'src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/debugVisualization.ts', - 'src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts', - 'src/vs/editor/test/browser/controller/imeRecorder.ts', - // Platform - 'src/vs/platform/actionWidget/browser/actionList.ts', - 'src/vs/platform/dnd/browser/dnd.ts', - 'src/vs/platform/quickinput/browser/quickInputList.ts', - // Workbench - 'src/vs/workbench/browser/actions/listCommands.ts', - 'src/vs/workbench/browser/layout.ts', - 'src/vs/workbench/browser/parts/titlebar/titlebarPart.ts', - 'src/vs/workbench/browser/parts/views/treeView.ts', - 'src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityActions.ts', - 'src/vs/workbench/contrib/chat/browser/actions/chatCopyActions.ts', - 'src/vs/workbench/contrib/chat/browser/chatAttachmentWidgets.ts', - 'src/vs/workbench/contrib/chat/browser/chatContentMarkdownRenderer.ts', - 'src/vs/workbench/contrib/chat/browser/chatContentParts/chatAttachmentsContentPart.ts', - 'src/vs/workbench/contrib/chat/browser/chatContentParts/chatChangesSummaryPart.ts', - 'src/vs/workbench/contrib/chat/browser/chatContentParts/chatMarkdownContentPart.ts', - 'src/vs/workbench/contrib/chat/browser/chatContentParts/chatMcpServersInteractionContentPart.ts', - 'src/vs/workbench/contrib/chat/browser/chatContentParts/chatMultiDiffContentPart.ts', - 'src/vs/workbench/contrib/chat/browser/chatContentParts/chatReferencesContentPart.ts', - 'src/vs/workbench/contrib/chat/browser/chatContentParts/chatThinkingContentPart.ts', - 'src/vs/workbench/contrib/chat/browser/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.ts', - 'src/vs/workbench/contrib/chat/browser/chatEditing/simpleBrowserEditorOverlay.ts', - 'src/vs/workbench/contrib/chat/browser/chatEditor.ts', - 'src/vs/workbench/contrib/chat/browser/chatInlineAnchorWidget.ts', - 'src/vs/workbench/contrib/chat/browser/chatInputPart.ts', - 'src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts', - 'src/vs/workbench/contrib/chat/browser/chatSessions/view/sessionsTreeRenderer.ts', - 'src/vs/workbench/contrib/chat/browser/viewsWelcome/chatViewWelcomeController.ts', - 'src/vs/workbench/contrib/codeEditor/browser/emptyTextEditorHint/emptyTextEditorHint.ts', - 'src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts', - 'src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts', - 'src/vs/workbench/contrib/files/browser/views/explorerView.ts', - 'src/vs/workbench/contrib/files/browser/views/explorerViewer.ts', - 'src/vs/workbench/contrib/files/browser/views/openEditorsView.ts', - 'src/vs/workbench/contrib/issue/browser/baseIssueReporterService.ts', - 'src/vs/workbench/contrib/issue/browser/issueReporterService.ts', - 'src/vs/workbench/contrib/issue/electron-browser/issueReporterService.ts', - 'src/vs/workbench/contrib/languageStatus/browser/languageStatus.ts', - 'src/vs/workbench/contrib/markdown/browser/markedKatexSupport.ts', - 'src/vs/workbench/contrib/markers/browser/markersTable.ts', - 'src/vs/workbench/contrib/notebook/browser/contrib/troubleshoot/layout.ts', - 'src/vs/workbench/contrib/notebook/browser/view/cellParts/cellDragRenderer.ts', - 'src/vs/workbench/contrib/notebook/browser/view/cellParts/cellExecution.ts', - 'src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts', - 'src/vs/workbench/contrib/preferences/browser/settingsTree.ts', - 'src/vs/workbench/contrib/processExplorer/browser/processExplorerControl.ts', - 'src/vs/workbench/contrib/search/browser/searchResultsView.ts', - 'src/vs/workbench/contrib/search/browser/searchWidget.ts', - 'src/vs/workbench/contrib/splash/browser/partsSplash.ts', - 'src/vs/workbench/contrib/terminal/browser/terminalTabsList.ts', - 'src/vs/workbench/contrib/terminal/browser/xterm/decorationAddon.ts', - 'src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts', - 'src/vs/workbench/contrib/terminalContrib/commandGuide/browser/terminal.commandGuide.contribution.ts', - 'src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollOverlay.ts', - 'src/vs/workbench/contrib/terminalContrib/suggest/browser/terminal.suggest.contribution.ts', - 'src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts', - 'src/vs/workbench/contrib/testing/test/browser/testObjectTree.ts', - 'src/vs/workbench/contrib/webview/electron-browser/webviewCommands.ts', - 'src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts', - 'src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughPart.ts', - 'src/vs/workbench/services/driver/browser/driver.ts', - 'src/vs/workbench/services/extensionManagement/browser/builtinExtensionsScannerService.ts', - 'src/vs/workbench/services/themes/browser/workbenchThemeService.ts', - // Tests - '**/*.test.ts', - '**/*.integrationTest.ts' - ], - languageOptions: { - parser: tseslint.parser, - }, - plugins: { - 'local': pluginLocal, - }, - rules: { - 'no-restricted-syntax': [ - 'warn', - { - 'selector': 'CallExpression[callee.property.name=\'querySelector\']', - 'message': 'querySelector should not be used. Use dom.ts h() to build your elements and access them directly.' - }, - { - 'selector': 'CallExpression[callee.property.name=\'querySelectorAll\']', - 'message': 'querySelectorAll should not be used. Use dom.ts h() to build your elements and access them directly.' - }, - { - 'selector': 'CallExpression[callee.property.name=\'getElementById\']', - 'message': 'getElementById should not be used. Use dom.ts h() to build your elements and access them directly.' - }, - { - 'selector': 'CallExpression[callee.property.name=\'getElementsByClassName\']', - 'message': 'getElementsByClassName should not be used. Use dom.ts h() to build your elements and access them directly.' - }, - { - 'selector': 'CallExpression[callee.property.name=\'getElementsByTagName\']', - 'message': 'getElementsByTagName should not be used. Use dom.ts h() to build your elements and access them directly.' - }, - { - 'selector': 'CallExpression[callee.property.name=\'getElementsByName\']', - 'message': 'getElementsByName should not be used. Use dom.ts h() to build your elements and access them directly.' - }, - { - 'selector': 'CallExpression[callee.property.name=\'getElementsByTagNameNS\']', - 'message': 'getElementsByTagNameNS should not be used. Use dom.ts h() to build your elements and access them directly.' - } - ] - } - }, // electron-utility layer { files: [ diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index 6f5dcde1127..598aa29c32c 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -799,6 +799,7 @@ export function setParentFlowTo(fromChildElement: HTMLElement, toParentElement: function getParentFlowToElement(node: HTMLElement): HTMLElement | null { const flowToParentId = node.dataset[parentFlowToDataKey]; if (typeof flowToParentId === 'string') { + // eslint-disable-next-line no-restricted-syntax return node.ownerDocument.getElementById(flowToParentId); } return null; diff --git a/src/vs/base/browser/markdownRenderer.ts b/src/vs/base/browser/markdownRenderer.ts index 2e9ad74d2ad..ccfab4c39e2 100644 --- a/src/vs/base/browser/markdownRenderer.ts +++ b/src/vs/base/browser/markdownRenderer.ts @@ -231,6 +231,7 @@ export function renderMarkdown(markdown: IMarkdownString, options: MarkdownRende return; } const renderedElements = new Map(tuples); + // eslint-disable-next-line no-restricted-syntax const placeholderElements = outElement.querySelectorAll(`div[data-code]`); for (const placeholderElement of placeholderElements) { const renderedElement = renderedElements.get(placeholderElement.dataset['code'] ?? ''); @@ -242,6 +243,7 @@ export function renderMarkdown(markdown: IMarkdownString, options: MarkdownRende }); } else if (syncCodeBlocks.length > 0) { const renderedElements = new Map(syncCodeBlocks); + // eslint-disable-next-line no-restricted-syntax const placeholderElements = outElement.querySelectorAll(`div[data-code]`); for (const placeholderElement of placeholderElements) { const renderedElement = renderedElements.get(placeholderElement.dataset['code'] ?? ''); @@ -253,6 +255,7 @@ export function renderMarkdown(markdown: IMarkdownString, options: MarkdownRende // Signal size changes for image tags if (options.asyncRenderCallback) { + // eslint-disable-next-line no-restricted-syntax for (const img of outElement.getElementsByTagName('img')) { const listener = disposables.add(DOM.addDisposableListener(img, 'load', () => { listener.dispose(); @@ -283,6 +286,7 @@ export function renderMarkdown(markdown: IMarkdownString, options: MarkdownRende } // Remove/disable inputs + // eslint-disable-next-line no-restricted-syntax for (const input of [...outElement.getElementsByTagName('input')]) { if (input.attributes.getNamedItem('type')?.value === 'checkbox') { input.setAttribute('disabled', ''); @@ -310,6 +314,7 @@ export function renderMarkdown(markdown: IMarkdownString, options: MarkdownRende } function rewriteRenderedLinks(markdown: IMarkdownString, options: MarkdownRenderOptions, root: HTMLElement) { + // eslint-disable-next-line no-restricted-syntax for (const el of root.querySelectorAll('img, audio, video, source')) { const src = el.getAttribute('src'); // Get the raw 'src' attribute value as text, not the resolved 'src' if (src) { @@ -331,6 +336,7 @@ function rewriteRenderedLinks(markdown: IMarkdownString, options: MarkdownRender } } + // eslint-disable-next-line no-restricted-syntax for (const el of root.querySelectorAll('a')) { const href = el.getAttribute('href'); // Get the raw 'href' attribute value as text, not the resolved 'href' el.setAttribute('href', ''); // Clear out href. We use the `data-href` for handling clicks instead diff --git a/src/vs/base/browser/ui/button/button.ts b/src/vs/base/browser/ui/button/button.ts index 1f9ea52453f..b4317a323f1 100644 --- a/src/vs/base/browser/ui/button/button.ts +++ b/src/vs/base/browser/ui/button/button.ts @@ -251,6 +251,7 @@ export class Button extends Disposable implements IButton { rendered.dispose(); // Don't include outer `

` + // eslint-disable-next-line no-restricted-syntax const root = rendered.element.querySelector('p')?.innerHTML; if (root) { safeSetInnerHtml(labelElement, root, buttonSanitizerConfig); @@ -652,6 +653,7 @@ export class ButtonWithIcon extends Button { const rendered = renderMarkdown(value, undefined, document.createElement('span')); rendered.dispose(); + // eslint-disable-next-line no-restricted-syntax const root = rendered.element.querySelector('p')?.innerHTML; if (root) { safeSetInnerHtml(this._mdlabelElement, root, buttonSanitizerConfig); diff --git a/src/vs/base/browser/ui/dialog/dialog.ts b/src/vs/base/browser/ui/dialog/dialog.ts index b569359a06c..6c972e7866b 100644 --- a/src/vs/base/browser/ui/dialog/dialog.ts +++ b/src/vs/base/browser/ui/dialog/dialog.ts @@ -136,6 +136,7 @@ export class Dialog extends Disposable { const customFooter = this.footerContainer.appendChild($('#monaco-dialog-footer.dialog-footer')); this.options.renderFooter(customFooter); + // eslint-disable-next-line no-restricted-syntax for (const el of this.footerContainer.querySelectorAll('a')) { el.tabIndex = 0; } @@ -177,6 +178,7 @@ export class Dialog extends Disposable { const customBody = this.messageContainer.appendChild($('#monaco-dialog-message-body.dialog-message-body')); this.options.renderBody(customBody); + // eslint-disable-next-line no-restricted-syntax for (const el of this.messageContainer.querySelectorAll('a')) { el.tabIndex = 0; } @@ -378,6 +380,7 @@ export class Dialog extends Disposable { let focusedIndex = -1; if (this.messageContainer) { + // eslint-disable-next-line no-restricted-syntax const links = this.messageContainer.querySelectorAll('a'); for (const link of links) { focusableElements.push(link); @@ -422,6 +425,7 @@ export class Dialog extends Disposable { } if (this.footerContainer) { + // eslint-disable-next-line no-restricted-syntax const links = this.footerContainer.querySelectorAll('a'); for (const link of links) { focusableElements.push(link); @@ -562,6 +566,7 @@ export class Dialog extends Disposable { this.element.style.border = border; if (linkFgColor) { + // eslint-disable-next-line no-restricted-syntax for (const el of [...this.messageContainer.getElementsByTagName('a'), ...this.footerContainer?.getElementsByTagName('a') ?? []]) { el.style.color = linkFgColor; } diff --git a/src/vs/base/browser/ui/iconLabel/iconLabel.ts b/src/vs/base/browser/ui/iconLabel/iconLabel.ts index 562b759ff10..56c15406f63 100644 --- a/src/vs/base/browser/ui/iconLabel/iconLabel.ts +++ b/src/vs/base/browser/ui/iconLabel/iconLabel.ts @@ -162,6 +162,7 @@ export class IconLabel extends Disposable { } } + // eslint-disable-next-line no-restricted-syntax const existingIconNode = this.domNode.element.querySelector('.monaco-icon-label-iconpath'); if (options?.iconPath) { let iconNode; diff --git a/src/vs/base/browser/ui/list/listWidget.ts b/src/vs/base/browser/ui/list/listWidget.ts index f4e96e204e2..c637ba43c88 100644 --- a/src/vs/base/browser/ui/list/listWidget.ts +++ b/src/vs/base/browser/ui/list/listWidget.ts @@ -631,6 +631,7 @@ class DOMFocusController implements IDisposable { return; } + // eslint-disable-next-line no-restricted-syntax const tabIndexElement = focusedDomElement.querySelector('[tabIndex]'); if (!tabIndexElement || !(isHTMLElement(tabIndexElement)) || tabIndexElement.tabIndex === -1) { diff --git a/src/vs/base/browser/ui/sash/sash.ts b/src/vs/base/browser/ui/sash/sash.ts index cc899c1c4f3..6f2fcb52276 100644 --- a/src/vs/base/browser/ui/sash/sash.ts +++ b/src/vs/base/browser/ui/sash/sash.ts @@ -511,6 +511,7 @@ export class Sash extends Disposable { return; } + // eslint-disable-next-line no-restricted-syntax const iframes = this.el.ownerDocument.getElementsByTagName('iframe'); for (const iframe of iframes) { iframe.classList.add(PointerEventsDisabledCssClass); // disable mouse events on iframes as long as we drag the sash diff --git a/src/vs/base/browser/ui/splitview/paneview.ts b/src/vs/base/browser/ui/splitview/paneview.ts index 42d2234a131..fb2e1f406ae 100644 --- a/src/vs/base/browser/ui/splitview/paneview.ts +++ b/src/vs/base/browser/ui/splitview/paneview.ts @@ -657,6 +657,7 @@ export class PaneView extends Disposable { } private getPaneHeaderElements(): HTMLElement[] { + // eslint-disable-next-line no-restricted-syntax return [...this.element.querySelectorAll('.pane-header')] as HTMLElement[]; } diff --git a/src/vs/base/test/browser/markdownRenderer.test.ts b/src/vs/base/test/browser/markdownRenderer.test.ts index cdfbe914fa9..5a02b84c7dc 100644 --- a/src/vs/base/test/browser/markdownRenderer.test.ts +++ b/src/vs/base/test/browser/markdownRenderer.test.ts @@ -3,6 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +/* eslint-disable no-restricted-syntax */ + import assert from 'assert'; import { fillInIncompleteTokens, renderMarkdown, renderAsPlaintext } from '../../browser/markdownRenderer.js'; import { IMarkdownString, MarkdownString } from '../../common/htmlContent.js'; diff --git a/src/vs/base/test/browser/ui/splitview/splitview.test.ts b/src/vs/base/test/browser/ui/splitview/splitview.test.ts index 76d7639b04c..e470e11a3f1 100644 --- a/src/vs/base/test/browser/ui/splitview/splitview.test.ts +++ b/src/vs/base/test/browser/ui/splitview/splitview.test.ts @@ -3,6 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +/* eslint-disable no-restricted-syntax */ + import assert from 'assert'; import { Sash, SashState } from '../../../../browser/ui/sash/sash.js'; import { IView, LayoutPriority, Sizing, SplitView } from '../../../../browser/ui/splitview/splitview.js'; diff --git a/src/vs/base/test/browser/ui/tree/asyncDataTree.test.ts b/src/vs/base/test/browser/ui/tree/asyncDataTree.test.ts index 4eb5e2b7e28..25840582aab 100644 --- a/src/vs/base/test/browser/ui/tree/asyncDataTree.test.ts +++ b/src/vs/base/test/browser/ui/tree/asyncDataTree.test.ts @@ -3,6 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +/* eslint-disable no-restricted-syntax */ + import assert from 'assert'; import { IIdentityProvider, IListVirtualDelegate } from '../../../../browser/ui/list/list.js'; import { AsyncDataTree, CompressibleAsyncDataTree, ITreeCompressionDelegate } from '../../../../browser/ui/tree/asyncDataTree.js'; diff --git a/src/vs/base/test/browser/ui/tree/objectTree.test.ts b/src/vs/base/test/browser/ui/tree/objectTree.test.ts index aa11fbe6036..b3813240e60 100644 --- a/src/vs/base/test/browser/ui/tree/objectTree.test.ts +++ b/src/vs/base/test/browser/ui/tree/objectTree.test.ts @@ -3,6 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +/* eslint-disable no-restricted-syntax */ + import assert from 'assert'; import { IIdentityProvider, IListVirtualDelegate } from '../../../../browser/ui/list/list.js'; import { ICompressedTreeNode } from '../../../../browser/ui/tree/compressedObjectTreeModel.js'; diff --git a/src/vs/editor/browser/widget/markdownRenderer/browser/editorMarkdownCodeBlockRenderer.ts b/src/vs/editor/browser/widget/markdownRenderer/browser/editorMarkdownCodeBlockRenderer.ts index 9ba8e0ceee4..2fa5e9c2993 100644 --- a/src/vs/editor/browser/widget/markdownRenderer/browser/editorMarkdownCodeBlockRenderer.ts +++ b/src/vs/editor/browser/widget/markdownRenderer/browser/editorMarkdownCodeBlockRenderer.ts @@ -52,6 +52,7 @@ export class EditorMarkdownCodeBlockRenderer implements IMarkdownCodeBlockRender const root = document.createElement('span'); root.innerHTML = content as string; + // eslint-disable-next-line no-restricted-syntax const codeElement = root.querySelector('.monaco-tokenized-source'); if (!isHTMLElement(codeElement)) { return document.createElement('span'); diff --git a/src/vs/editor/contrib/documentSymbols/browser/outlineModel.ts b/src/vs/editor/contrib/documentSymbols/browser/outlineModel.ts index b63525347fc..223c25d8306 100644 --- a/src/vs/editor/contrib/documentSymbols/browser/outlineModel.ts +++ b/src/vs/editor/contrib/documentSymbols/browser/outlineModel.ts @@ -66,6 +66,7 @@ export abstract class TreeElement { return undefined; } for (const [, child] of element.children) { + // eslint-disable-next-line no-restricted-syntax const candidate = TreeElement.getElementById(id, child); if (candidate) { return candidate; @@ -333,6 +334,7 @@ export class OutlineModel extends TreeElement { } getItemById(id: string): TreeElement | undefined { + // eslint-disable-next-line no-restricted-syntax return TreeElement.getElementById(id, this); } diff --git a/src/vs/editor/contrib/find/browser/findWidget.ts b/src/vs/editor/contrib/find/browser/findWidget.ts index b7e7f878a91..b6724abfa60 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.ts +++ b/src/vs/editor/contrib/find/browser/findWidget.ts @@ -851,10 +851,12 @@ export class FindWidget extends Widget implements IOverlayWidget, IVerticalSashL } if (e.equals(KeyCode.UpArrow)) { + // eslint-disable-next-line no-restricted-syntax return stopPropagationForMultiLineUpwards(e, this._findInput.getValue(), this._findInput.domNode.querySelector('textarea')); } if (e.equals(KeyCode.DownArrow)) { + // eslint-disable-next-line no-restricted-syntax return stopPropagationForMultiLineDownwards(e, this._findInput.getValue(), this._findInput.domNode.querySelector('textarea')); } } @@ -891,10 +893,12 @@ export class FindWidget extends Widget implements IOverlayWidget, IVerticalSashL } if (e.equals(KeyCode.UpArrow)) { + // eslint-disable-next-line no-restricted-syntax return stopPropagationForMultiLineUpwards(e, this._replaceInput.inputBox.value, this._replaceInput.inputBox.element.querySelector('textarea')); } if (e.equals(KeyCode.DownArrow)) { + // eslint-disable-next-line no-restricted-syntax return stopPropagationForMultiLineDownwards(e, this._replaceInput.inputBox.value, this._replaceInput.inputBox.element.querySelector('textarea')); } } diff --git a/src/vs/editor/contrib/hover/browser/contentHoverWidget.ts b/src/vs/editor/contrib/hover/browser/contentHoverWidget.ts index 526651513c4..c5226cb273f 100644 --- a/src/vs/editor/contrib/hover/browser/contentHoverWidget.ts +++ b/src/vs/editor/contrib/hover/browser/contentHoverWidget.ts @@ -287,6 +287,7 @@ export class ContentHoverWidget extends ResizableContentWidget { const contentsDomNode = this._hover.contentsDomNode; contentsDomNode.style.fontSize = `${fontSize}px`; contentsDomNode.style.lineHeight = `${lineHeight / fontSize}`; + // eslint-disable-next-line no-restricted-syntax const codeClasses: HTMLElement[] = Array.prototype.slice.call(this._hover.contentsDomNode.getElementsByClassName('code')); codeClasses.forEach(node => this._editor.applyFontInfo(node)); } diff --git a/src/vs/editor/contrib/hover/browser/glyphHoverWidget.ts b/src/vs/editor/contrib/hover/browser/glyphHoverWidget.ts index 486573a133d..1c741fc3b8b 100644 --- a/src/vs/editor/contrib/hover/browser/glyphHoverWidget.ts +++ b/src/vs/editor/contrib/hover/browser/glyphHoverWidget.ts @@ -79,6 +79,7 @@ export class GlyphHoverWidget extends Disposable implements IOverlayWidget, IHov } private _updateFont(): void { + // eslint-disable-next-line no-restricted-syntax const codeClasses: HTMLElement[] = Array.prototype.slice.call(this._hover.contentsDomNode.getElementsByClassName('code')); codeClasses.forEach(node => this._editor.applyFontInfo(node)); } diff --git a/src/vs/editor/contrib/hover/test/browser/hoverCopyButton.test.ts b/src/vs/editor/contrib/hover/test/browser/hoverCopyButton.test.ts index ceecd7d6adc..4b7495ca9a8 100644 --- a/src/vs/editor/contrib/hover/test/browser/hoverCopyButton.test.ts +++ b/src/vs/editor/contrib/hover/test/browser/hoverCopyButton.test.ts @@ -3,6 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +/* eslint-disable no-restricted-syntax */ + import assert from 'assert'; import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js'; import { DisposableStore } from '../../../../../base/common/lifecycle.js'; diff --git a/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts b/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts index a85c301ae19..15af4b01e4d 100644 --- a/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts +++ b/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts @@ -356,6 +356,7 @@ export class ParameterHintsWidget extends Disposable implements IContentWidget { const height = Math.max(this.editor.getLayoutInfo().height / 4, 250); const maxHeight = `${height}px`; this.domNodes.element.style.maxHeight = maxHeight; + // eslint-disable-next-line no-restricted-syntax const wrapper = this.domNodes.element.getElementsByClassName('phwrapper') as HTMLCollectionOf; if (wrapper.length) { wrapper[0].style.maxHeight = maxHeight; diff --git a/src/vs/editor/test/browser/controller/imeRecorder.ts b/src/vs/editor/test/browser/controller/imeRecorder.ts index 4b22ced5131..95bd1c5fd7c 100644 --- a/src/vs/editor/test/browser/controller/imeRecorder.ts +++ b/src/vs/editor/test/browser/controller/imeRecorder.ts @@ -12,7 +12,9 @@ import { TextAreaWrapper } from '../../../browser/controller/editContext/textAre (() => { + // eslint-disable-next-line no-restricted-syntax const startButton = mainWindow.document.getElementById('startRecording')!; + // eslint-disable-next-line no-restricted-syntax const endButton = mainWindow.document.getElementById('endRecording')!; let inputarea: HTMLTextAreaElement; diff --git a/src/vs/platform/actionWidget/browser/actionList.ts b/src/vs/platform/actionWidget/browser/actionList.ts index f89a4e7db1b..7d48eaa295e 100644 --- a/src/vs/platform/actionWidget/browser/actionList.ts +++ b/src/vs/platform/actionWidget/browser/actionList.ts @@ -331,6 +331,7 @@ export class ActionList extends Disposable { } else { // For finding width dynamically (not using resize observer) const itemWidths: number[] = this._allMenuItems.map((_, index): number => { + // eslint-disable-next-line no-restricted-syntax const element = this.domNode.ownerDocument.getElementById(this._list.getElementID(index)); if (element) { element.style.width = 'auto'; diff --git a/src/vs/platform/quickinput/browser/quickInputList.ts b/src/vs/platform/quickinput/browser/quickInputList.ts index 373e32f3f26..98722edf566 100644 --- a/src/vs/platform/quickinput/browser/quickInputList.ts +++ b/src/vs/platform/quickinput/browser/quickInputList.ts @@ -1130,6 +1130,7 @@ export class QuickInputList extends Disposable { // https://github.com/microsoft/vscode/issues/211976 if (this.accessibilityService.isScreenReaderOptimized()) { setTimeout(() => { + // eslint-disable-next-line no-restricted-syntax const focusedElement = this._tree.getHTMLElement().querySelector(`.monaco-list-row.focused`); const parent = focusedElement?.parentNode; if (focusedElement && parent) { diff --git a/src/vs/workbench/browser/actions/listCommands.ts b/src/vs/workbench/browser/actions/listCommands.ts index 369b370fd9b..9f7594a22c2 100644 --- a/src/vs/workbench/browser/actions/listCommands.ts +++ b/src/vs/workbench/browser/actions/listCommands.ts @@ -716,8 +716,11 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ // As the tree does not know anything about the rendered DOM elements // we have to traverse the dom to find the HTMLElements const treeDOM = lastFocusedList.getHTMLElement(); + // eslint-disable-next-line no-restricted-syntax const scrollableElement = treeDOM.querySelector('.monaco-scrollable-element'); + // eslint-disable-next-line no-restricted-syntax const listRows = scrollableElement?.querySelector('.monaco-list-rows'); + // eslint-disable-next-line no-restricted-syntax const focusedElement = listRows?.querySelector('.focused'); if (!focusedElement) { return; @@ -738,6 +741,7 @@ function getCustomHoverForElement(element: HTMLElement): HTMLElement | undefined // Only consider children that are not action items or have a tabindex // as these element are focusable and the user is able to trigger them already + // eslint-disable-next-line no-restricted-syntax const noneFocusableElementWithHover = element.querySelector('[custom-hover="true"]:not([tabindex]):not(.action-item)'); if (noneFocusableElementWithHover) { return noneFocusableElementWithHover as HTMLElement; diff --git a/src/vs/workbench/browser/layout.ts b/src/vs/workbench/browser/layout.ts index b417167da33..c517d4fbd29 100644 --- a/src/vs/workbench/browser/layout.ts +++ b/src/vs/workbench/browser/layout.ts @@ -199,6 +199,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi if (targetDocument === this.mainContainer.ownerDocument) { return this.mainContainer; // main window } else { + // eslint-disable-next-line no-restricted-syntax return targetDocument.body.getElementsByClassName('monaco-workbench')[0] as HTMLElement; // auxiliary window } } diff --git a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts index 690f6528c86..743f9e6ee8b 100644 --- a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts +++ b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts @@ -874,6 +874,7 @@ export class BrowserTitlebarPart extends Part implements ITitlebarPart { if (this.customMenubar.value) { this.customMenubar.value.toggleFocus(); } else { + // eslint-disable-next-line no-restricted-syntax (this.element.querySelector('[tabindex]:not([tabindex="-1"])') as HTMLElement | null)?.focus(); } } diff --git a/src/vs/workbench/browser/parts/views/treeView.ts b/src/vs/workbench/browser/parts/views/treeView.ts index 5507f19ac6e..492b76f975d 100644 --- a/src/vs/workbench/browser/parts/views/treeView.ts +++ b/src/vs/workbench/browser/parts/views/treeView.ts @@ -999,6 +999,7 @@ abstract class AbstractTreeView extends Disposable implements ITreeView { getOptimalWidth(): number { if (this.tree) { const parentNode = this.tree.getHTMLElement(); + // eslint-disable-next-line no-restricted-syntax const childNodes = ([] as HTMLElement[]).slice.call(parentNode.querySelectorAll('.outline-item-label > a')); return DOM.getLargestChildWidth(parentNode, childNodes); } diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityActions.ts index f9120bc1a9b..e57dee9ddcc 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityActions.ts @@ -52,6 +52,7 @@ class AnnounceChatConfirmationAction extends Action2 { const lastResponse = viewModel.getItems()[viewModel.getItems().length - 1]; if (isResponseVM(lastResponse)) { + // eslint-disable-next-line no-restricted-syntax const confirmationWidgets = lastFocusedWidget.domNode.querySelectorAll('.chat-confirmation-widget-container'); if (confirmationWidgets.length > 0) { firstConfirmationElement = confirmationWidgets[0] as HTMLElement; diff --git a/src/vs/workbench/contrib/chat/browser/actions/chatCopyActions.ts b/src/vs/workbench/contrib/chat/browser/actions/chatCopyActions.ts index 70d7f9f0537..15e4fd5e780 100644 --- a/src/vs/workbench/contrib/chat/browser/actions/chatCopyActions.ts +++ b/src/vs/workbench/contrib/chat/browser/actions/chatCopyActions.ts @@ -134,11 +134,13 @@ export function registerChatCopyActions() { // Otherwise, fallback to querying from the active element if (!selectedElement) { + // eslint-disable-next-line no-restricted-syntax selectedElement = activeElement?.querySelector('.katex') ?? null; } // Extract the LaTeX source from the annotation element const katexElement = dom.isHTMLElement(selectedElement) ? selectedElement.closest('.katex') : null; + // eslint-disable-next-line no-restricted-syntax const annotation = katexElement?.querySelector('annotation[encoding="application/x-tex"]'); if (annotation) { const latexSource = annotation.textContent || ''; diff --git a/src/vs/workbench/contrib/chat/browser/chatAttachmentWidgets.ts b/src/vs/workbench/contrib/chat/browser/chatAttachmentWidgets.ts index 50f58c6790c..67387b835a2 100644 --- a/src/vs/workbench/contrib/chat/browser/chatAttachmentWidgets.ts +++ b/src/vs/workbench/contrib/chat/browser/chatAttachmentWidgets.ts @@ -467,6 +467,7 @@ function createImageElements(resource: URI | undefined, name: string, fullName: const pillImg = dom.$('img.chat-attached-context-pill-image', { src: url, alt: '' }); const pill = dom.$('div.chat-attached-context-pill', {}, pillImg); + // eslint-disable-next-line no-restricted-syntax const existingPill = element.querySelector('.chat-attached-context-pill'); if (existingPill) { existingPill.replaceWith(pill); @@ -488,6 +489,7 @@ function createImageElements(resource: URI | undefined, name: string, fullName: // reset to original icon on error or invalid image const pillIcon = dom.$('div.chat-attached-context-pill', {}, dom.$('span.codicon.codicon-file-media')); const pill = dom.$('div.chat-attached-context-pill', {}, pillIcon); + // eslint-disable-next-line no-restricted-syntax const existingPill = element.querySelector('.chat-attached-context-pill'); if (existingPill) { existingPill.replaceWith(pill); diff --git a/src/vs/workbench/contrib/chat/browser/chatContentMarkdownRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatContentMarkdownRenderer.ts index 35a73bf0c03..6855178fa58 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentMarkdownRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentMarkdownRenderer.ts @@ -108,6 +108,7 @@ export class ChatContentMarkdownRenderer implements IMarkdownRenderer { private attachCustomHover(result: IRenderedMarkdown): IRenderedMarkdown { const store = new DisposableStore(); + // eslint-disable-next-line no-restricted-syntax result.element.querySelectorAll('a').forEach((element) => { if (element.title) { const title = element.title; diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatAttachmentsContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatAttachmentsContentPart.ts index 4e750be61a0..b7972a34222 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatAttachmentsContentPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatAttachmentsContentPart.ts @@ -166,6 +166,7 @@ export class ChatAttachmentsContentPart extends Disposable { if (isAttachmentPartialOrOmitted) { ariaLabel = `${ariaLabel}${description ? ` ${description}` : ''}`; for (const selector of ['.monaco-icon-suffix-container', '.monaco-icon-name-container']) { + // eslint-disable-next-line no-restricted-syntax const element = widget.label.element.querySelector(selector); if (element) { element.classList.add('warning'); diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatChangesSummaryPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatChangesSummaryPart.ts index 7b25ea957d9..b069c2c9ef1 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatChangesSummaryPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatChangesSummaryPart.ts @@ -339,6 +339,7 @@ class CollapsibleChangesSummaryListRenderer implements IListRenderer !a.getAttribute('data-href')?.startsWith('command:')); if (!startLink) { // Should not happen diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatMultiDiffContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatMultiDiffContentPart.ts index 7bbf6a6f64d..be4a86a76aa 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatMultiDiffContentPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatMultiDiffContentPart.ts @@ -293,6 +293,7 @@ class ChatMultiDiffListRenderer implements IListRenderer { // Empty link text -> render file widget diff --git a/src/vs/workbench/contrib/chat/browser/chatInputPart.ts b/src/vs/workbench/contrib/chat/browser/chatInputPart.ts index c9bc2fa9a0e..5e41a01920e 100644 --- a/src/vs/workbench/contrib/chat/browser/chatInputPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatInputPart.ts @@ -1467,6 +1467,7 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge this._register(this.inputActionsToolbar.onDidChangeMenuItems(() => { // Update container reference for the pickers const toolbarElement = this.inputActionsToolbar.getElement(); + // eslint-disable-next-line no-restricted-syntax const container = toolbarElement.querySelector('.chat-sessionPicker-container'); this.chatSessionPickerContainer = container as HTMLElement | undefined; @@ -1755,11 +1756,13 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge return; } + // eslint-disable-next-line no-restricted-syntax const toolbar = this.addFilesToolbar?.getElement().querySelector('.action-label'); if (!toolbar) { return; } + // eslint-disable-next-line no-restricted-syntax const attachments = Array.from(this.attachedContextContainer.querySelectorAll('.chat-attached-context-attachment')); if (!attachments.length) { return; @@ -1889,15 +1892,19 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge listEntries: IObservable, ) { // Summary of number of files changed + // eslint-disable-next-line no-restricted-syntax const innerContainer = this.chatEditingSessionWidgetContainer.querySelector('.chat-editing-session-container.show-file-icons') as HTMLElement ?? dom.append(this.chatEditingSessionWidgetContainer, $('.chat-editing-session-container.show-file-icons')); + // eslint-disable-next-line no-restricted-syntax const overviewRegion = innerContainer.querySelector('.chat-editing-session-overview') as HTMLElement ?? dom.append(innerContainer, $('.chat-editing-session-overview')); + // eslint-disable-next-line no-restricted-syntax const overviewTitle = overviewRegion.querySelector('.working-set-title') as HTMLElement ?? dom.append(overviewRegion, $('.working-set-title')); // Clear out the previous actions (if any) this._chatEditsActionsDisposables.clear(); // Chat editing session actions + // eslint-disable-next-line no-restricted-syntax const actionsContainer = overviewRegion.querySelector('.chat-editing-session-actions') as HTMLElement ?? dom.append(overviewRegion, $('.chat-editing-session-actions')); this._chatEditsActionsDisposables.add(this.instantiationService.createInstance(MenuWorkbenchButtonBar, actionsContainer, MenuId.ChatEditingWidgetToolbar, { @@ -1918,6 +1925,7 @@ export class ChatInputPart extends Disposable implements IHistoryNavigationWidge } // Working set + // eslint-disable-next-line no-restricted-syntax const workingSetContainer = innerContainer.querySelector('.chat-editing-session-list') as HTMLElement ?? dom.append(innerContainer, $('.chat-editing-session-list')); const button = this._chatEditsActionsDisposables.add(new ButtonWithIcon(overviewTitle, { diff --git a/src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts index 965d5e13262..7683012be95 100644 --- a/src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatMarkdownDecorationsRenderer.ts @@ -123,6 +123,7 @@ export class ChatMarkdownDecorationsRenderer { walkTreeAndAnnotateReferenceLinks(content: IChatMarkdownContent, element: HTMLElement): IDisposable { const store = new DisposableStore(); + // eslint-disable-next-line no-restricted-syntax element.querySelectorAll('a').forEach(a => { const href = a.getAttribute('data-href'); if (href) { diff --git a/src/vs/workbench/contrib/chat/browser/chatSessions/view/sessionsTreeRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatSessions/view/sessionsTreeRenderer.ts index 4eb953e0755..7fc8b3409a7 100644 --- a/src/vs/workbench/contrib/chat/browser/chatSessions/view/sessionsTreeRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatSessions/view/sessionsTreeRenderer.ts @@ -374,12 +374,14 @@ export class SessionsRenderer extends Disposable implements ITreeRenderer private getRenderedComment(commentBody: IMarkdownString) { const renderedComment = renderMarkdown(commentBody, {}, document.createElement('span')); + // eslint-disable-next-line no-restricted-syntax const images = renderedComment.element.getElementsByTagName('img'); for (let i = 0; i < images.length; i++) { const image = images[i]; @@ -252,6 +253,7 @@ export class CommentNodeRenderer implements IListRenderer textDescription.textContent = image.alt ? nls.localize('imageWithLabel', "Image: {0}", image.alt) : nls.localize('image', "Image"); image.replaceWith(textDescription); } + // eslint-disable-next-line no-restricted-syntax const headings = [...renderedComment.element.getElementsByTagName('h1'), ...renderedComment.element.getElementsByTagName('h2'), ...renderedComment.element.getElementsByTagName('h3'), ...renderedComment.element.getElementsByTagName('h4'), ...renderedComment.element.getElementsByTagName('h5'), ...renderedComment.element.getElementsByTagName('h6')]; for (const heading of headings) { const textNode = document.createTextNode(heading.textContent || ''); diff --git a/src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts b/src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts index d5eab305fdc..cfaa1ab3f83 100644 --- a/src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts @@ -3,6 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +/* eslint-disable no-restricted-syntax */ + import assert from 'assert'; import * as dom from '../../../../../base/browser/dom.js'; import { HighlightedLabel } from '../../../../../base/browser/ui/highlightedlabel/highlightedLabel.js'; diff --git a/src/vs/workbench/contrib/files/browser/views/explorerView.ts b/src/vs/workbench/contrib/files/browser/views/explorerView.ts index 98bb86cdefe..bef572b125a 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerView.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerView.ts @@ -278,6 +278,7 @@ export class ExplorerView extends ViewPane implements IExplorerView { // Expand on drag over this.dragHandler = new DelayedDragHandler(container, () => this.setExpanded(true)); + // eslint-disable-next-line no-restricted-syntax const titleElement = container.querySelector('.title') as HTMLElement; const setHeader = () => { titleElement.textContent = this.name; @@ -715,6 +716,7 @@ export class ExplorerView extends ViewPane implements IExplorerView { override getOptimalWidth(): number { const parentNode = this.tree.getHTMLElement(); + // eslint-disable-next-line no-restricted-syntax const childNodes = ([] as HTMLElement[]).slice.call(parentNode.querySelectorAll('.explorer-item .label-name')); // select all file labels return DOM.getLargestChildWidth(parentNode, childNodes); diff --git a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts index 0f66cb538ac..cdd6404a505 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts @@ -752,6 +752,7 @@ export class CompressedNavigationController implements ICompressedNavigationCont } private updateLabels(templateData: IFileTemplateData): void { + // eslint-disable-next-line no-restricted-syntax this._labels = Array.from(templateData.container.querySelectorAll('.label-name')); let parents = ''; for (let i = 0; i < this.labels.length; i++) { @@ -1009,6 +1010,7 @@ export class FilesRenderer implements ICompressibleTreeRenderer a')); return dom.getLargestChildWidth(parentNode, childNodes); diff --git a/src/vs/workbench/contrib/issue/browser/baseIssueReporterService.ts b/src/vs/workbench/contrib/issue/browser/baseIssueReporterService.ts index ca6f65cbadb..d7d14153f59 100644 --- a/src/vs/workbench/contrib/issue/browser/baseIssueReporterService.ts +++ b/src/vs/workbench/contrib/issue/browser/baseIssueReporterService.ts @@ -150,6 +150,7 @@ export class BaseIssueReporterService extends Disposable { const issueTitle = data.issueTitle; if (issueTitle) { + // eslint-disable-next-line no-restricted-syntax const issueTitleElement = this.getElementById('issue-title'); if (issueTitleElement) { issueTitleElement.value = issueTitle; @@ -158,6 +159,7 @@ export class BaseIssueReporterService extends Disposable { const issueBody = data.issueBody; if (issueBody) { + // eslint-disable-next-line no-restricted-syntax const description = this.getElementById('description'); if (description) { description.value = issueBody; @@ -166,6 +168,7 @@ export class BaseIssueReporterService extends Disposable { } if (this.window.document.documentElement.lang !== 'en') { + // eslint-disable-next-line no-restricted-syntax show(this.getElementById('english')); } @@ -190,6 +193,7 @@ export class BaseIssueReporterService extends Disposable { } // initialize the reporting button(s) + // eslint-disable-next-line no-restricted-syntax const issueReporterElement = this.getElementById('issue-reporter'); if (issueReporterElement) { this.updateButtonStates(); @@ -203,15 +207,18 @@ export class BaseIssueReporterService extends Disposable { setInitialFocus() { const { fileOnExtension } = this.issueReporterModel.getData(); if (fileOnExtension) { + // eslint-disable-next-line no-restricted-syntax const issueTitle = this.window.document.getElementById('issue-title'); issueTitle?.focus(); } else { + // eslint-disable-next-line no-restricted-syntax const issueType = this.window.document.getElementById('issue-type'); issueType?.focus(); } } public updateButtonStates() { + // eslint-disable-next-line no-restricted-syntax const issueReporterElement = this.getElementById('issue-reporter'); if (!issueReporterElement) { // shouldn't occur -- throw? @@ -220,6 +227,7 @@ export class BaseIssueReporterService extends Disposable { // public elements section + // eslint-disable-next-line no-restricted-syntax let publicElements = this.getElementById('public-elements'); if (!publicElements) { publicElements = document.createElement('div'); @@ -232,6 +240,7 @@ export class BaseIssueReporterService extends Disposable { // private filing section + // eslint-disable-next-line no-restricted-syntax let internalElements = this.getElementById('internal-elements'); if (!internalElements) { internalElements = document.createElement('div'); @@ -240,6 +249,7 @@ export class BaseIssueReporterService extends Disposable { internalElements.classList.add('hidden'); issueReporterElement.appendChild(internalElements); } + // eslint-disable-next-line no-restricted-syntax let filingRow = this.getElementById('internal-top-row'); if (!filingRow) { filingRow = document.createElement('div'); @@ -253,6 +263,7 @@ export class BaseIssueReporterService extends Disposable { } private updateInternalFilingNote(container: HTMLElement) { + // eslint-disable-next-line no-restricted-syntax let filingNote = this.getElementById('internal-preview-message'); if (!filingNote) { filingNote = document.createElement('span'); @@ -265,6 +276,7 @@ export class BaseIssueReporterService extends Disposable { } private updatePublicGithubButton(container: HTMLElement): void { + // eslint-disable-next-line no-restricted-syntax const issueReporterElement = this.getElementById('issue-reporter'); if (!issueReporterElement) { return; @@ -309,6 +321,7 @@ export class BaseIssueReporterService extends Disposable { } // make sure that the repo link is after the button + // eslint-disable-next-line no-restricted-syntax const repoLink = this.getElementById('show-repo-name'); if (repoLink) { container.insertBefore(this.publicGithubButton.element, repoLink); @@ -316,6 +329,7 @@ export class BaseIssueReporterService extends Disposable { } private updatePublicRepoLink(container: HTMLElement): void { + // eslint-disable-next-line no-restricted-syntax let issueRepoName = this.getElementById('show-repo-name') as HTMLAnchorElement; if (!issueRepoName) { issueRepoName = document.createElement('a'); @@ -350,6 +364,7 @@ export class BaseIssueReporterService extends Disposable { } private updateInternalGithubButton(container: HTMLElement): void { + // eslint-disable-next-line no-restricted-syntax const issueReporterElement = this.getElementById('issue-reporter'); if (!issueReporterElement) { return; @@ -375,6 +390,7 @@ export class BaseIssueReporterService extends Disposable { } private updateInternalElementsVisibility(): void { + // eslint-disable-next-line no-restricted-syntax const container = this.getElementById('internal-elements'); if (!container) { // shouldn't happen @@ -414,6 +430,7 @@ export class BaseIssueReporterService extends Disposable { this.issueReporterModel.update({ numberOfThemeExtesions, enabledNonThemeExtesions: nonThemes, allExtensions: installedExtensions }); this.updateExtensionTable(nonThemes ?? [], numberOfThemeExtesions); if (this.disableExtensions || installedExtensions.length === 0) { + // eslint-disable-next-line no-restricted-syntax (this.getElementById('disableExtensions')).disabled = true; } @@ -456,6 +473,7 @@ export class BaseIssueReporterService extends Disposable { }, extension.name); }; + // eslint-disable-next-line no-restricted-syntax const extensionsSelector = this.getElementById('extension-selector'); if (extensionsSelector) { const { selectedExtension } = this.issueReporterModel.getData(); @@ -539,6 +557,7 @@ export class BaseIssueReporterService extends Disposable { } private updateAcknowledgementState() { + // eslint-disable-next-line no-restricted-syntax const acknowledgementCheckbox = this.getElementById('includeAcknowledgement'); if (acknowledgementCheckbox) { this.acknowledged = acknowledgementCheckbox.checked; @@ -559,6 +578,7 @@ export class BaseIssueReporterService extends Disposable { this.updateAcknowledgementState(); }); + // eslint-disable-next-line no-restricted-syntax const showInfoElements = this.window.document.getElementsByClassName('showInfo'); for (let i = 0; i < showInfoElements.length; i++) { const showInfo = showInfoElements.item(i)!; @@ -581,6 +601,7 @@ export class BaseIssueReporterService extends Disposable { this.addEventListener('issue-source', 'change', (e: Event) => { const value = (e.target).value; + // eslint-disable-next-line no-restricted-syntax const problemSourceHelpText = this.getElementById('problem-source-help-text')!; if (value === '') { this.issueReporterModel.update({ fileOnExtension: undefined }); @@ -592,6 +613,7 @@ export class BaseIssueReporterService extends Disposable { hide(problemSourceHelpText); } + // eslint-disable-next-line no-restricted-syntax const descriptionTextArea = this.getElementById('issue-title'); if (value === IssueSource.VSCode) { descriptionTextArea.placeholder = localize('vscodePlaceholder', "E.g Workbench is missing problems panel"); @@ -615,6 +637,7 @@ export class BaseIssueReporterService extends Disposable { this.issueReporterModel.update({ fileOnExtension, fileOnMarketplace, fileOnProduct }); this.render(); + // eslint-disable-next-line no-restricted-syntax const title = (this.getElementById('issue-title')).value; this.searchIssues(title, fileOnExtension, fileOnMarketplace); }); @@ -625,12 +648,14 @@ export class BaseIssueReporterService extends Disposable { // Only search for extension issues on title change if (this.issueReporterModel.fileOnExtension() === false) { + // eslint-disable-next-line no-restricted-syntax const title = (this.getElementById('issue-title')).value; this.searchVSCodeIssues(title, issueDescription); } }); this.addEventListener('issue-title', 'input', _ => { + // eslint-disable-next-line no-restricted-syntax const titleElement = this.getElementById('issue-title') as HTMLInputElement; if (titleElement) { const title = titleElement.value; @@ -640,6 +665,7 @@ export class BaseIssueReporterService extends Disposable { this.addEventListener('issue-title', 'input', (e: Event) => { const title = (e.target).value; + // eslint-disable-next-line no-restricted-syntax const lengthValidationMessage = this.getElementById('issue-title-length-validation-error'); const issueUrl = this.getIssueUrl(); if (title && this.getIssueUrlWithTitle(title, issueUrl).length > MAX_URL_LENGTH) { @@ -647,6 +673,7 @@ export class BaseIssueReporterService extends Disposable { } else { hide(lengthValidationMessage); } + // eslint-disable-next-line no-restricted-syntax const issueSource = this.getElementById('issue-source'); if (!issueSource || issueSource.value === '') { return; @@ -690,6 +717,7 @@ export class BaseIssueReporterService extends Disposable { e.stopPropagation(); e.preventDefault(); + // eslint-disable-next-line no-restricted-syntax const issueTitle = (this.getElementById('issue-title'))!.value; const { issueDescription } = this.issueReporterModel.getData(); if (!this.hasBeenSubmitted && (issueTitle || issueDescription)) { @@ -823,6 +851,7 @@ export class BaseIssueReporterService extends Disposable { } public clearSearchResults(): void { + // eslint-disable-next-line no-restricted-syntax const similarIssues = this.getElementById('similar-issues')!; similarIssues.innerText = ''; this.numberOfSearchResultsDisplayed = 0; @@ -831,6 +860,7 @@ export class BaseIssueReporterService extends Disposable { @debounce(300) private searchGitHub(repo: string, title: string): void { const query = `is:issue+repo:${repo}+${title}`; + // eslint-disable-next-line no-restricted-syntax const similarIssues = this.getElementById('similar-issues')!; fetch(`https://api.github.com/search/issues?q=${query}`).then((response) => { @@ -879,6 +909,7 @@ export class BaseIssueReporterService extends Disposable { } private displaySearchResults(results: SearchResult[]) { + // eslint-disable-next-line no-restricted-syntax const similarIssues = this.getElementById('similar-issues')!; if (results.length) { const issues = $('div.issues-container'); @@ -925,6 +956,7 @@ export class BaseIssueReporterService extends Disposable { private setUpTypes(): void { const makeOption = (issueType: IssueType, description: string) => $('option', { 'value': issueType.valueOf() }, escape(description)); + // eslint-disable-next-line no-restricted-syntax const typeSelect = this.getElementById('issue-type')! as HTMLSelectElement; const { issueType } = this.issueReporterModel.getData(); reset(typeSelect, @@ -948,6 +980,7 @@ export class BaseIssueReporterService extends Disposable { } public setSourceOptions(): void { + // eslint-disable-next-line no-restricted-syntax const sourceSelect = this.getElementById('issue-source')! as HTMLSelectElement; const { issueType, fileOnExtension, selectedExtension, fileOnMarketplace, fileOnProduct } = this.issueReporterModel.getData(); let selected = sourceSelect.selectedIndex; @@ -979,6 +1012,7 @@ export class BaseIssueReporterService extends Disposable { sourceSelect.selectedIndex = selected; } else { sourceSelect.selectedIndex = 0; + // eslint-disable-next-line no-restricted-syntax hide(this.getElementById('problem-source-help-text')); } } @@ -986,22 +1020,37 @@ export class BaseIssueReporterService extends Disposable { public async renderBlocks(): Promise { // Depending on Issue Type, we render different blocks and text const { issueType, fileOnExtension, fileOnMarketplace, selectedExtension } = this.issueReporterModel.getData(); + // eslint-disable-next-line no-restricted-syntax const blockContainer = this.getElementById('block-container'); + // eslint-disable-next-line no-restricted-syntax const systemBlock = this.window.document.querySelector('.block-system'); + // eslint-disable-next-line no-restricted-syntax const processBlock = this.window.document.querySelector('.block-process'); + // eslint-disable-next-line no-restricted-syntax const workspaceBlock = this.window.document.querySelector('.block-workspace'); + // eslint-disable-next-line no-restricted-syntax const extensionsBlock = this.window.document.querySelector('.block-extensions'); + // eslint-disable-next-line no-restricted-syntax const experimentsBlock = this.window.document.querySelector('.block-experiments'); + // eslint-disable-next-line no-restricted-syntax const extensionDataBlock = this.window.document.querySelector('.block-extension-data'); + // eslint-disable-next-line no-restricted-syntax const problemSource = this.getElementById('problem-source')!; + // eslint-disable-next-line no-restricted-syntax const descriptionTitle = this.getElementById('issue-description-label')!; + // eslint-disable-next-line no-restricted-syntax const descriptionSubtitle = this.getElementById('issue-description-subtitle')!; + // eslint-disable-next-line no-restricted-syntax const extensionSelector = this.getElementById('extension-selection')!; + // eslint-disable-next-line no-restricted-syntax const downloadExtensionDataLink = this.getElementById('extension-data-download')!; + // eslint-disable-next-line no-restricted-syntax const titleTextArea = this.getElementById('issue-title-container')!; + // eslint-disable-next-line no-restricted-syntax const descriptionTextArea = this.getElementById('description')!; + // eslint-disable-next-line no-restricted-syntax const extensionDataTextArea = this.getElementById('extension-data')!; // Hide all by default @@ -1114,8 +1163,11 @@ export class BaseIssueReporterService extends Disposable { } public validateInput(inputId: string): boolean { + // eslint-disable-next-line no-restricted-syntax const inputElement = (this.getElementById(inputId)); + // eslint-disable-next-line no-restricted-syntax const inputValidationMessage = this.getElementById(`${inputId}-empty-error`); + // eslint-disable-next-line no-restricted-syntax const descriptionShortMessage = this.getElementById(`description-short-error`); if (inputId === 'description' && this.nonGitHubIssueUrl && this.data.extensionId) { return true; @@ -1192,6 +1244,7 @@ export class BaseIssueReporterService extends Disposable { if (!this.validateInputs()) { // If inputs are invalid, set focus to the first one and add listeners on them // to detect further changes + // eslint-disable-next-line no-restricted-syntax const invalidInput = this.window.document.getElementsByClassName('invalid-input'); if (invalidInput.length) { (invalidInput[0]).focus(); @@ -1220,6 +1273,7 @@ export class BaseIssueReporterService extends Disposable { this.hasBeenSubmitted = true; + // eslint-disable-next-line no-restricted-syntax const issueTitle = (this.getElementById('issue-title')).value; const issueBody = this.issueReporterModel.serialize(); @@ -1238,6 +1292,7 @@ export class BaseIssueReporterService extends Disposable { return this.submitToGitHub(issueTitle, issueBody, gitHubDetails); } + // eslint-disable-next-line no-restricted-syntax const baseUrl = this.getIssueUrlWithTitle((this.getElementById('issue-title')).value, issueUrl); let url = baseUrl + `&body=${encodeURIComponent(issueBody)}`; @@ -1358,6 +1413,7 @@ export class BaseIssueReporterService extends Disposable { // uses this.configuuration.data to ensure that data is coming from `openReporter` command. const template = this.data.issueBody; if (template) { + // eslint-disable-next-line no-restricted-syntax const descriptionTextArea = this.getElementById('description')!; const descriptionText = (descriptionTextArea as HTMLTextAreaElement).value; if (descriptionText === '' || !descriptionText.includes(template.toString())) { @@ -1371,6 +1427,7 @@ export class BaseIssueReporterService extends Disposable { if (data) { this.issueReporterModel.update({ extensionData: data }); extension.data = data; + // eslint-disable-next-line no-restricted-syntax const extensionDataBlock = this.window.document.querySelector('.block-extension-data')!; show(extensionDataBlock); this.renderBlocks(); @@ -1383,6 +1440,7 @@ export class BaseIssueReporterService extends Disposable { } this.validateSelectedExtension(); + // eslint-disable-next-line no-restricted-syntax const title = (this.getElementById('issue-title')).value; this.searchExtensionIssues(title); @@ -1391,7 +1449,9 @@ export class BaseIssueReporterService extends Disposable { } public validateSelectedExtension(): void { + // eslint-disable-next-line no-restricted-syntax const extensionValidationMessage = this.getElementById('extension-selection-validation-error')!; + // eslint-disable-next-line no-restricted-syntax const extensionValidationNoUrlsMessage = this.getElementById('extension-selection-validation-error-no-url')!; hide(extensionValidationMessage); hide(extensionValidationNoUrlsMessage); @@ -1421,12 +1481,15 @@ export class BaseIssueReporterService extends Disposable { this.loadingExtensionData = true; this.updateButtonStates(); + // eslint-disable-next-line no-restricted-syntax const extensionDataCaption = this.getElementById('extension-id')!; hide(extensionDataCaption); + // eslint-disable-next-line no-restricted-syntax const extensionDataCaption2 = Array.from(this.window.document.querySelectorAll('.ext-parens')); extensionDataCaption2.forEach(extensionDataCaption2 => hide(extensionDataCaption2)); + // eslint-disable-next-line no-restricted-syntax const showLoading = this.getElementById('ext-loading')!; show(showLoading); while (showLoading.firstChild) { @@ -1442,12 +1505,15 @@ export class BaseIssueReporterService extends Disposable { this.loadingExtensionData = false; this.updateButtonStates(); + // eslint-disable-next-line no-restricted-syntax const extensionDataCaption = this.getElementById('extension-id')!; show(extensionDataCaption); + // eslint-disable-next-line no-restricted-syntax const extensionDataCaption2 = Array.from(this.window.document.querySelectorAll('.ext-parens')); extensionDataCaption2.forEach(extensionDataCaption2 => show(extensionDataCaption2)); + // eslint-disable-next-line no-restricted-syntax const hideLoading = this.getElementById('ext-loading')!; hide(hideLoading); if (hideLoading.firstChild) { @@ -1457,11 +1523,14 @@ export class BaseIssueReporterService extends Disposable { } private setExtensionValidationMessage(): void { + // eslint-disable-next-line no-restricted-syntax const extensionValidationMessage = this.getElementById('extension-selection-validation-error')!; + // eslint-disable-next-line no-restricted-syntax const extensionValidationNoUrlsMessage = this.getElementById('extension-selection-validation-error-no-url')!; const bugsUrl = this.getExtensionBugsUrl(); if (bugsUrl) { show(extensionValidationMessage); + // eslint-disable-next-line no-restricted-syntax const link = this.getElementById('extensionBugsLink')!; link.textContent = bugsUrl; return; @@ -1470,6 +1539,7 @@ export class BaseIssueReporterService extends Disposable { const extensionUrl = this.getExtensionRepositoryUrl(); if (extensionUrl) { show(extensionValidationMessage); + // eslint-disable-next-line no-restricted-syntax const link = this.getElementById('extensionBugsLink'); link!.textContent = extensionUrl; return; @@ -1479,6 +1549,7 @@ export class BaseIssueReporterService extends Disposable { } private updateProcessInfo(state: IssueReporterModelData) { + // eslint-disable-next-line no-restricted-syntax const target = this.window.document.querySelector('.block-process .block-info') as HTMLElement; if (target) { reset(target, $('code', undefined, state.processInfo ?? '')); @@ -1486,10 +1557,12 @@ export class BaseIssueReporterService extends Disposable { } private updateWorkspaceInfo(state: IssueReporterModelData) { + // eslint-disable-next-line no-restricted-syntax this.window.document.querySelector('.block-workspace .block-info code')!.textContent = '\n' + state.workspaceInfo; } public updateExtensionTable(extensions: IssueReporterExtensionData[], numThemeExtensions: number): void { + // eslint-disable-next-line no-restricted-syntax const target = this.window.document.querySelector('.block-extensions .block-info'); if (target) { if (this.disableExtensions) { @@ -1541,6 +1614,7 @@ export class BaseIssueReporterService extends Disposable { } public getElementById(elementId: string): T | undefined { + // eslint-disable-next-line no-restricted-syntax const element = this.window.document.getElementById(elementId) as T | undefined; if (element) { return element; @@ -1550,6 +1624,7 @@ export class BaseIssueReporterService extends Disposable { } public addEventListener(elementId: string, eventType: string, handler: (event: Event) => void): void { + // eslint-disable-next-line no-restricted-syntax const element = this.getElementById(elementId); element?.addEventListener(eventType, handler); } diff --git a/src/vs/workbench/contrib/issue/browser/issueReporterService.ts b/src/vs/workbench/contrib/issue/browser/issueReporterService.ts index d12bb39e76c..fd4a56d64b7 100644 --- a/src/vs/workbench/contrib/issue/browser/issueReporterService.ts +++ b/src/vs/workbench/contrib/issue/browser/issueReporterService.ts @@ -37,6 +37,7 @@ export class IssueWebReporter extends BaseIssueReporterService { ) { super(disableExtensions, data, os, product, window, true, issueFormService, themeService, fileService, fileDialogService, contextMenuService, authenticationService, openerService); + // eslint-disable-next-line no-restricted-syntax const target = this.window.document.querySelector('.block-system .block-info'); const webInfo = this.window.navigator.userAgent; @@ -57,6 +58,7 @@ export class IssueWebReporter extends BaseIssueReporterService { this.issueReporterModel.update({ issueType: issueType }); // Resets placeholder + // eslint-disable-next-line no-restricted-syntax const descriptionTextArea = this.getElementById('issue-title'); if (descriptionTextArea) { descriptionTextArea.placeholder = localize('undefinedPlaceholder', "Please enter a title"); diff --git a/src/vs/workbench/contrib/issue/electron-browser/issueReporterService.ts b/src/vs/workbench/contrib/issue/electron-browser/issueReporterService.ts index a6ea8f75804..94230a89c7f 100644 --- a/src/vs/workbench/contrib/issue/electron-browser/issueReporterService.ts +++ b/src/vs/workbench/contrib/issue/electron-browser/issueReporterService.ts @@ -86,7 +86,9 @@ export class IssueReporter extends BaseIssueReporterService { const updateState = this.updateService.state; if (updateState.type === StateType.Ready || updateState.type === StateType.Downloaded) { this.needsUpdate = true; + // eslint-disable-next-line no-restricted-syntax const includeAcknowledgement = this.getElementById('version-acknowledgements'); + // eslint-disable-next-line no-restricted-syntax const updateBanner = this.getElementById('update-banner'); if (updateBanner && includeAcknowledgement) { includeAcknowledgement.classList.remove('hidden'); @@ -109,6 +111,7 @@ export class IssueReporter extends BaseIssueReporterService { } // Resets placeholder + // eslint-disable-next-line no-restricted-syntax const descriptionTextArea = this.getElementById('issue-title'); if (descriptionTextArea) { descriptionTextArea.placeholder = localize('undefinedPlaceholder', "Please enter a title"); @@ -187,6 +190,7 @@ export class IssueReporter extends BaseIssueReporterService { if (!this.validateInputs()) { // If inputs are invalid, set focus to the first one and add listeners on them // to detect further changes + // eslint-disable-next-line no-restricted-syntax const invalidInput = this.window.document.getElementsByClassName('invalid-input'); if (invalidInput.length) { (invalidInput[0]).focus(); @@ -216,6 +220,7 @@ export class IssueReporter extends BaseIssueReporterService { this.hasBeenSubmitted = true; + // eslint-disable-next-line no-restricted-syntax const issueTitle = (this.getElementById('issue-title')).value; const issueBody = this.issueReporterModel.serialize(); @@ -230,6 +235,7 @@ export class IssueReporter extends BaseIssueReporterService { const gitHubDetails = this.parseGitHubUrl(issueUrl); + // eslint-disable-next-line no-restricted-syntax const baseUrl = this.getIssueUrlWithTitle((this.getElementById('issue-title')).value, issueUrl); let url = baseUrl + `&body=${encodeURIComponent(issueBody)}`; @@ -267,6 +273,7 @@ export class IssueReporter extends BaseIssueReporterService { } private updateSystemInfo(state: IssueReporterModelData) { + // eslint-disable-next-line no-restricted-syntax const target = this.window.document.querySelector('.block-system .block-info'); if (target) { @@ -356,6 +363,7 @@ export class IssueReporter extends BaseIssueReporterService { private updateExperimentsInfo(experimentInfo: string | undefined) { this.issueReporterModel.update({ experimentInfo }); + // eslint-disable-next-line no-restricted-syntax const target = this.window.document.querySelector('.block-experiments .block-info'); if (target) { target.textContent = experimentInfo ? experimentInfo : localize('noCurrentExperiments', "No current experiments."); diff --git a/src/vs/workbench/contrib/languageStatus/browser/languageStatus.ts b/src/vs/workbench/contrib/languageStatus/browser/languageStatus.ts index 329707002d5..386bde3c067 100644 --- a/src/vs/workbench/contrib/languageStatus/browser/languageStatus.ts +++ b/src/vs/workbench/contrib/languageStatus/browser/languageStatus.ts @@ -233,7 +233,9 @@ class LanguageStatus { // when severity is warning or error, don't show animation when showing progress/busy const userHasInteractedWithStatus = this._interactionCounter.value >= 3; const targetWindow = dom.getWindow(editor?.getContainerDomNode()); + // eslint-disable-next-line no-restricted-syntax const node = targetWindow.document.querySelector('.monaco-workbench .statusbar DIV#status\\.languageStatus A>SPAN.codicon'); + // eslint-disable-next-line no-restricted-syntax const container = targetWindow.document.querySelector('.monaco-workbench .statusbar DIV#status\\.languageStatus'); if (dom.isHTMLElement(node) && container) { const _wiggle = 'wiggle'; @@ -254,6 +256,7 @@ class LanguageStatus { // track when the hover shows (this is automagic and DOM mutation spying is needed...) // use that as signal that the user has interacted/learned language status items work if (!userHasInteractedWithStatus) { + // eslint-disable-next-line no-restricted-syntax const hoverTarget = targetWindow.document.querySelector('.monaco-workbench .context-view'); if (dom.isHTMLElement(hoverTarget)) { const observer = new MutationObserver(() => { diff --git a/src/vs/workbench/contrib/markdown/browser/markedKatexSupport.ts b/src/vs/workbench/contrib/markdown/browser/markedKatexSupport.ts index 467f5fc9c3d..a43139a5591 100644 --- a/src/vs/workbench/contrib/markdown/browser/markedKatexSupport.ts +++ b/src/vs/workbench/contrib/markdown/browser/markedKatexSupport.ts @@ -151,6 +151,7 @@ export class MarkedKatexSupport { public static ensureKatexStyles(window: CodeWindow) { const doc = window.document; + // eslint-disable-next-line no-restricted-syntax if (!doc.querySelector('link.katex')) { const katexStyle = document.createElement('link'); katexStyle.classList.add('katex'); diff --git a/src/vs/workbench/contrib/markers/browser/markersTable.ts b/src/vs/workbench/contrib/markers/browser/markersTable.ts index cf3412a118d..3f058e518ad 100644 --- a/src/vs/workbench/contrib/markers/browser/markersTable.ts +++ b/src/vs/workbench/contrib/markers/browser/markersTable.ts @@ -335,6 +335,7 @@ export class MarkersTable extends Disposable implements IProblemsWidget { options ) as WorkbenchTable; + // eslint-disable-next-line no-restricted-syntax const list = this.table.domNode.querySelector('.monaco-list-rows')! as HTMLElement; // mouseover/mouseleave event handlers diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/troubleshoot/layout.ts b/src/vs/workbench/contrib/notebook/browser/contrib/troubleshoot/layout.ts index fbb8fe4893c..923522d9aa1 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/troubleshoot/layout.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/troubleshoot/layout.ts @@ -147,6 +147,7 @@ export class TroubleshootController extends Disposable implements INotebookEdito if (this._notebookOverlayDomNode) { // Update label + // eslint-disable-next-line no-restricted-syntax const labelElement = this._notebookOverlayDomNode.querySelector('div:nth-child(2)') as HTMLElement; if (labelElement) { labelElement.textContent = `ScrollTop: ${scrollTop}px`; @@ -154,6 +155,7 @@ export class TroubleshootController extends Disposable implements INotebookEdito } // Update top line + // eslint-disable-next-line no-restricted-syntax const topLineElement = this._notebookOverlayDomNode.querySelector('div:first-child') as HTMLElement; if (topLineElement) { topLineElement.style.top = `${listViewTop}px`; diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellDragRenderer.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellDragRenderer.ts index b02c85371d4..1f39fbaff7f 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellDragRenderer.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellDragRenderer.ts @@ -111,6 +111,7 @@ export class CodeCellDragImageRenderer { dragImageContainer.classList.forEach(c => dragImageContainer.classList.remove(c)); dragImageContainer.classList.add('cell-drag-image', 'monaco-list-row', 'focused', `${type}-cell-row`); + // eslint-disable-next-line no-restricted-syntax const editorContainer: HTMLElement | null = dragImageContainer.querySelector('.cell-editor-container'); if (!editorContainer) { return null; diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellExecution.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellExecution.ts index be37babcfb3..6b4ba9c20bd 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellExecution.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellExecution.ts @@ -171,6 +171,7 @@ export class CellExecutionPart extends CellContentPart { this._executionOrderLabel.classList.remove('sticky'); top = this.currentCell.layoutInfo.editorHeight - lineHeight; // Place at the bottom of the editor // Only update content if we were previously sticky or content is not correct + // eslint-disable-next-line no-restricted-syntax const iconIsPresent = this._executionOrderContent.querySelector('.codicon') !== null; if (wasStickyHere || iconIsPresent) { const executionOrder = this.currentCell.internalMetadata.executionOrder; diff --git a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts index 1d9a15732b7..c5472e5835d 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts @@ -607,6 +607,7 @@ export class SettingsEditor2 extends EditorPane { } else if (this._currentFocusContext === SettingsFocusContext.SettingControl) { const element = this.focusedSettingDOMElement; if (element) { + // eslint-disable-next-line no-restricted-syntax const control = element.querySelector(AbstractSettingRenderer.CONTROL_SELECTOR); if (control) { (control).focus(); @@ -641,6 +642,7 @@ export class SettingsEditor2 extends EditorPane { this.settingsTree.domFocus(); if (focusSettingInput) { + // eslint-disable-next-line no-restricted-syntax const controlInFocusedRow = this.settingsTree.getHTMLElement().querySelector(`.focused ${AbstractSettingRenderer.CONTROL_SELECTOR}`); if (controlInFocusedRow) { (controlInFocusedRow).focus(); @@ -847,6 +849,7 @@ export class SettingsEditor2 extends EditorPane { } private onDidClickSetting(evt: ISettingLinkClickEvent, recursed?: boolean): void { + // eslint-disable-next-line no-restricted-syntax const targetElement = this.currentSettingsModel?.getElementsByName(evt.targetKey)?.[0]; let revealFailed = false; if (targetElement) { @@ -887,6 +890,7 @@ export class SettingsEditor2 extends EditorPane { const domElements = this.settingRenderers.getDOMElementsForSettingKey(this.settingsTree.getHTMLElement(), evt.targetKey); if (domElements && domElements[0]) { + // eslint-disable-next-line no-restricted-syntax const control = domElements[0].querySelector(AbstractSettingRenderer.CONTROL_SELECTOR); if (control) { (control).focus(); @@ -1625,6 +1629,7 @@ export class SettingsEditor2 extends EditorPane { // If the context view is focused, delay rendering settings if (this.contextViewFocused()) { + // eslint-disable-next-line no-restricted-syntax const element = this.window.document.querySelector('.context-view'); if (element) { this.scheduleRefresh(element as HTMLElement, key); @@ -1656,6 +1661,7 @@ export class SettingsEditor2 extends EditorPane { this.renderResultCountMessages(false); if (key) { + // eslint-disable-next-line no-restricted-syntax const elements = this.currentSettingsModel?.getElementsByName(key); if (elements?.length) { if (elements.length >= 2) { @@ -1702,6 +1708,7 @@ export class SettingsEditor2 extends EditorPane { if (!this.currentSettingsModel) { return; } + // eslint-disable-next-line no-restricted-syntax const dataElements = this.currentSettingsModel.getElementsByName(key); const isModified = dataElements && dataElements[0] && dataElements[0].isConfigured; // all elements are either configured or not const elements = this.settingRenderers.getDOMElementsForSettingKey(this.settingsTree.getHTMLElement(), key); diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index ffd51c1da27..8500e0c1706 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -788,6 +788,7 @@ export interface ISettingLinkClickEvent { } function removeChildrenFromTabOrder(node: Element): void { + // eslint-disable-next-line no-restricted-syntax const focusableElements = node.querySelectorAll(` [tabindex="0"], input:not([tabindex="-1"]), @@ -805,6 +806,7 @@ function removeChildrenFromTabOrder(node: Element): void { } function addChildrenToTabOrder(node: Element): void { + // eslint-disable-next-line no-restricted-syntax const focusableElements = node.querySelectorAll( `[${AbstractSettingRenderer.ELEMENT_FOCUSABLE_ATTR}="true"]` ); @@ -1291,6 +1293,7 @@ class SettingArrayRenderer extends AbstractSettingRenderer implements ITreeRende renderTemplate(container: HTMLElement): ISettingListItemTemplate { const common = this.renderCommonTemplate(null, container, 'list'); + // eslint-disable-next-line no-restricted-syntax const descriptionElement = common.containerElement.querySelector('.setting-item-description')!; const validationErrorMessageElement = $('.setting-item-validation-message'); descriptionElement.after(validationErrorMessageElement); @@ -1403,6 +1406,7 @@ abstract class AbstractSettingObjectRenderer extends AbstractSettingRenderer imp widget.domNode.classList.add(AbstractSettingRenderer.CONTROL_CLASS); common.toDispose.add(widget); + // eslint-disable-next-line no-restricted-syntax const descriptionElement = common.containerElement.querySelector('.setting-item-description')!; const validationErrorMessageElement = $('.setting-item-validation-message'); descriptionElement.after(validationErrorMessageElement); @@ -1851,6 +1855,7 @@ class SettingEnumRenderer extends AbstractSettingRenderer implements ITreeRender common.toDispose.add(selectBox); selectBox.render(common.controlElement); + // eslint-disable-next-line no-restricted-syntax const selectElement = common.controlElement.querySelector('select'); if (selectElement) { selectElement.classList.add(AbstractSettingRenderer.CONTROL_CLASS); @@ -2266,6 +2271,7 @@ export class SettingTreeRenderers extends Disposable { } showContextMenu(element: SettingsTreeSettingElement, settingDOMElement: HTMLElement): void { + // eslint-disable-next-line no-restricted-syntax const toolbarElement = settingDOMElement.querySelector('.monaco-toolbar'); if (toolbarElement) { this._contextMenuService.showContextMenu({ @@ -2286,6 +2292,7 @@ export class SettingTreeRenderers extends Disposable { } getDOMElementsForSettingKey(treeContainer: HTMLElement, key: string): NodeListOf { + // eslint-disable-next-line no-restricted-syntax return treeContainer.querySelectorAll(`[${AbstractSettingRenderer.SETTING_KEY_ATTR}="${key}"]`); } diff --git a/src/vs/workbench/contrib/processExplorer/browser/processExplorerControl.ts b/src/vs/workbench/contrib/processExplorer/browser/processExplorerControl.ts index 32cad56f77a..934fe32b29f 100644 --- a/src/vs/workbench/contrib/processExplorer/browser/processExplorerControl.ts +++ b/src/vs/workbench/contrib/processExplorer/browser/processExplorerControl.ts @@ -170,6 +170,7 @@ class ProcessHeaderTreeRenderer implements ITreeRenderer getDocument(container).getElementById(`pid-${e}`)).filter(e => !!e); if (rows) { const text = rows.map(e => e.innerText).filter(e => !!e); @@ -437,6 +439,7 @@ export abstract class ProcessExplorerControl extends Disposable { id: 'copyAll', label: localize('copyAll', "Copy All"), run: () => { + // eslint-disable-next-line no-restricted-syntax const processList = getDocument(container).getElementById('process-explorer'); if (processList) { this.clipboardService.writeText(processList.innerText); diff --git a/src/vs/workbench/contrib/search/browser/searchResultsView.ts b/src/vs/workbench/contrib/search/browser/searchResultsView.ts index fb2ec1fc959..62d5db99be1 100644 --- a/src/vs/workbench/contrib/search/browser/searchResultsView.ts +++ b/src/vs/workbench/contrib/search/browser/searchResultsView.ts @@ -366,6 +366,7 @@ export class FileMatchRenderer extends Disposable implements ICompressibleTreeRe // when hidesExplorerArrows: true, then the file nodes should still have a twistie because it would otherwise // be hard to tell whether the node is collapsed or expanded. + // eslint-disable-next-line no-restricted-syntax const twistieContainer = templateData.el.parentElement?.parentElement?.querySelector('.monaco-tl-twistie'); twistieContainer?.classList.add('force-twistie'); } diff --git a/src/vs/workbench/contrib/search/browser/searchWidget.ts b/src/vs/workbench/contrib/search/browser/searchWidget.ts index c06dbd4b3ea..aecf245b582 100644 --- a/src/vs/workbench/contrib/search/browser/searchWidget.ts +++ b/src/vs/workbench/contrib/search/browser/searchWidget.ts @@ -666,10 +666,12 @@ export class SearchWidget extends Widget { } else if (keyboardEvent.equals(KeyCode.UpArrow)) { + // eslint-disable-next-line no-restricted-syntax stopPropagationForMultiLineUpwards(keyboardEvent, this.searchInput?.getValue() ?? '', this.searchInput?.domNode.querySelector('textarea') ?? null); } else if (keyboardEvent.equals(KeyCode.DownArrow)) { + // eslint-disable-next-line no-restricted-syntax stopPropagationForMultiLineDownwards(keyboardEvent, this.searchInput?.getValue() ?? '', this.searchInput?.domNode.querySelector('textarea') ?? null); } @@ -748,10 +750,12 @@ export class SearchWidget extends Widget { } else if (keyboardEvent.equals(KeyCode.UpArrow)) { + // eslint-disable-next-line no-restricted-syntax stopPropagationForMultiLineUpwards(keyboardEvent, this.replaceInput?.getValue() ?? '', this.replaceInput?.domNode.querySelector('textarea') ?? null); } else if (keyboardEvent.equals(KeyCode.DownArrow)) { + // eslint-disable-next-line no-restricted-syntax stopPropagationForMultiLineDownwards(keyboardEvent, this.replaceInput?.getValue() ?? '', this.replaceInput?.domNode.querySelector('textarea') ?? null); } } diff --git a/src/vs/workbench/contrib/splash/browser/partsSplash.ts b/src/vs/workbench/contrib/splash/browser/partsSplash.ts index ec3bcebca97..8280bf593ca 100644 --- a/src/vs/workbench/contrib/splash/browser/partsSplash.ts +++ b/src/vs/workbench/contrib/splash/browser/partsSplash.ts @@ -108,12 +108,14 @@ export class PartsSplash { } private _removePartsSplash(): void { + // eslint-disable-next-line no-restricted-syntax const element = mainWindow.document.getElementById(PartsSplash._splashElementId); if (element) { element.style.display = 'none'; } // remove initial colors + // eslint-disable-next-line no-restricted-syntax const defaultStyles = mainWindow.document.head.getElementsByClassName('initialShellColors'); defaultStyles[0]?.remove(); } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalTabsList.ts b/src/vs/workbench/contrib/terminal/browser/terminalTabsList.ts index 91334b6e4bf..05cb619a218 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalTabsList.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalTabsList.ts @@ -420,6 +420,7 @@ class TerminalTabsRenderer extends Disposable implements IListRenderer this._tryShowHighlight(screenElement, xterm, e)), diff --git a/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollOverlay.ts b/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollOverlay.ts index f884f7fcb19..171a4ddf5b1 100644 --- a/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollOverlay.ts +++ b/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollOverlay.ts @@ -177,6 +177,7 @@ export class TerminalStickyScrollOverlay extends Disposable { // scrolling horizontally in a pager this._xterm.raw.onCursorMove, )(() => this._refresh()), + // eslint-disable-next-line no-restricted-syntax addStandardDisposableListener(this._xterm.raw.element!.querySelector('.xterm-viewport')!, 'scroll', () => this._refresh()), ); } diff --git a/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminal.suggest.contribution.ts b/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminal.suggest.contribution.ts index e270efe9d8b..c81c0121ccd 100644 --- a/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminal.suggest.contribution.ts +++ b/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminal.suggest.contribution.ts @@ -165,6 +165,7 @@ class TerminalSuggestContribution extends DisposableStore implements ITerminalCo } } addon.setContainerWithOverflow(container); + // eslint-disable-next-line no-restricted-syntax addon.setScreen(xterm.element!.querySelector('.xterm-screen')!); this.add(dom.addDisposableListener(this._ctx.instance.domElement, dom.EventType.FOCUS_OUT, (e) => { diff --git a/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts b/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts index d24f4a2689b..b695ba1e9dc 100644 --- a/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts +++ b/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminalSuggestAddon.ts @@ -858,6 +858,7 @@ export class SuggestAddon extends Disposable implements ITerminalAddon, ISuggest })); + // eslint-disable-next-line no-restricted-syntax const element = this._terminal?.element?.querySelector('.xterm-helper-textarea'); if (element) { this._register(dom.addDisposableListener(dom.getActiveDocument(), 'click', (event) => { diff --git a/src/vs/workbench/contrib/testing/test/browser/testObjectTree.ts b/src/vs/workbench/contrib/testing/test/browser/testObjectTree.ts index dd19fb50a49..0c369dc7df1 100644 --- a/src/vs/workbench/contrib/testing/test/browser/testObjectTree.ts +++ b/src/vs/workbench/contrib/testing/test/browser/testObjectTree.ts @@ -58,6 +58,7 @@ class TestObjectTree extends ObjectTree { } public getRendered(getProperty?: string) { + // eslint-disable-next-line no-restricted-syntax const elements = element.querySelectorAll('.monaco-tl-contents'); const sorted = [...elements].sort((a, b) => pos(a) - pos(b)); const chain: SerializedTree[] = [{ e: '', children: [] }]; diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewCommands.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewCommands.ts index 3396de579b1..51ccfc465d0 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewCommands.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewCommands.ts @@ -27,6 +27,7 @@ export class OpenWebviewDeveloperToolsAction extends Action2 { async run(accessor: ServicesAccessor): Promise { const nativeHostService = accessor.get(INativeHostService); + // eslint-disable-next-line no-restricted-syntax const iframeWebviewElements = getActiveWindow().document.querySelectorAll('iframe.webview.ready'); if (iframeWebviewElements.length) { console.info(nls.localize('iframeWebviewAlert', "Using standard dev tools to debug iframe based webview")); diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts index d286ec2f3e2..172ad280a95 100644 --- a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts +++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts @@ -250,7 +250,9 @@ export class GettingStartedPage extends EditorPane { ourCategory.title = category.title; ourCategory.description = category.description; + // eslint-disable-next-line no-restricted-syntax this.container.querySelectorAll(`[x-category-title-for="${category.id}"]`).forEach(step => (step as HTMLDivElement).innerText = ourCategory.title); + // eslint-disable-next-line no-restricted-syntax this.container.querySelectorAll(`[x-category-description-for="${category.id}"]`).forEach(step => (step as HTMLDivElement).innerText = ourCategory.description); })); @@ -275,6 +277,7 @@ export class GettingStartedPage extends EditorPane { ourStep.done = step.done; if (category.id === this.currentWalkthrough?.id) { + // eslint-disable-next-line no-restricted-syntax const badgeelements = assertReturnsDefined(this.window.document.querySelectorAll(`[data-done-step-id="${step.id}"]`)); badgeelements.forEach(badgeelement => { if (step.done) { @@ -377,6 +380,7 @@ export class GettingStartedPage extends EditorPane { private registerDispatchListeners() { this.dispatchListeners.clear(); + // eslint-disable-next-line no-restricted-syntax this.container.querySelectorAll('[x-dispatch]').forEach(element => { const dispatch = element.getAttribute('x-dispatch') ?? ''; let command, argument; @@ -783,9 +787,11 @@ export class GettingStartedPage extends EditorPane { private async selectStep(id: string | undefined, delayFocus = true) { if (id) { + // eslint-disable-next-line no-restricted-syntax let stepElement = this.container.querySelector(`[data-step-id="${id}"]`); if (!stepElement) { // Selected an element that is not in-context, just fallback to whatever. + // eslint-disable-next-line no-restricted-syntax stepElement = this.container.querySelector(`[data-step-id]`); if (!stepElement) { // No steps around... just ignore. @@ -793,10 +799,12 @@ export class GettingStartedPage extends EditorPane { } id = assertReturnsDefined(stepElement.getAttribute('data-step-id')); } + // eslint-disable-next-line no-restricted-syntax stepElement.parentElement?.querySelectorAll('.expanded').forEach(node => { if (node.getAttribute('data-step-id') !== id) { node.classList.remove('expanded'); node.setAttribute('aria-expanded', 'false'); + // eslint-disable-next-line no-restricted-syntax const codiconElement = node.querySelector('.codicon'); if (codiconElement) { codiconElement.removeAttribute('tabindex'); @@ -810,6 +818,7 @@ export class GettingStartedPage extends EditorPane { stepElement.classList.add('expanded'); stepElement.setAttribute('aria-expanded', 'true'); this.buildMediaComponent(id, true); + // eslint-disable-next-line no-restricted-syntax const codiconElement = stepElement.querySelector('.codicon'); if (codiconElement) { codiconElement.setAttribute('tabindex', '0'); @@ -1207,6 +1216,7 @@ export class GettingStartedPage extends EditorPane { } private updateCategoryProgress() { + // eslint-disable-next-line no-restricted-syntax this.window.document.querySelectorAll('.category-progress').forEach(element => { const categoryID = element.getAttribute('x-data-category-id'); const category = this.gettingStartedCategories.find(c => c.id === categoryID); @@ -1214,6 +1224,7 @@ export class GettingStartedPage extends EditorPane { const stats = this.getWalkthroughCompletionStats(category); + // eslint-disable-next-line no-restricted-syntax const bar = assertReturnsDefined(element.querySelector('.progress-bar-inner')) as HTMLDivElement; bar.setAttribute('aria-valuemin', '0'); bar.setAttribute('aria-valuenow', '' + stats.stepsComplete); @@ -1627,24 +1638,34 @@ export class GettingStartedPage extends EditorPane { } private setSlide(toEnable: 'details' | 'categories', firstLaunch: boolean = false) { + // eslint-disable-next-line no-restricted-syntax const slideManager = assertReturnsDefined(this.container.querySelector('.gettingStarted')); if (toEnable === 'categories') { slideManager.classList.remove('showDetails'); slideManager.classList.add('showCategories'); + // eslint-disable-next-line no-restricted-syntax this.container.querySelector('.prev-button.button-link')!.style.display = 'none'; + // eslint-disable-next-line no-restricted-syntax this.container.querySelector('.gettingStartedSlideDetails')!.querySelectorAll('button').forEach(button => button.disabled = true); + // eslint-disable-next-line no-restricted-syntax this.container.querySelector('.gettingStartedSlideCategories')!.querySelectorAll('button').forEach(button => button.disabled = false); + // eslint-disable-next-line no-restricted-syntax this.container.querySelector('.gettingStartedSlideCategories')!.querySelectorAll('input').forEach(button => button.disabled = false); } else { slideManager.classList.add('showDetails'); slideManager.classList.remove('showCategories'); + // eslint-disable-next-line no-restricted-syntax const prevButton = this.container.querySelector('.prev-button.button-link'); prevButton!.style.display = this.editorInput.showWelcome || this.prevWalkthrough ? 'block' : 'none'; + // eslint-disable-next-line no-restricted-syntax const moreTextElement = prevButton!.querySelector('.moreText'); moreTextElement!.textContent = firstLaunch ? localize('welcome', "Welcome") : localize('goBack', "Go Back"); + // eslint-disable-next-line no-restricted-syntax this.container.querySelector('.gettingStartedSlideDetails')!.querySelectorAll('button').forEach(button => button.disabled = false); + // eslint-disable-next-line no-restricted-syntax this.container.querySelector('.gettingStartedSlideCategories')!.querySelectorAll('button').forEach(button => button.disabled = true); + // eslint-disable-next-line no-restricted-syntax this.container.querySelector('.gettingStartedSlideCategories')!.querySelectorAll('input').forEach(button => button.disabled = true); } } diff --git a/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughPart.ts b/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughPart.ts index 0295214d7f7..27908c633b0 100644 --- a/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughPart.ts +++ b/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughPart.ts @@ -158,8 +158,10 @@ export class WalkThroughPart extends EditorPane { this.content.addEventListener('click', event => { for (let node = event.target as HTMLElement; node; node = node.parentNode as HTMLElement) { if (isHTMLAnchorElement(node) && node.href) { + // eslint-disable-next-line no-restricted-syntax const baseElement = node.ownerDocument.getElementsByTagName('base')[0] || this.window.location; if (baseElement && node.href.indexOf(baseElement.href) >= 0 && node.hash) { + // eslint-disable-next-line no-restricted-syntax const scrollTarget = this.content.querySelector(node.hash); const innerContent = this.content.firstElementChild; if (scrollTarget && innerContent) { @@ -312,6 +314,7 @@ export class WalkThroughPart extends EditorPane { return; } const id = `snippet-${model.uri.fragment}`; + // eslint-disable-next-line no-restricted-syntax const div = innerContent.querySelector(`#${id.replace(/[\\.]/g, '\\$&')}`) as HTMLElement; const options = this.getEditorOptions(model.getLanguageId()); @@ -424,6 +427,7 @@ export class WalkThroughPart extends EditorPane { } private decorateContent() { + // eslint-disable-next-line no-restricted-syntax const keys = this.content.querySelectorAll('.shortcut[data-command]'); Array.prototype.forEach.call(keys, (key: Element) => { const command = key.getAttribute('data-command'); @@ -434,6 +438,7 @@ export class WalkThroughPart extends EditorPane { } key.appendChild(document.createTextNode(label)); }); + // eslint-disable-next-line no-restricted-syntax const ifkeys = this.content.querySelectorAll('.if_shortcut[data-command]'); Array.prototype.forEach.call(ifkeys, (key: HTMLElement) => { const command = key.getAttribute('data-command'); @@ -446,6 +451,7 @@ export class WalkThroughPart extends EditorPane { const labels = UILabelProvider.modifierLabels[OS]; const value = this.configurationService.getValue('editor.multiCursorModifier'); const modifier = labels[value === 'ctrlCmd' ? (OS === OperatingSystem.Macintosh ? 'metaKey' : 'ctrlKey') : 'altKey']; + // eslint-disable-next-line no-restricted-syntax const keys = this.content.querySelectorAll('.multi-cursor-modifier'); Array.prototype.forEach.call(keys, (key: Element) => { while (key.firstChild) { diff --git a/src/vs/workbench/services/driver/browser/driver.ts b/src/vs/workbench/services/driver/browser/driver.ts index e1c8c1b0ace..1f82b39945d 100644 --- a/src/vs/workbench/services/driver/browser/driver.ts +++ b/src/vs/workbench/services/driver/browser/driver.ts @@ -42,6 +42,7 @@ export class BrowserWindowDriver implements IWindowDriver { } async setValue(selector: string, text: string): Promise { + // eslint-disable-next-line no-restricted-syntax const element = mainWindow.document.querySelector(selector); if (!element) { @@ -56,6 +57,7 @@ export class BrowserWindowDriver implements IWindowDriver { } async isActiveElement(selector: string): Promise { + // eslint-disable-next-line no-restricted-syntax const element = mainWindow.document.querySelector(selector); if (element !== mainWindow.document.activeElement) { @@ -78,6 +80,7 @@ export class BrowserWindowDriver implements IWindowDriver { } async getElements(selector: string, recursive: boolean): Promise { + // eslint-disable-next-line no-restricted-syntax const query = mainWindow.document.querySelectorAll(selector); const result: IElement[] = []; for (let i = 0; i < query.length; i++) { @@ -128,6 +131,7 @@ export class BrowserWindowDriver implements IWindowDriver { } async typeInEditor(selector: string, text: string): Promise { + // eslint-disable-next-line no-restricted-syntax const element = mainWindow.document.querySelector(selector); if (!element) { @@ -166,6 +170,7 @@ export class BrowserWindowDriver implements IWindowDriver { } async getEditorSelection(selector: string): Promise<{ selectionStart: number; selectionEnd: number }> { + // eslint-disable-next-line no-restricted-syntax const element = mainWindow.document.querySelector(selector); if (!element) { throw new Error(`Editor not found: ${selector}`); @@ -184,6 +189,7 @@ export class BrowserWindowDriver implements IWindowDriver { } async getTerminalBuffer(selector: string): Promise { + // eslint-disable-next-line no-restricted-syntax const element = mainWindow.document.querySelector(selector); if (!element) { @@ -206,6 +212,7 @@ export class BrowserWindowDriver implements IWindowDriver { } async writeInTerminal(selector: string, text: string): Promise { + // eslint-disable-next-line no-restricted-syntax const element = mainWindow.document.querySelector(selector); if (!element) { @@ -238,6 +245,7 @@ export class BrowserWindowDriver implements IWindowDriver { } protected async _getElementXY(selector: string, offset?: { x: number; y: number }): Promise<{ x: number; y: number }> { + // eslint-disable-next-line no-restricted-syntax const element = mainWindow.document.querySelector(selector); if (!element) { diff --git a/src/vs/workbench/services/extensionManagement/browser/builtinExtensionsScannerService.ts b/src/vs/workbench/services/extensionManagement/browser/builtinExtensionsScannerService.ts index dae14c4d562..de60ee7d81a 100644 --- a/src/vs/workbench/services/extensionManagement/browser/builtinExtensionsScannerService.ts +++ b/src/vs/workbench/services/extensionManagement/browser/builtinExtensionsScannerService.ts @@ -56,6 +56,7 @@ export class BuiltinExtensionsScannerService implements IBuiltinExtensionsScanne bundledExtensions = [/*BUILD->INSERT_BUILTIN_EXTENSIONS*/]; } else { // Find builtin extensions by checking for DOM + // eslint-disable-next-line no-restricted-syntax const builtinExtensionsElement = mainWindow.document.getElementById('vscode-workbench-builtin-extensions'); const builtinExtensionsElementAttribute = builtinExtensionsElement ? builtinExtensionsElement.getAttribute('data-settings') : undefined; if (builtinExtensionsElementAttribute) { diff --git a/src/vs/workbench/services/themes/browser/workbenchThemeService.ts b/src/vs/workbench/services/themes/browser/workbenchThemeService.ts index d85b23015f4..6622617c120 100644 --- a/src/vs/workbench/services/themes/browser/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/browser/workbenchThemeService.ts @@ -793,6 +793,7 @@ class ThemeFileWatcher { } function _applyRules(styleSheetContent: string, rulesClassName: string) { + // eslint-disable-next-line no-restricted-syntax const themeStyles = mainWindow.document.head.getElementsByClassName(rulesClassName); if (themeStyles.length === 0) { const elStyle = createStyleSheet(); diff --git a/src/vs/workbench/test/browser/part.test.ts b/src/vs/workbench/test/browser/part.test.ts index 794026f1952..2df6e797173 100644 --- a/src/vs/workbench/test/browser/part.test.ts +++ b/src/vs/workbench/test/browser/part.test.ts @@ -15,6 +15,8 @@ import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../base/test/comm import { DisposableStore } from '../../../base/common/lifecycle.js'; import { mainWindow } from '../../../base/browser/window.js'; +/* eslint-disable no-restricted-syntax */ + suite('Workbench parts', () => { const disposables = new DisposableStore();