diff --git a/extensions/git/src/askpass.sh b/extensions/git/src/askpass.sh index c85c64ad2fd..4536224764d 100755 --- a/extensions/git/src/askpass.sh +++ b/extensions/git/src/askpass.sh @@ -1,5 +1,5 @@ #!/bin/sh VSCODE_GIT_ASKPASS_PIPE=`mktemp` -ELECTRON_RUN_AS_NODE="1" VSCODE_GIT_ASKPASS_PIPE="$VSCODE_GIT_ASKPASS_PIPE" "$VSCODE_GIT_ASKPASS_NODE" "$VSCODE_GIT_ASKPASS_EXTRA_ARGS" "$VSCODE_GIT_ASKPASS_MAIN" $* +ELECTRON_RUN_AS_NODE="1" VSCODE_GIT_ASKPASS_PIPE="$VSCODE_GIT_ASKPASS_PIPE" "$VSCODE_GIT_ASKPASS_NODE" "$VSCODE_GIT_ASKPASS_MAIN" $VSCODE_GIT_ASKPASS_EXTRA_ARGS $* cat $VSCODE_GIT_ASKPASS_PIPE rm $VSCODE_GIT_ASKPASS_PIPE diff --git a/src/vs/base/browser/ui/grid/gridview.ts b/src/vs/base/browser/ui/grid/gridview.ts index 7b587fc8ff5..b59209ce188 100644 --- a/src/vs/base/browser/ui/grid/gridview.ts +++ b/src/vs/base/browser/ui/grid/gridview.ts @@ -5,7 +5,7 @@ import { $ } from 'vs/base/browser/dom'; import { Orientation, Sash } from 'vs/base/browser/ui/sash/sash'; -import { ISplitViewStyles, IView as ISplitView, LayoutPriority, Sizing, SplitView } from 'vs/base/browser/ui/splitview/splitview'; +import { DistributeSizing, ISplitViewStyles, IView as ISplitView, LayoutPriority, Sizing, SplitView } from 'vs/base/browser/ui/splitview/splitview'; import { equals as arrayEquals, tail2 as tail } from 'vs/base/common/arrays'; import { Color } from 'vs/base/common/color'; import { Emitter, Event, Relay } from 'vs/base/common/event'; diff --git a/src/vs/base/node/ports.ts b/src/vs/base/node/ports.ts index 6ecdc71019c..9d3a8bdcfe1 100644 --- a/src/vs/base/node/ports.ts +++ b/src/vs/base/node/ports.ts @@ -63,6 +63,90 @@ function doFindFreePort(startPort: number, giveUpAfter: number, stride: number, client.connect(startPort, '127.0.0.1'); } +// Reference: https://chromium.googlesource.com/chromium/src.git/+/refs/heads/main/net/base/port_util.cc#56 +export const BROWSER_RESTRICTED_PORTS: any = { + 1: true, // tcpmux + 7: true, // echo + 9: true, // discard + 11: true, // systat + 13: true, // daytime + 15: true, // netstat + 17: true, // qotd + 19: true, // chargen + 20: true, // ftp data + 21: true, // ftp access + 22: true, // ssh + 23: true, // telnet + 25: true, // smtp + 37: true, // time + 42: true, // name + 43: true, // nicname + 53: true, // domain + 69: true, // tftp + 77: true, // priv-rjs + 79: true, // finger + 87: true, // ttylink + 95: true, // supdup + 101: true, // hostriame + 102: true, // iso-tsap + 103: true, // gppitnp + 104: true, // acr-nema + 109: true, // pop2 + 110: true, // pop3 + 111: true, // sunrpc + 113: true, // auth + 115: true, // sftp + 117: true, // uucp-path + 119: true, // nntp + 123: true, // NTP + 135: true, // loc-srv /epmap + 137: true, // netbios + 139: true, // netbios + 143: true, // imap2 + 161: true, // snmp + 179: true, // BGP + 389: true, // ldap + 427: true, // SLP (Also used by Apple Filing Protocol) + 465: true, // smtp+ssl + 512: true, // print / exec + 513: true, // login + 514: true, // shell + 515: true, // printer + 526: true, // tempo + 530: true, // courier + 531: true, // chat + 532: true, // netnews + 540: true, // uucp + 548: true, // AFP (Apple Filing Protocol) + 554: true, // rtsp + 556: true, // remotefs + 563: true, // nntp+ssl + 587: true, // smtp (rfc6409) + 601: true, // syslog-conn (rfc3195) + 636: true, // ldap+ssl + 989: true, // ftps-data + 990: true, // ftps + 993: true, // ldap+ssl + 995: true, // pop3+ssl + 1719: true, // h323gatestat + 1720: true, // h323hostcall + 1723: true, // pptp + 2049: true, // nfs + 3659: true, // apple-sasl / PasswordServer + 4045: true, // lockd + 5060: true, // sip + 5061: true, // sips + 6000: true, // X11 + 6566: true, // sane-port + 6665: true, // Alternate IRC [Apple addition] + 6666: true, // Alternate IRC [Apple addition] + 6667: true, // Standard IRC [Apple addition] + 6668: true, // Alternate IRC [Apple addition] + 6669: true, // Alternate IRC [Apple addition] + 6697: true, // IRC + TLS + 10080: true // Amanda +}; + /** * Uses listen instead of connect. Is faster, but if there is another listener on 0.0.0.0 then this will take 127.0.0.1 from that listener. */ diff --git a/src/vs/editor/common/viewLayout/viewLineRenderer.ts b/src/vs/editor/common/viewLayout/viewLineRenderer.ts index d8615a93da0..3fba8e439f0 100644 --- a/src/vs/editor/common/viewLayout/viewLineRenderer.ts +++ b/src/vs/editor/common/viewLayout/viewLineRenderer.ts @@ -474,6 +474,11 @@ function resolveRenderLineInput(input: RenderLineInput): ResolvedRenderLineInput } let tokens = transformAndRemoveOverflowing(input.lineTokens, input.fauxIndentLength, len); + if (input.renderControlCharacters && !input.isBasicASCII) { + // Calling `extractControlCharacters` before adding (possibly empty) line parts + // for inline decorations. `extractControlCharacters` removes empty line parts. + tokens = extractControlCharacters(lineContent, tokens); + } if (input.renderWhitespace === RenderWhitespace.All || input.renderWhitespace === RenderWhitespace.Boundary || (input.renderWhitespace === RenderWhitespace.Selection && !!input.selectionsOnLine) || @@ -500,9 +505,6 @@ function resolveRenderLineInput(input: RenderLineInput): ResolvedRenderLineInput // We can never split RTL text, as it ruins the rendering tokens = splitLargeTokens(lineContent, tokens, !input.isBasicASCII || input.fontLigatures); } - if (input.renderControlCharacters && !input.isBasicASCII) { - tokens = extractControlCharacters(lineContent, tokens); - } return new ResolvedRenderLineInput( input.useMonospaceOptimizations, diff --git a/src/vs/editor/test/common/viewLayout/viewLineRenderer.test.ts b/src/vs/editor/test/common/viewLayout/viewLineRenderer.test.ts index 371db99fa20..df65a7573f6 100644 --- a/src/vs/editor/test/common/viewLayout/viewLineRenderer.test.ts +++ b/src/vs/editor/test/common/viewLayout/viewLineRenderer.test.ts @@ -1722,6 +1722,46 @@ suite('viewLineRenderer.renderLine 2', () => { assert.deepStrictEqual(actual.html, expected); }); + test('issue #136622: Inline decorations are not rendering on non-ASCII lines when renderControlCharacters is on', () => { + + let actual = renderViewLine(new RenderLineInput( + true, + true, + 'some text £', + false, + false, + false, + 0, + createViewLineTokens([createPart(11, 3)]), + [ + new LineDecoration(5, 5, 'inlineDec1', InlineDecorationType.After), + new LineDecoration(6, 6, 'inlineDec2', InlineDecorationType.Before), + ], + 4, + 0, + 10, + 10, + 10, + 10000, + 'none', + true, + false, + null + )); + + let expected = [ + '', + 'some', + '', + '\u00a0', + '', + 'text\u00a0£', + '' + ].join(''); + + assert.deepStrictEqual(actual.html, expected); + }); + test('issue #22832: Consider fullwidth characters when rendering tabs', () => { let actual = renderViewLine(new RenderLineInput( diff --git a/src/vs/platform/remote/common/remoteAuthorityResolver.ts b/src/vs/platform/remote/common/remoteAuthorityResolver.ts index af83a56d6b3..ecf80672720 100644 --- a/src/vs/platform/remote/common/remoteAuthorityResolver.ts +++ b/src/vs/platform/remote/common/remoteAuthorityResolver.ts @@ -24,6 +24,8 @@ export interface ResolvedOptions { export interface TunnelDescription { remoteAddress: { port: number, host: string }; localAddress: { port: number, host: string } | string; + privacy?: string; + protocol?: string; } export interface TunnelInformation { environmentTunnels?: TunnelDescription[]; diff --git a/src/vs/platform/remote/node/tunnelService.ts b/src/vs/platform/remote/node/tunnelService.ts index 2a6c75f4532..322b743d2c9 100644 --- a/src/vs/platform/remote/node/tunnelService.ts +++ b/src/vs/platform/remote/node/tunnelService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as net from 'net'; -import { findFreePortFaster } from 'vs/base/node/ports'; +import { BROWSER_RESTRICTED_PORTS, findFreePortFaster } from 'vs/base/node/ports'; import { NodeSocket } from 'vs/base/parts/ipc/node/ipc.net'; import { nodeSocketFactory } from 'vs/platform/remote/node/nodeSocketFactory'; @@ -18,8 +18,18 @@ import { AbstractTunnelService, isAllInterfaces, ISharedTunnelsService as IShare import { ISignService } from 'vs/platform/sign/common/sign'; async function createRemoteTunnel(options: IConnectionOptions, defaultTunnelHost: string, tunnelRemoteHost: string, tunnelRemotePort: number, tunnelLocalPort?: number): Promise { - const tunnel = new NodeRemoteTunnel(options, defaultTunnelHost, tunnelRemoteHost, tunnelRemotePort, tunnelLocalPort); - return tunnel.waitForReady(); + let readyTunnel: NodeRemoteTunnel | undefined; + for (let attempts = 3; attempts; attempts--) { + if (readyTunnel) { + readyTunnel.dispose(); + } + const tunnel = new NodeRemoteTunnel(options, defaultTunnelHost, tunnelRemoteHost, tunnelRemotePort, tunnelLocalPort); + readyTunnel = await tunnel.waitForReady(); + if ((tunnelLocalPort && BROWSER_RESTRICTED_PORTS[tunnelLocalPort]) || !BROWSER_RESTRICTED_PORTS[readyTunnel.tunnelLocalPort]) { + break; + } + } + return readyTunnel!; } class NodeRemoteTunnel extends Disposable implements RemoteTunnel { diff --git a/src/vs/workbench/api/browser/mainThreadTunnelService.ts b/src/vs/workbench/api/browser/mainThreadTunnelService.ts index 415f674a902..a1d54ed6423 100644 --- a/src/vs/workbench/api/browser/mainThreadTunnelService.ts +++ b/src/vs/workbench/api/browser/mainThreadTunnelService.ts @@ -153,7 +153,9 @@ export class MainThreadTunnelService extends Disposable implements MainThreadTun return (await this.tunnelService.tunnels).map(tunnel => { return { remoteAddress: { port: tunnel.tunnelRemotePort, host: tunnel.tunnelRemoteHost }, - localAddress: tunnel.localAddress + localAddress: tunnel.localAddress, + privacy: tunnel.privacy, + protocol: tunnel.protocol }; }); } diff --git a/src/vs/workbench/contrib/codeEditor/browser/inspectKeybindings.ts b/src/vs/workbench/contrib/codeEditor/browser/inspectKeybindings.ts index b81f646d3c1..73808153cd7 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/inspectKeybindings.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/inspectKeybindings.ts @@ -5,20 +5,20 @@ import { localize } from 'vs/nls'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { EditorAction, ServicesAccessor, registerEditorAction } from 'vs/editor/browser/editorExtensions'; +import { ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { CATEGORIES } from 'vs/workbench/common/actions'; import { Action2, registerAction2 } from 'vs/platform/actions/common/actions'; -class InspectKeyMap extends EditorAction { +class InspectKeyMap extends Action2 { constructor() { super({ id: 'workbench.action.inspectKeyMappings', - label: localize('workbench.action.inspectKeyMap', "Developer: Inspect Key Mappings"), - alias: 'Developer: Inspect Key Mappings', - precondition: undefined + title: { value: localize('workbench.action.inspectKeyMap', "Inspect Key Mappings"), original: 'Inspect Key Mappings' }, + category: CATEGORIES.Developer, + f1: true }); } @@ -30,7 +30,7 @@ class InspectKeyMap extends EditorAction { } } -registerEditorAction(InspectKeyMap); +registerAction2(InspectKeyMap); class InspectKeyMapJSON extends Action2 { diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorKernelManager.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorKernelManager.ts index b398ff9852d..37a5b0f439e 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorKernelManager.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorKernelManager.ts @@ -25,7 +25,7 @@ export class NotebookEditorKernelManager extends Disposable { getSelectedOrSuggestedKernel(notebook: INotebookTextModel): INotebookKernel | undefined { // returns SELECTED or the ONLY available kernel const info = this._notebookKernelService.getMatchingKernel(notebook); - return info.selected ?? info.suggestions[0]; + return info.selected ?? (info.all.length === 1 ? info.all[0] : undefined); } async executeNotebookCells(notebook: INotebookTextModel, cells: Iterable): Promise { diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager.ts index d76761635fd..9c42f1dfa4c 100644 --- a/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/links/terminalLinkManager.ts @@ -17,7 +17,7 @@ import type { Terminal, IViewportRange, ILinkProvider } from 'xterm'; import { Schemas } from 'vs/base/common/network'; import { posix, win32 } from 'vs/base/common/path'; import { ITerminalExternalLinkProvider, ITerminalInstance } from 'vs/workbench/contrib/terminal/browser/terminal'; -import { OperatingSystem, isMacintosh, OS, isWindows } from 'vs/base/common/platform'; +import { OperatingSystem, isMacintosh, OS } from 'vs/base/common/platform'; import { IMarkdownString, MarkdownString } from 'vs/base/common/htmlContent'; import { TerminalProtocolLinkProvider } from 'vs/workbench/contrib/terminal/browser/links/terminalProtocolLinkProvider'; import { TerminalValidatedLocalLinkProvider, lineAndColumnClause, unixLocalLinkClause, winLocalLinkClause, winDrivePrefix, winLineAndColumnMatchIndex, unixLineAndColumnMatchIndex, lineAndColumnClauseGroupCount } from 'vs/workbench/contrib/terminal/browser/links/terminalValidatedLocalLinkProvider'; @@ -213,7 +213,7 @@ export class TerminalLinkManager extends DisposableStore { if (uri.scheme === Schemas.file) { // Just using fsPath here is unsafe: https://github.com/microsoft/vscode/issues/109076 const fsPath = uri.fsPath; - this._handleLocalLink(((this._osPath.sep === posix.sep) && isWindows) ? fsPath.replace(/\\/g, posix.sep) : fsPath); + this._handleLocalLink(((this._osPath.sep === posix.sep) && this._processManager.os === OperatingSystem.Windows) ? fsPath.replace(/\\/g, posix.sep) : fsPath); return; } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalGroup.ts b/src/vs/workbench/contrib/terminal/browser/terminalGroup.ts index af7e864387b..6bca2bc4769 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalGroup.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalGroup.ts @@ -414,7 +414,7 @@ export class TerminalGroup extends Disposable implements ITerminalGroup { this._terminalInstances.splice(index, 0, instance); if (this._splitPaneContainer) { this._splitPaneContainer.remove(instance); - this._splitPaneContainer.split(instance, sourceIndex < index ? index - 1 : index); + this._splitPaneContainer.split(instance, index); } this._onInstancesChanged.fire(); }