import { IWorkbenchExtensionEnablementService, EnablementState } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { createDecorator, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; <del> import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; </del> <ins> import { INotificationService } from 'vs/platform/notification/common/notification'; </ins> import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { IURLHandler, IURLService, IOpenURLOptions } from 'vs/platform/url/common/url'; import { IHostService } from 'vs/workbench/services/host/browser/host'; <del> import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; </del> <ins> import { IExtensionService, toExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; </ins> import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { Registry } from 'vs/platform/registry/common/platform';


const extension = await this.extensionService.getExtension(extensionId); if (!extension) { <del> await this.handleUnhandledURL(uri, { id: extensionId }); </del> <ins> await this.handleUnhandledURL(uri, { id: extensionId }, options); </ins> return true; }


return await handler.handleURL(uri, options); } <del> private async handleUnhandledURL(uri: URI, extensionIdentifier: IExtensionIdentifier): Promise<void> { </del> <ins> private async handleUnhandledURL(uri: URI, extensionIdentifier: IExtensionIdentifier, options?: IOpenURLOptions): Promise<void> { </ins> const installedExtensions = await this.extensionManagementService.getInstalled(); <del> const extension = installedExtensions.filter(e => areSameExtensions(e.identifier, extensionIdentifier))[0]; // Extension is installed if (extension) { const enabled = this.extensionEnablementService.isEnabled(extension); // Extension is not running. Reload the window to handle. if (enabled) { this.telemetryService.publicLog2<ExtensionUrlHandlerEvent, ExtensionUrlHandlerClassification>('uri_invoked/activate_extension/start', { extensionId: extensionIdentifier.id }); const result = await this.dialogService.confirm({ message: localize('reloadAndHandle', "Extension '{0}' is not loaded. Would you like to reload the window to load the extension and open the URL?", extension.manifest.displayName || extension.manifest.name), detail: `${extension.manifest.displayName || extension.manifest.name} (${extensionIdentifier.id}) wants to open a URL:nn${uri.toString()}`, primaryButton: localize('reloadAndOpen', "&&Reload Window and Open"), type: 'question' }); if (!result.confirmed) { this.telemetryService.publicLog2<ExtensionUrlHandlerEvent, ExtensionUrlHandlerClassification>('uri_invoked/activate_extension/cancel', { extensionId: extensionIdentifier.id }); return; } this.telemetryService.publicLog2<ExtensionUrlHandlerEvent, ExtensionUrlHandlerClassification>('uri_invoked/activate_extension/accept', { extensionId: extensionIdentifier.id }); await this.reloadAndHandle(uri); } // Extension is disabled. Enable the extension and reload the window to handle. else if (this.extensionEnablementService.canChangeEnablement(extension)) { this.telemetryService.publicLog2<ExtensionUrlHandlerEvent, ExtensionUrlHandlerClassification>('uri_invoked/enable_extension/start', { extensionId: extensionIdentifier.id }); const result = await this.dialogService.confirm({ message: localize('enableAndHandle', "Extension '{0}' is disabled. Would you like to enable the extension and reload the window to open the URL?", extension.manifest.displayName || extension.manifest.name), detail: `${extension.manifest.displayName || extension.manifest.name} (${extensionIdentifier.id}) wants to open a URL:nn${uri.toString()}`, primaryButton: localize('enableAndReload', "&&Enable and Open"), type: 'question' }); if (!result.confirmed) { this.telemetryService.publicLog2<ExtensionUrlHandlerEvent, ExtensionUrlHandlerClassification>('uri_invoked/enable_extension/cancel', { extensionId: extensionIdentifier.id }); return; } this.telemetryService.publicLog2<ExtensionUrlHandlerEvent, ExtensionUrlHandlerClassification>('uri_invoked/enable_extension/accept', { extensionId: extensionIdentifier.id }); await this.extensionEnablementService.setEnablement([extension], EnablementState.EnabledGlobally); await this.reloadAndHandle(uri); } } </del> <ins> let extension = installedExtensions.find(e => areSameExtensions(e.identifier, extensionIdentifier)); </ins> // Extension is not installed <del> else { </del> <ins> if (!extension) { </ins> let galleryExtension: IGalleryExtension | undefined; try {


// Install the Extension and reload the window to handle. const result = await this.dialogService.confirm({ <del> message: localize('installAndHandle', "Extension '{0}' is not installed. Would you like to install the extension and reload the window to open this URL?", galleryExtension.displayName || galleryExtension.name), </del> <ins> message: localize('installAndHandle', "Extension '{0}' is not installed. Would you like to install the extension and open this URL?", galleryExtension.displayName || galleryExtension.name), </ins> detail: `${galleryExtension.displayName || galleryExtension.name} (${extensionIdentifier.id}) wants to open a URL:nn${uri.toString()}`, <del> primaryButton: localize('install', "&&Install"), </del> <ins> primaryButton: localize('install and open', "&&Install and Open"), </ins> type: 'question' });


this.telemetryService.publicLog2<ExtensionUrlHandlerEvent, ExtensionUrlHandlerClassification>('uri_invoked/install_extension/accept', { extensionId: extensionIdentifier.id }); try { <del> await this.progressService.withProgress({ </del> <ins> extension = await this.progressService.withProgress({ </ins> location: ProgressLocation.Notification, title: localize('Installing', "Installing Extension '{0}'...", galleryExtension.displayName || galleryExtension.name) }, () => this.extensionManagementService.installFromGallery(galleryExtension!)); <del> this.notificationService.prompt( Severity.Info, localize('reload', "Would you like to reload the window and open the URL '{0}'?", uri.toString()), [{ label: localize('Reload', "Reload Window and Open"), run: async () => { this.telemetryService.publicLog2<ExtensionUrlHandlerEvent, ExtensionUrlHandlerClassification>('uri_invoked/install_extension/reload', { extensionId: extensionIdentifier.id }); await this.reloadAndHandle(uri); } }], { sticky: true } ); </del> } catch (error) { this.notificationService.error(error); <ins> return; } } // Extension is installed but not enabled if (!this.extensionEnablementService.isEnabled(extension)) { this.telemetryService.publicLog2<ExtensionUrlHandlerEvent, ExtensionUrlHandlerClassification>('uri_invoked/enable_extension/start', { extensionId: extensionIdentifier.id }); const result = await this.dialogService.confirm({ message: localize('enableAndHandle', "Extension '{0}' is disabled. Would you like to enable the extension and open the URL?", extension.manifest.displayName || extension.manifest.name), detail: `${extension.manifest.displayName || extension.manifest.name} (${extensionIdentifier.id}) wants to open a URL:nn${uri.toString()}`, primaryButton: localize('enableAndReload', "&&Enable and Open"), type: 'question' }); if (!result.confirmed) { this.telemetryService.publicLog2<ExtensionUrlHandlerEvent, ExtensionUrlHandlerClassification>('uri_invoked/enable_extension/cancel', { extensionId: extensionIdentifier.id }); return; </ins> } <ins> this.telemetryService.publicLog2<ExtensionUrlHandlerEvent, ExtensionUrlHandlerClassification>('uri_invoked/enable_extension/accept', { extensionId: extensionIdentifier.id }); await this.extensionEnablementService.setEnablement([extension], EnablementState.EnabledGlobally); } if (this.extensionService.canAddExtension(toExtensionDescription(extension))) { await this.waitUntilExtensionIsAdded(extensionIdentifier); await this.handleURL(uri, { ...options, trusted: true }); } /* Extension cannot be added and require window reload */ else { this.telemetryService.publicLog2<ExtensionUrlHandlerEvent, ExtensionUrlHandlerClassification>('uri_invoked/activate_extension/start', { extensionId: extensionIdentifier.id }); const result = await this.dialogService.confirm({ message: localize('reloadAndHandle', "Extension '{0}' is not loaded. Would you like to reload the window to load the extension and open the URL?", extension.manifest.displayName || extension.manifest.name), detail: `${extension.manifest.displayName || extension.manifest.name} (${extensionIdentifier.id}) wants to open a URL:nn${uri.toString()}`, primaryButton: localize('reloadAndOpen', "&&Reload Window and Open"), type: 'question' }); if (!result.confirmed) { this.telemetryService.publicLog2<ExtensionUrlHandlerEvent, ExtensionUrlHandlerClassification>('uri_invoked/activate_extension/cancel', { extensionId: extensionIdentifier.id }); return; } this.telemetryService.publicLog2<ExtensionUrlHandlerEvent, ExtensionUrlHandlerClassification>('uri_invoked/activate_extension/accept', { extensionId: extensionIdentifier.id }); this.storageService.store(URL_TO_HANDLE, JSON.stringify(uri.toJSON()), StorageScope.WORKSPACE, StorageTarget.MACHINE); await this.hostService.reload(); </ins> } } <del> private async reloadAndHandle(url: URI): Promise<void> { this.storageService.store(URL_TO_HANDLE, JSON.stringify(url.toJSON()), StorageScope.WORKSPACE, StorageTarget.MACHINE); await this.hostService.reload(); </del> <ins> private async waitUntilExtensionIsAdded(extensionId: IExtensionIdentifier): Promise<void> { if (!(await this.extensionService.getExtension(extensionId.id))) { await new Promise<void>((c, e) => { const disposable = this.extensionService.onDidChangeExtensions(async () => { try { if (await this.extensionService.getExtension(extensionId.id)) { disposable.dispose(); c(); } } catch (error) { e(error); } }); }); } </ins> } // forget about all uris buffered more than 5 minutes ago


update_prompt() { PRIOR_PROMPT="$PS1" IN_COMMAND_EXECUTION="" <del> PS1="$(prompt_start)$PREFIX$PS1$(prompt_end)" PS2="$(continuation_start)$PS2$(continuation_end)" </del> <ins> PS1="[$(prompt_start)]$PREFIX$PS1[$(prompt_end)]" PS2="[$(continuation_start)]$PS2[$(continuation_end)]" </ins> } precmd() {


update_prompt() { PRIOR_PROMPT="$PS1" IN_COMMAND_EXECUTION="" <del> PS1="$(prompt_start)$PREFIX$PS1$(prompt_end)" PS2="$(continuation_start)$PS2$(continuation_end)" </del> <ins> PS1="%{$(prompt_start)%}$PREFIX$PS1%{$(prompt_end)%}" PS2="%{$(continuation_start)%}$PS2%{$(continuation_end)%}" </ins> } precmd() {


this.show(dto.revealLocation.range, TestingOutputPeek.lastHeightInLines || hintMessagePeekHeight(message)); this.editor.revealPositionNearTop(dto.revealLocation.range.getStartPosition(), ScrollType.Smooth); <del> this.editor.focus(); </del> return this.showInPlace(dto); }


this.tree.setFocus([messageNode]); this.tree.setSelection([messageNode]); <ins> this.tree.domFocus(); </ins> })); this._register(this.tree.onDidOpen(async e => {


} } <del> const lineBreakRe = /r?ns*/; </del> <ins> const lineBreakRe = /r?ns*/g; </ins> class TestMessageDecoration implements ITestDecoration { public static readonly inlineClassName = 'test-message-inline-content';


if (pick) { const languageId = this.languageService.getLanguageIdByLanguageName(pick.label); if (typeof languageId === 'string') { <del> return this.preferencesService.openUserSettings({ jsonEditor: true, revealSetting: { key: `[${languageId}]`, edit: true } }); </del> <ins> return this.preferencesService.openLanguageSpecificSettings(languageId); </ins> } } return undefined;


return this.open(this.userSettingsResource, options); } <ins> openLanguageSpecificSettings(languageId: string, options: IOpenSettingsOptions = {}): Promise<IEditorPane | undefined> { if (this.shouldOpenJsonByDefault()) { options.query = undefined; options.revealSetting = { key: `[${languageId}]`, edit: true }; } else { options.query = `@lang:${languageId}${options.query ? ` ${options.query}` : ''}`; } options.target = options.target ?? ConfigurationTarget.USER_LOCAL; return this.open(this.userSettingsResource, options); } </ins> private open(settingsResource: URI, options: IOpenSettingsOptions): Promise<IEditorPane | undefined> { options = { ...options,


openFolderSettings(options: IOpenSettingsOptions & { folderUri: IOpenSettingsOptions['folderUri'] }): Promise<IEditorPane | undefined>; openGlobalKeybindingSettings(textual: boolean, options?: IKeybindingsEditorOptions): Promise<void>; openDefaultKeybindingsFile(): Promise<IEditorPane | undefined>; <ins> openLanguageSpecificSettings(language: string, options?: IOpenSettingsOptions): Promise<IEditorPane | undefined>; </ins> getEditableSettingsURI(configurationTarget: ConfigurationTarget, resource?: URI): Promise<URI | null>; createSplitJsonEditorInput(configurationTarget: ConfigurationTarget, resource: URI): EditorInput;


return localize({ comment: ['Debug is a noun in this context, not a verb.'], key: 'callStackAriaLabel' }, "Debug Call Stack"); } <ins> getWidgetRole(): string { // Use treegrid as a role since each element can have additional actions inside #146210 return 'treegrid'; } getRole(_element: CallStackItem): string | undefined { return 'row'; } </ins> getAriaLabel(element: CallStackItem): string { if (element instanceof Thread) { return localize({ key: 'threadAriaLabel', comment: ['Placeholders stand for the thread name and the thread state.For example "Thread 1" and "Stopped'] }, "Thread {0} {1}", element.name, element.stateLabel);


dispose(): void; } <ins> function clearContainer(container: HTMLElement) { while (container.firstChild) { container.removeChild(container.firstChild); } } </ins> function renderImage(outputInfo: OutputItem, element: HTMLElement): IDisposable {


}; function renderHTML(outputInfo: OutputItem, container: HTMLElement): void { <ins> clearContainer(container); </ins> const htmlContent = outputInfo.text(); const element = document.createElement('div'); const trustedHtml = ttPolicy?.createHTML(htmlContent) ?? htmlContent;


} function renderText(outputInfo: OutputItem, container: HTMLElement, ctx: RendererContext<void> & { readonly settings: { readonly lineLimit: number } }): void { <ins> clearContainer(container); </ins> const contentNode = document.createElement('div'); contentNode.classList.add('output-plaintext'); const text = outputInfo.text();


disturl "https://electronjs.org/headers" <del> target "17.4.6" </del> <ins> target "17.4.7" </ins> runtime "electron" build_from_source "true"


"git": { "name": "electron", "repositoryUrl": "https://github.com/electron/electron", <del> "commitHash": "3a1945bd6c62459a457bd8d0b922259234816e22" </del> <ins> "commitHash": "66dd03293be5c6c7a06e1517bb80100030973be6" </ins> } }, "isOnlyProductionDependency": true, "license": "MIT", <del> "version": "17.4.6" </del> <ins> "version": "17.4.7" </ins> }, { "component": {


"cssnano": "^4.1.11", "debounce": "^1.0.0", "deemon": "^1.4.0", <del> "electron": "17.4.6", </del> <ins> "electron": "17.4.7", </ins> "eslint": "8.7.0", "eslint-plugin-header": "3.1.1", "eslint-plugin-jsdoc": "^19.1.0",


resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.45.tgz#cf1144091d6683cbd45a231954a745f02fb24598" integrity sha512-czF9eYVuOmlY/vxyMQz2rGlNSjZpxNQYBe1gmQv7al171qOIhgyO9k7D5AKlgeTCSPKk+LHhj5ZyIdmEub9oNg== <del> electron@17.4.6: version "17.4.6" resolved "https://registry.yarnpkg.com/electron/-/electron-17.4.6.tgz#4837b3adb2636992a33da734a77794dd932fb05c" integrity sha512-9aPjlyWoVxchD/iw5KcbQ7ZaC5ezxsObBrMbGjpdMmDL5dktI0EkT6x2l2CYPZCi4rQG/6qlPfTZJeVPIIwI2Q== </del> <ins> electron@17.4.7: version "17.4.7" resolved "https://registry.yarnpkg.com/electron/-/electron-17.4.7.tgz#5ae9105f2ee28e6405c79c7101f0c956676da697" integrity sha512-CMdUpd6oEwqbF7wcXwy9VNNXfTTbaeRg+zrGZciPzyzsEmJ9vzWcR1WpOxIQ4sIMjUyo1pFbvaD0VOgI2t4x3A== </ins> dependencies: "@electron/get" "^1.13.0" "@types/node" "^14.6.2"


disturl "https://electronjs.org/headers" <del> target "19.0.11" </del> <ins> target "19.0.12" </ins> runtime "electron" build_from_source "true"


"git": { "name": "electron", "repositoryUrl": "https://github.com/electron/electron", <del> "commitHash": "a5cafd174d2027529d0b251e5b8e58da2b364e5b" </del> <ins> "commitHash": "b05ccd812e3bb3de5b1546a313e298961653e942" </ins> } }, "isOnlyProductionDependency": true, "license": "MIT", <del> "version": "19.0.11" </del> <ins> "version": "19.0.12" </ins> }, { "component": {


"cssnano": "^4.1.11", "debounce": "^1.0.0", "deemon": "^1.4.0", <del> "electron": "19.0.11", </del> <ins> "electron": "19.0.12", </ins> "eslint": "8.7.0", "eslint-plugin-header": "3.1.1", "eslint-plugin-jsdoc": "^39.3.2",


constructor(modulePath: string, args?: string[] | undefined, options?: UtilityProcessOptions); postMessage(channel: string, message: any, transfer?: Electron.MessagePortMain[]): void; kill(signal?: number | string): boolean; <del> on(event: 'exit', listener: (code: number | undefined) => void): this; </del> <ins> on(event: 'exit', listener: (event: Electron.Event, code: number) => void): this; </ins> on(event: 'spawn', listener: () => void): this; } }


this._register(Event.fromNodeEventEmitter<void>(this._process, 'spawn')(() => { this._logService.info(`UtilityProcess<${this.id}>: received spawn event.`); })); <del> this._register(Event.fromNodeEventEmitter<number | undefined>(this._process, 'exit')((code: number | undefined) => { code = code || 0; </del> <ins> const onExit = Event.fromNodeEventEmitter<number>(this._process, 'exit', (_, code: number) => code); this._register(onExit((code: number) => { </ins> this._logService.info(`UtilityProcess<${this.id}>: received exit event with code ${code}.`); this._hasExited = true; this._onExit.fire({ pid: this._process!.pid!, code, signal: '' });


resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.207.tgz#9c3310ebace2952903d05dcaba8abe3a4ed44c01" integrity sha512-piH7MJDJp4rJCduWbVvmUd59AUne1AFBJ8JaRQvk0KzNTSUnZrVXHCZc+eg+CGE4OujkcLJznhGKD6tuAshj5Q== <del> electron@19.0.11: version "19.0.11" resolved "https://registry.yarnpkg.com/electron/-/electron-19.0.11.tgz#0c0a52abc08694fd38916d9270baf45bb7752a27" integrity sha512-GPM6C1Ze17/gR4koTE171MxrI5unYfFRgXQdkMdpWM2Cd55LMUrVa0QHCsfKpsaloufv9T65lsOn0uZuzCw5UA== </del> <ins> electron@19.0.12: version "19.0.12" resolved "https://registry.yarnpkg.com/electron/-/electron-19.0.12.tgz#73d11cc2a3e4dbcd61fdc1c39561e7a7911046e9" integrity sha512-GOvG0t2NCeJYIfmC3g/dnEAQ71k3nQDbRVqQhpi2YbsYMury0asGJwqnVAv2uZQEwCwSx4XOwOQARTFEG/msWw== </ins> dependencies: "@electron/get" "^1.14.1" "@types/node" "^16.11.26"


code { font-size: 1em; <ins> font-family: var(--vscode-editor-font-family); </ins> } pre code { <del> font-family: var(--vscode-editor-font-family); </del> line-height: 1.357em; white-space: pre-wrap; }


if (token.type === 'heading') { yield { depth: token.depth, <del> text: renderMarkdownAsPlaintext({ value: token.text }).trim() </del> <ins> text: renderMarkdownAsPlaintext({ value: token.raw }).trim() </ins> }; } }


} } } <del> const newDecorationIds = this._editor.deltaDecorations(decorationIdsToReplace, newDecorationsData.map(d => d.decoration)); for (let i = 0; i < newDecorationIds.length; i++) { const data = newDecorationsData[i]; this._decorationsMetadata.set(newDecorationIds[i], data); } </del> <ins> this._editor.changeDecorations(accessor => { const newDecorationIds = accessor.deltaDecorations(decorationIdsToReplace, newDecorationsData.map(d => d.decoration)); for (let i = 0; i < newDecorationIds.length; i++) { const data = newDecorationsData[i]; this._decorationsMetadata.set(newDecorationIds[i], data); } }); </ins> } private _fillInColors(props: CssProperties, hint: languages.InlayHint): void {


import { IRequestContext, IRequestOptions, OfflineError } from 'vs/base/parts/request/common/request'; export function request(options: IRequestOptions, token: CancellationToken): Promise<IRequestContext> { <del> if (!navigator.onLine) { throw new OfflineError(); } </del> if (options.proxyAuthorization) { options.headers = { ...(options.headers || {}),


setRequestHeaders(xhr, options); xhr.responseType = 'arraybuffer'; <del> xhr.onerror = e => reject(new Error(xhr.statusText && ('XHR failed: ' + xhr.statusText) || 'XHR failed')); </del> <ins> xhr.onerror = e => reject( navigator.onLine ? new Error(xhr.statusText && ('XHR failed: ' + xhr.statusText) || 'XHR failed') : new OfflineError() ); </ins> xhr.onload = (e) => { resolve({ res: {


"vscode-proxy-agent": "^0.12.0", "vscode-regexpp": "^3.1.0", "vscode-textmate": "7.0.1", <del> "xterm": "4.19.0-beta.24", "xterm-addon-search": "0.9.0-beta.21", </del> <ins> "xterm": "4.19.0-beta.25", "xterm-addon-search": "0.9.0-beta.22", </ins> "xterm-addon-serialize": "0.7.0-beta.12", "xterm-addon-unicode11": "0.4.0-beta.3", <del> "xterm-addon-webgl": "0.12.0-beta.28", "xterm-headless": "4.19.0-beta.24", </del> <ins> "xterm-addon-webgl": "0.12.0-beta.29", "xterm-headless": "4.19.0-beta.25", </ins> "yauzl": "^2.9.2", "yazl": "^2.4.3" },


"tas-client-umd": "0.1.4", "vscode-oniguruma": "1.6.1", "vscode-textmate": "7.0.1", <del> "xterm": "4.19.0-beta.24", "xterm-addon-search": "0.9.0-beta.21", </del> <ins> "xterm": "4.19.0-beta.25", "xterm-addon-search": "0.9.0-beta.22", </ins> "xterm-addon-unicode11": "0.4.0-beta.3", <del> "xterm-addon-webgl": "0.12.0-beta.28" </del> <ins> "xterm-addon-webgl": "0.12.0-beta.29" </ins> } }


resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-7.0.1.tgz#8118a32b02735dccd14f893b495fa5389ad7de79" integrity sha512-zQ5U/nuXAAMsh691FtV0wPz89nSkHbs+IQV8FDk+wew9BlSDhf4UmWGlWJfTR2Ti6xZv87Tj5fENzKf6Qk7aLw== <del> xterm-addon-search@0.9.0-beta.21: version "0.9.0-beta.21" resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.9.0-beta.21.tgz#5348fe25676cdd89ce3be52ae62a316b6f266176" integrity sha512-jh6kfRCpWRvZZkV9QghFYesSYHjybaLNEyYAD6uilZYfNHoGLa0zPgUkLOqoECL7K6rhBmSYOkKbc9MG4wNFMQ== </del> <ins> xterm-addon-search@0.9.0-beta.22: version "0.9.0-beta.22" resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.9.0-beta.22.tgz#18f2eabda82709cdd64dee003879b586869e28a3" integrity sha512-1I8W0bwjg6bUoNaESKHSkS9BN3Z9Xe44/zbUb6Un+pbb5Nun4LQvFwSLkAIdRrslxcbcHYIU/2Q7F1wCOWLbaA== </ins> xterm-addon-unicode11@0.4.0-beta.3: version "0.4.0-beta.3" resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.3.tgz#f350184155fafd5ad0d6fbf31d13e6ca7dea1efa" integrity sha512-FryZAVwbUjKTmwXnm1trch/2XO60F5JsDvOkZhzobV1hm10sFLVuZpFyHXiUx7TFeeFsvNP+S77LAtWoeT5z+Q== <del> xterm-addon-webgl@0.12.0-beta.28: version "0.12.0-beta.28" resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.28.tgz#252f88fd15816c23789659a0e2545682cf1eec9c" integrity sha512-xpqZRYlyv+aNdDl46W2Hi2fxakNvdJDmWhOwGHPjOmex+kOYdBvVn4rRZmJ7xrKFuQVOfzb3SQCmpZ/njCpBJA== </del> <ins> xterm-addon-webgl@0.12.0-beta.29: version "0.12.0-beta.29" resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.29.tgz#7a508595c4521d14d7ed4315a121f9e3f230a0f0" integrity sha512-NcZBsD0ar3ZpQX070hDIsyEBl/StRMNu6U+9crNpiD2rQVfkM1vcWkOv31Zlj3eu6/f8z5aStyZLRMCGFwiRbA== </ins> <del> xterm@4.19.0-beta.24: version "4.19.0-beta.24" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.24.tgz#12b62877d4cf133f4626db3a15f6ed267b3bbcb5" integrity sha512-GydvC2ExdsfjkiXhUVuZtDhc89IZfyMLFgw/nwWHrvkyq4iCVsHbMloEObV3lZmv+0oRpcGtTiorfzdWGiHG0A== </del> <ins> xterm@4.19.0-beta.25: version "4.19.0-beta.25" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.25.tgz#38f92d0fef1cfdb290ef8994449a04fa1a8c90a7" integrity sha512-pDiMWKN1Cj4+X/K9Xegp0SA0ZDEGVqiq7RPSy8oZO2wo2rze1BF20PAZb3/RSp30eY5WyOKilKnck4yNOsPzHw== </ins>


resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= <del> xterm-addon-search@0.9.0-beta.21: version "0.9.0-beta.21" resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.9.0-beta.21.tgz#5348fe25676cdd89ce3be52ae62a316b6f266176" integrity sha512-jh6kfRCpWRvZZkV9QghFYesSYHjybaLNEyYAD6uilZYfNHoGLa0zPgUkLOqoECL7K6rhBmSYOkKbc9MG4wNFMQ== </del> <ins> xterm-addon-search@0.9.0-beta.22: version "0.9.0-beta.22" resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.9.0-beta.22.tgz#18f2eabda82709cdd64dee003879b586869e28a3" integrity sha512-1I8W0bwjg6bUoNaESKHSkS9BN3Z9Xe44/zbUb6Un+pbb5Nun4LQvFwSLkAIdRrslxcbcHYIU/2Q7F1wCOWLbaA== </ins> xterm-addon-serialize@0.7.0-beta.12: version "0.7.0-beta.12"


resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.3.tgz#f350184155fafd5ad0d6fbf31d13e6ca7dea1efa" integrity sha512-FryZAVwbUjKTmwXnm1trch/2XO60F5JsDvOkZhzobV1hm10sFLVuZpFyHXiUx7TFeeFsvNP+S77LAtWoeT5z+Q== <del> xterm-addon-webgl@0.12.0-beta.28: version "0.12.0-beta.28" resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.28.tgz#252f88fd15816c23789659a0e2545682cf1eec9c" integrity sha512-xpqZRYlyv+aNdDl46W2Hi2fxakNvdJDmWhOwGHPjOmex+kOYdBvVn4rRZmJ7xrKFuQVOfzb3SQCmpZ/njCpBJA== </del> <ins> xterm-addon-webgl@0.12.0-beta.29: version "0.12.0-beta.29" resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.29.tgz#7a508595c4521d14d7ed4315a121f9e3f230a0f0" integrity sha512-NcZBsD0ar3ZpQX070hDIsyEBl/StRMNu6U+9crNpiD2rQVfkM1vcWkOv31Zlj3eu6/f8z5aStyZLRMCGFwiRbA== </ins> <del> xterm-headless@4.19.0-beta.24: version "4.19.0-beta.24" resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.19.0-beta.24.tgz#17dab68ae1b2600b0926d4c47032599f3b2f24cc" integrity sha512-Coq8gQ9f5/kNr1yhpXTZqatTOHOYDF4XVp93SM12vRROH64bM0rUMec6ukuTAd8DD97UOWYUgR+n7+xD0iTTSg== </del> <ins> xterm-headless@4.19.0-beta.25: version "4.19.0-beta.25" resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.19.0-beta.25.tgz#a0a1b59f386c44458f06b8ced64e3567371cc983" integrity sha512-UswSgymk3g9i6XTpFAasnqqIvWhi+AEWT+iO3kkjII6ll+dYEQgeZAv92EnCmeRHp11u5TP+IBAo8jy+aTYbtA== </ins> <del> xterm@4.19.0-beta.24: version "4.19.0-beta.24" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.24.tgz#12b62877d4cf133f4626db3a15f6ed267b3bbcb5" integrity sha512-GydvC2ExdsfjkiXhUVuZtDhc89IZfyMLFgw/nwWHrvkyq4iCVsHbMloEObV3lZmv+0oRpcGtTiorfzdWGiHG0A== </del> <ins> xterm@4.19.0-beta.25: version "4.19.0-beta.25" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.25.tgz#38f92d0fef1cfdb290ef8994449a04fa1a8c90a7" integrity sha512-pDiMWKN1Cj4+X/K9Xegp0SA0ZDEGVqiq7RPSy8oZO2wo2rze1BF20PAZb3/RSp30eY5WyOKilKnck4yNOsPzHw== </ins> yallist@^4.0.0: version "4.0.0"


import { KeyCode } from 'vs/base/common/keyCodes'; import { FindReplaceState } from 'vs/editor/contrib/find/browser/findState'; import { IMessage as InputBoxMessage } from 'vs/base/browser/ui/inputbox/inputBox'; <del> import { SimpleButton, findPreviousMatchIcon, findNextMatchIcon } from 'vs/editor/contrib/find/browser/findWidget'; </del> <ins> import { SimpleButton, findPreviousMatchIcon, findNextMatchIcon, NLS_NO_RESULTS, NLS_MATCHES_LOCATION } from 'vs/editor/contrib/find/browser/findWidget'; </ins> import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { editorWidgetBackground, inputActiveOptionBorder, inputActiveOptionBackground, inputActiveOptionForeground, inputBackground, inputBorder, inputForeground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationErrorForeground, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationWarningForeground, widgetShadow, editorWidgetForeground, errorForeground } from 'vs/platform/theme/common/colorRegistry'; import { IColorTheme, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { ContextScopedFindInput } from 'vs/platform/history/browser/contextScopedHistoryWidget'; import { widgetClose } from 'vs/platform/theme/common/iconRegistry'; <ins> import * as strings from 'vs/base/common/strings'; </ins> const NLS_FIND_INPUT_LABEL = nls.localize('label.find', "Find"); const NLS_FIND_INPUT_" = nls.localize('placeholder.find', "Find");


this._matchesCount.className = 'matchesCount'; } this._matchesCount.innerText = ''; <del> const label = count === undefined || count.resultCount === 0 ? `No Results` : `${count.resultIndex + 1} of ${count.resultCount}`; </del> <ins> let label; if (count?.resultCount === -1) { label = ''; } else { label = count === undefined || count.resultCount === 0 ? NLS_NO_RESULTS : strings.format(NLS_MATCHES_LOCATION, count.resultIndex + 1, count?.resultCount); } </ins> this._matchesCount.appendChild(document.createTextNode(label)); this._matchesCount.classList.toggle('no-results', !count || count.resultCount === 0); this._findInput?.domNode.insertAdjacentElement('afterend', this._matchesCount);


dependencies: object-keys "~0.4.0" <del> xterm-addon-search@0.9.0-beta.21: version "0.9.0-beta.21" resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.9.0-beta.21.tgz#5348fe25676cdd89ce3be52ae62a316b6f266176" integrity sha512-jh6kfRCpWRvZZkV9QghFYesSYHjybaLNEyYAD6uilZYfNHoGLa0zPgUkLOqoECL7K6rhBmSYOkKbc9MG4wNFMQ== </del> <ins> xterm-addon-search@0.9.0-beta.22: version "0.9.0-beta.22" resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.9.0-beta.22.tgz#18f2eabda82709cdd64dee003879b586869e28a3" integrity sha512-1I8W0bwjg6bUoNaESKHSkS9BN3Z9Xe44/zbUb6Un+pbb5Nun4LQvFwSLkAIdRrslxcbcHYIU/2Q7F1wCOWLbaA== </ins> xterm-addon-serialize@0.7.0-beta.12: version "0.7.0-beta.12"


resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.3.tgz#f350184155fafd5ad0d6fbf31d13e6ca7dea1efa" integrity sha512-FryZAVwbUjKTmwXnm1trch/2XO60F5JsDvOkZhzobV1hm10sFLVuZpFyHXiUx7TFeeFsvNP+S77LAtWoeT5z+Q== <del> xterm-addon-webgl@0.12.0-beta.28: version "0.12.0-beta.28" resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.28.tgz#252f88fd15816c23789659a0e2545682cf1eec9c" integrity sha512-xpqZRYlyv+aNdDl46W2Hi2fxakNvdJDmWhOwGHPjOmex+kOYdBvVn4rRZmJ7xrKFuQVOfzb3SQCmpZ/njCpBJA== </del> <ins> xterm-addon-webgl@0.12.0-beta.29: version "0.12.0-beta.29" resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.29.tgz#7a508595c4521d14d7ed4315a121f9e3f230a0f0" integrity sha512-NcZBsD0ar3ZpQX070hDIsyEBl/StRMNu6U+9crNpiD2rQVfkM1vcWkOv31Zlj3eu6/f8z5aStyZLRMCGFwiRbA== </ins> <del> xterm-headless@4.19.0-beta.24: version "4.19.0-beta.24" resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.19.0-beta.24.tgz#17dab68ae1b2600b0926d4c47032599f3b2f24cc" integrity sha512-Coq8gQ9f5/kNr1yhpXTZqatTOHOYDF4XVp93SM12vRROH64bM0rUMec6ukuTAd8DD97UOWYUgR+n7+xD0iTTSg== </del> <ins> xterm-headless@4.19.0-beta.25: version "4.19.0-beta.25" resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.19.0-beta.25.tgz#a0a1b59f386c44458f06b8ced64e3567371cc983" integrity sha512-UswSgymk3g9i6XTpFAasnqqIvWhi+AEWT+iO3kkjII6ll+dYEQgeZAv92EnCmeRHp11u5TP+IBAo8jy+aTYbtA== </ins> <del> xterm@4.19.0-beta.24: version "4.19.0-beta.24" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.24.tgz#12b62877d4cf133f4626db3a15f6ed267b3bbcb5" integrity sha512-GydvC2ExdsfjkiXhUVuZtDhc89IZfyMLFgw/nwWHrvkyq4iCVsHbMloEObV3lZmv+0oRpcGtTiorfzdWGiHG0A== </del> <ins> xterm@4.19.0-beta.25: version "4.19.0-beta.25" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.25.tgz#38f92d0fef1cfdb290ef8994449a04fa1a8c90a7" integrity sha512-pDiMWKN1Cj4+X/K9Xegp0SA0ZDEGVqiq7RPSy8oZO2wo2rze1BF20PAZb3/RSp30eY5WyOKilKnck4yNOsPzHw== </ins> y18n@^3.2.1: version "3.2.2"


const no = localize('no', "No"); const answer = await window.showInformationMessage(localize('fork', "You don't have permissions to push to '{0}/{1}' on GitHub. Would you like to create a fork and push to it instead?", owner, repo), yes, no); <del> if (answer === no) { </del> <ins> if (answer !== yes) { </ins> return; }


import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { ITextModel } from 'vs/editor/common/model'; import * as nls from 'vs/nls'; <del> import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; </del> <ins> import { IConfirmationResult, IDialogService } from 'vs/platform/dialogs/common/dialogs'; </ins> const ignoreUnusualLineTerminators = 'ignoreUnusualLineTerminators';


public static readonly ID = 'editor.contrib.unusualLineTerminatorsDetector'; private _config: 'auto' | 'off' | 'prompt'; <ins> private _isPresentingDialog: boolean = false; </ins> constructor( private readonly _editor: ICodeEditor,


return; } <del> const result = await this._dialogService.confirm({ title: nls.localize('unusualLineTerminators.title', "Unusual Line Terminators"), message: nls.localize('unusualLineTerminators.message', "Detected unusual line terminators"), detail: nls.localize('unusualLineTerminators.detail', "The file '{0}' contains one or more unusual line terminator characters, like Line Separator (LS) or Paragraph Separator (PS).nnIt is recommended to remove them from the file. This can be configured via `editor.unusualLineTerminators`.", basename(model.uri)), primaryButton: nls.localize('unusualLineTerminators.fix', "Remove Unusual Line Terminators"), secondaryButton: nls.localize('unusualLineTerminators.ignore', "Ignore") }); </del> <ins> if (this._isPresentingDialog) { // we're currently showing the dialog, which is async. // avoid spamming the user return; } let result: IConfirmationResult; try { this._isPresentingDialog = true; result = await this._dialogService.confirm({ title: nls.localize('unusualLineTerminators.title', "Unusual Line Terminators"), message: nls.localize('unusualLineTerminators.message', "Detected unusual line terminators"), detail: nls.localize('unusualLineTerminators.detail', "The file '{0}' contains one or more unusual line terminator characters, like Line Separator (LS) or Paragraph Separator (PS).nnIt is recommended to remove them from the file. This can be configured via `editor.unusualLineTerminators`.", basename(model.uri)), primaryButton: nls.localize('unusualLineTerminators.fix', "Remove Unusual Line Terminators"), secondaryButton: nls.localize('unusualLineTerminators.ignore', "Ignore") }); } finally { this._isPresentingDialog = false; } </ins> if (!result.confirmed) { // this model should be ignored


contextKey.set(true); this.compositeBar.addComposite({ id: viewContainer.id, name: viewContainer.title, order: viewContainer.order, requestedIndex: viewContainer.requestedIndex }); <del> const activeComposite = this.getActiveComposite(); if (activeComposite === undefined || activeComposite.getId() === viewContainer.id) { this.compositeBar.activateComposite(viewContainer.id); </del> <ins> if (this.layoutService.isVisible(this.partId)) { const activeComposite = this.getActiveComposite(); if (activeComposite === undefined || activeComposite.getId() === viewContainer.id) { this.compositeBar.activateComposite(viewContainer.id); } </ins> } this.layoutCompositeBar();


// User data let userDataProvider; if (indexedDB) { <del> userDataProvider = new IndexedDBFileSystemProvider(logsPath.scheme, indexedDB, userDataStore, false); </del> <ins> userDataProvider = new IndexedDBFileSystemProvider(Schemas.vscodeUserData, indexedDB, userDataStore, true); </ins> this.registerDeveloperActions(<IndexedDBFileSystemProvider>userDataProvider); } else { logService.info('Using in-memory user data provider');


public static readonly layoutStatusbar = new Codicon('layout-statusbar', { fontCharacter: 'ebf5' }); public static readonly layoutMenubar = new Codicon('layout-menubar', { fontCharacter: 'ebf6' }); public static readonly layoutCentered = new Codicon('layout-centered', { fontCharacter: 'ebf7' }); <ins> public static readonly layoutSidebarRightOff = new Codicon('layout-sidebar-right-off', { fontCharacter: 'ec00' }); public static readonly layoutPanelOff = new Codicon('layout-panel-off', { fontCharacter: 'ec01' }); public static readonly layoutSidebarLeftOff = new Codicon('layout-sidebar-left-off', { fontCharacter: 'ec02' }); </ins> public static readonly target = new Codicon('target', { fontCharacter: 'ebf8' }); public static readonly indent = new Codicon('indent', { fontCharacter: 'ebf9' }); public static readonly recordSmall = new Codicon('record-small', { fontCharacter: 'ebfa' });


if (beforeCommandExecution && !this._placeholderDecoration) { this._placeholderDecoration = decoration; this._placeholderDecoration.onDispose(() => this._placeholderDecoration = undefined); <del> } else { </del> <ins> } else if (!this._decorations.get(decoration.marker.id)) { </ins> decoration.onDispose(() => this._decorations.delete(decoration.marker.id)); this._decorations.set(decoration.marker.id, {


getTargetPlatform(): Promise<TargetPlatform>; <del> scanAllExtensions(systemScanOptions: ScanOptions, userScanOptions: ScanOptions): Promise<IScannedExtension[]>; </del> <ins> scanAllExtensions(systemScanOptions: ScanOptions, userScanOptions: ScanOptions, includeExtensionsUnderDev: boolean): Promise<IScannedExtension[]>; </ins> scanSystemExtensions(scanOptions: ScanOptions): Promise<IScannedExtension[]>; scanUserExtensions(scanOptions: ScanOptions): Promise<IScannedExtension[]>; scanExtensionsUnderDevelopment(scanOptions: ScanOptions, existingExtensions: IScannedExtension[]): Promise<IScannedExtension[]>;


return this._targetPlatformPromise; } <del> async scanAllExtensions(systemScanOptions: ScanOptions, userScanOptions: ScanOptions): Promise<IScannedExtension[]> { </del> <ins> async scanAllExtensions(systemScanOptions: ScanOptions, userScanOptions: ScanOptions, includeExtensionsUnderDev: boolean): Promise<IScannedExtension[]> { </ins> const [system, user] = await Promise.all([ this.scanSystemExtensions(systemScanOptions), this.scanUserExtensions(userScanOptions), ]); <del> const development = await this.scanExtensionsUnderDevelopment(systemScanOptions, [...system, ...user]); </del> <ins> const development = includeExtensionsUnderDev ? await this.scanExtensionsUnderDevelopment(systemScanOptions, [...system, ...user]) : []; </ins> return this.dedupExtensions(system, user, development, await this.getTargetPlatform(), true); }


const userScanOptions: ScanOptions = { includeInvalid: true, profileLocation }; let scannedExtensions: IScannedExtension[] = []; if (type === null || type === ExtensionType.System) { <del> scannedExtensions.push(...await this.extensionsScannerService.scanAllExtensions({ includeInvalid: true }, userScanOptions)); </del> <ins> scannedExtensions.push(...await this.extensionsScannerService.scanAllExtensions({ includeInvalid: true }, userScanOptions, false)); </ins> } else if (type === ExtensionType.User) { scannedExtensions.push(...await this.extensionsScannerService.scanUserExtensions(userScanOptions)); }


export default class TypeScriptServiceClient extends Disposable implements ITypeScriptServiceClient { private readonly pathSeparator: string; <ins> private readonly emptyAuthority = 'ts-nul-authority'; </ins> private readonly inMemoryResourcePrefix = '^'; private readonly workspaceState: vscode.Memento;


{ return this.inMemoryResourcePrefix + '/' + resource.scheme <del> + '/' + resource.authority </del> <ins> + '/' + (resource.authority || this.emptyAuthority) </ins> + (resource.path.startsWith('/') ? resource.path : '/' + resource.path) + (resource.fragment ? '#' + resource.fragment : ''); }


} if (filepath.startsWith(this.inMemoryResourcePrefix)) { <del> const parts = filepath.match(/^^/([^/]+)/(.+)$/); </del> <ins> const parts = filepath.match(/^^/([^/]+)/([^/]*)/(.+)$/); </ins> if (parts) { <del> const resource = vscode.Uri.parse(parts[1] + '://' + parts[2]); </del> <ins> const resource = vscode.Uri.parse(parts[1] + '://' + (parts[2] === this.emptyAuthority ? '' : parts[2]) + '/' + parts[3]); </ins> return this.bufferSyncSupport.toVsCodeResource(resource); } }


this._buttonElements.forEach(b => b.remove()); const groups = menu.getActions({ shouldForwardArgs: true }); <ins> let isPrimary: boolean = true; </ins> for (const group of groups) { const [, actions] = group; this._actions = actions; <del> actions.forEach(action => { const button = new Button(this.container); </del> <ins> for (const action of actions) { const button = new Button(this.container, { secondary: !isPrimary }); isPrimary = false; </ins> this._buttonElements.push(button.element); this._toDispose.add(button);


button.enabled = action.enabled; button.label = action.label; <del> }); </del> <ins> } </ins> } }


padding: 10px 0; } <del> .review-widget .body .edit-container .form-actions { display: flex; justify-content: flex-end; } </del> .review-widget .body .edit-textarea { height: 90px; margin: 5px 0 10px 0;


margin-bottom: 5px; } <del> .review-widget .body .comment-form .monaco-text-button { </del> <ins> .review-widget .body .form-actions .monaco-text-button { </ins> float: right; }


} } <del> async function runCell(accessor: ServicesAccessor, context: INotebookActionContext): Promise<void> { const editorGroupService = accessor.get(IEditorGroupsService); const group = editorGroupService.activeGroup; </del> <ins> async function runCell(editorGroupsService: IEditorGroupsService, context: INotebookActionContext): Promise<void> { const group = editorGroupsService.activeGroup; </ins> if (group) { if (group.activeEditor) {


} async runWithContext(accessor: ServicesAccessor, context: INotebookCommandContext | INotebookCellToolbarActionContext): Promise<void> { <ins> const editorGroupsService = accessor.get(IEditorGroupsService); </ins> if (context.ui) { await context.notebookEditor.focusNotebookCell(context.cell, 'container', { skipReveal: true }); } <del> return runCell(accessor, context); </del> <ins> return runCell(editorGroupsService, context); </ins> } });


} async runWithContext(accessor: ServicesAccessor, context: INotebookCommandContext | INotebookCellToolbarActionContext): Promise<void> { <ins> const editorGroupsService = accessor.get(IEditorGroupsService); </ins> if (context.ui) { await context.notebookEditor.focusNotebookCell(context.cell, 'container', { skipReveal: true }); } else {


} } <del> await runCell(accessor, context); </del> <ins> await runCell(editorGroupsService, context); </ins> } });


} async runWithContext(accessor: ServicesAccessor, context: INotebookCellActionContext): Promise<void> { <ins> const editorGroupsService = accessor.get(IEditorGroupsService); </ins> const idx = context.notebookEditor.getCellIndex(context.cell); if (typeof idx !== 'number') { return;


} } <del> return runCell(accessor, context); </del> <ins> return runCell(editorGroupsService, context); </ins> } } });


} async runWithContext(accessor: ServicesAccessor, context: INotebookCellActionContext): Promise<void> { <ins> const editorGroupsService = accessor.get(IEditorGroupsService); </ins> const idx = context.notebookEditor.getCellIndex(context.cell); const languageService = accessor.get(ILanguageService); const newFocusMode = context.cell.focusMode === CellFocusMode.Editor ? 'editor' : 'container';


if (context.cell.cellKind === CellKind.Markup) { context.cell.updateEditState(CellEditState.Preview, EXECUTE_CELL_INSERT_BELOW); } else { <del> runCell(accessor, context); </del> <ins> runCell(editorGroupsService, context); </ins> } } });


"vscode-proxy-agent": "^0.12.0", "vscode-regexpp": "^3.1.0", "vscode-textmate": "7.0.1", <del> "xterm": "4.19.0-beta.47", </del> <ins> "xterm": "4.19.0-beta.49", </ins> "xterm-addon-search": "0.9.0-beta.37", "xterm-addon-serialize": "0.7.0-beta.12", "xterm-addon-unicode11": "0.4.0-beta.3", "xterm-addon-webgl": "0.12.0-beta.36", <del> "xterm-headless": "4.19.0-beta.47", </del> <ins> "xterm-headless": "4.19.0-beta.49", </ins> "yauzl": "^2.9.2", "yazl": "^2.4.3" },


