From b647b024ad15631f93377d54ae24e3ee09331f66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= Date: Mon, 14 Aug 2023 11:04:09 +0200 Subject: [PATCH 01/17] feat: remove monaco-specific features --- scripts/vscode.patch | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/scripts/vscode.patch b/scripts/vscode.patch index 01c79cd4..70ac0c63 100644 --- a/scripts/vscode.patch +++ b/scripts/vscode.patch @@ -235,6 +235,23 @@ index fc197da1d57..a4d9573979f 100644 public static validateOptions(options: IEditorOptions): ValidatedEditorOptions { const result = new ValidatedEditorOptions(); +diff --git a/src/vs/editor/editor.main.ts b/src/vs/editor/editor.main.ts +index 23d547570e9..31dfb4fd8d4 100644 +--- a/src/vs/editor/editor.main.ts ++++ b/src/vs/editor/editor.main.ts +@@ -5,12 +5,5 @@ + + import 'vs/editor/editor.all'; + import 'vs/editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard'; +-import 'vs/editor/standalone/browser/inspectTokens/inspectTokens'; +-import 'vs/editor/standalone/browser/quickAccess/standaloneHelpQuickAccess'; +-import 'vs/editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess'; +-import 'vs/editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess'; +-import 'vs/editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess'; +-import 'vs/editor/standalone/browser/referenceSearch/standaloneReferenceSearch'; +-import 'vs/editor/standalone/browser/toggleHighContrast/toggleHighContrast'; + + export * from 'vs/editor/editor.api'; diff --git a/src/vs/platform/assignment/common/assignmentService.ts b/src/vs/platform/assignment/common/assignmentService.ts index 67e34826627..7c5287d6a32 100644 --- a/src/vs/platform/assignment/common/assignmentService.ts From c6e5821af424c39be029b44b97e28ac3ec73a0bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= Date: Mon, 14 Aug 2023 11:04:22 +0200 Subject: [PATCH 02/17] doc: update README --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a16ab050..78d79ff0 100644 --- a/README.md +++ b/README.md @@ -120,9 +120,10 @@ await initialize({ }) ``` -Additionally, this library exposes 22 modules that include the vscode version of some services (with some glue to make it work with monaco): +Additionally, this library exposes 23 modules that include the vscode version of some services (with some glue to make it work with monaco): - Extensions (included by default): `vscode/service-override/extensions` +- Files (included by default): `vscode/service-override/files` - Notifications: `vscode/service-override/notifications` - Dialogs: `vscode/service-override/dialogs` - Model: `vscode/service-override/model` @@ -135,7 +136,6 @@ Additionally, this library exposes 22 modules that include the vscode version of - VSCode themes: `vscode/service-override/theme` - Audio cue: `vscode/service-override/audioCue` - Debug: `vscode/service-override/debug` -- Files: `vscode/service-override/files` - Preferences: `vscode/service-override/preferences` - Views: `vscode/service-override/views` (Is exclusive with `editor`, do not use both at the same time) - QuickAccess: `vscode/service-override/quickaccess` @@ -144,6 +144,7 @@ Additionally, this library exposes 22 modules that include the vscode version of - Search: `vscode/service-override/search` - Markers: `vscode/service-override/markers` - Language detection worker: `vscode/service-override/languageDetectionWorker` +- Storage: `vscode/service-override/storage` Usage: From 25f25ff49d8c08daf8e8751def495d8142bd3035 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= Date: Mon, 14 Aug 2023 11:04:35 +0200 Subject: [PATCH 03/17] refactor: simplify demo --- demo/src/main.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/demo/src/main.ts b/demo/src/main.ts index 3df5ce09..cb8de973 100644 --- a/demo/src/main.ts +++ b/demo/src/main.ts @@ -1,7 +1,5 @@ import './style.css' -import 'monaco-editor/esm/vs/editor/editor.all.js' -import * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js' -import 'monaco-editor/esm/vs/editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.js' +import * as monaco from 'monaco-editor' import './setup' import { createConfiguredEditor, createModelReference } from 'vscode/monaco' import { registerFileSystemOverlay, HTMLFileSystemProvider } from 'vscode/service-override/files' From 7af788ce07845b7b4bcd86307a4beb348e2e478f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= Date: Mon, 14 Aug 2023 11:30:06 +0200 Subject: [PATCH 04/17] feat: demo storage service --- demo/index.html | 1 + demo/src/main.ts | 6 +++++- demo/src/setup.ts | 25 ++++++++++++++++++++++++- demo/vite.config.ts | 2 +- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/demo/index.html b/demo/index.html index fc3e844d..ac419685 100644 --- a/demo/index.html +++ b/demo/index.html @@ -20,6 +20,7 @@

Editor

+ diff --git a/demo/src/main.ts b/demo/src/main.ts index cb8de973..c01c5168 100644 --- a/demo/src/main.ts +++ b/demo/src/main.ts @@ -1,11 +1,11 @@ import './style.css' import * as monaco from 'monaco-editor' -import './setup' import { createConfiguredEditor, createModelReference } from 'vscode/monaco' import { registerFileSystemOverlay, HTMLFileSystemProvider } from 'vscode/service-override/files' import * as vscode from 'vscode' import { ILogService, StandaloneServices, IPreferencesService, IEditorService, IDialogService } from 'vscode/services' import { ConfirmResult } from 'vscode/service-override/views' +import { clearStorage } from './setup' import { CustomEditorInput } from './features/customView' import './features/debugger' import './features/search' @@ -189,3 +189,7 @@ document.querySelector('#customEditorPanel')!.addEventListener('click', async () pinned: true }) }) + +document.querySelector('#clearStorage')!.addEventListener('click', async () => { + clearStorage() +}) diff --git a/demo/src/setup.ts b/demo/src/setup.ts index f4932b6f..ce500987 100644 --- a/demo/src/setup.ts +++ b/demo/src/setup.ts @@ -20,6 +20,7 @@ import getSearchAccessServiceOverride from 'vscode/service-override/search' import getMarkersAccessServiceOverride from 'vscode/service-override/markers' import getAccessibilityAccessServiceOverride from 'vscode/service-override/accessibility' import getLanguageDetectionWorkerServiceOverride from 'vscode/service-override/languageDetectionWorker' +import getStorageServiceOverride, { IStorageItemsChangeEvent, StorageScope } from 'vscode/service-override/storage' import getExtensionServiceOverride from 'vscode/service-override/extensions' import EditorWorker from 'monaco-editor/esm/vs/editor/editor.worker.js?worker' import TextMateWorker from 'vscode/workers/textMate.worker?worker' @@ -49,6 +50,8 @@ window.MonacoEnvironment = { } } +const onStorageChange = new monaco.Emitter() + // Override services await initializeMonacoService({ ...getExtensionServiceOverride(toWorkerConfig(ExtensionHostWorker)), @@ -74,10 +77,30 @@ await initializeMonacoService({ ...getSearchAccessServiceOverride(), ...getMarkersAccessServiceOverride(), ...getAccessibilityAccessServiceOverride(), - ...getLanguageDetectionWorkerServiceOverride() + ...getLanguageDetectionWorkerServiceOverride(), + ...getStorageServiceOverride({ + read (scope) { + return new Map(Object.entries(JSON.parse(localStorage.getItem(`storage-${scope}`) ?? '{}'))) + }, + async write (scope, data) { + localStorage.setItem(`storage-${scope}`, JSON.stringify(Object.fromEntries(data.entries()))) + }, + onDidChange: onStorageChange.event + }) }) StandaloneServices.get(ILogService).setLevel(LogLevel.Off) +export function clearStorage (): void { + const allKeys = new Set([StorageScope.APPLICATION, StorageScope.PROFILE, StorageScope.WORKSPACE].flatMap(scope => Object.keys(JSON.parse(localStorage.getItem(`storage-${scope}`) ?? '{}')))) + localStorage.removeItem(`storage-${StorageScope.APPLICATION}`) + localStorage.removeItem(`storage-${StorageScope.PROFILE}`) + localStorage.removeItem(`storage-${StorageScope.WORKSPACE}`) + onStorageChange.fire({ + deleted: allKeys, + changed: new Map() + }) +} + await initializeVscodeExtensions() renderSidebarPart(document.querySelector('#sidebar')!) diff --git a/demo/vite.config.ts b/demo/vite.config.ts index 1fff3671..f6b963d9 100644 --- a/demo/vite.config.ts +++ b/demo/vite.config.ts @@ -42,7 +42,7 @@ export default defineConfig({ 'vscode/service-override/keybindings', 'vscode/service-override/textmate', 'vscode/service-override/theme', 'vscode/service-override/languages', 'vscode/service-override/audioCue', 'vscode/service-override/views', 'vscode/service-override/quickaccess', 'vscode/service-override/debug', 'vscode/service-override/preferences', 'vscode/service-override/snippets', 'vscode/service-override/files', 'vscode/service-override/output', - 'vscode/service-override/terminal', 'vscode/service-override/search', 'vscode/service-override/markers', 'vscode/service-override/accessibility', + 'vscode/service-override/terminal', 'vscode/service-override/search', 'vscode/service-override/markers', 'vscode/service-override/accessibility', 'vscode/service-override/storage', 'vscode/service-override/languageDetectionWorker', 'vscode/default-extensions/clojure', 'vscode/default-extensions/coffeescript', 'vscode/default-extensions/cpp', 'vscode/default-extensions/csharp', 'vscode/default-extensions/css', 'vscode/default-extensions/diff', 'vscode/default-extensions/fsharp', 'vscode/default-extensions/go', 'vscode/default-extensions/groovy', 'vscode/default-extensions/html', 'vscode/default-extensions/java', 'vscode/default-extensions/javascript', From fed6df50e3f04c399984169b363e52e13537e642 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= Date: Mon, 14 Aug 2023 12:09:56 +0200 Subject: [PATCH 05/17] fix: missing service, fix search view --- src/missing-services.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/missing-services.ts b/src/missing-services.ts index 5968091c..5d4faeba 100644 --- a/src/missing-services.ts +++ b/src/missing-services.ts @@ -163,6 +163,8 @@ import { ITestProfileService } from 'vs/workbench/contrib/testing/common/testPro import { IEncryptionService } from 'vs/platform/encryption/common/encryptionService' import { ITestResultService } from 'vs/workbench/contrib/testing/common/testResultService' import { IDiagnosticsService, NullDiagnosticsService } from 'vs/platform/diagnostics/common/diagnostics' +import { INotebookSearchService } from 'vs/workbench/contrib/search/browser/notebookSearch' +import { ResourceSet } from 'vs/base/common/map' import { unsupported } from './tools' class NullLoggerService extends AbstractLoggerService { @@ -2086,3 +2088,16 @@ registerSingleton(IUserDataInitializationService, class UserDataInitializationSe }, InstantiationType.Delayed) registerSingleton(IDiagnosticsService, NullDiagnosticsService, InstantiationType.Delayed) + +registerSingleton(INotebookSearchService, class NotebookSearchService implements INotebookSearchService { + _serviceBrand: undefined + async notebookSearch () { + return { + completeData: { + messages: [], + results: [] + }, + scannedFiles: new ResourceSet() + } + } +}, InstantiationType.Delayed) From e507fc1d6f25b266d609f1fe83ad99b8970c697f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= Date: Mon, 14 Aug 2023 12:10:10 +0200 Subject: [PATCH 06/17] clean: remove outdated README entry --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 78d79ff0..eafed3f3 100644 --- a/README.md +++ b/README.md @@ -296,8 +296,6 @@ It includes: - Keybinding service, with user keybindings editor - Debuggers -It also uses the `synchronizeJsonSchemas` function to register them on the monaco json worker and have autocomplete/hover on settings and keybindings. - From CLI run: ```bash From 53daf6287e01a8d811c0332bb645e2c63a16256f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= Date: Mon, 14 Aug 2023 12:11:15 +0200 Subject: [PATCH 07/17] fix(demo): wrong names --- demo/src/setup.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/demo/src/setup.ts b/demo/src/setup.ts index ce500987..2cae6a30 100644 --- a/demo/src/setup.ts +++ b/demo/src/setup.ts @@ -16,9 +16,9 @@ import getSnippetServiceOverride from 'vscode/service-override/snippets' import getQuickAccessServiceOverride from 'vscode/service-override/quickaccess' import getOutputServiceOverride from 'vscode/service-override/output' import getTerminalServiceOverride from 'vscode/service-override/terminal' -import getSearchAccessServiceOverride from 'vscode/service-override/search' -import getMarkersAccessServiceOverride from 'vscode/service-override/markers' -import getAccessibilityAccessServiceOverride from 'vscode/service-override/accessibility' +import getSearchServiceOverride from 'vscode/service-override/search' +import getMarkersServiceOverride from 'vscode/service-override/markers' +import getAccessibilityServiceOverride from 'vscode/service-override/accessibility' import getLanguageDetectionWorkerServiceOverride from 'vscode/service-override/languageDetectionWorker' import getStorageServiceOverride, { IStorageItemsChangeEvent, StorageScope } from 'vscode/service-override/storage' import getExtensionServiceOverride from 'vscode/service-override/extensions' @@ -74,9 +74,9 @@ await initializeMonacoService({ }), ...getOutputServiceOverride(), ...getTerminalServiceOverride(new TerminalBackend()), - ...getSearchAccessServiceOverride(), - ...getMarkersAccessServiceOverride(), - ...getAccessibilityAccessServiceOverride(), + ...getSearchServiceOverride(), + ...getMarkersServiceOverride(), + ...getAccessibilityServiceOverride(), ...getLanguageDetectionWorkerServiceOverride(), ...getStorageServiceOverride({ read (scope) { From 39843565d11679ebbaf26e74946070bc4c6a5d76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= Date: Mon, 14 Aug 2023 19:08:44 +0200 Subject: [PATCH 08/17] fix: properly set delayedInitializationSupported flag --- src/service-override/accessibility.ts | 2 +- src/service-override/audioCue.ts | 2 +- src/service-override/bulkEdit.ts | 2 +- src/service-override/configuration.ts | 8 ++-- src/service-override/debug.ts | 4 +- src/service-override/editor.ts | 4 +- src/service-override/environment.ts | 4 +- src/service-override/extensions.ts | 4 +- src/service-override/files.ts | 2 +- src/service-override/keybindings.ts | 4 +- .../languageDetectionWorker.ts | 2 +- src/service-override/languages.ts | 2 +- src/service-override/layout.ts | 4 +- src/service-override/output.ts | 2 +- src/service-override/preferences.ts | 6 +-- src/service-override/quickaccess.ts | 2 +- src/service-override/search.ts | 8 ++-- src/service-override/snippets.ts | 2 +- src/service-override/storage.ts | 2 +- src/service-override/terminal.ts | 22 ++++----- src/service-override/textmate.ts | 2 +- src/service-override/theme.ts | 2 +- src/service-override/views.ts | 48 +++++++++---------- 23 files changed, 70 insertions(+), 70 deletions(-) diff --git a/src/service-override/accessibility.ts b/src/service-override/accessibility.ts index 7c0ea240..d27cfa57 100644 --- a/src/service-override/accessibility.ts +++ b/src/service-override/accessibility.ts @@ -7,6 +7,6 @@ import 'vs/workbench/contrib/codeEditor/browser/accessibility/accessibility' export default function getServiceOverride (): IEditorOverrideServices { return { - [IAccessibleViewService.toString()]: new SyncDescriptor(AccessibleViewService, []) + [IAccessibleViewService.toString()]: new SyncDescriptor(AccessibleViewService, [], true) } } diff --git a/src/service-override/audioCue.ts b/src/service-override/audioCue.ts index 26ce8b65..264e66aa 100644 --- a/src/service-override/audioCue.ts +++ b/src/service-override/audioCue.ts @@ -11,6 +11,6 @@ registerAssets(audioAssets) export default function getServiceOverride (): IEditorOverrideServices { return { - [IAudioCueService.toString()]: new SyncDescriptor(AudioCueService) + [IAudioCueService.toString()]: new SyncDescriptor(AudioCueService, [], true) } } diff --git a/src/service-override/bulkEdit.ts b/src/service-override/bulkEdit.ts index c87a15c9..78caa800 100644 --- a/src/service-override/bulkEdit.ts +++ b/src/service-override/bulkEdit.ts @@ -6,6 +6,6 @@ import { BulkEditService } from 'vs/workbench/contrib/bulkEdit/browser/bulkEditS export default function getServiceOverride (): IEditorOverrideServices { return { - [IBulkEditService.toString()]: new SyncDescriptor(BulkEditService) + [IBulkEditService.toString()]: new SyncDescriptor(BulkEditService, [], true) } } diff --git a/src/service-override/configuration.ts b/src/service-override/configuration.ts index abcea477..5ef0bd70 100644 --- a/src/service-override/configuration.ts +++ b/src/service-override/configuration.ts @@ -113,10 +113,10 @@ export default function getServiceOverride (defaultWorkspaceUri: URI): IEditorOv return { ...getFileServiceOverride(), [ILabelService.toString()]: new SyncDescriptor(LabelService, undefined, true), - [IConfigurationService.toString()]: new SyncDescriptor(MemoizedInjectedConfigurationService), - [IWorkspaceContextService.toString()]: new SyncDescriptor(MemoizedInjectedConfigurationService), - [ITextResourceConfigurationService.toString()]: new SyncDescriptor(TextResourceConfigurationService), - [IWorkspaceEditingService.toString()]: new SyncDescriptor(MonacoWorkspaceEditingService), + [IConfigurationService.toString()]: new SyncDescriptor(MemoizedInjectedConfigurationService, [], true), + [IWorkspaceContextService.toString()]: new SyncDescriptor(MemoizedInjectedConfigurationService, [], true), + [ITextResourceConfigurationService.toString()]: new SyncDescriptor(TextResourceConfigurationService, [], true), + [IWorkspaceEditingService.toString()]: new SyncDescriptor(MonacoWorkspaceEditingService, [], true), [IWorkspacesService.toString()]: new SyncDescriptor(BrowserWorkspacesService, undefined, true) } } diff --git a/src/service-override/debug.ts b/src/service-override/debug.ts index d0776e89..49b48e16 100644 --- a/src/service-override/debug.ts +++ b/src/service-override/debug.ts @@ -22,8 +22,8 @@ DebugService.prototype['showError'] = function (message: string, errorActions?: export default function getServiceOverride (): IEditorOverrideServices { return { ...getLayoutServiceOverride(), - [ILanguageFeaturesService.toString()]: new SyncDescriptor(LanguageFeaturesService), // To restore inlineValuesProvider + [ILanguageFeaturesService.toString()]: new SyncDescriptor(LanguageFeaturesService, [], true), // To restore inlineValuesProvider [IDebugService.toString()]: new SyncDescriptor(DebugService, [], true), - [IConfigurationResolverService.toString()]: new SyncDescriptor(ConfigurationResolverService) + [IConfigurationResolverService.toString()]: new SyncDescriptor(ConfigurationResolverService, [], true) } } diff --git a/src/service-override/editor.ts b/src/service-override/editor.ts index f754f35c..acef1cfc 100644 --- a/src/service-override/editor.ts +++ b/src/service-override/editor.ts @@ -106,8 +106,8 @@ Registry.as(EditorExtensions.EditorFactory).registerFile export default function getServiceOverride (openEditor: OpenEditor): IEditorOverrideServices { return { [ICodeEditorService.toString()]: new SyncDescriptor(CodeEditorService, undefined, true), - [IEditorService.toString()]: new SyncDescriptor(SimpleEditorService, [openEditor]), - [ITextEditorService.toString()]: new SyncDescriptor(TextEditorService) + [IEditorService.toString()]: new SyncDescriptor(SimpleEditorService, [openEditor], true), + [ITextEditorService.toString()]: new SyncDescriptor(TextEditorService, [], false) } } diff --git a/src/service-override/environment.ts b/src/service-override/environment.ts index 08835f1f..24fa3401 100644 --- a/src/service-override/environment.ts +++ b/src/service-override/environment.ts @@ -14,7 +14,7 @@ class InjectedBrowserWorkbenchEnvironmentService extends BrowserWorkbenchEnviron export default function getServiceOverride (): IEditorOverrideServices { return { - [IEnvironmentService.toString()]: new SyncDescriptor(InjectedBrowserWorkbenchEnvironmentService, []), - [IBrowserWorkbenchEnvironmentService.toString()]: new SyncDescriptor(InjectedBrowserWorkbenchEnvironmentService, []) + [IEnvironmentService.toString()]: new SyncDescriptor(InjectedBrowserWorkbenchEnvironmentService, [], true), + [IBrowserWorkbenchEnvironmentService.toString()]: new SyncDescriptor(InjectedBrowserWorkbenchEnvironmentService, [], true) } } diff --git a/src/service-override/extensions.ts b/src/service-override/extensions.ts index f712e6d5..eb086e73 100644 --- a/src/service-override/extensions.ts +++ b/src/service-override/extensions.ts @@ -480,8 +480,8 @@ export default function getServiceOverride (workerConfig?: WorkerConfig, _iframe return { ...getOutputServiceOverride(), - [IExtensionService.toString()]: new SyncDescriptor(SimpleExtensionService, [_workerConfig]), - [IExtensionManifestPropertiesService.toString()]: new SyncDescriptor(ExtensionManifestPropertiesService) + [IExtensionService.toString()]: new SyncDescriptor(SimpleExtensionService, [_workerConfig], false), + [IExtensionManifestPropertiesService.toString()]: new SyncDescriptor(ExtensionManifestPropertiesService, [], true) } } diff --git a/src/service-override/files.ts b/src/service-override/files.ts index b7e83bc0..3f8898fa 100644 --- a/src/service-override/files.ts +++ b/src/service-override/files.ts @@ -430,7 +430,7 @@ class MemoryFileService extends FileService { export default function getServiceOverride (): IEditorOverrideServices { return { - [IFileService.toString()]: new SyncDescriptor(MemoryFileService) + [IFileService.toString()]: new SyncDescriptor(MemoryFileService, [], true) } } diff --git a/src/service-override/keybindings.ts b/src/service-override/keybindings.ts index bca45d7a..c72d1e9c 100644 --- a/src/service-override/keybindings.ts +++ b/src/service-override/keybindings.ts @@ -22,9 +22,9 @@ async function updateUserKeybindings (keybindingsJson: string): Promise { export default function getServiceOverride (): IEditorOverrideServices { return { ...getFileServiceOverride(), - [IKeybindingService.toString()]: new SyncDescriptor(WorkbenchKeybindingService), + [IKeybindingService.toString()]: new SyncDescriptor(WorkbenchKeybindingService, [], false), [IKeyboardLayoutService.toString()]: new SyncDescriptor(BrowserKeyboardLayoutService, undefined, true), - [ICommandService.toString()]: new SyncDescriptor(CommandService) + [ICommandService.toString()]: new SyncDescriptor(CommandService, [], true) } } diff --git a/src/service-override/languageDetectionWorker.ts b/src/service-override/languageDetectionWorker.ts index 1e8dcc31..e65e8f33 100644 --- a/src/service-override/languageDetectionWorker.ts +++ b/src/service-override/languageDetectionWorker.ts @@ -12,6 +12,6 @@ registerAssets({ export default function getServiceOverride (): IEditorOverrideServices { return { - [ILanguageDetectionService.toString()]: new SyncDescriptor(LanguageDetectionService) + [ILanguageDetectionService.toString()]: new SyncDescriptor(LanguageDetectionService, [], false) } } diff --git a/src/service-override/languages.ts b/src/service-override/languages.ts index c3e2ee28..60a7580d 100644 --- a/src/service-override/languages.ts +++ b/src/service-override/languages.ts @@ -23,6 +23,6 @@ Registry.as(WorkbenchExtensions.Workbench).regi export default function getServiceOverride (): IEditorOverrideServices { return { ...getFileServiceOverride(), - [ILanguageService.toString()]: new SyncDescriptor(WorkbenchLanguageService) + [ILanguageService.toString()]: new SyncDescriptor(WorkbenchLanguageService, [], false) } } diff --git a/src/service-override/layout.ts b/src/service-override/layout.ts index 8f432fd8..8a6c2f50 100644 --- a/src/service-override/layout.ts +++ b/src/service-override/layout.ts @@ -166,7 +166,7 @@ export default function getServiceOverride (container: HTMLElement = document.bo document.body.classList.add('web') return { - [ILayoutService.toString()]: new SyncDescriptor(LayoutService, [container]), - [IWorkbenchLayoutService.toString()]: new SyncDescriptor(LayoutService, [container]) + [ILayoutService.toString()]: new SyncDescriptor(LayoutService, [container], true), + [IWorkbenchLayoutService.toString()]: new SyncDescriptor(LayoutService, [container], true) } } diff --git a/src/service-override/output.ts b/src/service-override/output.ts index 6669da4f..342e237c 100644 --- a/src/service-override/output.ts +++ b/src/service-override/output.ts @@ -15,6 +15,6 @@ class _FileLoggerService extends FileLoggerService { export default function getServiceOverride (logLevel: LogLevel = LogLevel.Info): IEditorOverrideServices { return { - [ILoggerService.toString()]: new SyncDescriptor(_FileLoggerService, [logLevel]) + [ILoggerService.toString()]: new SyncDescriptor(_FileLoggerService, [logLevel], true) } } diff --git a/src/service-override/preferences.ts b/src/service-override/preferences.ts index 813051ff..5127707c 100644 --- a/src/service-override/preferences.ts +++ b/src/service-override/preferences.ts @@ -10,8 +10,8 @@ import 'vs/workbench/contrib/preferences/browser/preferences.contribution' export default function getServiceOverride (): IEditorOverrideServices { return { - [IPreferencesService.toString()]: new SyncDescriptor(PreferencesService), - [IPreferencesSearchService.toString()]: new SyncDescriptor(PreferencesSearchService), - [IKeybindingEditingService.toString()]: new SyncDescriptor(KeybindingsEditingService) + [IPreferencesService.toString()]: new SyncDescriptor(PreferencesService, [], true), + [IPreferencesSearchService.toString()]: new SyncDescriptor(PreferencesSearchService, [], true), + [IKeybindingEditingService.toString()]: new SyncDescriptor(KeybindingsEditingService, [], true) } } diff --git a/src/service-override/quickaccess.ts b/src/service-override/quickaccess.ts index bb76356d..9fb407a6 100644 --- a/src/service-override/quickaccess.ts +++ b/src/service-override/quickaccess.ts @@ -122,6 +122,6 @@ export default function getServiceOverride ({ shouldUseGlobalPicker = _shouldUseGlobalPicker } return { - [IQuickInputService.toString()]: new SyncDescriptor(DelegateQuickInputService) + [IQuickInputService.toString()]: new SyncDescriptor(DelegateQuickInputService, [], true) } } diff --git a/src/service-override/search.ts b/src/service-override/search.ts index 1367923f..213b9719 100644 --- a/src/service-override/search.ts +++ b/src/service-override/search.ts @@ -12,9 +12,9 @@ import 'vs/workbench/contrib/searchEditor/browser/searchEditor.contribution' export default function getServiceOverride (): IEditorOverrideServices { return { - [ISearchService.toString()]: new SyncDescriptor(SearchService), - [ISearchWorkbenchService.toString()]: new SyncDescriptor(SearchWorkbenchService), - [ISearchHistoryService.toString()]: new SyncDescriptor(SearchHistoryService), - [IReplaceService.toString()]: new SyncDescriptor(ReplaceService) + [ISearchService.toString()]: new SyncDescriptor(SearchService, [], true), + [ISearchWorkbenchService.toString()]: new SyncDescriptor(SearchWorkbenchService, [], true), + [ISearchHistoryService.toString()]: new SyncDescriptor(SearchHistoryService, [], true), + [IReplaceService.toString()]: new SyncDescriptor(ReplaceService, [], true) } } diff --git a/src/service-override/snippets.ts b/src/service-override/snippets.ts index 433b83f8..ee91af50 100644 --- a/src/service-override/snippets.ts +++ b/src/service-override/snippets.ts @@ -23,7 +23,7 @@ registerServiceInitializeParticipant(async (accessor) => { export default function getServiceOverride (): IEditorOverrideServices { return { ...getFileServiceOverride(), - [ISnippetsService.toString()]: new SyncDescriptor(SnippetsService) + [ISnippetsService.toString()]: new SyncDescriptor(SnippetsService, [], true) } } diff --git a/src/service-override/storage.ts b/src/service-override/storage.ts index bfcb56bd..f7bda4c0 100644 --- a/src/service-override/storage.ts +++ b/src/service-override/storage.ts @@ -119,7 +119,7 @@ class ExternalStorageService extends AbstractStorageService { export default function getStorageServiceOverride (provider: IStorageProvider): IEditorOverrideServices { return { - [IStorageService.toString()]: new SyncDescriptor(ExternalStorageService, [provider]) + [IStorageService.toString()]: new SyncDescriptor(ExternalStorageService, [provider], true) } } diff --git a/src/service-override/terminal.ts b/src/service-override/terminal.ts index a043dc2f..ebb26662 100644 --- a/src/service-override/terminal.ts +++ b/src/service-override/terminal.ts @@ -127,17 +127,17 @@ abstract class SimpleTerminalProcess implements ITerminalChildProcess { export default function getServiceOverride (backend: ITerminalBackend): IEditorOverrideServices { Registry.as(TerminalExtensions.Backend).registerTerminalBackend(backend) return { - [ITerminalService.toString()]: new SyncDescriptor(TerminalService), - [ITerminalLogService.toString()]: new SyncDescriptor(TerminalLogService), - [ITerminalEditorService.toString()]: new SyncDescriptor(TerminalEditorService), - [ITerminalGroupService.toString()]: new SyncDescriptor(TerminalGroupService), - [ITerminalInstanceService.toString()]: new SyncDescriptor(TerminalInstanceService), - [ITerminalProfileService.toString()]: new SyncDescriptor(TerminalProfileService), - [ITerminalContributionService.toString()]: new SyncDescriptor(TerminalContributionService), - [ITerminalLinkProviderService.toString()]: new SyncDescriptor(TerminalLinkProviderService), - [ITerminalProfileResolverService.toString()]: new SyncDescriptor(ElectronTerminalProfileResolverService), - [IEnvironmentVariableService.toString()]: new SyncDescriptor(EnvironmentVariableService), - [ITerminalQuickFixService.toString()]: new SyncDescriptor(TerminalQuickFixService) + [ITerminalService.toString()]: new SyncDescriptor(TerminalService, [], true), + [ITerminalLogService.toString()]: new SyncDescriptor(TerminalLogService, [], true), + [ITerminalEditorService.toString()]: new SyncDescriptor(TerminalEditorService, [], true), + [ITerminalGroupService.toString()]: new SyncDescriptor(TerminalGroupService, [], true), + [ITerminalInstanceService.toString()]: new SyncDescriptor(TerminalInstanceService, [], true), + [ITerminalProfileService.toString()]: new SyncDescriptor(TerminalProfileService, [], true), + [ITerminalContributionService.toString()]: new SyncDescriptor(TerminalContributionService, [], true), + [ITerminalLinkProviderService.toString()]: new SyncDescriptor(TerminalLinkProviderService, [], true), + [ITerminalProfileResolverService.toString()]: new SyncDescriptor(ElectronTerminalProfileResolverService, [], true), + [IEnvironmentVariableService.toString()]: new SyncDescriptor(EnvironmentVariableService, [], true), + [ITerminalQuickFixService.toString()]: new SyncDescriptor(TerminalQuickFixService, [], true) } } diff --git a/src/service-override/textmate.ts b/src/service-override/textmate.ts index d1abf1a2..1ea854db 100644 --- a/src/service-override/textmate.ts +++ b/src/service-override/textmate.ts @@ -37,7 +37,7 @@ Registry.as(WorkbenchExtensions.Workbench).regi export default function getServiceOverride (): IEditorOverrideServices { return { ...getFileServiceOverride(), - [ITextMateTokenizationService.toString()]: new SyncDescriptor(TextMateTokenizationFeature) + [ITextMateTokenizationService.toString()]: new SyncDescriptor(TextMateTokenizationFeature, [], false) } } diff --git a/src/service-override/theme.ts b/src/service-override/theme.ts index 4a7623a4..9906e0f9 100644 --- a/src/service-override/theme.ts +++ b/src/service-override/theme.ts @@ -33,7 +33,7 @@ type PartialIThemeExtensionPoint = Partial & Pick Date: Mon, 14 Aug 2023 22:01:15 +0200 Subject: [PATCH 09/17] fix: split initialization file to initialize in correct order --- src/service-override/configuration.ts | 4 ++-- src/services.ts | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/service-override/configuration.ts b/src/service-override/configuration.ts index 5ef0bd70..59d0a5c8 100644 --- a/src/service-override/configuration.ts +++ b/src/service-override/configuration.ts @@ -35,7 +35,7 @@ import 'vs/workbench/api/common/configurationExtensionPoint' import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService' import getFileServiceOverride from './files' import { memoizedConstructor, unsupported } from '../tools' -import { registerServiceInitializeParticipant } from '../services' +import { registerServiceInitializePreParticipant } from '../services' async function updateUserConfiguration (configurationJson: string): Promise { const userDataProfilesService = StandaloneServices.get(IUserDataProfilesService) @@ -79,7 +79,7 @@ class MonacoWorkspaceEditingService extends AbstractWorkspaceEditingService { } let _defaultWorkspaceUri = URI.file('/workspace') -registerServiceInitializeParticipant(async (accessor) => { +registerServiceInitializePreParticipant(async (accessor) => { const workspaceService = accessor.get(IWorkspaceContextService) as WorkspaceService workspaceService.acquireInstantiationService(accessor.get(IInstantiationService)) diff --git a/src/services.ts b/src/services.ts index f93bca61..19213a71 100644 --- a/src/services.ts +++ b/src/services.ts @@ -19,10 +19,18 @@ import getFileServiceOverride from './service-override/files' interface ServiceInitializeParticipant { (accessor: ServicesAccessor): Promise } +const serviceInitializePreParticipants: ServiceInitializeParticipant[] = [] const serviceInitializeParticipants: ServiceInitializeParticipant[] = [] +const serviceInitializePostParticipants: ServiceInitializeParticipant[] = [] +export function registerServiceInitializePreParticipant (participant: ServiceInitializeParticipant): void { + serviceInitializePreParticipants.push(participant) +} export function registerServiceInitializeParticipant (participant: ServiceInitializeParticipant): void { serviceInitializeParticipants.push(participant) } +export function registerServiceInitializePostParticipant (participant: ServiceInitializeParticipant): void { + serviceInitializePostParticipants.push(participant) +} async function initServices (overrides: IEditorOverrideServices): Promise { const instantiationService = StandaloneServices.initialize({ @@ -33,6 +41,10 @@ async function initServices (overrides: IEditorOverrideServices): Promise { + await Promise.all(serviceInitializePreParticipants.map(participant => participant(accessor))) + }) + await instantiationService.invokeFunction(async accessor => { const lifecycleService = accessor.get(ILifecycleService) @@ -42,6 +54,10 @@ async function initServices (overrides: IEditorOverrideServices): Promise { + await Promise.all(serviceInitializePostParticipants.map(participant => participant(accessor))) + }) + return instantiationService } From 27f09b1626bdee0caba0aad160f75a589904bd44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= Date: Mon, 14 Aug 2023 22:01:32 +0200 Subject: [PATCH 10/17] fix: initialize storage service --- src/service-override/storage.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/service-override/storage.ts b/src/service-override/storage.ts index f7bda4c0..e0990f28 100644 --- a/src/service-override/storage.ts +++ b/src/service-override/storage.ts @@ -6,6 +6,7 @@ import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors' import { AbstractStorageService, IStorageService, StorageScope as VSStorageScope } from 'vs/platform/storage/common/storage' import { IUserDataProfile } from 'vs/platform/userDataProfile/common/userDataProfile' import { IAnyWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace' +import { registerServiceInitializePreParticipant } from '../services' export enum StorageScope { APPLICATION = VSStorageScope.APPLICATION, @@ -71,7 +72,9 @@ class ExternalStorageService extends AbstractStorageService { private readonly workspaceStorage = this._register(new ExternalStorage(StorageScope.WORKSPACE, this.provider)) constructor (protected readonly provider: IStorageProvider) { - super() + super({ + flushInterval: 5000 + }) this._register(this.workspaceStorage.onDidChangeStorage(key => this.emitDidChangeValue(VSStorageScope.WORKSPACE, key))) this._register(this.profileStorage.onDidChangeStorage(key => this.emitDidChangeValue(VSStorageScope.PROFILE, key))) @@ -117,6 +120,10 @@ class ExternalStorageService extends AbstractStorageService { } } +registerServiceInitializePreParticipant(async (accessor) => { + await (accessor.get(IStorageService) as ExternalStorageService).initialize() +}) + export default function getStorageServiceOverride (provider: IStorageProvider): IEditorOverrideServices { return { [IStorageService.toString()]: new SyncDescriptor(ExternalStorageService, [provider], true) From 94efbb3fe3408774b4e749e9f141427d8bb36f5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= Date: Mon, 14 Aug 2023 22:04:01 +0200 Subject: [PATCH 11/17] fix: rework view rendering parts need to be rendered immediately to fully work (because of extensionService.onDidRegisterExtensions). So now we render them in an invisible container until the user needs it --- src/service-override/layout.ts | 2 +- src/service-override/views.ts | 182 ++++++++++++++------------------- 2 files changed, 76 insertions(+), 108 deletions(-) diff --git a/src/service-override/layout.ts b/src/service-override/layout.ts index 8a6c2f50..595c38f9 100644 --- a/src/service-override/layout.ts +++ b/src/service-override/layout.ts @@ -58,7 +58,7 @@ export class LayoutService implements ILayoutService, Pick() -const paneCompositeSelectorParts = new Map() - -class PaneCompositePartService implements IPaneCompositePartService { - _serviceBrand: undefined - onDidPaneCompositeOpen = Event.None - onDidPaneCompositeClose = Event.None - async openPaneComposite (id: string | undefined, viewContainerLocation: ViewContainerLocation, focus?: boolean): Promise { - return this.getPartByLocation(viewContainerLocation)?.openPaneComposite(id, focus) - } - - getActivePaneComposite (viewContainerLocation: ViewContainerLocation) { - return this.getPartByLocation(viewContainerLocation)?.getActivePaneComposite() - } - - getPaneComposite (id: string, viewContainerLocation: ViewContainerLocation) { - return this.getPartByLocation(viewContainerLocation)?.getPaneComposite(id) - } - - getPaneComposites (viewContainerLocation: ViewContainerLocation) { - return this.getPartByLocation(viewContainerLocation)?.getPaneComposites() ?? [] - } - - getPinnedPaneCompositeIds (viewContainerLocation: ViewContainerLocation): string[] { - return this.getSelectorPartByLocation(viewContainerLocation)?.getPinnedPaneCompositeIds() ?? [] - } - - getVisiblePaneCompositeIds (viewContainerLocation: ViewContainerLocation): string[] { - return this.getSelectorPartByLocation(viewContainerLocation)?.getVisiblePaneCompositeIds() ?? [] - } - - getProgressIndicator (id: string, viewContainerLocation: ViewContainerLocation): IProgressIndicator | undefined { - return this.getPartByLocation(viewContainerLocation)?.getProgressIndicator(id) - } - - hideActivePaneComposite (viewContainerLocation: ViewContainerLocation): void { - this.getPartByLocation(viewContainerLocation)?.hideActivePaneComposite() - } - - getLastActivePaneCompositeId (viewContainerLocation: ViewContainerLocation): string { - return this.getPartByLocation(viewContainerLocation)!.getLastActivePaneCompositeId() - } - - showActivity (id: string, viewContainerLocation: ViewContainerLocation, badge: IBadge, clazz?: string, priority?: number): IDisposable { - return this.getSelectorPartByLocation(viewContainerLocation)!.showActivity(id, badge, clazz, priority) - } - - private getPartByLocation (viewContainerLocation: ViewContainerLocation): IPaneCompositePart | undefined { - return paneCompositeParts.get(viewContainerLocation) - } - - private getSelectorPartByLocation (viewContainerLocation: ViewContainerLocation): IPaneCompositeSelectorPart | undefined { - return paneCompositeSelectorParts.get(viewContainerLocation) - } -} +import { registerServiceInitializePostParticipant } from '../services' function createPart (id: string, role: string, classes: string[]): HTMLElement { const part = document.createElement(role === 'status' ? 'footer' /* Use footer element for status bar #98376 */ : 'div') @@ -172,17 +115,22 @@ function createPart (id: string, role: string, classes: string[]): HTMLElement { return part } -function renderPart (id: string, role: string, classes: string[], part: Part, container: HTMLElement): IDisposable { - const partContainer = createPart(id, role, classes) - container.append(partContainer) +function layoutPart (part: Part) { + const parent = part.getContainer()?.parentNode + if (parent == null) { + return + } + part.layout( + Math.max(part.minimumWidth, Math.min(part.maximumWidth, (parent as HTMLElement).offsetWidth)), + Math.max(part.minimumHeight, Math.min(part.maximumHeight, (parent as HTMLElement).offsetHeight)), + 0, 0 + ) +} + +function renderPart (partContainer: HTMLElement, part: Part): void { partContainer.oncontextmenu = () => false - part.create(partContainer) function layout () { - part.layout( - Math.max(part.minimumWidth, Math.min(part.maximumWidth, container.offsetWidth)), - Math.max(part.minimumHeight, Math.min(part.maximumHeight, container.offsetHeight)), - 0, 0 - ) + layoutPart(part) } part.onDidVisibilityChange((visible) => { if (visible) { @@ -190,7 +138,15 @@ function renderPart (id: string, role: string, classes: string[], part: Part, co } }) layout() - const observer = new ResizeObserver(layout) +} + +function getPart (part: Parts): Part { + return (StandaloneServices.get(ILayoutService) as LayoutService).getPart(part) +} + +function attachPart (part: Part, container: HTMLElement) { + container.append(part.getContainer()!) + const observer = new ResizeObserver(() => layoutPart(part)) observer.observe(container) return { @@ -201,54 +157,27 @@ function renderPart (id: string, role: string, classes: string[], part: Part, co } function renderActivitybarPar (container: HTMLElement): IDisposable { - const activitybarPart = StandaloneServices.get(IInstantiationService).createInstance(ActivitybarPart, paneCompositeParts.get(ViewContainerLocation.Sidebar)!) - paneCompositeSelectorParts.set(ViewContainerLocation.Sidebar, activitybarPart) - - // eslint-disable-next-line dot-notation - activitybarPart['_register'](renderPart(Parts.ACTIVITYBAR_PART, 'none', ['activitybar', 'left'], activitybarPart, container)) - - return activitybarPart + return attachPart(getPart(Parts.ACTIVITYBAR_PART), container) } function renderSidebarPart (container: HTMLElement): IDisposable { - const sidebarPart = StandaloneServices.get(IInstantiationService).createInstance(SidebarPart) - paneCompositeParts.set(ViewContainerLocation.Sidebar, sidebarPart) - - // eslint-disable-next-line dot-notation - sidebarPart['_register'](renderPart(Parts.SIDEBAR_PART, 'none', ['sidebar', 'left'], sidebarPart, container)) - - if (sidebarPart.getPaneComposites().length > 0) { - void sidebarPart.openPaneComposite(sidebarPart.getPaneComposites()[0]!.id) - } - - return sidebarPart + return attachPart(getPart(Parts.SIDEBAR_PART), container) } function renderPanelPart (container: HTMLElement): IDisposable { - const panelPart = StandaloneServices.get(IInstantiationService).createInstance(PanelPart) - paneCompositeSelectorParts.set(ViewContainerLocation.Panel, panelPart) - paneCompositeParts.set(ViewContainerLocation.Panel, panelPart) - - // eslint-disable-next-line dot-notation - panelPart['_register'](renderPart(Parts.PANEL_PART, 'none', ['panel', 'basepanel', positionToString(Position.LEFT)], panelPart, container)) - - if (panelPart.getPaneComposites().length > 0) { - void panelPart.openPaneComposite(panelPart.getPaneComposites()[0]!.id) - } + return attachPart(getPart(Parts.PANEL_PART), container) +} - return panelPart +function renderAuxiliaryPart (container: HTMLElement): IDisposable { + return attachPart(getPart(Parts.AUXILIARYBAR_PART), container) } function renderEditorPart (container: HTMLElement): IDisposable { - const editorPart = StandaloneServices.get(IEditorGroupsService) as EditorPart - - return renderPart(Parts.EDITOR_PART, 'main', ['editor'], editorPart, container) + return attachPart(getPart(Parts.EDITOR_PART), container) } function renderStatusBarPart (container: HTMLElement): IDisposable { - const statusBarPart = StandaloneServices.get(IStatusbarService) as StatusbarPart - - return renderPart(Parts.STATUSBAR_PART, 'status', ['statusbar'], statusBarPart, container) + return attachPart(getPart(Parts.STATUSBAR_PART), container) } type Label = string | { @@ -568,6 +497,44 @@ registerAssets({ 'vs/workbench/contrib/webview/browser/pre/fake.html': () => changeUrlDomain(new URL('../../vscode/vs/workbench/contrib/webview/browser/pre/fake.html', import.meta.url).href, webviewIframeAlternateDomains) }) +registerServiceInitializePostParticipant(async (accessor) => { + const paneCompositePartService = accessor.get(IPaneCompositePartService) + const viewDescriptorService = accessor.get(IViewDescriptorService) + + // force service instantiation + accessor.get(IStatusbarService) + paneCompositePartService.getPaneComposites(ViewContainerLocation.Panel) + + const layoutService = accessor.get(ILayoutService) as LayoutService + + const invisibleContainer = document.createElement('div') + invisibleContainer.style.display = 'none' + document.body.append(invisibleContainer) + + // Create Parts + for (const { id, role, classes, options } of [ + { id: Parts.ACTIVITYBAR_PART, role: 'none', classes: ['activitybar', 'left'] }, + { id: Parts.SIDEBAR_PART, role: 'none', classes: ['sidebar', 'left'] }, + { id: Parts.EDITOR_PART, role: 'main', classes: ['editor'], options: { restorePreviousState: false } }, + { id: Parts.PANEL_PART, role: 'none', classes: ['panel', 'basepanel', positionToString(Position.BOTTOM)] }, + { id: Parts.AUXILIARYBAR_PART, role: 'none', classes: ['auxiliarybar', 'basepanel', 'right'] }, + { id: Parts.STATUSBAR_PART, role: 'status', classes: ['statusbar'] } + ]) { + const partContainer = createPart(id, role, classes) + + const part = layoutService.getPart(id) + part.create(partContainer, options) + renderPart(partContainer, part) + + // We need the container to be attached for some views to work (like xterm) + invisibleContainer.append(partContainer) + } + + await paneCompositePartService.openPaneComposite(viewDescriptorService.getDefaultViewContainer(ViewContainerLocation.Sidebar)?.id, ViewContainerLocation.Sidebar) + await paneCompositePartService.openPaneComposite(viewDescriptorService.getDefaultViewContainer(ViewContainerLocation.Panel)?.id, ViewContainerLocation.Panel) + await paneCompositePartService.openPaneComposite(viewDescriptorService.getDefaultViewContainer(ViewContainerLocation.AuxiliaryBar)?.id, ViewContainerLocation.AuxiliaryBar) +}) + export default function getServiceOverride (openEditorFallback?: OpenEditor, _webviewIframeAlternateDomains?: string): IEditorOverrideServices { if (_webviewIframeAlternateDomains != null) { webviewIframeAlternateDomains = _webviewIframeAlternateDomains @@ -612,6 +579,7 @@ export { registerEditorPane, renderSidebarPart, renderActivitybarPar, + renderAuxiliaryPart, renderPanelPart, renderEditorPart, renderStatusBarPart, From 26c6760104b571a0749b83a83d453d47d51aab09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= Date: Mon, 14 Aug 2023 22:05:19 +0200 Subject: [PATCH 12/17] fix: prevent class conflict --- demo/index.html | 4 ++-- demo/src/style.css | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/demo/index.html b/demo/index.html index ac419685..97b6b635 100644 --- a/demo/index.html +++ b/demo/index.html @@ -30,10 +30,10 @@

Editor

Settings

-
+

Keybindings

-
+
diff --git a/demo/src/style.css b/demo/src/style.css index e7c1f84f..bfd83a6f 100644 --- a/demo/src/style.css +++ b/demo/src/style.css @@ -33,7 +33,7 @@ body { height: 30vh; } -.editor { +.standalone-editor { width: 100%; height: 55vh; } From 8a7d8504adf5d26f8152e1a82631bcd4d27958ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= Date: Mon, 14 Aug 2023 23:17:13 +0200 Subject: [PATCH 13/17] fix(demo): use dedicated extension for output demo --- demo/src/features/output.ts | 13 +++++++++++-- demo/src/main.ts | 2 +- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/demo/src/features/output.ts b/demo/src/features/output.ts index d7a544de..66d6c830 100644 --- a/demo/src/features/output.ts +++ b/demo/src/features/output.ts @@ -1,8 +1,17 @@ -import * as vscode from 'vscode' -import { onExtHostInitialized } from 'vscode/extensions' +import { ExtensionHostKind, onExtHostInitialized, registerExtension } from 'vscode/extensions' await new Promise(resolve => onExtHostInitialized(resolve)) +const { getApi } = registerExtension({ + name: 'outputDemo', + publisher: 'codingame', + version: '1.0.0', + engines: { + vscode: '*' + } +}, ExtensionHostKind.LocalProcess) + +const vscode = await getApi() const fakeOutputChannel = vscode.window.createOutputChannel('Fake output') const anotherFakeOutputChannel = vscode.window.createOutputChannel('Your code', 'javascript') diff --git a/demo/src/main.ts b/demo/src/main.ts index c01c5168..cde09852 100644 --- a/demo/src/main.ts +++ b/demo/src/main.ts @@ -78,7 +78,7 @@ await vscode.window.showTextDocument(mainDocument, { anotherFakeOutputChannel.replace(mainDocument.getText()) vscode.workspace.onDidChangeTextDocument((e) => { - if (e.document === mainDocument) { + if (e.document === mainDocument && e.contentChanges.length > 0) { anotherFakeOutputChannel.replace(e.document.getText()) } }) From 623f5055322eac4497b442ac315223efb2a0e588 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= Date: Tue, 15 Aug 2023 01:11:15 +0200 Subject: [PATCH 14/17] fix: help vite to load properly ts worker d.ts files --- rollup/rollup.default-extensions.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/rollup/rollup.default-extensions.ts b/rollup/rollup.default-extensions.ts index 6e8ce857..3631f9cb 100644 --- a/rollup/rollup.default-extensions.ts +++ b/rollup/rollup.default-extensions.ts @@ -23,7 +23,13 @@ export default rollup.defineConfig(defaultExtensions.map(name => ( { + if (chunkInfo.name != null && chunkInfo.name.endsWith('d.ts')) { + // append .txt at the end of d.ts files: those file are required by the typescript extension and are just expected to be loaded as simple text + return `default-extensions/${name}/[name][extname].txt` + } + return `default-extensions/${name}/[name][extname]` + }, format: 'esm', dir: 'dist', entryFileNames: `default-extensions/${name}.js`, From 8fa91caac2e06d8cc107d46d9cc6a84e03143149 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= Date: Tue, 15 Aug 2023 01:12:33 +0200 Subject: [PATCH 15/17] fix: improve XMLHttpRequest patch make it return a 404 for unknown extension file --- scripts/vscode.patch | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/scripts/vscode.patch b/scripts/vscode.patch index 70ac0c63..4e8f013e 100644 --- a/scripts/vscode.patch +++ b/scripts/vscode.patch @@ -543,7 +543,7 @@ index b83a462131d..5555f431ba0 100644 performance.mark('code/extHost/didInitAPI'); diff --git a/src/vs/workbench/api/worker/extensionHostWorker.ts b/src/vs/workbench/api/worker/extensionHostWorker.ts -index 6e6f8845da5..74ecefe68f1 100644 +index 6e6f8845da5..89cab1e16da 100644 --- a/src/vs/workbench/api/worker/extensionHostWorker.ts +++ b/src/vs/workbench/api/worker/extensionHostWorker.ts @@ -15,7 +15,6 @@ import * as performance from 'vs/base/common/performance'; @@ -554,7 +554,16 @@ index 6e6f8845da5..74ecefe68f1 100644 import { URI } from 'vs/base/common/uri'; //#region --- Define, capture, and override some globals -@@ -89,66 +88,155 @@ self.addEventListener = () => console.trace(`'addEventListener' has been blocked +@@ -47,7 +46,7 @@ function shouldTransformUri(uri: string): boolean { + // In principle, we could convert any URI, but we have concerns + // that parsing https URIs might end up decoding escape characters + // and result in an unintended transformation +- return /^(file|vscode-remote):/i.test(uri); ++ return /^(file|extension|vscode-remote):/i.test(uri); + } + + const nativeFetch = fetch.bind(self); +@@ -89,66 +88,167 @@ self.addEventListener = () => console.trace(`'addEventListener' has been blocked (self)['webkitResolveLocalFileSystemSyncURL'] = undefined; (self)['webkitResolveLocalFileSystemURL'] = undefined; @@ -620,8 +629,20 @@ index 6e6f8845da5..74ecefe68f1 100644 + return nativeFetch(asWorkerBrowserUrl(input), init); + }; + self.XMLHttpRequest = class extends XMLHttpRequest { ++ private notFound = false; + override open(method: string, url: string | URL, async?: boolean, username?: string | null, password?: string | null): void { -+ return super.open(method, asWorkerBrowserUrl(url), async ?? true, username, password); ++ const transformedUrl = asWorkerBrowserUrl(url); ++ this.notFound = transformedUrl.startsWith('extension:'); ++ return super.open(method, transformedUrl, async ?? true, username, password); ++ } ++ override send(body?: Document | XMLHttpRequestBodyInit | null | undefined): void { ++ if (this.notFound) { ++ return; ++ } ++ super.send(body); ++ } ++ override get status() { ++ return this.notFound ? 404 : super.status; + } + }; + const nativeImportScripts = importScripts.bind(self); @@ -764,7 +785,7 @@ index 6e6f8845da5..74ecefe68f1 100644 } //#endregion --- -@@ -255,6 +343,7 @@ export function create(): { onmessage: (message: any) => void } { +@@ -255,6 +355,7 @@ export function create(): { onmessage: (message: any) => void } { ); patchFetching(uri => extHostMain.asBrowserUri(uri)); From 764200d6ace51af9c4e742434eb4f4384f45e968 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= Date: Thu, 17 Aug 2023 09:50:55 +0200 Subject: [PATCH 16/17] feat: automatically add quickaccess service override with proper arguments --- src/service-override/quickaccess.ts | 4 ++-- src/service-override/views.ts | 5 +++++ src/services.ts | 2 ++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/service-override/quickaccess.ts b/src/service-override/quickaccess.ts index 9fb407a6..cff2f983 100644 --- a/src/service-override/quickaccess.ts +++ b/src/service-override/quickaccess.ts @@ -17,10 +17,10 @@ import 'vs/workbench/browser/actions/quickAccessActions' import 'vs/workbench/contrib/quickaccess/browser/quickAccess.contribution' let isKeybindingConfigurationVisible = () => { - return true + return false } let shouldUseGlobalPicker = () => { - return true + return false } // eslint-disable-next-line dot-notation diff --git a/src/service-override/views.ts b/src/service-override/views.ts index 1066fd98..8ded8d32 100644 --- a/src/service-override/views.ts +++ b/src/service-override/views.ts @@ -99,6 +99,7 @@ import { ILayoutService } from 'vs/platform/layout/browser/layoutService' import { OpenEditor, wrapOpenEditor } from './tools/editor' import getBulkEditServiceOverride from './bulkEdit' import getLayoutServiceOverride, { LayoutService } from './layout' +import getQuickAccessOverride from './quickaccess' import { changeUrlDomain } from './tools/url' import { registerAssets } from '../assets' import { registerServiceInitializePostParticipant } from '../services' @@ -542,6 +543,10 @@ export default function getServiceOverride (openEditorFallback?: OpenEditor, _we return { ...getLayoutServiceOverride(), ...getBulkEditServiceOverride(), + ...getQuickAccessOverride({ + isKeybindingConfigurationVisible: isEditorPartVisible, + shouldUseGlobalPicker: isEditorPartVisible + }), [IViewsService.toString()]: new SyncDescriptor(ViewsService, [], false), [IViewDescriptorService.toString()]: new SyncDescriptor(ViewDescriptorService, [], true), [IActivityService.toString()]: new SyncDescriptor(ActivityService, [], true), diff --git a/src/services.ts b/src/services.ts index 19213a71..66549fdc 100644 --- a/src/services.ts +++ b/src/services.ts @@ -15,6 +15,7 @@ import getLayoutServiceOverride from './service-override/layout' import getEnvironmentServiceOverride from './service-override/environment' import getExtensionsServiceOverride from './service-override/extensions' import getFileServiceOverride from './service-override/files' +import getQuickAccessOverride from './service-override/quickaccess' interface ServiceInitializeParticipant { (accessor: ServicesAccessor): Promise @@ -38,6 +39,7 @@ async function initServices (overrides: IEditorOverrideServices): Promise Date: Thu, 17 Aug 2023 09:54:37 +0200 Subject: [PATCH 17/17] fix: wrong version change --- demo/package-lock.json | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/demo/package-lock.json b/demo/package-lock.json index f408f32d..bbc886ed 100644 --- a/demo/package-lock.json +++ b/demo/package-lock.json @@ -36,7 +36,7 @@ }, "..": { "name": "@codingame/monaco-vscode-api", - "version": "1.81.0-next.0", + "version": "0.0.0-semantic-release", "license": "MIT", "bin": { "monaco-treemending": "monaco-treemending.js" diff --git a/package-lock.json b/package-lock.json index b32d0131..d06f8fd7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@codingame/monaco-vscode-api", - "version": "1.81.0-next.0", + "version": "0.0.0-semantic-release", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@codingame/monaco-vscode-api", - "version": "1.81.0-next.0", + "version": "0.0.0-semantic-release", "license": "MIT", "bin": { "monaco-treemending": "monaco-treemending.js" diff --git a/package.json b/package.json index c34490e6..006a03f8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@codingame/monaco-vscode-api", - "version": "1.81.0-next.0", + "version": "0.0.0-semantic-release", "private": false, "description": "VSCode public API plugged on the monaco editor", "keywords": [],