@theia/plugin-ext 1.22.1 → 1.23.0-next.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/common/character-classifier.js +2 -2
- package/lib/common/character-classifier.js.map +1 -1
- package/lib/common/index.js +1 -1
- package/lib/common/objects.js +3 -3
- package/lib/common/objects.js.map +1 -1
- package/lib/common/plugin-api-rpc-model.d.ts +12 -19
- package/lib/common/plugin-api-rpc-model.d.ts.map +1 -1
- package/lib/common/plugin-api-rpc-model.js.map +1 -1
- package/lib/common/plugin-api-rpc.d.ts +31 -13
- package/lib/common/plugin-api-rpc.d.ts.map +1 -1
- package/lib/common/plugin-api-rpc.js +64 -62
- package/lib/common/plugin-api-rpc.js.map +1 -1
- package/lib/common/plugin-protocol.d.ts +6 -0
- package/lib/common/plugin-protocol.d.ts.map +1 -1
- package/lib/common/plugin-protocol.js +6 -1
- package/lib/common/plugin-protocol.js.map +1 -1
- package/lib/hosted/browser/hosted-plugin-watcher.js +1 -1
- package/lib/hosted/browser/hosted-plugin-watcher.js.map +1 -1
- package/lib/hosted/browser/hosted-plugin.d.ts +3 -2
- package/lib/hosted/browser/hosted-plugin.d.ts.map +1 -1
- package/lib/hosted/browser/hosted-plugin.js +53 -68
- package/lib/hosted/browser/hosted-plugin.js.map +1 -1
- package/lib/hosted/browser/plugin-worker.js +1 -1
- package/lib/hosted/browser/plugin-worker.js.map +1 -1
- package/lib/hosted/browser/worker/worker-main.js +4 -4
- package/lib/hosted/browser/worker/worker-main.js.map +1 -1
- package/lib/hosted/node/hosted-plugin-cli-contribution.js +1 -1
- package/lib/hosted/node/hosted-plugin-cli-contribution.js.map +1 -1
- package/lib/hosted/node/hosted-plugin-deployer-handler.d.ts +2 -0
- package/lib/hosted/node/hosted-plugin-deployer-handler.d.ts.map +1 -1
- package/lib/hosted/node/hosted-plugin-deployer-handler.js +25 -7
- package/lib/hosted/node/hosted-plugin-deployer-handler.js.map +1 -1
- package/lib/hosted/node/hosted-plugin-localization-service.js +3 -3
- package/lib/hosted/node/hosted-plugin-localization-service.js.map +1 -1
- package/lib/hosted/node/hosted-plugin-process.js +9 -9
- package/lib/hosted/node/hosted-plugin-process.js.map +1 -1
- package/lib/hosted/node/hosted-plugin.js +6 -6
- package/lib/hosted/node/hosted-plugin.js.map +1 -1
- package/lib/hosted/node/metadata-scanner.js +2 -2
- package/lib/hosted/node/metadata-scanner.js.map +1 -1
- package/lib/hosted/node/plugin-ext-hosted-backend-module.js +2 -2
- package/lib/hosted/node/plugin-ext-hosted-backend-module.js.map +1 -1
- package/lib/hosted/node/plugin-host-rpc.js +6 -6
- package/lib/hosted/node/plugin-host-rpc.js.map +1 -1
- package/lib/hosted/node/plugin-reader.d.ts.map +1 -1
- package/lib/hosted/node/plugin-reader.js +9 -8
- package/lib/hosted/node/plugin-reader.js.map +1 -1
- package/lib/hosted/node/plugin-service.js +9 -9
- package/lib/hosted/node/plugin-service.js.map +1 -1
- package/lib/hosted/node/scanners/backend-init-theia.js +2 -1
- package/lib/hosted/node/scanners/backend-init-theia.js.map +1 -1
- package/lib/hosted/node/scanners/file-plugin-uri-factory.js +1 -1
- package/lib/hosted/node/scanners/file-plugin-uri-factory.js.map +1 -1
- package/lib/hosted/node/scanners/grammars-reader.js +1 -1
- package/lib/hosted/node/scanners/grammars-reader.js.map +1 -1
- package/lib/hosted/node/scanners/scanner-theia.d.ts.map +1 -1
- package/lib/hosted/node/scanners/scanner-theia.js +9 -8
- package/lib/hosted/node/scanners/scanner-theia.js.map +1 -1
- package/lib/hosted/node-electron/plugin-ext-hosted-electron-backend-module.js +1 -1
- package/lib/hosted/node-electron/plugin-ext-hosted-electron-backend-module.js.map +1 -1
- package/lib/hosted/node-electron/scanner-theia-electron.js +1 -1
- package/lib/hosted/node-electron/scanner-theia-electron.js.map +1 -1
- package/lib/main/browser/authentication-main.d.ts +18 -11
- package/lib/main/browser/authentication-main.d.ts.map +1 -1
- package/lib/main/browser/authentication-main.js +111 -67
- package/lib/main/browser/authentication-main.js.map +1 -1
- package/lib/main/browser/commands.js +3 -3
- package/lib/main/browser/commands.js.map +1 -1
- package/lib/main/browser/comments/comment-thread-widget.js.map +1 -1
- package/lib/main/browser/comments/comments-context-key-service.d.ts +1 -1
- package/lib/main/browser/comments/comments-context-key-service.d.ts.map +1 -1
- package/lib/main/browser/comments/comments-context-key-service.js +3 -3
- package/lib/main/browser/comments/comments-context-key-service.js.map +1 -1
- package/lib/main/browser/comments/comments-contribution.js +8 -8
- package/lib/main/browser/comments/comments-contribution.js.map +1 -1
- package/lib/main/browser/comments/comments-decorator.js +1 -1
- package/lib/main/browser/comments/comments-decorator.js.map +1 -1
- package/lib/main/browser/comments/comments-main.js +1 -1
- package/lib/main/browser/comments/comments-main.js.map +1 -1
- package/lib/main/browser/comments/comments-service.js +1 -1
- package/lib/main/browser/comments/comments-service.js.map +1 -1
- package/lib/main/browser/custom-editors/custom-editor-contribution.js +2 -2
- package/lib/main/browser/custom-editors/custom-editor-contribution.js.map +1 -1
- package/lib/main/browser/custom-editors/custom-editor-opener.js +3 -3
- package/lib/main/browser/custom-editors/custom-editor-opener.js.map +1 -1
- package/lib/main/browser/custom-editors/custom-editor-service.js +1 -1
- package/lib/main/browser/custom-editors/custom-editor-service.js.map +1 -1
- package/lib/main/browser/custom-editors/custom-editor-widget.js +3 -3
- package/lib/main/browser/custom-editors/custom-editor-widget.js.map +1 -1
- package/lib/main/browser/custom-editors/custom-editors-main.js.map +1 -1
- package/lib/main/browser/custom-editors/paths.js +1 -1
- package/lib/main/browser/custom-editors/paths.js.map +1 -1
- package/lib/main/browser/custom-editors/plugin-custom-editor-registry.js +8 -8
- package/lib/main/browser/custom-editors/plugin-custom-editor-registry.js.map +1 -1
- package/lib/main/browser/custom-editors/undo-redo-service.js +1 -1
- package/lib/main/browser/custom-editors/undo-redo-service.js.map +1 -1
- package/lib/main/browser/debug/plugin-debug-service.js +4 -4
- package/lib/main/browser/debug/plugin-debug-service.js.map +1 -1
- package/lib/main/browser/debug/plugin-debug-session-contribution-registry.js +4 -4
- package/lib/main/browser/debug/plugin-debug-session-contribution-registry.js.map +1 -1
- package/lib/main/browser/dialogs/modal-notification.js +4 -4
- package/lib/main/browser/dialogs/modal-notification.js.map +1 -1
- package/lib/main/browser/dialogs-main.js.map +1 -1
- package/lib/main/browser/documents-main.js +1 -1
- package/lib/main/browser/documents-main.js.map +1 -1
- package/lib/main/browser/editor/untitled-resource.js +2 -2
- package/lib/main/browser/editor/untitled-resource.js.map +1 -1
- package/lib/main/browser/keybindings/keybindings-contribution-handler.js +2 -2
- package/lib/main/browser/keybindings/keybindings-contribution-handler.js.map +1 -1
- package/lib/main/browser/languages-main.js +12 -12
- package/lib/main/browser/languages-main.js.map +1 -1
- package/lib/main/browser/main-context.d.ts.map +1 -1
- package/lib/main/browser/main-context.js +3 -0
- package/lib/main/browser/main-context.js.map +1 -1
- package/lib/main/browser/main-file-system-event-service.js.map +1 -1
- package/lib/main/browser/menus/menus-contribution-handler.js +14 -14
- package/lib/main/browser/menus/menus-contribution-handler.js.map +1 -1
- package/lib/main/browser/output-channel-registry-main.js +2 -2
- package/lib/main/browser/output-channel-registry-main.js.map +1 -1
- package/lib/main/browser/plugin-authentication-service.d.ts +29 -0
- package/lib/main/browser/plugin-authentication-service.d.ts.map +1 -0
- package/lib/main/browser/plugin-authentication-service.js +81 -0
- package/lib/main/browser/plugin-authentication-service.js.map +1 -0
- package/lib/main/browser/plugin-contribution-handler.d.ts +1 -1
- package/lib/main/browser/plugin-contribution-handler.d.ts.map +1 -1
- package/lib/main/browser/plugin-contribution-handler.js +23 -23
- package/lib/main/browser/plugin-contribution-handler.js.map +1 -1
- package/lib/main/browser/plugin-ext-deploy-command.js +4 -4
- package/lib/main/browser/plugin-ext-deploy-command.js.map +1 -1
- package/lib/main/browser/plugin-ext-frontend-module.d.ts.map +1 -1
- package/lib/main/browser/plugin-ext-frontend-module.js +14 -10
- package/lib/main/browser/plugin-ext-frontend-module.js.map +1 -1
- package/lib/main/browser/plugin-ext-widget.js +6 -6
- package/lib/main/browser/plugin-ext-widget.js.map +1 -1
- package/lib/main/browser/plugin-frontend-contribution.js +3 -3
- package/lib/main/browser/plugin-frontend-contribution.js.map +1 -1
- package/lib/main/browser/plugin-frontend-view-contribution.js +1 -1
- package/lib/main/browser/plugin-frontend-view-contribution.js.map +1 -1
- package/lib/main/browser/plugin-icon-theme-service.js +11 -11
- package/lib/main/browser/plugin-icon-theme-service.js.map +1 -1
- package/lib/main/browser/plugin-shared-style.js +1 -1
- package/lib/main/browser/plugin-shared-style.js.map +1 -1
- package/lib/main/browser/plugin-storage.js.map +1 -1
- package/lib/main/browser/quick-open-main.js +1 -1
- package/lib/main/browser/quick-open-main.js.map +1 -1
- package/lib/main/browser/scm-main.js.map +1 -1
- package/lib/main/browser/selection-provider-command.js +3 -3
- package/lib/main/browser/selection-provider-command.js.map +1 -1
- package/lib/main/browser/text-editor-main.js +1 -1
- package/lib/main/browser/text-editor-main.js.map +1 -1
- package/lib/main/browser/text-editor-model-service.js +3 -3
- package/lib/main/browser/text-editor-model-service.js.map +1 -1
- package/lib/main/browser/text-editors-main.js +9 -9
- package/lib/main/browser/text-editors-main.js.map +1 -1
- package/lib/main/browser/view/plugin-tree-view-node-label-provider.js +3 -3
- package/lib/main/browser/view/plugin-tree-view-node-label-provider.js.map +1 -1
- package/lib/main/browser/view/plugin-view-registry.d.ts +8 -4
- package/lib/main/browser/view/plugin-view-registry.d.ts.map +1 -1
- package/lib/main/browser/view/plugin-view-registry.js +74 -18
- package/lib/main/browser/view/plugin-view-registry.js.map +1 -1
- package/lib/main/browser/view/plugin-view-widget.js +7 -7
- package/lib/main/browser/view/plugin-view-widget.js.map +1 -1
- package/lib/main/browser/view/tree-view-widget.js +16 -16
- package/lib/main/browser/view/tree-view-widget.js.map +1 -1
- package/lib/main/browser/view/view-context-key-service.js +3 -3
- package/lib/main/browser/view/view-context-key-service.js.map +1 -1
- package/lib/main/browser/view-column-service.js +4 -4
- package/lib/main/browser/view-column-service.js.map +1 -1
- package/lib/main/browser/webview/webview-environment.js +3 -3
- package/lib/main/browser/webview/webview-environment.js.map +1 -1
- package/lib/main/browser/webview/webview-frontend-security-warnings.js +4 -4
- package/lib/main/browser/webview/webview-frontend-security-warnings.js.map +1 -1
- package/lib/main/browser/webview/webview-preferences.js +1 -1
- package/lib/main/browser/webview/webview-preferences.js.map +1 -1
- package/lib/main/browser/webview/webview-resource-cache.js +1 -1
- package/lib/main/browser/webview/webview-resource-cache.js.map +1 -1
- package/lib/main/browser/webview/webview-theme-data-provider.d.ts +2 -2
- package/lib/main/browser/webview/webview-theme-data-provider.d.ts.map +1 -1
- package/lib/main/browser/webview/webview-theme-data-provider.js +5 -5
- package/lib/main/browser/webview/webview-theme-data-provider.js.map +1 -1
- package/lib/main/browser/webview/webview.js +17 -17
- package/lib/main/browser/webview/webview.js.map +1 -1
- package/lib/main/browser/webview-views/webview-views-main.d.ts +46 -0
- package/lib/main/browser/webview-views/webview-views-main.d.ts.map +1 -0
- package/lib/main/browser/webview-views/webview-views-main.js +127 -0
- package/lib/main/browser/webview-views/webview-views-main.js.map +1 -0
- package/lib/main/browser/webview-views/webview-views.d.ts +30 -0
- package/lib/main/browser/webview-views/webview-views.d.ts.map +1 -0
- package/lib/main/browser/webview-views/webview-views.js +23 -0
- package/lib/main/browser/webview-views/webview-views.js.map +1 -0
- package/lib/main/browser/webviews-main.js.map +1 -1
- package/lib/main/browser/window-state-main.js +1 -1
- package/lib/main/browser/window-state-main.js.map +1 -1
- package/lib/main/browser/workspace-main.d.ts +2 -0
- package/lib/main/browser/workspace-main.d.ts.map +1 -1
- package/lib/main/browser/workspace-main.js +6 -1
- package/lib/main/browser/workspace-main.js.map +1 -1
- package/lib/main/common/plugin-theia-environment.js +2 -2
- package/lib/main/common/plugin-theia-environment.js.map +1 -1
- package/lib/main/electron-browser/webview/electron-webview-widget-factory.js.map +1 -1
- package/lib/main/node/handlers/plugin-theia-directory-handler.js +1 -1
- package/lib/main/node/handlers/plugin-theia-directory-handler.js.map +1 -1
- package/lib/main/node/handlers/plugin-theia-file-handler.js +3 -3
- package/lib/main/node/handlers/plugin-theia-file-handler.js.map +1 -1
- package/lib/main/node/paths/plugin-paths-service.js +7 -7
- package/lib/main/node/paths/plugin-paths-service.js.map +1 -1
- package/lib/main/node/plugin-cli-contribution.js +1 -1
- package/lib/main/node/plugin-cli-contribution.js.map +1 -1
- package/lib/main/node/plugin-deployer-contribution.js +3 -3
- package/lib/main/node/plugin-deployer-contribution.js.map +1 -1
- package/lib/main/node/plugin-deployer-impl.d.ts +3 -1
- package/lib/main/node/plugin-deployer-impl.d.ts.map +1 -1
- package/lib/main/node/plugin-deployer-impl.js +24 -19
- package/lib/main/node/plugin-deployer-impl.js.map +1 -1
- package/lib/main/node/plugin-deployer-proxy-entry-impl.js +1 -1
- package/lib/main/node/plugin-deployer-proxy-entry-impl.js.map +1 -1
- package/lib/main/node/plugin-ext-backend-module.js +1 -1
- package/lib/main/node/plugin-ext-backend-module.js.map +1 -1
- package/lib/main/node/plugin-github-resolver.js +1 -1
- package/lib/main/node/plugin-github-resolver.js.map +1 -1
- package/lib/main/node/plugin-http-resolver.js +1 -1
- package/lib/main/node/plugin-http-resolver.js.map +1 -1
- package/lib/main/node/plugin-server-handler.js +3 -3
- package/lib/main/node/plugin-server-handler.js.map +1 -1
- package/lib/main/node/plugin-service.js +2 -2
- package/lib/main/node/plugin-service.js.map +1 -1
- package/lib/main/node/plugin-theia-deployer-participant.js +2 -2
- package/lib/main/node/plugin-theia-deployer-participant.js.map +1 -1
- package/lib/main/node/plugins-key-value-storage.js +4 -4
- package/lib/main/node/plugins-key-value-storage.js.map +1 -1
- package/lib/main/node/resolvers/local-directory-plugin-deployer-resolver.js +1 -1
- package/lib/main/node/resolvers/local-directory-plugin-deployer-resolver.js.map +1 -1
- package/lib/main/node/resolvers/local-file-plugin-deployer-resolver.js +1 -1
- package/lib/main/node/resolvers/local-file-plugin-deployer-resolver.js.map +1 -1
- package/lib/main/node/resolvers/local-plugin-deployer-resolver.js +1 -1
- package/lib/main/node/resolvers/local-plugin-deployer-resolver.js.map +1 -1
- package/lib/main/node/webview-backend-security-warnings.js +1 -1
- package/lib/main/node/webview-backend-security-warnings.js.map +1 -1
- package/lib/plugin/authentication-ext.d.ts +23 -8
- package/lib/plugin/authentication-ext.d.ts.map +1 -1
- package/lib/plugin/authentication-ext.js +28 -24
- package/lib/plugin/authentication-ext.js.map +1 -1
- package/lib/plugin/comments.js +6 -6
- package/lib/plugin/comments.js.map +1 -1
- package/lib/plugin/decorations.js +1 -1
- package/lib/plugin/decorations.js.map +1 -1
- package/lib/plugin/document-data.js +4 -4
- package/lib/plugin/document-data.js.map +1 -1
- package/lib/plugin/documents.js +1 -1
- package/lib/plugin/documents.js.map +1 -1
- package/lib/plugin/editors-and-documents.js +6 -6
- package/lib/plugin/editors-and-documents.js.map +1 -1
- package/lib/plugin/env.js +2 -2
- package/lib/plugin/env.js.map +1 -1
- package/lib/plugin/file-system-event-service-ext-impl.js +2 -2
- package/lib/plugin/file-system-event-service-ext-impl.js.map +1 -1
- package/lib/plugin/file-system-ext-impl.js +1 -1
- package/lib/plugin/file-system-ext-impl.js.map +1 -1
- package/lib/plugin/known-commands.js +17 -16
- package/lib/plugin/known-commands.js.map +1 -1
- package/lib/plugin/known-commands.spec.js +1 -1
- package/lib/plugin/known-commands.spec.js.map +1 -1
- package/lib/plugin/languages/completion.js.map +1 -1
- package/lib/plugin/languages/declaration.js +2 -2
- package/lib/plugin/languages/declaration.js.map +1 -1
- package/lib/plugin/languages/definition.js +2 -2
- package/lib/plugin/languages/definition.js.map +1 -1
- package/lib/plugin/languages/diagnostics.js +3 -3
- package/lib/plugin/languages/diagnostics.js.map +1 -1
- package/lib/plugin/languages/implementation.js +2 -2
- package/lib/plugin/languages/implementation.js.map +1 -1
- package/lib/plugin/languages/reference.js +1 -1
- package/lib/plugin/languages/reference.js.map +1 -1
- package/lib/plugin/languages/rename.js +1 -1
- package/lib/plugin/languages/rename.js.map +1 -1
- package/lib/plugin/languages/semantic-highlighting.js +4 -4
- package/lib/plugin/languages/semantic-highlighting.js.map +1 -1
- package/lib/plugin/languages/type-definition.js +2 -2
- package/lib/plugin/languages/type-definition.js.map +1 -1
- package/lib/plugin/languages.js +1 -1
- package/lib/plugin/languages.js.map +1 -1
- package/lib/plugin/node/debug/debug.js +7 -7
- package/lib/plugin/node/debug/debug.js.map +1 -1
- package/lib/plugin/node/debug/plugin-debug-adapter-starter.d.ts +1 -1
- package/lib/plugin/node/debug/plugin-debug-adapter-starter.d.ts.map +1 -1
- package/lib/plugin/node/debug/plugin-debug-adapter-starter.js +4 -4
- package/lib/plugin/node/debug/plugin-debug-adapter-starter.js.map +1 -1
- package/lib/plugin/node/debug/plugin-inline-debug-adapter.d.ts +34 -0
- package/lib/plugin/node/debug/plugin-inline-debug-adapter.d.ts.map +1 -0
- package/lib/plugin/node/debug/plugin-inline-debug-adapter.js +45 -0
- package/lib/plugin/node/debug/plugin-inline-debug-adapter.js.map +1 -0
- package/lib/plugin/node/env-node-ext.js +2 -2
- package/lib/plugin/node/env-node-ext.js.map +1 -1
- package/lib/plugin/path.spec.js +3 -3
- package/lib/plugin/path.spec.js.map +1 -1
- package/lib/plugin/plugin-context.d.ts.map +1 -1
- package/lib/plugin/plugin-context.js +62 -30
- package/lib/plugin/plugin-context.js.map +1 -1
- package/lib/plugin/plugin-manager.d.ts.map +1 -1
- package/lib/plugin/plugin-manager.js +7 -6
- package/lib/plugin/plugin-manager.js.map +1 -1
- package/lib/plugin/preference-registry.js +3 -3
- package/lib/plugin/preference-registry.js.map +1 -1
- package/lib/plugin/preferences/configuration.js +1 -1
- package/lib/plugin/preferences/configuration.js.map +1 -1
- package/lib/plugin/quick-open.js +1 -1
- package/lib/plugin/quick-open.js.map +1 -1
- package/lib/plugin/scm.js +1 -3
- package/lib/plugin/scm.js.map +1 -1
- package/lib/plugin/terminal-ext.d.ts +2 -2
- package/lib/plugin/terminal-ext.d.ts.map +1 -1
- package/lib/plugin/terminal-ext.js.map +1 -1
- package/lib/plugin/text-editor.js +10 -10
- package/lib/plugin/text-editor.js.map +1 -1
- package/lib/plugin/timeline.js.map +1 -1
- package/lib/plugin/type-converters.js +6 -5
- package/lib/plugin/type-converters.js.map +1 -1
- package/lib/plugin/type-converters.spec.js +5 -5
- package/lib/plugin/type-converters.spec.js.map +1 -1
- package/lib/plugin/types-impl.js +34 -32
- package/lib/plugin/types-impl.js.map +1 -1
- package/lib/plugin/webview-views.d.ts +68 -0
- package/lib/plugin/webview-views.d.ts.map +1 -0
- package/lib/plugin/webview-views.js +145 -0
- package/lib/plugin/webview-views.js.map +1 -0
- package/lib/plugin/webviews.d.ts +6 -0
- package/lib/plugin/webviews.d.ts.map +1 -1
- package/lib/plugin/webviews.js +29 -6
- package/lib/plugin/webviews.js.map +1 -1
- package/lib/plugin/workspace.d.ts +6 -0
- package/lib/plugin/workspace.d.ts.map +1 -1
- package/lib/plugin/workspace.js +21 -3
- package/lib/plugin/workspace.js.map +1 -1
- package/lib/plugin-ext-backend-electron-module.js +2 -2
- package/lib/plugin-ext-backend-electron-module.js.map +1 -1
- package/lib/plugin-ext-backend-module.js +2 -2
- package/lib/plugin-ext-backend-module.js.map +1 -1
- package/package.json +23 -23
- package/src/common/plugin-api-rpc-model.ts +12 -17
- package/src/common/plugin-api-rpc.ts +43 -13
- package/src/common/plugin-protocol.ts +7 -0
- package/src/hosted/browser/hosted-plugin.ts +20 -40
- package/src/hosted/node/hosted-plugin-deployer-handler.ts +23 -3
- package/src/hosted/node/plugin-reader.ts +2 -1
- package/src/hosted/node/scanners/scanner-theia.ts +2 -1
- package/src/main/browser/authentication-main.ts +137 -81
- package/src/main/browser/main-context.ts +4 -0
- package/src/main/browser/plugin-authentication-service.ts +71 -0
- package/src/main/browser/plugin-ext-frontend-module.ts +13 -8
- package/src/main/browser/view/plugin-view-registry.ts +73 -5
- package/src/main/browser/view-column-service.ts +1 -1
- package/src/main/browser/webview-views/webview-views-main.ts +142 -0
- package/src/main/browser/webview-views/webview-views.ts +38 -0
- package/src/main/browser/workspace-main.ts +9 -1
- package/src/main/electron-browser/webview/electron-webview-widget-factory.ts +2 -2
- package/src/main/node/paths/plugin-paths-service.ts +1 -1
- package/src/main/node/plugin-deployer-impl.ts +11 -7
- package/src/plugin/authentication-ext.ts +42 -32
- package/src/plugin/node/debug/plugin-debug-adapter-starter.ts +1 -1
- package/src/plugin/node/debug/plugin-inline-debug-adapter.ts +47 -0
- package/src/plugin/plugin-context.ts +47 -4
- package/src/plugin/plugin-manager.ts +2 -1
- package/src/plugin/terminal-ext.ts +2 -2
- package/src/plugin/webview-views.ts +213 -0
- package/src/plugin/webviews.ts +30 -0
- package/src/plugin/workspace.ts +23 -0
|
@@ -21,21 +21,21 @@
|
|
|
21
21
|
// code copied and modified from https://github.com/microsoft/vscode/blob/1.47.3/src/vs/workbench/api/browser/mainThreadAuthentication.ts
|
|
22
22
|
|
|
23
23
|
import { interfaces } from '@theia/core/shared/inversify';
|
|
24
|
-
import { AuthenticationExt, AuthenticationMain, MAIN_RPC_CONTEXT } from '../../common/plugin-api-rpc';
|
|
24
|
+
import { AuthenticationExt, AuthenticationMain, PluginManagerExt, MAIN_RPC_CONTEXT } from '../../common/plugin-api-rpc';
|
|
25
25
|
import { RPCProtocol } from '../../common/rpc-protocol';
|
|
26
26
|
import { MessageService } from '@theia/core/lib/common/message-service';
|
|
27
|
-
import { StorageService } from '@theia/core/lib/browser';
|
|
27
|
+
import { Dialog, StorageService } from '@theia/core/lib/browser';
|
|
28
28
|
import {
|
|
29
29
|
AuthenticationProvider,
|
|
30
30
|
AuthenticationService,
|
|
31
31
|
readAllowedExtensions
|
|
32
32
|
} from '@theia/core/lib/browser/authentication-service';
|
|
33
33
|
import { QuickPickService } from '@theia/core/lib/common/quick-pick-service';
|
|
34
|
-
import
|
|
35
|
-
AuthenticationSession,
|
|
36
|
-
AuthenticationSessionsChangeEvent
|
|
37
|
-
} from '../../common/plugin-api-rpc-model';
|
|
34
|
+
import * as theia from '@theia/plugin';
|
|
38
35
|
import { QuickPickValue } from '@theia/core/lib/browser/quick-input/quick-input-service';
|
|
36
|
+
import { nls } from '@theia/core/lib/common/nls';
|
|
37
|
+
|
|
38
|
+
export function getAuthenticationProviderActivationEvent(id: string): string { return `onAuthenticationRequest:${id}`; }
|
|
39
39
|
|
|
40
40
|
export class AuthenticationMainImpl implements AuthenticationMain {
|
|
41
41
|
private readonly proxy: AuthenticationExt;
|
|
@@ -43,15 +43,17 @@ export class AuthenticationMainImpl implements AuthenticationMain {
|
|
|
43
43
|
private readonly storageService: StorageService;
|
|
44
44
|
private readonly authenticationService: AuthenticationService;
|
|
45
45
|
private readonly quickPickService: QuickPickService;
|
|
46
|
+
private readonly extensionService: PluginManagerExt;
|
|
46
47
|
constructor(rpc: RPCProtocol, container: interfaces.Container) {
|
|
47
48
|
this.proxy = rpc.getProxy(MAIN_RPC_CONTEXT.AUTHENTICATION_EXT);
|
|
48
49
|
this.messageService = container.get(MessageService);
|
|
49
50
|
this.storageService = container.get(StorageService);
|
|
50
51
|
this.authenticationService = container.get(AuthenticationService);
|
|
51
52
|
this.quickPickService = container.get(QuickPickService);
|
|
53
|
+
this.extensionService = rpc.getProxy(MAIN_RPC_CONTEXT.HOSTED_PLUGIN_MANAGER_EXT);
|
|
52
54
|
|
|
53
55
|
this.authenticationService.onDidChangeSessions(e => {
|
|
54
|
-
this.proxy.$onDidChangeAuthenticationSessions(e.providerId, e.label
|
|
56
|
+
this.proxy.$onDidChangeAuthenticationSessions(e.providerId, e.label);
|
|
55
57
|
});
|
|
56
58
|
this.authenticationService.onDidRegisterAuthenticationProvider(info => {
|
|
57
59
|
this.proxy.$onDidChangeAuthenticationProviders([info], []);
|
|
@@ -73,7 +75,7 @@ export class AuthenticationMainImpl implements AuthenticationMain {
|
|
|
73
75
|
this.authenticationService.unregisterAuthenticationProvider(id);
|
|
74
76
|
}
|
|
75
77
|
|
|
76
|
-
async $updateSessions(id: string, event:
|
|
78
|
+
async $updateSessions(id: string, event: theia.AuthenticationProviderAuthenticationSessionsChangeEvent): Promise<void> {
|
|
77
79
|
this.authenticationService.updateSessions(id, event);
|
|
78
80
|
}
|
|
79
81
|
|
|
@@ -86,75 +88,85 @@ export class AuthenticationMainImpl implements AuthenticationMain {
|
|
|
86
88
|
}
|
|
87
89
|
|
|
88
90
|
async $getSession(providerId: string, scopes: string[], extensionId: string, extensionName: string,
|
|
89
|
-
options:
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
91
|
+
options: theia.AuthenticationGetSessionOptions): Promise<theia.AuthenticationSession | undefined> {
|
|
92
|
+
const sessions = await this.authenticationService.getSessions(providerId, scopes);
|
|
93
|
+
|
|
94
|
+
// Error cases
|
|
95
|
+
if (options.forceNewSession && !sessions.length) {
|
|
96
|
+
throw new Error('No existing sessions found.');
|
|
97
|
+
}
|
|
98
|
+
if (options.forceNewSession && options.createIfNone) {
|
|
99
|
+
throw new Error('Invalid combination of options. Please remove one of the following: forceNewSession, createIfNone');
|
|
100
|
+
}
|
|
101
|
+
if (options.forceNewSession && options.silent) {
|
|
102
|
+
throw new Error('Invalid combination of options. Please remove one of the following: forceNewSession, silent');
|
|
103
|
+
}
|
|
104
|
+
if (options.createIfNone && options.silent) {
|
|
105
|
+
throw new Error('Invalid combination of options. Please remove one of the following: createIfNone, silent');
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const supportsMultipleAccounts = this.authenticationService.supportsMultipleAccounts(providerId);
|
|
109
|
+
// Check if the sessions we have are valid
|
|
110
|
+
if (!options.forceNewSession && sessions.length) {
|
|
111
|
+
if (supportsMultipleAccounts) {
|
|
112
|
+
if (options.clearSessionPreference) {
|
|
113
|
+
await this.storageService.setData(`authentication-session-${extensionName}-${providerId}`, undefined);
|
|
100
114
|
} else {
|
|
101
|
-
|
|
115
|
+
const existingSessionPreference = await this.storageService.getData(`authentication-session-${extensionName}-${providerId}`);
|
|
116
|
+
if (existingSessionPreference) {
|
|
117
|
+
const matchingSession = sessions.find(session => session.id === existingSessionPreference);
|
|
118
|
+
if (matchingSession && await this.isAccessAllowed(providerId, matchingSession.account.label, extensionId)) {
|
|
119
|
+
return matchingSession;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
102
122
|
}
|
|
123
|
+
} else if (await this.isAccessAllowed(providerId, sessions[0].account.label, extensionId)) {
|
|
124
|
+
return sessions[0];
|
|
103
125
|
}
|
|
126
|
+
}
|
|
104
127
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
throw new Error('User did not consent to login.');
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
const session = await this.authenticationService.login(providerId, scopes);
|
|
116
|
-
await this.setTrustedExtensionAndAccountPreference(providerId, session.account.label, extensionId, extensionName, session.id);
|
|
117
|
-
return session;
|
|
118
|
-
} else {
|
|
119
|
-
await this.requestNewSession(providerId, scopes, extensionId, extensionName);
|
|
120
|
-
return undefined;
|
|
128
|
+
// We may need to prompt because we don't have a valid session modal flows
|
|
129
|
+
if (options.createIfNone || options.forceNewSession) {
|
|
130
|
+
const providerName = this.authenticationService.getLabel(providerId);
|
|
131
|
+
const detail = (typeof options.forceNewSession === 'object') ? options.forceNewSession!.detail : undefined;
|
|
132
|
+
const isAllowed = await this.loginPrompt(providerName, extensionName, !!options.forceNewSession, detail);
|
|
133
|
+
if (!isAllowed) {
|
|
134
|
+
throw new Error('User did not consent to login.');
|
|
121
135
|
}
|
|
136
|
+
|
|
137
|
+
const session = sessions?.length && !options.forceNewSession && supportsMultipleAccounts
|
|
138
|
+
? await this.selectSession(providerId, providerName, extensionId, extensionName, sessions, scopes, !!options.clearSessionPreference)
|
|
139
|
+
: await this.authenticationService.login(providerId, scopes);
|
|
140
|
+
await this.setTrustedExtensionAndAccountPreference(providerId, session.account.label, extensionId, extensionName, session.id);
|
|
141
|
+
return session;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// passive flows (silent or default)
|
|
145
|
+
const validSession = sessions.find(s => this.isAccessAllowed(providerId, s.account.label, extensionId));
|
|
146
|
+
if (!options.silent && !validSession) {
|
|
147
|
+
this.authenticationService.requestNewSession(providerId, scopes, extensionId, extensionName);
|
|
122
148
|
}
|
|
149
|
+
return validSession;
|
|
123
150
|
}
|
|
124
151
|
|
|
125
152
|
protected async selectSession(providerId: string, providerName: string, extensionId: string, extensionName: string,
|
|
126
|
-
potentialSessions: AuthenticationSession[]
|
|
153
|
+
potentialSessions: Readonly<theia.AuthenticationSession[]>, scopes: string[], clearSessionPreference: boolean): Promise<theia.AuthenticationSession> {
|
|
127
154
|
if (!potentialSessions.length) {
|
|
128
155
|
throw new Error('No potential sessions found');
|
|
129
156
|
}
|
|
130
157
|
|
|
131
|
-
if (clearSessionPreference) {
|
|
132
|
-
await this.storageService.setData(`authentication-session-${extensionName}-${providerId}`, undefined);
|
|
133
|
-
} else {
|
|
134
|
-
const existingSessionPreference = await this.storageService.getData(`authentication-session-${extensionName}-${providerId}`);
|
|
135
|
-
if (existingSessionPreference) {
|
|
136
|
-
const matchingSession = potentialSessions.find(session => session.id === existingSessionPreference);
|
|
137
|
-
if (matchingSession) {
|
|
138
|
-
const allowed = await this.getSessionsPrompt(providerId, matchingSession.account.label, providerName, extensionId, extensionName);
|
|
139
|
-
if (allowed) {
|
|
140
|
-
return matchingSession;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
158
|
return new Promise(async (resolve, reject) => {
|
|
147
|
-
const items: QuickPickValue<{ session?: AuthenticationSession }>[] = potentialSessions.map(session => ({
|
|
159
|
+
const items: QuickPickValue<{ session?: theia.AuthenticationSession }>[] = potentialSessions.map(session => ({
|
|
148
160
|
label: session.account.label,
|
|
149
161
|
value: { session }
|
|
150
162
|
}));
|
|
151
163
|
items.push({
|
|
152
|
-
label: 'Sign in to another account',
|
|
164
|
+
label: nls.localizeByDefault('Sign in to another account'),
|
|
153
165
|
value: { session: undefined }
|
|
154
166
|
});
|
|
155
167
|
const selected = await this.quickPickService.show(items,
|
|
156
168
|
{
|
|
157
|
-
title:
|
|
169
|
+
title: nls.localizeByDefault("The extension '{0}' wants to access a {1} account", extensionName, providerName),
|
|
158
170
|
ignoreFocusOut: true
|
|
159
171
|
});
|
|
160
172
|
if (selected) {
|
|
@@ -196,20 +208,39 @@ export class AuthenticationMainImpl implements AuthenticationMain {
|
|
|
196
208
|
return allow;
|
|
197
209
|
}
|
|
198
210
|
|
|
199
|
-
protected async loginPrompt(providerName: string, extensionName: string): Promise<boolean> {
|
|
200
|
-
const
|
|
211
|
+
protected async loginPrompt(providerName: string, extensionName: string, recreatingSession: boolean, _detail?: string): Promise<boolean> {
|
|
212
|
+
const message = recreatingSession
|
|
213
|
+
? nls.localizeByDefault("The extension '{0}' wants you to sign in again using {1}.", extensionName, providerName)
|
|
214
|
+
: nls.localizeByDefault("The extension '{0}' wants to sign in using {1}.", extensionName, providerName);
|
|
215
|
+
const choice = await this.messageService.info(message, 'Allow', 'Cancel');
|
|
201
216
|
return choice === 'Allow';
|
|
202
217
|
}
|
|
203
218
|
|
|
219
|
+
protected async isAccessAllowed(providerId: string, accountName: string, extensionId: string): Promise<boolean> {
|
|
220
|
+
const allowList = await readAllowedExtensions(this.storageService, providerId, accountName);
|
|
221
|
+
return !!allowList.find(allowed => allowed.id === extensionId);
|
|
222
|
+
}
|
|
223
|
+
|
|
204
224
|
protected async setTrustedExtensionAndAccountPreference(providerId: string, accountName: string, extensionId: string, extensionName: string, sessionId: string): Promise<void> {
|
|
205
225
|
const allowList = await readAllowedExtensions(this.storageService, providerId, accountName);
|
|
206
226
|
if (!allowList.find(allowed => allowed.id === extensionId)) {
|
|
207
227
|
allowList.push({ id: extensionId, name: extensionName });
|
|
208
228
|
this.storageService.setData(`authentication-trusted-extensions-${providerId}-${accountName}`, JSON.stringify(allowList));
|
|
209
229
|
}
|
|
210
|
-
|
|
211
230
|
this.storageService.setData(`authentication-session-${extensionName}-${providerId}`, sessionId);
|
|
212
231
|
}
|
|
232
|
+
|
|
233
|
+
$ensureProvider(id: string): Promise<void> {
|
|
234
|
+
return this.extensionService.$activateByEvent(getAuthenticationProviderActivationEvent(id));
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
$removeSession(providerId: string, sessionId: string): Promise<void> {
|
|
238
|
+
return this.authenticationService.logout(providerId, sessionId);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
$sendDidChangeSessions(providerId: string, event: theia.AuthenticationProviderAuthenticationSessionsChangeEvent): void {
|
|
242
|
+
this.authenticationService.updateSessions(providerId, event);
|
|
243
|
+
}
|
|
213
244
|
}
|
|
214
245
|
|
|
215
246
|
async function addAccountUsage(storageService: StorageService, providerId: string, accountName: string, extensionId: string, extensionName: string): Promise<void> {
|
|
@@ -244,6 +275,8 @@ export class AuthenticationProviderImpl implements AuthenticationProvider {
|
|
|
244
275
|
private accounts = new Map<string, string[]>(); // Map account name to session ids
|
|
245
276
|
private sessions = new Map<string, string>(); // Map account id to name
|
|
246
277
|
|
|
278
|
+
readonly onDidChangeSessions: theia.Event<theia.AuthenticationProviderAuthenticationSessionsChangeEvent>;
|
|
279
|
+
|
|
247
280
|
constructor(
|
|
248
281
|
private readonly proxy: AuthenticationExt,
|
|
249
282
|
public readonly id: string,
|
|
@@ -257,7 +290,7 @@ export class AuthenticationProviderImpl implements AuthenticationProvider {
|
|
|
257
290
|
return !!this.sessions.size;
|
|
258
291
|
}
|
|
259
292
|
|
|
260
|
-
private registerSession(session: AuthenticationSession): void {
|
|
293
|
+
private registerSession(session: theia.AuthenticationSession): void {
|
|
261
294
|
this.sessions.set(session.id, session.account.label);
|
|
262
295
|
|
|
263
296
|
const existingSessionsForAccount = this.accounts.get(session.account.label);
|
|
@@ -272,34 +305,41 @@ export class AuthenticationProviderImpl implements AuthenticationProvider {
|
|
|
272
305
|
async signOut(accountName: string): Promise<void> {
|
|
273
306
|
const accountUsages = await readAccountUsages(this.storageService, this.id, accountName);
|
|
274
307
|
const sessionsForAccount = this.accounts.get(accountName);
|
|
275
|
-
const result = await this.messageService.info(accountUsages.length
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
308
|
+
const result = await this.messageService.info(accountUsages.length
|
|
309
|
+
? nls.localizeByDefault("The account '{0}' has been used by: \n\n{1}\n\n Sign out from these extensions?", accountName,
|
|
310
|
+
accountUsages.map(usage => usage.extensionName).join(', '))
|
|
311
|
+
: nls.localizeByDefault("Sign out of '{0}'?", accountName),
|
|
312
|
+
nls.localizeByDefault('Sign Out'),
|
|
313
|
+
Dialog.CANCEL);
|
|
314
|
+
|
|
315
|
+
if (result && result === nls.localizeByDefault('Sign Out') && sessionsForAccount) {
|
|
279
316
|
sessionsForAccount.forEach(sessionId => this.logout(sessionId));
|
|
280
317
|
removeAccountUsage(this.storageService, this.id, accountName);
|
|
281
318
|
}
|
|
282
319
|
}
|
|
283
320
|
|
|
284
|
-
async getSessions(): Promise<ReadonlyArray<AuthenticationSession>> {
|
|
285
|
-
return this.proxy.$getSessions(this.id);
|
|
321
|
+
async getSessions(scopes?: string[]): Promise<ReadonlyArray<theia.AuthenticationSession>> {
|
|
322
|
+
return this.proxy.$getSessions(this.id, scopes);
|
|
286
323
|
}
|
|
287
324
|
|
|
288
|
-
async updateSessionItems(event:
|
|
325
|
+
async updateSessionItems(event: theia.AuthenticationProviderAuthenticationSessionsChangeEvent): Promise<void> {
|
|
289
326
|
const { added, removed } = event;
|
|
290
327
|
const session = await this.proxy.$getSessions(this.id);
|
|
291
|
-
const addedSessions = session.filter(s => added.some(
|
|
292
|
-
|
|
293
|
-
removed.forEach(
|
|
294
|
-
const
|
|
295
|
-
if (
|
|
296
|
-
this.sessions.
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
328
|
+
const addedSessions = session.filter(s => added.some(addedSession => this.getSessionId(addedSession) === s.id));
|
|
329
|
+
|
|
330
|
+
removed.forEach(removedSession => {
|
|
331
|
+
const sessionId = this.getSessionId(removedSession);
|
|
332
|
+
if (sessionId) {
|
|
333
|
+
const accountName = this.sessions.get(sessionId);
|
|
334
|
+
if (accountName) {
|
|
335
|
+
this.sessions.delete(sessionId);
|
|
336
|
+
const sessionsForAccount = this.accounts.get(accountName) || [];
|
|
337
|
+
const sessionIndex = sessionsForAccount.indexOf(sessionId);
|
|
338
|
+
sessionsForAccount.splice(sessionIndex);
|
|
339
|
+
|
|
340
|
+
if (!sessionsForAccount.length) {
|
|
341
|
+
this.accounts.delete(accountName);
|
|
342
|
+
}
|
|
303
343
|
}
|
|
304
344
|
}
|
|
305
345
|
});
|
|
@@ -307,14 +347,30 @@ export class AuthenticationProviderImpl implements AuthenticationProvider {
|
|
|
307
347
|
addedSessions.forEach(s => this.registerSession(s));
|
|
308
348
|
}
|
|
309
349
|
|
|
310
|
-
login(scopes: string[]): Promise<AuthenticationSession> {
|
|
311
|
-
return this.proxy.$
|
|
350
|
+
login(scopes: string[]): Promise<theia.AuthenticationSession> {
|
|
351
|
+
return this.proxy.$createSession(this.id, scopes);
|
|
312
352
|
}
|
|
313
353
|
|
|
314
354
|
async logout(sessionId: string): Promise<void> {
|
|
315
|
-
await this.proxy.$
|
|
355
|
+
await this.proxy.$removeSession(this.id, sessionId);
|
|
316
356
|
this.messageService.info('Successfully signed out.');
|
|
317
357
|
}
|
|
358
|
+
|
|
359
|
+
createSession(scopes: string[]): Thenable<theia.AuthenticationSession> {
|
|
360
|
+
return this.login(scopes);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
removeSession(sessionId: string): Thenable<void> {
|
|
364
|
+
return this.logout(sessionId);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// utility method to be backwards compatible with the old AuthenticationProviderAuthenticationSessionsChangeEvent containing only the session id string
|
|
368
|
+
private getSessionId(obj: string | theia.AuthenticationSession | undefined): string | undefined {
|
|
369
|
+
if (!obj || typeof obj === 'string') {
|
|
370
|
+
return obj;
|
|
371
|
+
}
|
|
372
|
+
return obj.id;
|
|
373
|
+
}
|
|
318
374
|
}
|
|
319
375
|
|
|
320
376
|
async function readAccountUsages(storageService: StorageService, providerId: string, accountName: string): Promise<AccountUsage[]> {
|
|
@@ -56,6 +56,7 @@ import { ThemingMainImpl } from './theming-main';
|
|
|
56
56
|
import { CommentsMainImp } from './comments/comments-main';
|
|
57
57
|
import { CustomEditorsMainImpl } from './custom-editors/custom-editors-main';
|
|
58
58
|
import { SecretsMainImpl } from './secrets-main';
|
|
59
|
+
import { WebviewViewsMainImpl } from './webview-views/webview-views-main';
|
|
59
60
|
|
|
60
61
|
export function setUpPluginApi(rpc: RPCProtocol, container: interfaces.Container): void {
|
|
61
62
|
const authenticationMain = new AuthenticationMainImpl(rpc, container);
|
|
@@ -127,6 +128,9 @@ export function setUpPluginApi(rpc: RPCProtocol, container: interfaces.Container
|
|
|
127
128
|
const customEditorsMain = new CustomEditorsMainImpl(rpc, container, webviewsMain);
|
|
128
129
|
rpc.set(PLUGIN_RPC_CONTEXT.CUSTOM_EDITORS_MAIN, customEditorsMain);
|
|
129
130
|
|
|
131
|
+
const webviewViewsMain = new WebviewViewsMainImpl(rpc, container, webviewsMain);
|
|
132
|
+
rpc.set(PLUGIN_RPC_CONTEXT.WEBVIEW_VIEWS_MAIN, webviewViewsMain);
|
|
133
|
+
|
|
130
134
|
const storageMain = new StorageMainImpl(container);
|
|
131
135
|
rpc.set(PLUGIN_RPC_CONTEXT.STORAGE_MAIN, storageMain);
|
|
132
136
|
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (C) 2022 EclipseSource and others.
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made available under the
|
|
5
|
+
* terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
* http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
*
|
|
8
|
+
* This Source Code may also be made available under the following Secondary
|
|
9
|
+
* Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
+
* Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
+
* with the GNU Classpath Exception which is available at
|
|
12
|
+
* https://www.gnu.org/software/classpath/license.html.
|
|
13
|
+
*
|
|
14
|
+
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
|
|
15
|
+
********************************************************************************/
|
|
16
|
+
|
|
17
|
+
import { AuthenticationProvider, AuthenticationService, AuthenticationServiceImpl, AuthenticationSession } from '@theia/core/lib/browser/authentication-service';
|
|
18
|
+
import { inject } from '@theia/core/shared/inversify';
|
|
19
|
+
import { Deferred, timeoutReject } from '@theia/core/lib/common/promise-util';
|
|
20
|
+
import { HostedPluginSupport } from '../../hosted/browser/hosted-plugin';
|
|
21
|
+
|
|
22
|
+
export function getAuthenticationProviderActivationEvent(id: string): string { return `onAuthenticationRequest:${id}`; }
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Plugin authentiction service that aims to activate additional plugins if sessions are created or queried.
|
|
26
|
+
*/
|
|
27
|
+
export class PluginAuthenticationServiceImpl extends AuthenticationServiceImpl implements AuthenticationService {
|
|
28
|
+
@inject(HostedPluginSupport) protected readonly pluginService: HostedPluginSupport;
|
|
29
|
+
|
|
30
|
+
async getSessions(id: string, scopes?: string[]): Promise<ReadonlyArray<AuthenticationSession>> {
|
|
31
|
+
await this.tryActivateProvider(id);
|
|
32
|
+
return super.getSessions(id, scopes);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async login(id: string, scopes: string[]): Promise<AuthenticationSession> {
|
|
36
|
+
await this.tryActivateProvider(id);
|
|
37
|
+
return super.login(id, scopes);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
protected async tryActivateProvider(providerId: string): Promise<AuthenticationProvider> {
|
|
41
|
+
this.pluginService.activateByEvent(getAuthenticationProviderActivationEvent(providerId));
|
|
42
|
+
|
|
43
|
+
const provider = this.authenticationProviders.get(providerId);
|
|
44
|
+
if (provider) {
|
|
45
|
+
return provider;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// When activate has completed, the extension has made the call to `registerAuthenticationProvider`.
|
|
49
|
+
// However, activate cannot block on this, so the renderer may not have gotten the event yet.
|
|
50
|
+
return Promise.race([
|
|
51
|
+
this.waitForProviderRegistration(providerId),
|
|
52
|
+
timeoutReject<AuthenticationProvider>(5000, 'Timed out waiting for authentication provider to register')
|
|
53
|
+
]);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
protected async waitForProviderRegistration(providerId: string): Promise<AuthenticationProvider> {
|
|
57
|
+
const waitForRegistration = new Deferred<AuthenticationProvider>();
|
|
58
|
+
const registration = this.onDidRegisterAuthenticationProvider(info => {
|
|
59
|
+
if (info.id === providerId) {
|
|
60
|
+
registration.dispose();
|
|
61
|
+
const provider = this.authenticationProviders.get(providerId);
|
|
62
|
+
if (provider) {
|
|
63
|
+
waitForRegistration.resolve(provider);
|
|
64
|
+
} else {
|
|
65
|
+
waitForRegistration.reject(new Error(`No authentication provider '${providerId}' is currently registered.`));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
return waitForRegistration.promise;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -21,7 +21,7 @@ import '../../../src/main/browser/style/comments.css';
|
|
|
21
21
|
import { ContainerModule } from '@theia/core/shared/inversify';
|
|
22
22
|
import {
|
|
23
23
|
FrontendApplicationContribution, WidgetFactory, bindViewContribution,
|
|
24
|
-
ViewContainerIdentifier, ViewContainer, createTreeContainer,
|
|
24
|
+
ViewContainerIdentifier, ViewContainer, createTreeContainer, TreeWidget, LabelProviderContribution
|
|
25
25
|
} from '@theia/core/lib/browser';
|
|
26
26
|
import { MaybePromise, CommandContribution, ResourceResolver, bindContributionProvider } from '@theia/core/lib/common';
|
|
27
27
|
import { WebSocketConnectionProvider } from '@theia/core/lib/browser/messaging';
|
|
@@ -76,6 +76,8 @@ import { CustomEditorWidget } from './custom-editors/custom-editor-widget';
|
|
|
76
76
|
import { CustomEditorService } from './custom-editors/custom-editor-service';
|
|
77
77
|
import { UndoRedoService } from './custom-editors/undo-redo-service';
|
|
78
78
|
import { WebviewFrontendSecurityWarnings } from './webview/webview-frontend-security-warnings';
|
|
79
|
+
import { PluginAuthenticationServiceImpl } from './plugin-authentication-service';
|
|
80
|
+
import { AuthenticationService } from '@theia/core/lib/browser/authentication-service';
|
|
79
81
|
|
|
80
82
|
export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
|
81
83
|
|
|
@@ -145,21 +147,21 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
|
|
145
147
|
bind(WidgetFactory).toDynamicValue(({ container }) => ({
|
|
146
148
|
id: PLUGIN_VIEW_DATA_FACTORY_ID,
|
|
147
149
|
createWidget: (identifier: TreeViewWidgetIdentifier) => {
|
|
148
|
-
const
|
|
150
|
+
const props = {
|
|
149
151
|
contextMenuPath: VIEW_ITEM_CONTEXT_MENU,
|
|
150
152
|
expandOnlyOnExpansionToggleClick: true,
|
|
151
153
|
expansionTogglePadding: 22,
|
|
152
154
|
globalSelection: true,
|
|
153
155
|
leftPadding: 8,
|
|
154
156
|
search: true
|
|
157
|
+
};
|
|
158
|
+
const child = createTreeContainer(container, {
|
|
159
|
+
props,
|
|
160
|
+
tree: PluginTree,
|
|
161
|
+
model: PluginTreeModel,
|
|
162
|
+
widget: TreeViewWidget,
|
|
155
163
|
});
|
|
156
164
|
child.bind(TreeViewWidgetIdentifier).toConstantValue(identifier);
|
|
157
|
-
child.bind(PluginTree).toSelf();
|
|
158
|
-
child.rebind(TreeImpl).toService(PluginTree);
|
|
159
|
-
child.bind(PluginTreeModel).toSelf();
|
|
160
|
-
child.rebind(TreeModelImpl).toService(PluginTreeModel);
|
|
161
|
-
child.bind(TreeViewWidget).toSelf();
|
|
162
|
-
child.rebind(TreeWidget).toService(TreeViewWidget);
|
|
163
165
|
return child.get(TreeWidget);
|
|
164
166
|
}
|
|
165
167
|
})).inSingletonScope();
|
|
@@ -234,4 +236,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
|
|
234
236
|
|
|
235
237
|
bind(WebviewFrontendSecurityWarnings).toSelf().inSingletonScope();
|
|
236
238
|
bind(FrontendApplicationContribution).toService(WebviewFrontendSecurityWarnings);
|
|
239
|
+
|
|
240
|
+
bind(PluginAuthenticationServiceImpl).toSelf().inSingletonScope();
|
|
241
|
+
rebind(AuthenticationService).toService(PluginAuthenticationServiceImpl);
|
|
237
242
|
});
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
ViewContainerIdentifier, ViewContainerTitleOptions, Widget, FrontendApplicationContribution,
|
|
21
21
|
StatefulWidget, CommonMenus, BaseWidget, TreeViewWelcomeWidget, codicon, ViewContainerPart
|
|
22
22
|
} from '@theia/core/lib/browser';
|
|
23
|
-
import { ViewContainer, View, ViewWelcome } from '../../../common';
|
|
23
|
+
import { ViewContainer, View, ViewWelcome, PluginViewType } from '../../../common';
|
|
24
24
|
import { PluginSharedStyle } from '../plugin-shared-style';
|
|
25
25
|
import { DebugWidget } from '@theia/debug/lib/browser/view/debug-widget';
|
|
26
26
|
import { PluginViewWidget, PluginViewWidgetIdentifier } from './plugin-view-widget';
|
|
@@ -31,7 +31,7 @@ import { DebugFrontendApplicationContribution } from '@theia/debug/lib/browser/d
|
|
|
31
31
|
import { Disposable, DisposableCollection } from '@theia/core/lib/common/disposable';
|
|
32
32
|
import { CommandRegistry } from '@theia/core/lib/common/command';
|
|
33
33
|
import { MenuModelRegistry } from '@theia/core/lib/common/menu';
|
|
34
|
-
import { Emitter } from '@theia/core/lib/common/event';
|
|
34
|
+
import { Emitter, Event } from '@theia/core/lib/common/event';
|
|
35
35
|
import { ContextKeyService } from '@theia/core/lib/browser/context-key-service';
|
|
36
36
|
import { ViewContextKeyService } from './view-context-key-service';
|
|
37
37
|
import { PROBLEMS_WIDGET_ID } from '@theia/markers/lib/browser/problem/problem-widget';
|
|
@@ -41,6 +41,11 @@ import { TERMINAL_WIDGET_FACTORY_ID } from '@theia/terminal/lib/browser/terminal
|
|
|
41
41
|
import { TreeViewWidget } from './tree-view-widget';
|
|
42
42
|
import { SEARCH_VIEW_CONTAINER_ID } from '@theia/search-in-workspace/lib/browser/search-in-workspace-factory';
|
|
43
43
|
|
|
44
|
+
import { WebviewView, WebviewViewResolver } from '../webview-views/webview-views';
|
|
45
|
+
import { WebviewWidget, WebviewWidgetIdentifier } from '../webview/webview';
|
|
46
|
+
import { CancellationToken } from '@theia/core/lib/common/cancellation';
|
|
47
|
+
import { v4 } from 'uuid';
|
|
48
|
+
|
|
44
49
|
export const PLUGIN_VIEW_FACTORY_ID = 'plugin-view';
|
|
45
50
|
export const PLUGIN_VIEW_CONTAINER_FACTORY_ID = 'plugin-view-container';
|
|
46
51
|
export const PLUGIN_VIEW_DATA_FACTORY_ID = 'plugin-view-data';
|
|
@@ -95,6 +100,8 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
|
|
|
95
100
|
private readonly viewDataProviders = new Map<string, ViewDataProvider>();
|
|
96
101
|
private readonly viewDataState = new Map<string, object>();
|
|
97
102
|
|
|
103
|
+
private readonly webviewViewResolvers = new Map<string, WebviewViewResolver>();
|
|
104
|
+
|
|
98
105
|
@postConstruct()
|
|
99
106
|
protected init(): void {
|
|
100
107
|
// VS Code Viewlets
|
|
@@ -333,6 +340,63 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
|
|
|
333
340
|
return toDispose;
|
|
334
341
|
}
|
|
335
342
|
|
|
343
|
+
async registerWebviewView(viewId: string, resolver: WebviewViewResolver): Promise<Disposable> {
|
|
344
|
+
if (this.webviewViewResolvers.has(viewId)) {
|
|
345
|
+
throw new Error(`View resolver already registered for ${viewId}`);
|
|
346
|
+
}
|
|
347
|
+
this.webviewViewResolvers.set(viewId, resolver);
|
|
348
|
+
|
|
349
|
+
const webviewView = await this.createNewWebviewView();
|
|
350
|
+
const token = CancellationToken.None;
|
|
351
|
+
this.getView(viewId).then(async view => {
|
|
352
|
+
if (view) {
|
|
353
|
+
if (view.isVisible) {
|
|
354
|
+
await this.prepareView(view, webviewView.webview.identifier.id);
|
|
355
|
+
} else {
|
|
356
|
+
const toDisposeOnDidExpandView = new DisposableCollection(this.onDidExpandView(async id => {
|
|
357
|
+
if (id === viewId) {
|
|
358
|
+
dispose();
|
|
359
|
+
await this.prepareView(view, webviewView.webview.identifier.id);
|
|
360
|
+
}
|
|
361
|
+
}));
|
|
362
|
+
const dispose = () => toDisposeOnDidExpandView.dispose();
|
|
363
|
+
view.disposed.connect(dispose);
|
|
364
|
+
toDisposeOnDidExpandView.push(Disposable.create(() => view.disposed.disconnect(dispose)));
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
resolver.resolve(webviewView, token);
|
|
370
|
+
|
|
371
|
+
return Disposable.create(() => {
|
|
372
|
+
this.webviewViewResolvers.delete(viewId);
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
async createNewWebviewView(): Promise<WebviewView> {
|
|
377
|
+
const webview = await this.widgetManager.getOrCreateWidget<WebviewWidget>(
|
|
378
|
+
WebviewWidget.FACTORY_ID, <WebviewWidgetIdentifier>{ id: v4() });
|
|
379
|
+
webview.setContentOptions({ allowScripts: true });
|
|
380
|
+
|
|
381
|
+
let _description: string | undefined;
|
|
382
|
+
|
|
383
|
+
return {
|
|
384
|
+
webview,
|
|
385
|
+
|
|
386
|
+
get onDidChangeVisibility(): Event<boolean> { return webview.onDidChangeVisibility; },
|
|
387
|
+
get onDidDispose(): Event<void> { return webview.onDidDispose; },
|
|
388
|
+
|
|
389
|
+
get title(): string | undefined { return webview.title.label; },
|
|
390
|
+
set title(value: string | undefined) { webview.title.label = value || ''; },
|
|
391
|
+
|
|
392
|
+
get description(): string | undefined { return _description; },
|
|
393
|
+
set description(value: string | undefined) { _description = value; },
|
|
394
|
+
|
|
395
|
+
dispose: webview.dispose,
|
|
396
|
+
show: webview.show
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
|
|
336
400
|
registerViewWelcome(viewWelcome: ViewWelcome): Disposable {
|
|
337
401
|
const toDispose = new DisposableCollection();
|
|
338
402
|
|
|
@@ -409,7 +473,7 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
|
|
|
409
473
|
return this.getView(viewId);
|
|
410
474
|
}
|
|
411
475
|
|
|
412
|
-
protected async prepareView(widget: PluginViewWidget): Promise<void> {
|
|
476
|
+
protected async prepareView(widget: PluginViewWidget, webviewId?: string): Promise<void> {
|
|
413
477
|
const data = this.views.get(widget.options.viewId);
|
|
414
478
|
if (!data) {
|
|
415
479
|
return;
|
|
@@ -419,7 +483,7 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
|
|
|
419
483
|
widget.title.label = view.name;
|
|
420
484
|
}
|
|
421
485
|
const currentDataWidget = widget.widgets[0];
|
|
422
|
-
const viewDataWidget = await this.createViewDataWidget(view.id);
|
|
486
|
+
const viewDataWidget = await this.createViewDataWidget(view.id, webviewId);
|
|
423
487
|
if (widget.isDisposed) {
|
|
424
488
|
// eslint-disable-next-line no-unused-expressions
|
|
425
489
|
viewDataWidget?.dispose();
|
|
@@ -701,8 +765,12 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
|
|
|
701
765
|
return toDispose;
|
|
702
766
|
}
|
|
703
767
|
|
|
704
|
-
protected async createViewDataWidget(viewId: string): Promise<Widget | undefined> {
|
|
768
|
+
protected async createViewDataWidget(viewId: string, webviewId?: string): Promise<Widget | undefined> {
|
|
705
769
|
const view = this.views.get(viewId);
|
|
770
|
+
if (view?.[1]?.type === PluginViewType.Webview) {
|
|
771
|
+
const webviewWidget = this.widgetManager.getWidget(WebviewWidget.FACTORY_ID, <WebviewWidgetIdentifier>{ id: webviewId });
|
|
772
|
+
return webviewWidget;
|
|
773
|
+
}
|
|
706
774
|
const provider = this.viewDataProviders.get(viewId);
|
|
707
775
|
if (!view || !provider) {
|
|
708
776
|
return undefined;
|
|
@@ -32,7 +32,7 @@ export class ViewColumnService {
|
|
|
32
32
|
) {
|
|
33
33
|
let oldColumnValues = new Map<string, number>();
|
|
34
34
|
const update = async () => {
|
|
35
|
-
await new Promise((resolve => setTimeout(
|
|
35
|
+
await new Promise<void>((resolve => setTimeout(resolve)));
|
|
36
36
|
this.updateViewColumns();
|
|
37
37
|
this.viewColumnIds.forEach((ids: string[], viewColumn: number) => {
|
|
38
38
|
ids.forEach((id: string) => {
|