"tas-client-umd": "0.1.5", "vscode-oniguruma": "1.6.1", "vscode-textmate": "7.0.1", <del> "xterm": "4.19.0-beta.47", </del> <ins> "xterm": "4.19.0-beta.49", </ins> "xterm-addon-search": "0.9.0-beta.37", "xterm-addon-unicode11": "0.4.0-beta.3", "xterm-addon-webgl": "0.12.0-beta.36"


resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.36.tgz#460f80829a78c979a448d5b764699af3f0366ff1" integrity sha512-sgX7OHSGZQZE5b4xtPqd/5NEcll0Z+00tnTVxKZlXf5XEENcG0tnBF4I4f+k9K3cmjE1UIUVG2yYPrqWlYCdpA== <del> xterm@4.19.0-beta.47: version "4.19.0-beta.47" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.47.tgz#f5931201346a485e3bcb29d24e83583727e55707" integrity sha512-c8EcCSWCHnFYNdRMTnJIpYTV9J2Ze7kdB1GhTcPO2ipMEsqaP/u6Ca8rgBWwV9HeEVfe4rGRqWW2qcSy4U9hMQ== </del> <ins> xterm@4.19.0-beta.49: version "4.19.0-beta.49" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.49.tgz#96d0d748c97a2f0cfa4c6112bc4de8b0d5d559fe" integrity sha512-qPhOeGtnB357mZOvfDckVlPDR7EDkSASQrB3aujhjgJlOiBBqcNRJcuSvF7v1DOho7xdEI9UQxiSiT5diHhMlg== </ins>


resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.36.tgz#460f80829a78c979a448d5b764699af3f0366ff1" integrity sha512-sgX7OHSGZQZE5b4xtPqd/5NEcll0Z+00tnTVxKZlXf5XEENcG0tnBF4I4f+k9K3cmjE1UIUVG2yYPrqWlYCdpA== <del> xterm-headless@4.19.0-beta.47: version "4.19.0-beta.47" resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.19.0-beta.47.tgz#9d5af8145c42b9a6241a040bb244b877c149761b" integrity sha512-chVTURPMNDEerQIsN4lIRotpXCfJsTHioZGQxDBNdktZO1gMXGvNxDjzsbsJg5ikLN5llz/HLDfXZrjCeb3elg== xterm@4.19.0-beta.47: version "4.19.0-beta.47" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.47.tgz#f5931201346a485e3bcb29d24e83583727e55707" integrity sha512-c8EcCSWCHnFYNdRMTnJIpYTV9J2Ze7kdB1GhTcPO2ipMEsqaP/u6Ca8rgBWwV9HeEVfe4rGRqWW2qcSy4U9hMQ== </del> <ins> xterm-headless@4.19.0-beta.49: version "4.19.0-beta.49" resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.19.0-beta.49.tgz#8e4178620be9a9dee25a586ef992a6fc621a829a" integrity sha512-uRnHpR2pv1MJPbE3sa7XbP6x0uHubAWVMbiD26e3a5ICtWJQVVpLojkA0t4qU7CoMX85pRL1rIclg9CKY0B0xA== xterm@4.19.0-beta.49: version "4.19.0-beta.49" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.49.tgz#96d0d748c97a2f0cfa4c6112bc4de8b0d5d559fe" integrity sha512-qPhOeGtnB357mZOvfDckVlPDR7EDkSASQrB3aujhjgJlOiBBqcNRJcuSvF7v1DOho7xdEI9UQxiSiT5diHhMlg== </ins> yallist@^4.0.0: version "4.0.0"


resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.36.tgz#460f80829a78c979a448d5b764699af3f0366ff1" integrity sha512-sgX7OHSGZQZE5b4xtPqd/5NEcll0Z+00tnTVxKZlXf5XEENcG0tnBF4I4f+k9K3cmjE1UIUVG2yYPrqWlYCdpA== <del> xterm-headless@4.19.0-beta.47: version "4.19.0-beta.47" resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.19.0-beta.47.tgz#9d5af8145c42b9a6241a040bb244b877c149761b" integrity sha512-chVTURPMNDEerQIsN4lIRotpXCfJsTHioZGQxDBNdktZO1gMXGvNxDjzsbsJg5ikLN5llz/HLDfXZrjCeb3elg== xterm@4.19.0-beta.47: version "4.19.0-beta.47" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.47.tgz#f5931201346a485e3bcb29d24e83583727e55707" integrity sha512-c8EcCSWCHnFYNdRMTnJIpYTV9J2Ze7kdB1GhTcPO2ipMEsqaP/u6Ca8rgBWwV9HeEVfe4rGRqWW2qcSy4U9hMQ== </del> <ins> xterm-headless@4.19.0-beta.49: version "4.19.0-beta.49" resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.19.0-beta.49.tgz#8e4178620be9a9dee25a586ef992a6fc621a829a" integrity sha512-uRnHpR2pv1MJPbE3sa7XbP6x0uHubAWVMbiD26e3a5ICtWJQVVpLojkA0t4qU7CoMX85pRL1rIclg9CKY0B0xA== xterm@4.19.0-beta.49: version "4.19.0-beta.49" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.49.tgz#96d0d748c97a2f0cfa4c6112bc4de8b0d5d559fe" integrity sha512-qPhOeGtnB357mZOvfDckVlPDR7EDkSASQrB3aujhjgJlOiBBqcNRJcuSvF7v1DOho7xdEI9UQxiSiT5diHhMlg== </ins> y18n@^3.2.1: version "3.2.2"


color: var(--vscode-descriptionForeground); } <ins> .monaco-list-row.selected .extension-list-item > .details > .description{ color: unset; } </ins> .hc-black .extension-list-item > .details > .description, .hc-light .extension-list-item > .details > .description { color: unset;


"configuration.markdown.links.openLocation.currentGroup": "Open links in the active editor group.", "configuration.markdown.links.openLocation.beside": "Open links beside the active editor.", "configuration.markdown.suggest.paths.enabled.description": "Enable/disable path suggestions for markdown links", <del> "configuration.markdown.editor.drop.enabled": "Enable/disable dropping into the markdown editor to insert shift. Requires enabling `#workbenck.experimental.editor.dropIntoEditor.enabled#`.", </del> <ins> "configuration.markdown.editor.drop.enabled": "Enable/disable dropping into the markdown editor to insert shift. Requires enabling `#workbench.experimental.editor.dropIntoEditor.enabled#`.", </ins> "configuration.markdown.experimental.validate.enabled.description": "Enable/disable all error reporting in Markdown files.", "configuration.markdown.experimental.validate.referenceLinks.enabled.description": "Validate reference links in Markdown files, e.g. `[link][ref]`.  Requires enabling `#markdown.experimental.validate.enabled#`.", "configuration.markdown.experimental.validate.headerLinks.enabled.description": "Validate links to headers in Markdown files, e.g. `[link](#header)`. Requires enabling `#markdown.experimental.validate.enabled#`.",


"configuration.markdown.links.openLocation.currentGroup": "Open links in the active editor group.", "configuration.markdown.links.openLocation.beside": "Open links beside the active editor.", "configuration.markdown.suggest.paths.enabled.description": "Enable/disable path suggestions for markdown links", <del> "configuration.markdown.editor.drop.enabled": "Enable/disable dropping into the markdown editor to insert shift. Requires enabling `#workbenck.experimental.editor.dropIntoEditor.enabled#`.", </del> <ins> "configuration.markdown.editor.drop.enabled": "Enable/disable dropping into the markdown editor to insert shift. Requires enabling `#workbench.experimental.editor.dropIntoEditor.enabled#`.", </ins> "configuration.markdown.editor.pasteLinks.enabled": "Enable/disable pasting files into a Markdown editor inserts Markdown links.", "configuration.markdown.experimental.validate.enabled.description": "Enable/disable all error reporting in Markdown files.", "configuration.markdown.experimental.validate.referenceLinks.enabled.description": "Validate reference links in Markdown files, e.g. `[link][ref]`.  Requires enabling `#markdown.experimental.validate.enabled#`.",


}); } <del> MenuRegistry.appendMenuItem(MenuId.TitleMenu, { command: { id: NavigateBackwardsAction.ID, title: NavigateBackwardsAction.LABEL, icon: Codicon.arrowLeft } }); MenuRegistry.appendMenuItem(MenuId.TitleMenu, { command: { id: NavigateForwardAction.ID, title: NavigateForwardAction.LABEL, icon: Codicon.arrowRight } }); </del> <ins> MenuRegistry.appendMenuItem(MenuId.TitleMenu, { order: 1, command: { id: NavigateBackwardsAction.ID, title: NavigateBackwardsAction.LABEL, icon: Codicon.arrowLeft } }); MenuRegistry.appendMenuItem(MenuId.TitleMenu, { order: 2, command: { id: NavigateForwardAction.ID, title: NavigateForwardAction.LABEL, icon: Codicon.arrowRight } }); </ins> // Empty Editor Group Toolbar MenuRegistry.appendMenuItem(MenuId.EmptyEditorGroup, { command: { id: UNLOCK_GROUP_COMMAND_ID, title: localize('unlockGroupAction', "Unlock Group"), icon: Codicon.lock }, group: 'navigation', order: 10, when: ActiveEditorGroupLockedContext });


// Shared before/after handling installAllHandlers(logger); <del> // skipped until translations are available https://github.com/microsoft/vscode/issues/150324 it.skip('starts with "DE" locale and verifies title and viewlets text is in German', async function () { </del> <ins> it('starts with "DE" locale and verifies title and viewlets text is in German', async function () { </ins> const app = this.app as Application; await app.workbench.extensions.openExtensionsViewlet();


// Check for invalid file name. if (names.some(folderName => !pathService.hasValidBasename(item.resource, os, folderName))) { <ins> // Escape * characters const escapedName = name.replace(/*/g, '*'); </ins> return { <del> content: nls.localize('invalidFileNameError', "The name **{0}** is not valid as a file or folder name. Please choose a different name.", trimLongName(name)), </del> <ins> content: nls.localize('invalidFileNameError', "The name **{0}** is not valid as a file or folder name. Please choose a different name.", trimLongName(escapedName)), </ins> severity: Severity.Error }; }


/** * Matches `[text](link)` */ <del> const linkPattern = /([((![[^]]*?](s*)([^s()]+?)s*)]|(?:]|[^]])*])(s*)(([^s()]|([^s()]*?))+)s*("[^"]*"|'[^']*'|([^()]*))?s*)/g; </del> <ins> const linkPattern = /([((![[^]]*?](s*)([^s()]+?)s*)]|(?:]|[^]]|][^(])*])(s*)(([^s()]|([^s()]*?))+)s*("[^"]*"|'[^']*'|([^()]*))?s*)/g; </ins> /** * Matches `[text](<link>)` */ <del> const linkPatternAngle = /([((![[^]]*?](s*)([^s()]+?)s*)]|(?:]|[^]])*])(s*<)(([^<>]|([^s()]*?))+)>s*("[^"]*"|'[^']*'|([^()]*))?s*)/g; </del> <ins> const linkPatternAngle = /([((![[^]]*?](s*)([^s()]+?)s*)]|(?:]|[^]]|][^(])*])(s*<)(([^<>]|([^s()]*?))+)>s*("[^"]*"|'[^']*'|([^()]*))?s*)/g; </ins> /**


} }); <ins> test('Should ignore texts in brackets inside link title (#150921)', async () => { { const links = await getLinksForFile('[some [inner bracket pairs] in title](<link>)'); assertLinksEqual(links, [ new vscode.Range(0, 39, 0, 43), ]); } { const links = await getLinksForFile('[some [inner bracket pairs] in title](link)'); assertLinksEqual(links, [ new vscode.Range(0, 38, 0, 42) ]); } }); </ins> test('Should handle two links without space', async () => { const links = await getLinksForFile('a ([test](test)[test2](test2)) c'); assertLinksEqual(links, [


private *getReferenceLinks(document: ITextDocument, noLinkRanges: NoLinkRanges): Iterable<MdLink> { const text = document.getText(); for (const match of text.matchAll(referenceLinkPattern)) { <del> const linkStart = document.positionAt(match.index ?? 0); </del> <ins> const linkStartOffset = (match.index ?? 0) + match[1].length; const linkStart = document.positionAt(linkStartOffset); </ins> if (noLinkRanges.contains(linkStart)) { continue; }


let reference = match[4]; if (reference === '') { // [ref][], reference = match[3]; <del> const offset = ((match.index ?? 0) + match[1].length) + 1; </del> <ins> const offset = linkStartOffset + 1; </ins> hrefStart = document.positionAt(offset); hrefEnd = document.positionAt(offset + reference.length); } else if (reference) { // [text][ref] const pre = match[2]; <del> const offset = ((match.index ?? 0) + match[1].length) + pre.length; </del> <ins> const offset = linkStartOffset + pre.length; </ins> hrefStart = document.positionAt(offset); hrefEnd = document.positionAt(offset + reference.length); } else if (match[5]) { // [ref] reference = match[5]; <del> const offset = ((match.index ?? 0) + match[1].length) + 1; </del> <ins> const offset = linkStartOffset + 1; </ins> hrefStart = document.positionAt(offset); const line = getLine(document, hrefStart.line); // See if link looks like a checkbox


continue; } <del> const linkEnd = linkStart.translate(0, match[0].length); </del> <ins> const linkEnd = linkStart.translate(0, match[0].length - match[1].length); </ins> yield { kind: 'link', source: {


new vscode.Range(0, 35, 0, 39), ]); } <ins> { const links = await getLinksForFile(joinLines( `# h`, `[[a]](http://example.com)`, )); assertLinksEqual(links, [ new vscode.Range(1, 6, 1, 24), ]); } </ins> }); test('Should handle two links without space', async () => {


import { dispose } from 'vs/base/common/lifecycle'; import { IExtension, ExtensionState, IExtensionsWorkbenchService, VIEWLET_ID, IExtensionsViewPaneContainer, IExtensionContainer, TOGGLE_IGNORE_EXTENSION_ACTION_ID, SELECT_INSTALL_VSIX_EXTENSION_COMMAND_ID, THEME_ACTIONS_GROUP, INSTALL_ACTIONS_GROUP } from 'vs/workbench/contrib/extensions/common/extensions'; import { ExtensionsConfigurationInitialContent } from 'vs/workbench/contrib/extensions/common/extensionsFileTemplate'; <del> import { IGalleryExtension, IExtensionGalleryService, ILocalExtension, InstallOptions, InstallOperation, TargetPlatformToString, ExtensionManagementErrorCode } from 'vs/platform/extensionManagement/common/extensionManagement'; </del> <ins> import { IGalleryExtension, IExtensionGalleryService, ILocalExtension, InstallOptions, InstallOperation, TargetPlatformToString, ExtensionManagementErrorCode, isTargetPlatformCompatible } from 'vs/platform/extensionManagement/common/extensionManagement'; </ins> import { IWorkbenchExtensionEnablementService, EnablementState, IExtensionManagementServerService, IExtensionManagementServer, IWorkbenchExtensionManagementService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { ExtensionRecommendationReason, IExtensionIgnoredRecommendationsService, IExtensionRecommendationsService } from 'vs/workbench/services/extensionRecommendations/common/extensionRecommendations'; import { areSameExtensions, getExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil';


@IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, @IExtensionManagementServerService protected readonly extensionManagementServerService: IExtensionManagementServerService, @IExtensionManifestPropertiesService private readonly extensionManifestPropertiesService: IExtensionManifestPropertiesService, <ins> @IExtensionGalleryService private readonly extensionGalleryService: IExtensionGalleryService, </ins> ) { super(id, InstallInOtherServerAction.INSTALL_LABEL, InstallInOtherServerAction.Class, false); this.update();


} override async run(): Promise<void> { <del> if (!this.extension) { </del> <ins> if (!this.extension?.local) { </ins> return; } <del> if (this.server) { this.extensionsWorkbenchService.open(this.extension); alert(localize('installExtensionStart', "Installing extension {0} started. An editor is now open with more details on this extension", this.extension.displayName)); if (this.extension.gallery) { await this.server.extensionManagementService.installFromGallery(this.extension.gallery, { installPreReleaseVersion: this.extension.local?.preRelease }); } else { const vsix = await this.extension.server!.extensionManagementService.zip(this.extension.local!); await this.server.extensionManagementService.install(vsix); } </del> <ins> if (!this.extension?.server) { return; } if (!this.server) { return; } this.extensionsWorkbenchService.open(this.extension); alert(localize('installExtensionStart', "Installing extension {0} started. An editor is now open with more details on this extension", this.extension.displayName)); const gallery = this.extension.gallery ?? (this.extensionGalleryService.isEnabled() && (await this.extensionGalleryService.getExtensions([this.extension.identifier], CancellationToken.None))[0]); if (gallery) { await this.server.extensionManagementService.installFromGallery(gallery, { installPreReleaseVersion: this.extension.local.preRelease }); return; } const targetPlatform = await this.server.extensionManagementService.getTargetPlatform(); if (!isTargetPlatformCompatible(this.extension.local.targetPlatform, [this.extension.local.targetPlatform], targetPlatform)) { throw new Error(localize('incompatible', "Can't install '{0}' extension because it is not compatible.", this.extension.identifier.id)); </ins> } <ins> const vsix = await this.extension.server.extensionManagementService.zip(this.extension.local); await this.server.extensionManagementService.install(vsix); </ins> } protected abstract getInstallLabel(): string;


@IExtensionsWorkbenchService extensionsWorkbenchService: IExtensionsWorkbenchService, @IExtensionManagementServerService extensionManagementServerService: IExtensionManagementServerService, @IExtensionManifestPropertiesService extensionManifestPropertiesService: IExtensionManifestPropertiesService, <ins> @IExtensionGalleryService extensionGalleryService: IExtensionGalleryService, </ins> ) { <del> super(`extensions.remoteinstall`, extensionManagementServerService.remoteExtensionManagementServer, canInstallAnyWhere, extensionsWorkbenchService, extensionManagementServerService, extensionManifestPropertiesService); </del> <ins> super(`extensions.remoteinstall`, extensionManagementServerService.remoteExtensionManagementServer, canInstallAnyWhere, extensionsWorkbenchService, extensionManagementServerService, extensionManifestPropertiesService, extensionGalleryService); </ins> } protected getInstallLabel(): string {


@IExtensionsWorkbenchService extensionsWorkbenchService: IExtensionsWorkbenchService, @IExtensionManagementServerService extensionManagementServerService: IExtensionManagementServerService, @IExtensionManifestPropertiesService extensionManifestPropertiesService: IExtensionManifestPropertiesService, <ins> @IExtensionGalleryService extensionGalleryService: IExtensionGalleryService, </ins> ) { <del> super(`extensions.localinstall`, extensionManagementServerService.localExtensionManagementServer, false, extensionsWorkbenchService, extensionManagementServerService, extensionManifestPropertiesService); </del> <ins> super(`extensions.localinstall`, extensionManagementServerService.localExtensionManagementServer, false, extensionsWorkbenchService, extensionManagementServerService, extensionManifestPropertiesService, extensionGalleryService); </ins> } protected getInstallLabel(): string {


@IExtensionsWorkbenchService extensionsWorkbenchService: IExtensionsWorkbenchService, @IExtensionManagementServerService extensionManagementServerService: IExtensionManagementServerService, @IExtensionManifestPropertiesService extensionManifestPropertiesService: IExtensionManifestPropertiesService, <ins> @IExtensionGalleryService extensionGalleryService: IExtensionGalleryService, </ins> ) { <del> super(`extensions.webInstall`, extensionManagementServerService.webExtensionManagementServer, false, extensionsWorkbenchService, extensionManagementServerService, extensionManifestPropertiesService); </del> <ins> super(`extensions.webInstall`, extensionManagementServerService.webExtensionManagementServer, false, extensionsWorkbenchService, extensionManagementServerService, extensionManifestPropertiesService, extensionGalleryService); </ins> } protected getInstallLabel(): string {


renderElement(node: ITreeNode<Call, FuzzyScore>, _index: number, template: CallRenderingTemplate): void { const { element, filterData } = node; const deprecated = element.item.tags?.includes(SymbolTag.Deprecated); <ins> template.icon.className = ''; </ins> template.icon.classList.add('inline', ...CSSIcon.asClassNameArray(SymbolKinds.toIcon(element.item.kind))); template.label.setLabel( element.item.name,


comment: ['The task command line or label'] }, 'Executing task: {0}', commandLine), { excludeLeadingNewLine: true }) + taskShellIntegrationOutputSequence; } <ins> } else { shellLaunchConfig.initialText = taskShellIntegrationStartSequence + taskShellIntegrationOutputSequence; </ins> } } else { const commandExecutable = (task.command.runtime !== RuntimeType.CustomExecution) ? CommandString.value(command) : undefined;


comment: ['The task command line or label'] }, 'Executing task: {0}', `${shellLaunchConfig.executable} ${getArgsToEcho(shellLaunchConfig.args)}`), { excludeLeadingNewLine: true }) + taskShellIntegrationOutputSequence; } <ins> } else { shellLaunchConfig.initialText = taskShellIntegrationStartSequence + taskShellIntegrationOutputSequence; </ins> } }


/** * A string including ANSI escape sequences that will be written to the terminal emulator <del> * _before_ the terminal process has launched, a trailing n is added at the end of the string. * This allows for example the terminal instance to display a styled message as the first line * of the terminal. Use x1b over 033 or e for the escape control character. </del> <ins> * _before_ the terminal process has launched, when a string is specified, a trailing n is * added at the end. This allows for example the terminal instance to display a styled message * as the first line of the terminal. Use x1b over 033 or e for the escape control character. </ins> */ <del> initialText?: string; </del> <ins> initialText?: string | { text: string; trailingNewLine: boolean }; </ins> /** * Custom PTY/pseudoterminal process to use.


executableEnv, options }; <del> const persistentProcess = new PersistentTerminalProcess(id, process, workspaceId, workspaceName, shouldPersist, cols, rows, processLaunchOptions, unicodeVersion, this._reconnectConstants, this._logService, isReviving ? shellLaunchConfig.initialText : undefined, rawReviveBuffer, shellLaunchConfig.icon, shellLaunchConfig.color, shellLaunchConfig.name, shellLaunchConfig.fixedDimensions); </del> <ins> const persistentProcess = new PersistentTerminalProcess(id, process, workspaceId, workspaceName, shouldPersist, cols, rows, processLaunchOptions, unicodeVersion, this._reconnectConstants, this._logService, isReviving && typeof shellLaunchConfig.initialText === 'string' ? shellLaunchConfig.initialText : undefined, rawReviveBuffer, shellLaunchConfig.icon, shellLaunchConfig.color, shellLaunchConfig.name, shellLaunchConfig.fixedDimensions); </ins> process.onDidChangeProperty(property => this._onDidChangeProperty.fire({ id, property })); process.onProcessExit(event => { persistentProcess.dispose();


}, 'Executing task: {0}', commandLine), { excludeLeadingNewLine: true }) + this.taskShellIntegrationOutputSequence; } } else { <del> shellLaunchConfig.initialText = this.taskShellIntegrationStartSequence + this.taskShellIntegrationOutputSequence; </del> <ins> shellLaunchConfig.initialText = { text: this.taskShellIntegrationStartSequence + this.taskShellIntegrationOutputSequence, trailingNewLine: false }; </ins> } } else { const commandExecutable = (task.command.runtime !== RuntimeType.CustomExecution) ? CommandString.value(command) : undefined;


}, 'Executing task: {0}', `${shellLaunchConfig.executable} ${getArgsToEcho(shellLaunchConfig.args)}`), { excludeLeadingNewLine: true }) + this.taskShellIntegrationOutputSequence; } } else { <del> shellLaunchConfig.initialText = this.taskShellIntegrationStartSequence + this.taskShellIntegrationOutputSequence; </del> <ins> shellLaunchConfig.initialText = { text: this.taskShellIntegrationStartSequence + this.taskShellIntegrationOutputSequence, trailingNewLine: false }; </ins> } }


// Write initial text, deferring onLineFeed listener when applicable to avoid firing // onLineData events containing initialText if (this._shellLaunchConfig.initialText) { <del> this.xterm.raw.writeln(this._shellLaunchConfig.initialText, () => { </del> <ins> this._writeInitialText(this.xterm, () => { </ins> lineDataEventAddon.onLineData(e => this._onLineData.fire(e)); }); } else {


} } <ins> private _writeInitialText(xterm: XtermTerminal, callback?: () => void): void { if (!this._shellLaunchConfig.initialText) { callback?.(); return; } const text = typeof this._shellLaunchConfig.initialText === 'string' ? this._shellLaunchConfig.initialText : this._shellLaunchConfig.initialText?.text; if (typeof this._shellLaunchConfig.initialText === 'string') { xterm.raw.writeln(text, callback); } else { if (this._shellLaunchConfig.initialText.trailingNewLine) { xterm.raw.writeln(text, callback); } else { xterm.raw.write(text, callback); } } } </ins> async reuseTerminal(shell: IShellLaunchConfig, reset: boolean = false): Promise<void> { // Unsubscribe any key listener we may have. this._pressAnyKeyToCloseListener?.dispose(); this._pressAnyKeyToCloseListener = undefined; <del> if (this.xterm) { </del> <ins> const xterm = this.xterm; if (xterm) { </ins> if (!reset) { // Ensure new processes' output starts at start of new line <del> await new Promise<void>(r => this.xterm!.raw.write('nx1b[G', r)); </del> <ins> await new Promise<void>(r => xterm.raw.write('nx1b[G', r)); </ins> } // Print initialText if specified if (shell.initialText) { <del> await new Promise<void>(r => this.xterm!.raw.writeln(shell.initialText!, r)); </del> <ins> await new Promise<void>(r => this._writeInitialText(xterm, r)); </ins> } // Clean up waitOnExit state if (this._isExiting && this._shellLaunchConfig.waitOnExit) { <del> this.xterm.raw.options.disableStdin = false; </del> <ins> xterm.raw.options.disableStdin = false; </ins> this._isExiting = false; } if (reset) { <del> this.xterm.clearDecorations(); </del> <ins> xterm.clearDecorations(); </ins> } }


private async smartCommit( repository: Repository, getCommitMessage: () => Promise<string | undefined>, <del> opts?: CommitOptions </del> <ins> opts: CommitOptions </ins> ): Promise<boolean> { const config = workspace.getConfiguration('git', Uri.file(repository.root)); let promptToSaveFilesBeforeCommit = config.get<'always' | 'staged' | 'never'>('promptToSaveFilesBeforeCommit');


} } <del> if (!opts) { opts = { all: noStagedChanges }; } else if (!opts.all && noStagedChanges && !opts.empty) { opts = { ...opts, all: true }; } </del> // no changes, and the user has not configured to commit all in this case <del> if (!noUnstagedChanges && noStagedChanges && !enableSmartCommit && !opts.empty) { </del> <ins> if (!noUnstagedChanges && noStagedChanges && !enableSmartCommit && !opts.empty && !opts.all) { </ins> const suggestSmartCommit = config.get<boolean>('suggestSmartCommit') === true; if (!suggestSmartCommit) {


} } <ins> if (opts.all === undefined) { opts = { all: noStagedChanges }; } else if (!opts.all && noStagedChanges && !opts.empty) { opts = { ...opts, all: true }; } </ins> // enable signing of commits if configured opts.signCommit = enableCommitSigning;


return true; } <del> private async commitWithAnyInput(repository: Repository, opts?: CommitOptions): Promise<void> { </del> <ins> private async commitWithAnyInput(repository: Repository, opts: CommitOptions): Promise<void> { </ins> const message = repository.inputBox.value; const root = Uri.file(repository.root); const config = workspace.getConfiguration('git', root);


import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ITerminalCommand, TerminalCapability } from 'vs/platform/terminal/common/capabilities/capabilities'; import { TerminalCapabilityStoreMultiplexer } from 'vs/platform/terminal/common/capabilities/terminalCapabilityStore'; <del> import { IProcessDataEvent, IProcessPropertyMap, IShellLaunchConfig, ITerminalDimensionsOverride, ITerminalLaunchError, ProcessPropertyType, TerminalIcon, TerminalLocation, TerminalSettingId, TerminalShellType, TitleEventSource, WindowsShellType } from 'vs/platform/terminal/common/terminal'; </del> <ins> import { IProcessDataEvent, IProcessPropertyMap, IShellLaunchConfig, ITerminalDimensionsOverride, ITerminalLaunchError, PosixShellType, ProcessPropertyType, TerminalIcon, TerminalLocation, TerminalSettingId, TerminalShellType, TitleEventSource, WindowsShellType } from 'vs/platform/terminal/common/terminal'; </ins> import { escapeNonWindowsPath } from 'vs/platform/terminal/common/terminalEnvironment'; import { activeContrastBorder, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground } from 'vs/platform/theme/common/colorRegistry'; import { IColorTheme, ICssStyleCollector, IThemeService, registerThemingParticipant, ThemeIcon } from 'vs/platform/theme/common/themeService';


rows: number; } <ins> const shellIntegrationSupportedShellTypes = [PosixShellType.Bash, PosixShellType.Zsh, PosixShellType.PowerShell, WindowsShellType.PowerShell]; </ins> const scrollbarHeight = 5; class TerminalOutputProvider implements ITextModelContentProvider {


} get disableShellIntegrationReporting(): boolean { if (this._disableShellIntegrationReporting === undefined) { <del> this._disableShellIntegrationReporting = this.shellLaunchConfig.isFeatureTerminal || this.shellLaunchConfig.hideFromUser || this.shellLaunchConfig.executable === undefined; </del> <ins> this._disableShellIntegrationReporting = (this.shellLaunchConfig.hideFromUser || this.shellLaunchConfig.executable === undefined || this.shellType === undefined) || !shellIntegrationSupportedShellTypes.includes(this.shellType); </ins> } return this._disableShellIntegrationReporting; }


"terminal.ansiBrightMagenta": "#6c71c4", "terminal.ansiBrightCyan": "#93a1a1", "terminal.ansiBrightWhite": "#fdf6e3", <ins> // Set terminal background explicitly, otherwise selection becomes invisible when the // terminal is in the side bar "terminal.background": "#FDF6E3", </ins> // Interactive Playground "walkThrough.embeddedEditorBackground": "#00000014" },


DataTransfers.RESOURCES, ]); <del> export function addExternalEditorsDropData(dataTransfer: VSDataTransfer, dragEvent: DragEvent) { if (dragEvent.dataTransfer && !dataTransfer.has(Mimes.uriList)) { </del> <ins> export function addExternalEditorsDropData(dataTransfer: VSDataTransfer, dragEvent: DragEvent, overwriteUriList = false) { if (dragEvent.dataTransfer && (overwriteUriList || !dataTransfer.has(Mimes.uriList))) { </ins> const editorData = extractEditorsDropData(dragEvent) .filter(input => input.resource) .map(input => input.resource!.toString());


} const originalDataTransfer = toVSDataTransfer(originalEvent.dataTransfer); <del> addExternalEditorsDropData(originalDataTransfer, originalEvent); </del> <ins> addExternalEditorsDropData(originalDataTransfer, originalEvent, true); </ins> const outDataTransfer = new VSDataTransfer(); for (const [type, item] of originalDataTransfer.entries()) {


return notebook.cellAt(notebook.cellCount - 1); } <del> async function addCellAndRun(code: string, notebook: vscode.NotebookDocument) { </del> <ins> async function addCellAndRun(code: string, notebook: vscode.NotebookDocument, i: number) { </ins> const cell = await addCell(code, notebook); <del> await vscode.commands.executeCommand('notebook.execute'); </del> <ins> await vscode.commands.executeCommand('notebook.cell.execute', { start: i, end: i + 1 }); </ins> assert.strictEqual(cell.outputs.length, 1, 'execute failed'); return cell; }


// Run and add a bunch of cells for (let i = 0; i < 10; i++) { <del> await addCellAndRun(`print ${i}`, notebookEditor.notebook); </del> <ins> await addCellAndRun(`print ${i}`, notebookEditor.notebook, i); </ins> } // Verify visible range has the last cell


} }, required: [ <del> 'settings', 'scope' </del> <ins> 'settings' </ins> ], additionalProperties: false }


} update(mode: OutputChannelUpdateMode, till?: number): void { <del> this.model.update(mode, till); </del> <ins> this.model.update(mode, till, true); </ins> } clear(): void {


export interface IOutputChannelModel extends IDisposable { readonly onDispose: Event<void>; append(output: string): void; <del> update(mode: OutputChannelUpdateMode, till?: number): void; </del> <ins> update(mode: OutputChannelUpdateMode, till: number | undefined, immediate: boolean): void; </ins> loadModel(): Promise<ITextModel>; clear(): void; replace(value: string): void;


} clear(): void { <del> this.update(OutputChannelUpdateMode.Clear, this.endOffset); </del> <ins> this.update(OutputChannelUpdateMode.Clear, this.endOffset, true); </ins> } <del> update(mode: OutputChannelUpdateMode, till?: number): void { </del> <ins> update(mode: OutputChannelUpdateMode, till: number | undefined, immediate: boolean): void { </ins> const loadModelPromise: Promise<any> = this.loadModelPromise ? this.loadModelPromise : Promise.resolve(); <del> loadModelPromise.then(() => this.doUpdate(mode, till)); </del> <ins> loadModelPromise.then(() => this.doUpdate(mode, till, immediate)); </ins> } loadModel(): Promise<ITextModel> {


return this.model; } <del> private doUpdate(mode: OutputChannelUpdateMode, till?: number): void { </del> <ins> private doUpdate(mode: OutputChannelUpdateMode, till: number | undefined, immediate: boolean): void { </ins> if (mode === OutputChannelUpdateMode.Clear || mode === OutputChannelUpdateMode.Replace) { this.startOffset = this.endOffset = isNumber(till) ? till : this.endOffset; this.cancelModelUpdate();


} else { <del> this.appendContent(this.model, token); </del> <ins> this.appendContent(this.model, immediate, token); </ins> } }


this.doUpdateModel(model, [EditOperation.delete(model.getFullModelRange())], VSBuffer.fromString('')); } <del> private async appendContent(model: ITextModel, token: CancellationToken): Promise<void> { </del> <ins> private async appendContent(model: ITextModel, immediate: boolean, token: CancellationToken): Promise<void> { </ins> this.appendThrottler.trigger(async () => { /* Abort if operation is cancelled */ if (token.isCancellationRequested) {


const lastLineMaxColumn = model.getLineMaxColumn(lastLine); const edits = [EditOperation.insert(new Position(lastLine, lastLineMaxColumn), contentToAppend.toString())]; this.doUpdateModel(model, edits, contentToAppend); <del> }); </del> <ins> }, immediate ? 0 : undefined); </ins> } private async replaceContent(model: ITextModel, token: CancellationToken): Promise<void> {


if (!this.modelUpdateInProgress) { if (isNumber(size) && this.endOffset > size) { // Reset - Content is removed <del> this.update(OutputChannelUpdateMode.Clear, 0); </del> <ins> this.update(OutputChannelUpdateMode.Clear, 0, true); </ins> } } <del> this.update(OutputChannelUpdateMode.Append); </del> <ins> this.update(OutputChannelUpdateMode.Append, undefined, false /* Not needed to update immediately. Wait to collect more changes and update. */); </ins> } }


override append(message: string): void { this.write(message); <del> this.update(OutputChannelUpdateMode.Append); </del> <ins> this.update(OutputChannelUpdateMode.Append, undefined, this.isVisible()); </ins> } override replace(message: string): void { const till = this._offset; this.write(message); <del> this.update(OutputChannelUpdateMode.Replace, till); </del> <ins> this.update(OutputChannelUpdateMode.Replace, till, true); </ins> } private write(content: string): void {


this.outputChannelModel.then(outputChannelModel => outputChannelModel.append(output)); } <del> update(mode: OutputChannelUpdateMode, till?: number): void { this.outputChannelModel.then(outputChannelModel => outputChannelModel.update(mode, till)); </del> <ins> update(mode: OutputChannelUpdateMode, till: number | undefined, immediate: boolean): void { this.outputChannelModel.then(outputChannelModel => outputChannelModel.update(mode, till, immediate)); </ins> } loadModel(): Promise<ITextModel> {


if (uri === undefined) { return; } // Run the store action to get back a ref <del> const ref = await that.storeEditSession(); </del> <ins> const ref = await that.storeEditSession(false); </ins> // Append the ref to the URI if (ref !== undefined) {


await that.progressService.withProgress({ location: ProgressLocation.Notification, title: localize('storing edit session', 'Storing edit session...') <del> }, async () => await that.storeEditSession()); </del> <ins> }, async () => await that.storeEditSession(true)); </ins> } })); }


} } <del> async storeEditSession(): Promise<string | undefined> { </del> <ins> async storeEditSession(fromStoreCommand: boolean): Promise<string | undefined> { </ins> const folders: Folder[] = []; <ins> let hasEdits = false; </ins> for (const repository of this.scmService.repositories) { // Look through all resource groups and compute which files were added/modified/deleted


} } catch { } <ins> hasEdits = true; </ins> if (await this.fileService.exists(uri)) { workingChanges.push({ type: ChangeType.Addition, fileType: FileType.File, contents: (await this.fileService.readFile(uri)).value.toString(), relativeFilePath: relativeFilePath }); } else {


folders.push({ workingChanges, name: name ?? '' }); } <ins> if (!hasEdits) { this.logService.info('Edit Sessions: Skipping storing edit session as there are no edits to store.'); if (fromStoreCommand) { this.notificationService.info(localize('no edits to store', 'Skipped storing edit session as there are no edits to store.')); } return undefined; } </ins> const data: EditSession = { folders, version: 1 }; try {


let instantiationService: TestInstantiationService; let sessionSyncContribution: SessionSyncContribution; let fileService: FileService; <ins> let sandbox: sinon.SinonSandbox; </ins> const disposables = new DisposableStore(); <del> setup(() => { </del> <ins> suiteSetup(() => { sandbox = sinon.createSandbox(); </ins> instantiationService = new TestInstantiationService(); // Set up filesystem


} }); <ins> // Stub repositories instantiationService.stub(ISCMService, '_repositories', new Map()); </ins> sessionSyncContribution = instantiationService.createInstance(SessionSyncContribution); });


}; // Stub sync service to return edit session data <del> const sandbox = sinon.createSandbox(); </del> const readStub = sandbox.stub().returns({ editSession, ref: '0' }); instantiationService.stub(ISessionSyncWorkbenchService, 'read', readStub); <del> // Stub repositories instantiationService.stub(ISCMService, '_repositories', new Map()); </del> // Create root folder await fileService.createFolder(folderUri);


// Verify edit session was correctly applied assert.equal((await fileService.readFile(fileUri)).value.toString(), fileContents); }); <ins> test('Edit session not stored if there are no edits', async function () { const writeStub = sandbox.stub(); instantiationService.stub(ISessionSyncWorkbenchService, 'write', writeStub); // Create root folder await fileService.createFolder(folderUri); await sessionSyncContribution.storeEditSession(true); // Verify that we did not attempt to write the edit session assert.equal(writeStub.called, false); }); </ins> });


} extension.contributes?.walkthroughs?.forEach(section => { <del> const categoryID = extension.identifier.value + '#walkthrough#' + section.id; </del> <ins> const categoryID = extension.identifier.value + '#' + section.id; </ins> section.steps.forEach(step => { const fullyQualifiedID = extension.identifier.value + '#' + section.id + '#' + step.id; this.steps.delete(fullyQualifiedID);


* @returns whether the provided parameter is of type `Buffer` or Uint8Array dervived type */ export function isTypedArray(obj: unknown): obj is Object { <ins> const TypedArray = Object.getPrototypeOf(Uint8Array); </ins> return typeof obj === 'object' <del> && (obj instanceof Uint8Array || obj instanceof Uint16Array || obj instanceof Uint32Array || obj instanceof Float32Array || obj instanceof Float64Array || obj instanceof Int8Array || obj instanceof Int16Array || obj instanceof Int32Array || obj instanceof BigInt64Array || obj instanceof BigUint64Array || obj instanceof Uint8ClampedArray); </del> <ins> && obj instanceof TypedArray; </ins> } /**


import { IIdentityProvider } from 'vs/base/browser/ui/list/list'; import { ObjectTree } from 'vs/base/browser/ui/tree/objectTree'; import { ITreeElement } from 'vs/base/browser/ui/tree/tree'; <del> import { IActionableTestTreeElement, TestExplorerTreeElement, TestItemTreeElement } from 'vs/workbench/contrib/testing/browser/explorerProjections/index'; </del> <ins> import { IActionableTestTreeElement, TestExplorerTreeElement, TestItemTreeElement, TestTreeErrorMessage } from 'vs/workbench/contrib/testing/browser/explorerProjections/index'; </ins> <del> export const testIdentityProvider: IIdentityProvider<TestItemTreeElement> = { </del> <ins> export const testIdentityProvider: IIdentityProvider<TestExplorerTreeElement> = { </ins> getId(element) { <del> return element.treeId + '0' + element.test.expand; </del> <ins> return element.treeId + '0' + (element instanceof TestTreeErrorMessage ? 'error' : element.test.expand); </ins> } };


* Actions */ <del> // Configure Workspace Trust </del> <ins> // Configure Workspace Trust Settings </ins> const CONFIGURE_TRUST_COMMAND_ID = 'workbench.trust.configure'; const WORKSPACES_CATEGORY = { value: localize('workspacesCategory', "Workspaces"), original: 'Workspaces' };


constructor() { super({ id: CONFIGURE_TRUST_COMMAND_ID, <del> title: { original: 'Configure Workspace Trust', value: localize('configureWorkspaceTrust', "Configure Workspace Trust") }, </del> <ins> title: { original: 'Configure Workspace Trust Settings', value: localize('configureWorkspaceTrustSettings', "Configure Workspace Trust Settings") }, </ins> precondition: ContextKeyExpr.and(WorkspaceTrustContext.IsEnabled, ContextKeyExpr.equals(`config.${WORKSPACE_TRUST_ENABLED}`, true)), category: WORKSPACES_CATEGORY, f1: true


this.os = OS; this.userHome = pathService.defaultUriScheme === Schemas.file ? this.pathService.userHome({ preferLocal: true }) : undefined; <del> const memento = this.storedFormattersMemento = new Memento('cachedResourceLabelFormatters', storageService); </del> <ins> const memento = this.storedFormattersMemento = new Memento('cachedResourceLabelFormatters2', storageService); </ins> this.storedFormatters = memento.getMemento(StorageScope.PROFILE, StorageTarget.MACHINE); <del> this.formatters = this.storedFormatters?.formatters || []; </del> <ins> this.formatters = this.storedFormatters?.formatters?.slice() || []; </ins> // Remote environment is potentially long running this.resolveRemoteEnvironment();


test('label caching', () => { <del> const m = new Memento('cachedResourceLabelFormatters', storageService).getMemento(StorageScope.PROFILE, StorageTarget.MACHINE); </del> <ins> const m = new Memento('cachedResourceLabelFormatters2', storageService).getMemento(StorageScope.PROFILE, StorageTarget.MACHINE); </ins> const makeFormatter = (scheme: string): ResourceLabelFormatter => ({ formatting: { label: `${path} (${scheme})`, separator: '/' }, scheme }); assert.deepStrictEqual(m, {});


}, { "name": "border-image-width", <del> "desc": "The four values of 'border-image-width' specify offsets that are used to divide the border image area into nine parts. They represent inward distances from the the top, right, bottom, and left sides of the area, respectively.", </del> <ins> "desc": "The four values of 'border-image-width' specify offsets that are used to divide the border image area into nine parts. They represent inward distances from the top, right, bottom, and left sides of the area, respectively.", </ins> "browsers": "FF13,IE11", "restriction": "length, percentage, number", "values": []


}, { "name": "counter-increment", <del> "desc": "Counters are used with the 'counter()' and 'counters()' functions of the the 'content' property.", </del> <ins> "desc": "Counters are used with the 'counter()' and 'counters()' functions of the 'content' property.", </ins> "browsers": "C,FF1.5,IE8,O10.5,S3", "restriction": "identifier, integer", "values": []


"values": [ { "name": "center", <del> "desc": "Places the center of the Grid Item's margin box at the center of the the Grid Item's column." </del> <ins> "desc": "Places the center of the Grid Item's margin box at the center of the Grid Item's column." </ins> }, { "name": "end",


"values": [ { "name": "center", <del> "desc": "Places the center of the Grid Item's margin box at the center of the the Grid Item's row." </del> <ins> "desc": "Places the center of the Grid Item's margin box at the center of the Grid Item's row." </ins> }, { "name": "end",


async performReplace(element: FolderMatch | FileMatch | Match): Promise<any> { // since multiple elements can be selected, we need to check the type of the FolderMatch/FileMatch/Match before we perform the replace. <del> const elementsToReplace = getElementsToOperateOnInfo(this.viewer, element, this.configurationService.getValue<ISearchConfigurationProperties>('search')); </del> <ins> const opInfo = getElementsToOperateOnInfo(this.viewer, element, this.configurationService.getValue<ISearchConfigurationProperties>('search')); const elementsToReplace = opInfo.elements; </ins> await Promise.all(elementsToReplace.map(async (elem) => { const parent = elem.parent();


} override run(): Promise<any> { <del> const elementsToRemove = getElementsToOperateOnInfo(this.viewer, this.element, this.configurationService.getValue<ISearchConfigurationProperties>('search')); </del> <ins> const opInfo = getElementsToOperateOnInfo(this.viewer, this.element, this.configurationService.getValue<ISearchConfigurationProperties>('search')); const elementsToRemove = opInfo.elements; </ins> const currentBottomFocusElement = elementsToRemove[elementsToRemove.length - 1]; <del> const nextFocusElement = !currentBottomFocusElement || currentBottomFocusElement instanceof SearchResult || arrayContainsElementOrParent(currentBottomFocusElement, elementsToRemove) ? </del> <ins> const nextFocusElement = opInfo.mustReselect && (!currentBottomFocusElement || currentBottomFocusElement instanceof SearchResult || arrayContainsElementOrParent(currentBottomFocusElement, elementsToRemove)) ? </ins> this.getElementToFocusAfterRemoved(this.viewer, <any>currentBottomFocusElement) : null;


}); }; <del> function getElementsToOperateOnInfo(viewer: WorkbenchObjectTree<RenderableMatch, void>, currElement: RenderableMatch, sortConfig: ISearchConfigurationProperties): RenderableMatch[] { </del> <ins> function getElementsToOperateOnInfo(viewer: WorkbenchObjectTree<RenderableMatch, void>, currElement: RenderableMatch, sortConfig: ISearchConfigurationProperties): { elements: RenderableMatch[]; mustReselect: boolean } { </ins> let elements: RenderableMatch[] = viewer.getSelection().filter((x): x is RenderableMatch => x !== null).sort((a, b) => searchComparer(a, b, sortConfig.sortOrder)); <ins> const mustReselect = elements.includes(currElement); // this indicates whether we need to re-focus/re-select on a remove. </ins> // if selection doesn't include multiple elements, just return current focus element. if (!(elements.length > 1 && elements.includes(currElement))) { elements = [currElement]; } <del> return elements; </del> <ins> return { elements, mustReselect }; </ins> }


const pendingCommentText = this._pendingCommentCache[e.owner] && this._pendingCommentCache[e.owner][thread.threadId!]; this.displayCommentThread(e.owner, thread, pendingCommentText); this._commentInfos.filter(info => info.owner === e.owner)[0].threads.push(thread); <ins> this.tryUpdateReservedSpace(); </ins> }); this._commentThreadRangeDecorator.update(this.editor, commentInfo); }));


return; } <del> private setComments(commentInfos: ICommentInfo[]): void { if (!this.editor || !this.commentService.isCommentingEnabled) { return; } this._commentInfos = commentInfos; </del> <ins> private tryUpdateReservedSpace() { </ins> let lineDecorationsWidth: number = this.editor.getLayoutInfo().decorationsWidth; <ins> const hasCommentsOrRanges = this._commentInfos.some(info => { const hasRanges = Boolean(info.commentingRanges && (Array.isArray(info.commentingRanges) ? info.commentingRanges : info.commentingRanges.ranges).length); return hasRanges || (info.threads.length > 0); }); </ins> <del> if (this._commentInfos.some(info => Boolean(info.commentingRanges && (Array.isArray(info.commentingRanges) ? info.commentingRanges : info.commentingRanges.ranges).length))) { </del> <ins> if (hasCommentsOrRanges) { </ins> this._workspaceHasCommenting.set(true); if (!this._commentingRangeSpaceReserved) { this._commentingRangeSpaceReserved = true;


}); } } <ins> } private setComments(commentInfos: ICommentInfo[]): void { if (!this.editor || !this.commentService.isCommentingEnabled) { return; } this._commentInfos = commentInfos; this.tryUpdateReservedSpace(); </ins> // create viewzones this.removeCommentWidgetsAndStoreCache();


/** * Optional commenting range provider. Provide a list {@link Range ranges} which support commenting to any given resource uri. * <del> * If not provided, users can leave comments in any document opened in the editor. </del> <ins> * If not provided, users cannot leave any comments. </ins> */ commentingRangeProvider?: CommentingRangeProvider;


public removeManualRanges(ranges: ILineRange[]) { const newFoldingRanges: FoldRange[] = new Array(); <del> const containedBy = (foldRange: FoldRange) => { </del> <ins> const intersects = (foldRange: FoldRange) => { </ins> for (const range of ranges) { <del> if (range.startLineNumber <= foldRange.startLineNumber && range.endLineNumber >= foldRange.endLineNumber) { </del> <ins> if (!(range.startLineNumber > foldRange.endLineNumber || foldRange.startLineNumber > range.endLineNumber)) { </ins> return true; } }


}; for (let i = 0; i < this._regions.length; i++) { const foldRange = this._regions.toFoldRange(i); <del> if (!foldRange.isUserDefined && !foldRange.isRecovered || !containedBy(foldRange)) { </del> <ins> if (!foldRange.isUserDefined && !foldRange.isRecovered || !intersects(foldRange)) { </ins> newFoldingRanges.push(foldRange); } }


if (selections) { const ranges: ILineRange[] = []; for (const selection of selections) { <del> let endLineNumber = selection.endLineNumber; if (selection.endColumn === 1) { --endLineNumber; } const startLineNumber = selection.startLineNumber; ranges.push(endLineNumber >= selection.startLineNumber ? { startLineNumber, endLineNumber } : { endLineNumber, startLineNumber }); </del> <ins> const { startLineNumber, endLineNumber } = selection; ranges.push(endLineNumber >= startLineNumber ? { startLineNumber, endLineNumber } : { endLineNumber, startLineNumber }); </ins> } foldingModel.removeManualRanges(ranges); foldingController.triggerFoldingModelChanged();


private registerListeners(): void { this._register(addDisposableListener(this.container, EventType.DRAG_ENTER, e => this.onDragEnter(e))); this._register(addDisposableListener(this.container, EventType.DRAG_LEAVE, () => this.onDragLeave())); <del> this._register(addDisposableListener(this.container, EventType.DRAG_OVER, e => { if (!this.overlay) { this.onDragEnter(e); } })); </del> [this.container, window].forEach(node => this._register(addDisposableListener(node as HTMLElement, EventType.DRAG_END, () => this.onDragEnd()))); }


builtin printf "x1b]633;P;IsWindows=Truex07" fi <ins> # Allow verifying $BASH_COMMAND doesn't have aliases resolved via history when the right HISTCONTROL # configuration is used if [[ "$HISTCONTROL" =~ .*(erasedups|ignoreboth|ignoredups).* ]]; then __vsc_history_verify=0 else __vsc_history_verify=1 fi </ins> __vsc_initialized=0 __vsc_original_PS1="$PS1" __vsc_original_PS2="$PS2"


__vsc_preexec() { __vsc_initialized=1 if [[ ! "$BASH_COMMAND" =~ ^__vsc_prompt* ]]; then <del> __vsc_current_command=$BASH_COMMAND </del> <ins> # Use history if it's available to verify the command as BASH_COMMAND comes in with aliases # resolved if [ "$__vsc_history_verify" = "1" ]; then __vsc_current_command="$(builtin history 1 | sed -r 's/ *[0-9]+ +//')" else __vsc_current_command=$BASH_COMMAND fi </ins> else __vsc_current_command="" fi


import { OutlineModel, OutlineElement } from 'vs/editor/contrib/documentSymbols/browser/outlineModel'; import { CancellationToken, CancellationTokenSource, } from 'vs/base/common/cancellation'; import * as dom from 'vs/base/browser/dom'; <del> import { EditorLayoutInfo, EditorOption } from 'vs/editor/common/config/editorOptions'; </del> <ins> import { EditorLayoutInfo, EditorOption, RenderLineNumbersType } from 'vs/editor/common/config/editorOptions'; </ins> import { createStringBuilder } from 'vs/editor/common/core/stringBuilder'; import { RenderLineInput, renderViewLine } from 'vs/editor/common/viewLayout/viewLineRenderer'; import { SymbolKind } from 'vs/editor/common/languages';


this._sessionStore.add(this._editor.onDidLayoutChange(() => this._onDidResize())); this._sessionStore.add(this._editor.onDidChangeModelContent(() => this._updateSoon.schedule())); this._sessionStore.add(this._languageFeaturesService.documentSymbolProvider.onDidChange(() => this._update(true))); <ins> const lineNumberOption = this._editor.getOption(EditorOption.lineNumbers); if (lineNumberOption.renderType === RenderLineNumbersType.Relative) { this._sessionStore.add(this._editor.onDidChangeCursorPosition(() => this._update(false))); } </ins> this._update(true); } }


} const innerLineNumberHTML = document.createElement('span'); <del> innerLineNumberHTML.innerText = this._lineNumber.toString(); </del> <ins> const lineNumberOption = this._editor.getOption(EditorOption.lineNumbers); if (lineNumberOption.renderType === RenderLineNumbersType.On || lineNumberOption.renderType === RenderLineNumbersType.Interval && this._lineNumber % 10 === 0) { innerLineNumberHTML.innerText = this._lineNumber.toString(); } else if (lineNumberOption.renderType === RenderLineNumbersType.Relative) { innerLineNumberHTML.innerText = Math.abs(this._lineNumber - this._editor.getPosition().lineNumber).toString(); } </ins> innerLineNumberHTML.className = 'sticky-line-number'; innerLineNumberHTML.style.lineHeight = `${lineHeight}px`; innerLineNumberHTML.style.width = `${layoutInfo.lineNumbersWidth}px`;


} add-zsh-hook precmd __vsc_precmd add-zsh-hook preexec __vsc_preexec <ins> if [[ $options[login] = off ]]; then ZDOTDIR=$USER_ZDOTDIR fi </ins>


# Prevent the script recursing when setting up if [ -n "$VSCODE_SHELL_INTEGRATION" ]; then <ins> ZDOTDIR=$USER_ZDOTDIR </ins> builtin return fi


"vscode-proxy-agent": "^0.12.0", "vscode-regexpp": "^3.1.0", "vscode-textmate": "7.0.1", <del> "xterm": "5.0.0-beta.32", "xterm-addon-canvas": "0.2.0-beta.15", "xterm-addon-search": "0.10.0-beta.3", "xterm-addon-serialize": "0.8.0-beta.3", "xterm-addon-unicode11": "0.4.0-beta.3", "xterm-addon-webgl": "0.13.0-beta.32", </del> <ins> "xterm": "5.0.0-beta.35", "xterm-addon-canvas": "0.2.0-beta.17", "xterm-addon-search": "0.10.0-beta.5", "xterm-addon-serialize": "0.8.0-beta.5", "xterm-addon-unicode11": "0.4.0-beta.5", "xterm-addon-webgl": "0.13.0-beta.35", </ins> "xterm-headless": "5.0.0-beta.5", "yauzl": "^2.9.2", "yazl": "^2.4.3"


"tas-client-umd": "0.1.6", "vscode-oniguruma": "1.6.1", "vscode-textmate": "7.0.1", <del> "xterm": "5.0.0-beta.32", "xterm-addon-canvas": "0.2.0-beta.15", "xterm-addon-search": "0.10.0-beta.3", "xterm-addon-unicode11": "0.4.0-beta.3", "xterm-addon-webgl": "0.13.0-beta.32" </del> <ins> "xterm": "5.0.0-beta.35", "xterm-addon-canvas": "0.2.0-beta.17", "xterm-addon-search": "0.10.0-beta.5", "xterm-addon-unicode11": "0.4.0-beta.5", "xterm-addon-webgl": "0.13.0-beta.35" </ins> } }