@theia/core 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/README.md +5 -5
- package/lib/browser/about-dialog.js +5 -5
- package/lib/browser/about-dialog.js.map +1 -1
- package/lib/browser/authentication-service.d.ts +52 -22
- package/lib/browser/authentication-service.d.ts.map +1 -1
- package/lib/browser/authentication-service.js +49 -44
- package/lib/browser/authentication-service.js.map +1 -1
- package/lib/browser/breadcrumbs/breadcrumb-popup-container.js +5 -5
- package/lib/browser/breadcrumbs/breadcrumb-popup-container.js.map +1 -1
- package/lib/browser/breadcrumbs/breadcrumb-renderer.js +1 -1
- package/lib/browser/breadcrumbs/breadcrumb-renderer.js.map +1 -1
- package/lib/browser/breadcrumbs/breadcrumbs-renderer.d.ts.map +1 -1
- package/lib/browser/breadcrumbs/breadcrumbs-renderer.js +6 -6
- package/lib/browser/breadcrumbs/breadcrumbs-renderer.js.map +1 -1
- package/lib/browser/breadcrumbs/breadcrumbs-service.js +5 -5
- package/lib/browser/breadcrumbs/breadcrumbs-service.js.map +1 -1
- package/lib/browser/breadcrumbs/index.js +1 -1
- package/lib/browser/browser-clipboard-service.js +3 -3
- package/lib/browser/browser-clipboard-service.js.map +1 -1
- package/lib/browser/color-application-contribution.js +4 -4
- package/lib/browser/color-application-contribution.js.map +1 -1
- package/lib/browser/color-registry.js +2 -2
- package/lib/browser/color-registry.js.map +1 -1
- package/lib/browser/command-open-handler.js +2 -2
- package/lib/browser/command-open-handler.js.map +1 -1
- package/lib/browser/common-frontend-contribution.js +24 -24
- package/lib/browser/common-frontend-contribution.js.map +1 -1
- package/lib/browser/connection-status-service.js +15 -13
- package/lib/browser/connection-status-service.js.map +1 -1
- package/lib/browser/connection-status-service.spec.js +18 -18
- package/lib/browser/connection-status-service.spec.js.map +1 -1
- package/lib/browser/context-key-service.js +1 -1
- package/lib/browser/context-key-service.js.map +1 -1
- package/lib/browser/context-menu-renderer.js +1 -1
- package/lib/browser/context-menu-renderer.js.map +1 -1
- package/lib/browser/core-preferences.js +1 -1
- package/lib/browser/core-preferences.js.map +1 -1
- package/lib/browser/credentials-service.js +2 -2
- package/lib/browser/credentials-service.js.map +1 -1
- package/lib/browser/decorations-service.js +1 -1
- package/lib/browser/decorations-service.js.map +1 -1
- package/lib/browser/dialogs/react-dialog.js +2 -2
- package/lib/browser/dialogs/react-dialog.js.map +1 -1
- package/lib/browser/dialogs.js +11 -11
- package/lib/browser/dialogs.js.map +1 -1
- package/lib/browser/diff-uris.js +3 -3
- package/lib/browser/diff-uris.js.map +1 -1
- package/lib/browser/encoding-registry.js +3 -3
- package/lib/browser/encoding-registry.js.map +1 -1
- package/lib/browser/external-uri-service.js +1 -1
- package/lib/browser/external-uri-service.js.map +1 -1
- package/lib/browser/frontend-application-bindings.js +2 -2
- package/lib/browser/frontend-application-bindings.js.map +1 -1
- package/lib/browser/frontend-application-config-provider.js +1 -1
- package/lib/browser/frontend-application-config-provider.js.map +1 -1
- package/lib/browser/frontend-application-config-provider.spec.js +7 -7
- package/lib/browser/frontend-application-config-provider.spec.js.map +1 -1
- package/lib/browser/frontend-application-module.d.ts.map +1 -1
- package/lib/browser/frontend-application-module.js +23 -20
- package/lib/browser/frontend-application-module.js.map +1 -1
- package/lib/browser/frontend-application-state.js +2 -2
- package/lib/browser/frontend-application-state.js.map +1 -1
- package/lib/browser/frontend-application.d.ts +4 -2
- package/lib/browser/frontend-application.d.ts.map +1 -1
- package/lib/browser/frontend-application.js +30 -36
- package/lib/browser/frontend-application.js.map +1 -1
- package/lib/browser/http-open-handler.js +3 -3
- package/lib/browser/http-open-handler.js.map +1 -1
- package/lib/browser/icon-theme-contribution.js +5 -5
- package/lib/browser/icon-theme-contribution.js.map +1 -1
- package/lib/browser/icon-theme-service.js +4 -4
- package/lib/browser/icon-theme-service.js.map +1 -1
- package/lib/browser/index.js +1 -1
- package/lib/browser/json-schema-store.js +5 -5
- package/lib/browser/json-schema-store.js.map +1 -1
- package/lib/browser/keybinding.js +11 -11
- package/lib/browser/keybinding.js.map +1 -1
- package/lib/browser/keybinding.spec.js +9 -9
- package/lib/browser/keybinding.spec.js.map +1 -1
- package/lib/browser/keyboard/browser-keyboard-frontend-contribution.js +4 -4
- package/lib/browser/keyboard/browser-keyboard-frontend-contribution.js.map +1 -1
- package/lib/browser/keyboard/browser-keyboard-layout-provider.js +4 -4
- package/lib/browser/keyboard/browser-keyboard-layout-provider.js.map +1 -1
- package/lib/browser/keyboard/browser-keyboard-layout-provider.spec.js +3 -3
- package/lib/browser/keyboard/browser-keyboard-layout-provider.spec.js.map +1 -1
- package/lib/browser/keyboard/index.js +1 -1
- package/lib/browser/keyboard/keyboard-layout-service.js +5 -5
- package/lib/browser/keyboard/keyboard-layout-service.js.map +1 -1
- package/lib/browser/keyboard/keyboard-layout-service.spec.js +1 -1
- package/lib/browser/keyboard/keyboard-layout-service.spec.js.map +1 -1
- package/lib/browser/keyboard/keys.js +1 -1
- package/lib/browser/keyboard/keys.spec.js +2 -2
- package/lib/browser/keyboard/keys.spec.js.map +1 -1
- package/lib/browser/label-parser.js +1 -1
- package/lib/browser/label-parser.js.map +1 -1
- package/lib/browser/label-parser.spec.js +38 -38
- package/lib/browser/label-parser.spec.js.map +1 -1
- package/lib/browser/label-provider.js +8 -8
- package/lib/browser/label-provider.js.map +1 -1
- package/lib/browser/label-provider.spec.js +5 -5
- package/lib/browser/label-provider.spec.js.map +1 -1
- package/lib/browser/language-service.js +1 -1
- package/lib/browser/language-service.js.map +1 -1
- package/lib/browser/logger-frontend-module.js +1 -1
- package/lib/browser/logger-frontend-module.js.map +1 -1
- package/lib/browser/menu/browser-context-menu-renderer.js +3 -3
- package/lib/browser/menu/browser-context-menu-renderer.js.map +1 -1
- package/lib/browser/menu/browser-menu-plugin.js +13 -13
- package/lib/browser/menu/browser-menu-plugin.js.map +1 -1
- package/lib/browser/menu/context-menu-context.js +1 -1
- package/lib/browser/menu/context-menu-context.js.map +1 -1
- package/lib/browser/messaging/index.js +1 -1
- package/lib/browser/messaging/ws-connection-provider.js +7 -7
- package/lib/browser/messaging/ws-connection-provider.js.map +1 -1
- package/lib/browser/mime-service.js +1 -1
- package/lib/browser/mime-service.js.map +1 -1
- package/lib/browser/navigatable.js +1 -1
- package/lib/browser/opener-service.js +3 -2
- package/lib/browser/opener-service.js.map +1 -1
- package/lib/browser/performance/frontend-stopwatch.d.ts +21 -0
- package/lib/browser/performance/frontend-stopwatch.d.ts.map +1 -0
- package/lib/browser/performance/frontend-stopwatch.js +71 -0
- package/lib/browser/performance/frontend-stopwatch.js.map +1 -0
- package/lib/browser/performance/index.d.ts +18 -0
- package/lib/browser/performance/index.d.ts.map +1 -0
- package/lib/browser/performance/index.js +30 -0
- package/lib/browser/performance/index.js.map +1 -0
- package/lib/browser/performance/measurement-frontend-bindings.d.ts +20 -0
- package/lib/browser/performance/measurement-frontend-bindings.d.ts.map +1 -0
- package/lib/browser/performance/measurement-frontend-bindings.js +33 -0
- package/lib/browser/performance/measurement-frontend-bindings.js.map +1 -0
- package/lib/browser/preferences/index.js +1 -1
- package/lib/browser/preferences/preference-configurations.js +4 -4
- package/lib/browser/preferences/preference-configurations.js.map +1 -1
- package/lib/browser/preferences/preference-contribution.js +8 -8
- package/lib/browser/preferences/preference-contribution.js.map +1 -1
- package/lib/browser/preferences/preference-language-override-service.d.ts +11 -0
- package/lib/browser/preferences/preference-language-override-service.d.ts.map +1 -1
- package/lib/browser/preferences/preference-language-override-service.js +21 -7
- package/lib/browser/preferences/preference-language-override-service.js.map +1 -1
- package/lib/browser/preferences/preference-provider.js +2 -2
- package/lib/browser/preferences/preference-provider.js.map +1 -1
- package/lib/browser/preferences/preference-proxy.spec.js +6 -6
- package/lib/browser/preferences/preference-proxy.spec.js.map +1 -1
- package/lib/browser/preferences/preference-schema-provider.spec.js +3 -3
- package/lib/browser/preferences/preference-schema-provider.spec.js.map +1 -1
- package/lib/browser/preferences/preference-service.js +8 -8
- package/lib/browser/preferences/preference-service.js.map +1 -1
- package/lib/browser/preferences/preference-service.spec.js +5 -5
- package/lib/browser/preferences/preference-service.spec.js.map +1 -1
- package/lib/browser/preferences/test/index.js +1 -1
- package/lib/browser/preferences/test/mock-preference-service.js +1 -1
- package/lib/browser/preferences/test/mock-preference-service.js.map +1 -1
- package/lib/browser/progress-bar.js +4 -4
- package/lib/browser/progress-bar.js.map +1 -1
- package/lib/browser/progress-client.js +3 -3
- package/lib/browser/progress-client.js.map +1 -1
- package/lib/browser/progress-location-service.js +1 -1
- package/lib/browser/progress-location-service.js.map +1 -1
- package/lib/browser/progress-location-service.spec.js +1 -1
- package/lib/browser/progress-location-service.spec.js.map +1 -1
- package/lib/browser/progress-status-bar-item.js +2 -2
- package/lib/browser/progress-status-bar-item.js.map +1 -1
- package/lib/browser/quick-input/index.js +1 -1
- package/lib/browser/quick-input/quick-command-frontend-contribution.js +5 -5
- package/lib/browser/quick-input/quick-command-frontend-contribution.js.map +1 -1
- package/lib/browser/quick-input/quick-command-service.js +9 -9
- package/lib/browser/quick-input/quick-command-service.js.map +1 -1
- package/lib/browser/quick-input/quick-help-service.js +3 -3
- package/lib/browser/quick-input/quick-help-service.js.map +1 -1
- package/lib/browser/quick-input/quick-input-frontend-contribution.js +3 -3
- package/lib/browser/quick-input/quick-input-frontend-contribution.js.map +1 -1
- package/lib/browser/quick-input/quick-input-service.js +1 -1
- package/lib/browser/quick-input/quick-input-service.spec.js +15 -15
- package/lib/browser/quick-input/quick-input-service.spec.js.map +1 -1
- package/lib/browser/quick-input/quick-pick-service-impl.d.ts.map +1 -1
- package/lib/browser/quick-input/quick-pick-service-impl.js +3 -3
- package/lib/browser/quick-input/quick-pick-service-impl.js.map +1 -1
- package/lib/browser/quick-input/quick-view-service.js +4 -4
- package/lib/browser/quick-input/quick-view-service.js.map +1 -1
- package/lib/browser/resource-context-key.js +4 -4
- package/lib/browser/resource-context-key.js.map +1 -1
- package/lib/browser/saveable.d.ts +17 -2
- package/lib/browser/saveable.d.ts.map +1 -1
- package/lib/browser/saveable.js +71 -24
- package/lib/browser/saveable.js.map +1 -1
- package/lib/browser/shell/application-shell-mouse-tracker.js +5 -5
- package/lib/browser/shell/application-shell-mouse-tracker.js.map +1 -1
- package/lib/browser/shell/application-shell.d.ts +16 -1
- package/lib/browser/shell/application-shell.d.ts.map +1 -1
- package/lib/browser/shell/application-shell.js +76 -64
- package/lib/browser/shell/application-shell.js.map +1 -1
- package/lib/browser/shell/current-widget-command-adapter.js.map +1 -1
- package/lib/browser/shell/index.js +1 -1
- package/lib/browser/shell/shell-layout-restorer.js +7 -7
- package/lib/browser/shell/shell-layout-restorer.js.map +1 -1
- package/lib/browser/shell/side-panel-handler.d.ts +1 -0
- package/lib/browser/shell/side-panel-handler.d.ts.map +1 -1
- package/lib/browser/shell/side-panel-handler.js +26 -14
- package/lib/browser/shell/side-panel-handler.js.map +1 -1
- package/lib/browser/shell/side-panel-toolbar.js.map +1 -1
- package/lib/browser/shell/sidebar-bottom-menu-widget.js +1 -1
- package/lib/browser/shell/sidebar-bottom-menu-widget.js.map +1 -1
- package/lib/browser/shell/sidebar-menu-widget.js +2 -2
- package/lib/browser/shell/sidebar-menu-widget.js.map +1 -1
- package/lib/browser/shell/sidebar-top-menu-widget.js +1 -1
- package/lib/browser/shell/sidebar-top-menu-widget.js.map +1 -1
- package/lib/browser/shell/split-panels.js +1 -1
- package/lib/browser/shell/split-panels.js.map +1 -1
- package/lib/browser/shell/tab-bar-decorator.js +3 -3
- package/lib/browser/shell/tab-bar-decorator.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar.d.ts.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar.js +12 -12
- package/lib/browser/shell/tab-bar-toolbar.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar.spec.js +14 -14
- package/lib/browser/shell/tab-bar-toolbar.spec.js.map +1 -1
- package/lib/browser/shell/tab-bars.d.ts.map +1 -1
- package/lib/browser/shell/tab-bars.js +1 -0
- package/lib/browser/shell/tab-bars.js.map +1 -1
- package/lib/browser/shell/tab-bars.spec.js +9 -9
- package/lib/browser/shell/tab-bars.spec.js.map +1 -1
- package/lib/browser/shell/theia-dock-panel.d.ts +3 -2
- package/lib/browser/shell/theia-dock-panel.d.ts.map +1 -1
- package/lib/browser/shell/theia-dock-panel.js +4 -4
- package/lib/browser/shell/theia-dock-panel.js.map +1 -1
- package/lib/browser/shell/view-contribution.js +5 -5
- package/lib/browser/shell/view-contribution.js.map +1 -1
- package/lib/browser/source-tree/index.js +1 -1
- package/lib/browser/source-tree/source-tree-widget.d.ts.map +1 -1
- package/lib/browser/source-tree/source-tree-widget.js +7 -8
- package/lib/browser/source-tree/source-tree-widget.js.map +1 -1
- package/lib/browser/source-tree/source-tree.d.ts.map +1 -1
- package/lib/browser/source-tree/source-tree.js +2 -1
- package/lib/browser/source-tree/source-tree.js.map +1 -1
- package/lib/browser/source-tree/tree-source.js +2 -2
- package/lib/browser/source-tree/tree-source.js.map +1 -1
- package/lib/browser/status-bar/index.js +1 -1
- package/lib/browser/status-bar/status-bar.js +6 -6
- package/lib/browser/status-bar/status-bar.js.map +1 -1
- package/lib/browser/storage-service.js +5 -5
- package/lib/browser/storage-service.js.map +1 -1
- package/lib/browser/storage-service.spec.js +4 -4
- package/lib/browser/storage-service.spec.js.map +1 -1
- package/lib/browser/test/mock-opener-service.js +1 -1
- package/lib/browser/test/mock-opener-service.js.map +1 -1
- package/lib/browser/test/mock-storage-service.js +1 -1
- package/lib/browser/test/mock-storage-service.js.map +1 -1
- package/lib/browser/theming.js +1 -1
- package/lib/browser/tooltip-service.js +6 -5
- package/lib/browser/tooltip-service.js.map +1 -1
- package/lib/browser/tree/fuzzy-search.js +1 -1
- package/lib/browser/tree/fuzzy-search.js.map +1 -1
- package/lib/browser/tree/fuzzy-search.spec.js +2 -2
- package/lib/browser/tree/fuzzy-search.spec.js.map +1 -1
- package/lib/browser/tree/index.d.ts +1 -0
- package/lib/browser/tree/index.d.ts.map +1 -1
- package/lib/browser/tree/index.js +2 -1
- package/lib/browser/tree/index.js.map +1 -1
- package/lib/browser/tree/test/tree-test-container.js +1 -1
- package/lib/browser/tree/test/tree-test-container.js.map +1 -1
- package/lib/browser/tree/tree-compression/compressed-tree-expansion-service.d.ts +24 -0
- package/lib/browser/tree/tree-compression/compressed-tree-expansion-service.d.ts.map +1 -0
- package/lib/browser/tree/tree-compression/compressed-tree-expansion-service.js +68 -0
- package/lib/browser/tree/tree-compression/compressed-tree-expansion-service.js.map +1 -0
- package/lib/browser/tree/tree-compression/compressed-tree-model.d.ts +39 -0
- package/lib/browser/tree/tree-compression/compressed-tree-model.d.ts.map +1 -0
- package/lib/browser/tree/tree-compression/compressed-tree-model.js +96 -0
- package/lib/browser/tree/tree-compression/compressed-tree-model.js.map +1 -0
- package/lib/browser/tree/tree-compression/compressed-tree-widget.d.ts +55 -0
- package/lib/browser/tree/tree-compression/compressed-tree-widget.d.ts.map +1 -0
- package/lib/browser/tree/tree-compression/compressed-tree-widget.js +194 -0
- package/lib/browser/tree/tree-compression/compressed-tree-widget.js.map +1 -0
- package/lib/browser/tree/tree-compression/index.d.ts +20 -0
- package/lib/browser/tree/tree-compression/index.d.ts.map +1 -0
- package/lib/browser/tree/tree-compression/index.js +32 -0
- package/lib/browser/tree/tree-compression/index.js.map +1 -0
- package/lib/browser/tree/tree-compression/tree-compression-service.d.ts +73 -0
- package/lib/browser/tree/tree-compression/tree-compression-service.d.ts.map +1 -0
- package/lib/browser/tree/tree-compression/tree-compression-service.js +100 -0
- package/lib/browser/tree/tree-compression/tree-compression-service.js.map +1 -0
- package/lib/browser/tree/tree-consistency.spec.js +2 -2
- package/lib/browser/tree/tree-consistency.spec.js.map +1 -1
- package/lib/browser/tree/tree-container.d.ts +46 -1
- package/lib/browser/tree/tree-container.d.ts.map +1 -1
- package/lib/browser/tree/tree-container.js +67 -20
- package/lib/browser/tree/tree-container.js.map +1 -1
- package/lib/browser/tree/tree-decorator.js +2 -2
- package/lib/browser/tree/tree-decorator.js.map +1 -1
- package/lib/browser/tree/tree-decorator.spec.js +10 -10
- package/lib/browser/tree/tree-decorator.spec.js.map +1 -1
- package/lib/browser/tree/tree-expansion.d.ts +1 -1
- package/lib/browser/tree/tree-expansion.d.ts.map +1 -1
- package/lib/browser/tree/tree-expansion.js +3 -3
- package/lib/browser/tree/tree-expansion.js.map +1 -1
- package/lib/browser/tree/tree-expansion.spec.js +15 -15
- package/lib/browser/tree/tree-expansion.spec.js.map +1 -1
- package/lib/browser/tree/tree-iterator.spec.js +22 -22
- package/lib/browser/tree/tree-iterator.spec.js.map +1 -1
- package/lib/browser/tree/tree-label-provider.js +1 -1
- package/lib/browser/tree/tree-label-provider.js.map +1 -1
- package/lib/browser/tree/tree-model.d.ts +2 -1
- package/lib/browser/tree/tree-model.d.ts.map +1 -1
- package/lib/browser/tree/tree-model.js +20 -19
- package/lib/browser/tree/tree-model.js.map +1 -1
- package/lib/browser/tree/tree-navigation.js +1 -1
- package/lib/browser/tree/tree-navigation.js.map +1 -1
- package/lib/browser/tree/tree-search.js +5 -5
- package/lib/browser/tree/tree-search.js.map +1 -1
- package/lib/browser/tree/tree-selection-impl.js +3 -3
- package/lib/browser/tree/tree-selection-impl.js.map +1 -1
- package/lib/browser/tree/tree-selection-state.spec.js +6 -6
- package/lib/browser/tree/tree-selection-state.spec.js.map +1 -1
- package/lib/browser/tree/tree-view-welcome-widget.d.ts.map +1 -1
- package/lib/browser/tree/tree-view-welcome-widget.js +6 -6
- package/lib/browser/tree/tree-view-welcome-widget.js.map +1 -1
- package/lib/browser/tree/tree-widget.d.ts +6 -1
- package/lib/browser/tree/tree-widget.d.ts.map +1 -1
- package/lib/browser/tree/tree-widget.js +33 -20
- package/lib/browser/tree/tree-widget.js.map +1 -1
- package/lib/browser/tree/tree.d.ts +1 -1
- package/lib/browser/tree/tree.d.ts.map +1 -1
- package/lib/browser/tree/tree.js +3 -3
- package/lib/browser/tree/tree.js.map +1 -1
- package/lib/browser/tree/tree.spec.js +11 -11
- package/lib/browser/tree/tree.spec.js.map +1 -1
- package/lib/browser/view-container.d.ts +1 -1
- package/lib/browser/view-container.d.ts.map +1 -1
- package/lib/browser/view-container.js +60 -56
- package/lib/browser/view-container.js.map +1 -1
- package/lib/browser/widget-manager.js +4 -4
- package/lib/browser/widget-manager.js.map +1 -1
- package/lib/browser/widget-manager.spec.js +3 -3
- package/lib/browser/widget-manager.spec.js.map +1 -1
- package/lib/browser/widget-open-handler.d.ts.map +1 -1
- package/lib/browser/widget-open-handler.js +5 -6
- package/lib/browser/widget-open-handler.js.map +1 -1
- package/lib/browser/widgets/alert-message.js +4 -4
- package/lib/browser/widgets/alert-message.js.map +1 -1
- package/lib/browser/widgets/index.js +1 -1
- package/lib/browser/widgets/react-renderer.js +3 -2
- package/lib/browser/widgets/react-renderer.js.map +1 -1
- package/lib/browser/widgets/react-widget.js +2 -2
- package/lib/browser/widgets/react-widget.js.map +1 -1
- package/lib/browser/widgets/widget.js +4 -4
- package/lib/browser/widgets/widget.js.map +1 -1
- package/lib/browser/window/default-window-service.js +5 -5
- package/lib/browser/window/default-window-service.js.map +1 -1
- package/lib/browser/window/test/mock-window-service.js +1 -1
- package/lib/browser/window/test/mock-window-service.js.map +1 -1
- package/lib/browser/window-contribution.js +2 -2
- package/lib/browser/window-contribution.js.map +1 -1
- package/lib/common/command.js +3 -2
- package/lib/common/command.js.map +1 -1
- package/lib/common/contribution-filter/contribution-filter-registry.d.ts +1 -1
- package/lib/common/contribution-filter/contribution-filter-registry.d.ts.map +1 -1
- package/lib/common/contribution-filter/contribution-filter-registry.js +3 -2
- package/lib/common/contribution-filter/contribution-filter-registry.js.map +1 -1
- package/lib/common/contribution-filter/index.js +1 -1
- package/lib/common/encoding-service.js +2 -2
- package/lib/common/encoding-service.js.map +1 -1
- package/lib/common/env-variables/index.js +1 -1
- package/lib/common/event.js.map +1 -1
- package/lib/common/event.spec.js +2 -2
- package/lib/common/event.spec.js.map +1 -1
- package/lib/common/index.d.ts +1 -0
- package/lib/common/index.d.ts.map +1 -1
- package/lib/common/index.js +2 -1
- package/lib/common/index.js.map +1 -1
- package/lib/common/keybinding.js.map +1 -1
- package/lib/common/logger-protocol.js +1 -1
- package/lib/common/logger-protocol.js.map +1 -1
- package/lib/common/logger-watcher.js +1 -1
- package/lib/common/logger-watcher.js.map +1 -1
- package/lib/common/logger.js +5 -5
- package/lib/common/logger.js.map +1 -1
- package/lib/common/logger.spec.js +6 -6
- package/lib/common/logger.spec.js.map +1 -1
- package/lib/common/menu.js +4 -3
- package/lib/common/menu.js.map +1 -1
- package/lib/common/message-service-protocol.js +1 -1
- package/lib/common/message-service-protocol.js.map +1 -1
- package/lib/common/message-service.js +2 -2
- package/lib/common/message-service.js.map +1 -1
- package/lib/common/messaging/abstract-connection-provider.js +2 -2
- package/lib/common/messaging/abstract-connection-provider.js.map +1 -1
- package/lib/common/messaging/index.js +1 -1
- package/lib/common/messaging/proxy-factory.js.map +1 -1
- package/lib/common/messaging/proxy-factory.spec.js +2 -2
- package/lib/common/messaging/proxy-factory.spec.js.map +1 -1
- package/lib/common/path.spec.js +16 -16
- package/lib/common/path.spec.js.map +1 -1
- package/lib/common/performance/index.d.ts +19 -0
- package/lib/common/performance/index.d.ts.map +1 -0
- package/lib/common/performance/index.js +31 -0
- package/lib/common/performance/index.js.map +1 -0
- package/lib/common/performance/measurement-protocol.d.ts +65 -0
- package/lib/common/performance/measurement-protocol.d.ts.map +1 -0
- package/lib/common/performance/measurement-protocol.js +79 -0
- package/lib/common/performance/measurement-protocol.js.map +1 -0
- package/lib/common/performance/measurement.d.ts +91 -0
- package/lib/common/performance/measurement.d.ts.map +1 -0
- package/lib/common/performance/measurement.js +18 -0
- package/lib/common/performance/measurement.js.map +1 -0
- package/lib/common/performance/stopwatch.d.ts +68 -0
- package/lib/common/performance/stopwatch.d.ts.map +1 -0
- package/lib/common/performance/stopwatch.js +134 -0
- package/lib/common/performance/stopwatch.js.map +1 -0
- package/lib/common/progress-service.js +3 -3
- package/lib/common/progress-service.js.map +1 -1
- package/lib/common/promise-util.d.ts +11 -0
- package/lib/common/promise-util.d.ts.map +1 -1
- package/lib/common/promise-util.js +18 -2
- package/lib/common/promise-util.js.map +1 -1
- package/lib/common/promise-util.spec.js +2 -2
- package/lib/common/promise-util.spec.js.map +1 -1
- package/lib/common/resource.js +5 -4
- package/lib/common/resource.js.map +1 -1
- package/lib/common/selection-service.js +1 -1
- package/lib/common/selection-service.js.map +1 -1
- package/lib/common/stream.js.map +1 -1
- package/lib/common/ternary-search-tree.js +6 -6
- package/lib/common/ternary-search-tree.js.map +1 -1
- package/lib/common/test/expect.js +1 -1
- package/lib/common/test/expect.js.map +1 -1
- package/lib/common/test/mock-logger.js +1 -1
- package/lib/common/test/mock-logger.js.map +1 -1
- package/lib/common/test/mock-resource-provider.js +1 -1
- package/lib/common/test/mock-resource-provider.js.map +1 -1
- package/lib/common/types.d.ts +23 -1
- package/lib/common/types.d.ts.map +1 -1
- package/lib/common/types.js +26 -2
- package/lib/common/types.js.map +1 -1
- package/lib/common/uri.spec.js.map +1 -1
- package/lib/electron-browser/electron-clipboard-service.js +1 -1
- package/lib/electron-browser/electron-clipboard-service.js.map +1 -1
- package/lib/electron-browser/keyboard/electron-keyboard-layout-change-notifier.js +2 -2
- package/lib/electron-browser/keyboard/electron-keyboard-layout-change-notifier.js.map +1 -1
- package/lib/electron-browser/menu/electron-context-menu-renderer.js +8 -8
- package/lib/electron-browser/menu/electron-context-menu-renderer.js.map +1 -1
- package/lib/electron-browser/menu/electron-main-menu-factory.js +5 -5
- package/lib/electron-browser/menu/electron-main-menu-factory.js.map +1 -1
- package/lib/electron-browser/menu/electron-menu-contribution.js +7 -7
- package/lib/electron-browser/menu/electron-menu-contribution.js.map +1 -1
- package/lib/electron-browser/messaging/electron-ipc-connection-provider.js +1 -1
- package/lib/electron-browser/messaging/electron-ipc-connection-provider.js.map +1 -1
- package/lib/electron-browser/messaging/electron-ws-connection-provider.js +1 -1
- package/lib/electron-browser/messaging/electron-ws-connection-provider.js.map +1 -1
- package/lib/electron-browser/window/electron-window-module.js +1 -1
- package/lib/electron-browser/window/electron-window-module.js.map +1 -1
- package/lib/electron-browser/window/electron-window-preferences.js +1 -1
- package/lib/electron-browser/window/electron-window-preferences.js.map +1 -1
- package/lib/electron-browser/window/electron-window-service.js +4 -4
- package/lib/electron-browser/window/electron-window-service.js.map +1 -1
- package/lib/electron-main/electron-main-application-module.js +4 -4
- package/lib/electron-main/electron-main-application-module.js.map +1 -1
- package/lib/electron-main/electron-main-application.d.ts +0 -4
- package/lib/electron-main/electron-main-application.d.ts.map +1 -1
- package/lib/electron-main/electron-main-application.js +9 -29
- package/lib/electron-main/electron-main-application.js.map +1 -1
- package/lib/electron-main/electron-main-window-service-impl.js +2 -2
- package/lib/electron-main/electron-main-window-service-impl.js.map +1 -1
- package/lib/electron-main/electron-native-keymap.js +1 -1
- package/lib/electron-main/electron-native-keymap.js.map +1 -1
- package/lib/electron-main/electron-security-token-service.js +2 -2
- package/lib/electron-main/electron-security-token-service.js.map +1 -1
- package/lib/electron-main/messaging/electron-messaging-contribution.js +8 -8
- package/lib/electron-main/messaging/electron-messaging-contribution.js.map +1 -1
- package/lib/electron-node/hosting/electron-ws-origin-validator.js +1 -1
- package/lib/electron-node/hosting/electron-ws-origin-validator.js.map +1 -1
- package/lib/electron-node/keyboard/electron-keyboard-layout-provider.js +1 -1
- package/lib/electron-node/keyboard/electron-keyboard-layout-provider.js.map +1 -1
- package/lib/electron-node/token/electron-token-backend-contribution.js +2 -2
- package/lib/electron-node/token/electron-token-backend-contribution.js.map +1 -1
- package/lib/electron-node/token/electron-token-messaging-contribution.js +2 -2
- package/lib/electron-node/token/electron-token-messaging-contribution.js.map +1 -1
- package/lib/electron-node/token/electron-token-validator.js +2 -2
- package/lib/electron-node/token/electron-token-validator.js.map +1 -1
- package/lib/node/application-server.js +2 -2
- package/lib/node/application-server.js.map +1 -1
- package/lib/node/backend-application-config-provider.js +1 -1
- package/lib/node/backend-application-config-provider.js.map +1 -1
- package/lib/node/backend-application-config-provider.spec.js +1 -1
- package/lib/node/backend-application-config-provider.spec.js.map +1 -1
- package/lib/node/backend-application-module.d.ts.map +1 -1
- package/lib/node/backend-application-module.js +7 -4
- package/lib/node/backend-application-module.js.map +1 -1
- package/lib/node/backend-application.d.ts +2 -2
- package/lib/node/backend-application.d.ts.map +1 -1
- package/lib/node/backend-application.js +17 -35
- package/lib/node/backend-application.js.map +1 -1
- package/lib/node/cli.js +3 -2
- package/lib/node/cli.js.map +1 -1
- package/lib/node/console-logger-server.js +4 -4
- package/lib/node/console-logger-server.js.map +1 -1
- package/lib/node/console-logger-server.spec.js +5 -5
- package/lib/node/console-logger-server.spec.js.map +1 -1
- package/lib/node/env-variables/env-variables-server.js +3 -3
- package/lib/node/env-variables/env-variables-server.js.map +1 -1
- package/lib/node/env-variables/index.js +1 -1
- package/lib/node/environment-utils.js +1 -1
- package/lib/node/environment-utils.js.map +1 -1
- package/lib/node/hosting/backend-application-hosts.js +2 -2
- package/lib/node/hosting/backend-application-hosts.js.map +1 -1
- package/lib/node/hosting/ws-origin-validator.js +2 -2
- package/lib/node/hosting/ws-origin-validator.js.map +1 -1
- package/lib/node/i18n/i18n-backend-module.js +1 -1
- package/lib/node/i18n/i18n-backend-module.js.map +1 -1
- package/lib/node/i18n/localization-backend-contribution.js +3 -3
- package/lib/node/i18n/localization-backend-contribution.js.map +1 -1
- package/lib/node/i18n/localization-contribution.js +4 -4
- package/lib/node/i18n/localization-contribution.js.map +1 -1
- package/lib/node/i18n/localization-provider.js +1 -1
- package/lib/node/i18n/localization-provider.js.map +1 -1
- package/lib/node/index.js +1 -1
- package/lib/node/keytar-server.js +1 -1
- package/lib/node/keytar-server.js.map +1 -1
- package/lib/node/logger-backend-module.js +1 -1
- package/lib/node/logger-backend-module.js.map +1 -1
- package/lib/node/logger-cli-contribution.js +1 -1
- package/lib/node/logger-cli-contribution.js.map +1 -1
- package/lib/node/logger-cli-contribution.spec.js +13 -13
- package/lib/node/logger-cli-contribution.spec.js.map +1 -1
- package/lib/node/main.js +1 -1
- package/lib/node/main.js.map +1 -1
- package/lib/node/messaging/http-websocket-adapter.js +3 -3
- package/lib/node/messaging/http-websocket-adapter.js.map +1 -1
- package/lib/node/messaging/index.js +1 -1
- package/lib/node/messaging/ipc-bootstrap.js +3 -3
- package/lib/node/messaging/ipc-bootstrap.js.map +1 -1
- package/lib/node/messaging/ipc-connection-provider.d.ts.map +1 -1
- package/lib/node/messaging/ipc-connection-provider.js +11 -7
- package/lib/node/messaging/ipc-connection-provider.js.map +1 -1
- package/lib/node/messaging/messaging-backend-module.js +3 -3
- package/lib/node/messaging/messaging-backend-module.js.map +1 -1
- package/lib/node/messaging/messaging-contribution.js +14 -14
- package/lib/node/messaging/messaging-contribution.js.map +1 -1
- package/lib/node/messaging/messaging-listeners.js +3 -3
- package/lib/node/messaging/messaging-listeners.js.map +1 -1
- package/lib/node/performance/index.d.ts +18 -0
- package/lib/node/performance/index.d.ts.map +1 -0
- package/lib/node/performance/index.js +30 -0
- package/lib/node/performance/index.js.map +1 -0
- package/lib/node/performance/measurement-backend-bindings.d.ts +20 -0
- package/lib/node/performance/measurement-backend-bindings.d.ts.map +1 -0
- package/lib/node/performance/measurement-backend-bindings.js +31 -0
- package/lib/node/performance/measurement-backend-bindings.js.map +1 -0
- package/lib/node/performance/node-stopwatch.d.ts +21 -0
- package/lib/node/performance/node-stopwatch.d.ts.map +1 -0
- package/lib/node/performance/node-stopwatch.js +52 -0
- package/lib/node/performance/node-stopwatch.js.map +1 -0
- package/lib/node/process-utils.js +1 -1
- package/lib/node/process-utils.js.map +1 -1
- package/lib/node/process-utils.spec.js +1 -1
- package/lib/node/process-utils.spec.js.map +1 -1
- package/lib/node/ws-request-validators.js +3 -3
- package/lib/node/ws-request-validators.js.map +1 -1
- package/package.json +3 -3
- package/src/browser/authentication-service.ts +103 -59
- package/src/browser/frontend-application-module.ts +4 -0
- package/src/browser/frontend-application.ts +17 -22
- package/src/browser/performance/frontend-stopwatch.ts +62 -0
- package/src/browser/performance/index.ts +18 -0
- package/src/browser/performance/measurement-frontend-bindings.ts +31 -0
- package/src/browser/preferences/preference-language-override-service.ts +17 -3
- package/src/browser/saveable.ts +84 -27
- package/src/browser/shell/application-shell.ts +42 -28
- package/src/browser/shell/side-panel-handler.ts +12 -0
- package/src/browser/shell/tab-bars.ts +1 -0
- package/src/browser/source-tree/source-tree-widget.tsx +6 -9
- package/src/browser/source-tree/source-tree.ts +6 -4
- package/src/browser/style/sidepanel.css +4 -0
- package/src/browser/style/view-container.css +0 -8
- package/src/browser/tree/index.ts +1 -0
- package/src/browser/tree/tree-compression/compressed-tree-expansion-service.ts +46 -0
- package/src/browser/tree/tree-compression/compressed-tree-model.ts +82 -0
- package/src/browser/tree/tree-compression/compressed-tree-widget.tsx +181 -0
- package/src/browser/tree/tree-compression/index.ts +20 -0
- package/src/browser/tree/tree-compression/tree-compression-service.ts +121 -0
- package/src/browser/tree/tree-compression/tree-compression.css +28 -0
- package/src/browser/tree/tree-container.ts +107 -29
- package/src/browser/tree/tree-expansion.ts +1 -1
- package/src/browser/tree/tree-model.ts +13 -11
- package/src/browser/tree/tree-widget.tsx +30 -12
- package/src/browser/tree/tree.ts +2 -2
- package/src/browser/view-container.ts +27 -23
- package/src/browser/widget-open-handler.ts +1 -3
- package/src/common/event.ts +2 -2
- package/src/common/index.ts +1 -0
- package/src/common/messaging/proxy-factory.ts +1 -1
- package/src/common/performance/index.ts +19 -0
- package/src/common/performance/measurement-protocol.ts +104 -0
- package/src/common/performance/measurement.ts +104 -0
- package/src/common/performance/stopwatch.ts +157 -0
- package/src/common/promise-util.ts +16 -0
- package/src/common/types.ts +41 -1
- package/src/electron-browser/menu/electron-menu-contribution.ts +1 -1
- package/src/electron-main/electron-main-application.ts +1 -22
- package/src/node/backend-application-module.ts +4 -0
- package/src/node/backend-application.ts +10 -33
- package/src/node/messaging/ipc-connection-provider.ts +9 -5
- package/src/node/performance/index.ts +18 -0
- package/src/node/performance/measurement-backend-bindings.ts +35 -0
- package/src/node/performance/node-stopwatch.ts +40 -0
|
@@ -26,20 +26,17 @@ import { StorageService } from '../browser/storage-service';
|
|
|
26
26
|
import { Disposable, DisposableCollection } from '../common/disposable';
|
|
27
27
|
import { ACCOUNTS_MENU, ACCOUNTS_SUBMENU, MenuModelRegistry } from '../common/menu';
|
|
28
28
|
import { Command, CommandRegistry } from '../common/command';
|
|
29
|
+
import { nls } from '../common/nls';
|
|
29
30
|
|
|
30
|
-
export interface
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
changed: ReadonlyArray<string>;
|
|
31
|
+
export interface AuthenticationSessionAccountInformation {
|
|
32
|
+
readonly id: string;
|
|
33
|
+
readonly label: string;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
export interface AuthenticationSession {
|
|
37
37
|
id: string;
|
|
38
38
|
accessToken: string;
|
|
39
|
-
account:
|
|
40
|
-
label: string;
|
|
41
|
-
id: string;
|
|
42
|
-
}
|
|
39
|
+
account: AuthenticationSessionAccountInformation;
|
|
43
40
|
scopes: ReadonlyArray<string>;
|
|
44
41
|
}
|
|
45
42
|
|
|
@@ -48,6 +45,13 @@ export interface AuthenticationProviderInformation {
|
|
|
48
45
|
label: string;
|
|
49
46
|
}
|
|
50
47
|
|
|
48
|
+
/** Should match the definition from the theia/vscode types */
|
|
49
|
+
export interface AuthenticationProviderAuthenticationSessionsChangeEvent {
|
|
50
|
+
readonly added: ReadonlyArray<AuthenticationSession | string | undefined>;
|
|
51
|
+
readonly removed: ReadonlyArray<AuthenticationSession | string | undefined>;
|
|
52
|
+
readonly changed: ReadonlyArray<AuthenticationSession | string | undefined>;
|
|
53
|
+
}
|
|
54
|
+
|
|
51
55
|
export interface SessionRequest {
|
|
52
56
|
disposables: Disposable[];
|
|
53
57
|
requestingExtensionIds: string[];
|
|
@@ -57,6 +61,7 @@ export interface SessionRequestInfo {
|
|
|
57
61
|
[scopes: string]: SessionRequest;
|
|
58
62
|
}
|
|
59
63
|
|
|
64
|
+
/** Should match the definition from the theia/vscode types */
|
|
60
65
|
export interface AuthenticationProvider {
|
|
61
66
|
id: string;
|
|
62
67
|
|
|
@@ -68,13 +73,40 @@ export interface AuthenticationProvider {
|
|
|
68
73
|
|
|
69
74
|
signOut(accountName: string): Promise<void>;
|
|
70
75
|
|
|
71
|
-
getSessions(): Promise<ReadonlyArray<AuthenticationSession>>;
|
|
76
|
+
getSessions(scopes?: string[]): Promise<ReadonlyArray<AuthenticationSession>>;
|
|
72
77
|
|
|
73
|
-
updateSessionItems(event:
|
|
78
|
+
updateSessionItems(event: AuthenticationProviderAuthenticationSessionsChangeEvent): Promise<void>;
|
|
74
79
|
|
|
75
80
|
login(scopes: string[]): Promise<AuthenticationSession>;
|
|
76
81
|
|
|
77
82
|
logout(sessionId: string): Promise<void>;
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* An [event](#Event) which fires when the array of sessions has changed, or data
|
|
86
|
+
* within a session has changed.
|
|
87
|
+
*/
|
|
88
|
+
readonly onDidChangeSessions: Omit<Event<AuthenticationProviderAuthenticationSessionsChangeEvent>, 'maxListeners'>;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Get a list of sessions.
|
|
92
|
+
* @param scopes An optional list of scopes. If provided, the sessions returned should match
|
|
93
|
+
* these permissions, otherwise all sessions should be returned.
|
|
94
|
+
* @returns A promise that resolves to an array of authentication sessions.
|
|
95
|
+
*/
|
|
96
|
+
getSessions(scopes?: string[]): Thenable<ReadonlyArray<AuthenticationSession>>;
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Prompts a user to login.
|
|
100
|
+
* @param scopes A list of scopes, permissions, that the new session should be created with.
|
|
101
|
+
* @returns A promise that resolves to an authentication session.
|
|
102
|
+
*/
|
|
103
|
+
createSession(scopes: string[]): Thenable<AuthenticationSession>;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Removes the session corresponding to session id.
|
|
107
|
+
* @param sessionId The id of the session to remove.
|
|
108
|
+
*/
|
|
109
|
+
removeSession(sessionId: string): Thenable<void>;
|
|
78
110
|
}
|
|
79
111
|
export const AuthenticationService = Symbol('AuthenticationService');
|
|
80
112
|
|
|
@@ -84,13 +116,13 @@ export interface AuthenticationService {
|
|
|
84
116
|
registerAuthenticationProvider(id: string, provider: AuthenticationProvider): void;
|
|
85
117
|
unregisterAuthenticationProvider(id: string): void;
|
|
86
118
|
requestNewSession(id: string, scopes: string[], extensionId: string, extensionName: string): void;
|
|
87
|
-
updateSessions(providerId: string, event:
|
|
119
|
+
updateSessions(providerId: string, event: AuthenticationProviderAuthenticationSessionsChangeEvent): void;
|
|
88
120
|
|
|
89
121
|
readonly onDidRegisterAuthenticationProvider: Event<AuthenticationProviderInformation>;
|
|
90
122
|
readonly onDidUnregisterAuthenticationProvider: Event<AuthenticationProviderInformation>;
|
|
91
123
|
|
|
92
|
-
readonly onDidChangeSessions: Event<{ providerId: string, label: string, event:
|
|
93
|
-
getSessions(providerId: string): Promise<ReadonlyArray<AuthenticationSession>>;
|
|
124
|
+
readonly onDidChangeSessions: Event<{ providerId: string, label: string, event: AuthenticationProviderAuthenticationSessionsChangeEvent }>;
|
|
125
|
+
getSessions(providerId: string, scopes?: string[]): Promise<ReadonlyArray<AuthenticationSession>>;
|
|
94
126
|
getLabel(providerId: string): string;
|
|
95
127
|
supportsMultipleAccounts(providerId: string): boolean;
|
|
96
128
|
login(providerId: string, scopes: string[]): Promise<AuthenticationSession>;
|
|
@@ -99,13 +131,20 @@ export interface AuthenticationService {
|
|
|
99
131
|
signOutOfAccount(providerId: string, accountName: string): Promise<void>;
|
|
100
132
|
}
|
|
101
133
|
|
|
134
|
+
export interface SessionChangeEvent {
|
|
135
|
+
providerId: string,
|
|
136
|
+
label: string,
|
|
137
|
+
event: AuthenticationProviderAuthenticationSessionsChangeEvent
|
|
138
|
+
}
|
|
139
|
+
|
|
102
140
|
@injectable()
|
|
103
141
|
export class AuthenticationServiceImpl implements AuthenticationService {
|
|
104
142
|
private noAccountsMenuItem: Disposable | undefined;
|
|
105
143
|
private noAccountsCommand: Command = { id: 'noAccounts' };
|
|
106
144
|
private signInRequestItems = new Map<string, SessionRequestInfo>();
|
|
145
|
+
private sessionMap = new Map<string, DisposableCollection>();
|
|
107
146
|
|
|
108
|
-
|
|
147
|
+
protected authenticationProviders: Map<string, AuthenticationProvider> = new Map<string, AuthenticationProvider>();
|
|
109
148
|
|
|
110
149
|
private onDidRegisterAuthenticationProviderEmitter: Emitter<AuthenticationProviderInformation> = new Emitter<AuthenticationProviderInformation>();
|
|
111
150
|
readonly onDidRegisterAuthenticationProvider: Event<AuthenticationProviderInformation> = this.onDidRegisterAuthenticationProviderEmitter.event;
|
|
@@ -113,9 +152,8 @@ export class AuthenticationServiceImpl implements AuthenticationService {
|
|
|
113
152
|
private onDidUnregisterAuthenticationProviderEmitter: Emitter<AuthenticationProviderInformation> = new Emitter<AuthenticationProviderInformation>();
|
|
114
153
|
readonly onDidUnregisterAuthenticationProvider: Event<AuthenticationProviderInformation> = this.onDidUnregisterAuthenticationProviderEmitter.event;
|
|
115
154
|
|
|
116
|
-
private onDidChangeSessionsEmitter: Emitter<
|
|
117
|
-
|
|
118
|
-
readonly onDidChangeSessions: Event<{ providerId: string, label: string, event: AuthenticationSessionsChangeEvent }> = this.onDidChangeSessionsEmitter.event;
|
|
155
|
+
private onDidChangeSessionsEmitter: Emitter<SessionChangeEvent> = new Emitter<SessionChangeEvent>();
|
|
156
|
+
readonly onDidChangeSessions: Event<SessionChangeEvent> = this.onDidChangeSessionsEmitter.event;
|
|
119
157
|
|
|
120
158
|
@inject(MenuModelRegistry) protected readonly menus: MenuModelRegistry;
|
|
121
159
|
@inject(CommandRegistry) protected readonly commands: CommandRegistry;
|
|
@@ -123,48 +161,54 @@ export class AuthenticationServiceImpl implements AuthenticationService {
|
|
|
123
161
|
|
|
124
162
|
@postConstruct()
|
|
125
163
|
init(): void {
|
|
126
|
-
|
|
127
|
-
this.onDidChangeSessions(async e => {
|
|
128
|
-
if (e.event.added.length > 0) {
|
|
129
|
-
const sessions = await this.getSessions(e.providerId);
|
|
130
|
-
sessions.forEach(session => {
|
|
131
|
-
if (sessions.find(s => disposableMap.get(s.id))) {
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
const disposables = new DisposableCollection();
|
|
135
|
-
const commandId = `account-sign-out-${e.providerId}-${session.id}`;
|
|
136
|
-
const command = this.commands.registerCommand({ id: commandId }, {
|
|
137
|
-
execute: async () => {
|
|
138
|
-
this.signOutOfAccount(e.providerId, session.account.label);
|
|
139
|
-
}
|
|
140
|
-
});
|
|
141
|
-
const subSubMenuPath = [...ACCOUNTS_SUBMENU, 'account-sub-menu'];
|
|
142
|
-
this.menus.registerSubmenu(subSubMenuPath, `${session.account.label} (${e.label})`);
|
|
143
|
-
const menuAction = this.menus.registerMenuAction(subSubMenuPath, {
|
|
144
|
-
label: 'Sign Out',
|
|
145
|
-
commandId
|
|
146
|
-
});
|
|
147
|
-
disposables.push(menuAction);
|
|
148
|
-
disposables.push(command);
|
|
149
|
-
disposableMap.set(session.id, disposables);
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
if (e.event.removed.length > 0) {
|
|
153
|
-
e.event.removed.forEach(removed => {
|
|
154
|
-
const toDispose = disposableMap.get(removed);
|
|
155
|
-
if (toDispose) {
|
|
156
|
-
toDispose.dispose();
|
|
157
|
-
disposableMap.delete(removed);
|
|
158
|
-
}
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
});
|
|
164
|
+
this.onDidChangeSessions(event => this.handleSessionChange(event));
|
|
162
165
|
this.commands.registerCommand(this.noAccountsCommand, {
|
|
163
|
-
execute: () => {},
|
|
166
|
+
execute: () => { },
|
|
164
167
|
isEnabled: () => false
|
|
165
168
|
});
|
|
166
169
|
}
|
|
167
170
|
|
|
171
|
+
protected async handleSessionChange(changeEvent: SessionChangeEvent): Promise<void> {
|
|
172
|
+
if (changeEvent.event.added.length > 0) {
|
|
173
|
+
const sessions = await this.getSessions(changeEvent.providerId);
|
|
174
|
+
sessions.forEach(session => {
|
|
175
|
+
if (!this.sessionMap.get(session.id)) {
|
|
176
|
+
this.sessionMap.set(session.id, this.createAccountUi(changeEvent.providerId, changeEvent.label, session));
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
for (const removed of changeEvent.event.removed) {
|
|
181
|
+
const sessionId = typeof removed === 'string' ? removed : removed?.id;
|
|
182
|
+
if (sessionId) {
|
|
183
|
+
this.sessionMap.get(sessionId)?.dispose();
|
|
184
|
+
this.sessionMap.delete(sessionId);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
protected createAccountUi(providerId: string, providerLabel: string, session: AuthenticationSession): DisposableCollection {
|
|
190
|
+
// unregister old commands and menus if present (there is only one per account but there may be several sessions per account)
|
|
191
|
+
const providerAccountId = `account-sign-out-${providerId}-${session.account.id}`;
|
|
192
|
+
this.commands.unregisterCommand(providerAccountId);
|
|
193
|
+
|
|
194
|
+
const providerAccountSubmenu = [...ACCOUNTS_SUBMENU, providerAccountId];
|
|
195
|
+
this.menus.unregisterMenuAction({ commandId: providerAccountId }, providerAccountSubmenu);
|
|
196
|
+
|
|
197
|
+
// register new command and menu entry for the sessions account
|
|
198
|
+
const disposables = new DisposableCollection();
|
|
199
|
+
disposables.push(this.commands.registerCommand({ id: providerAccountId }, {
|
|
200
|
+
execute: async () => {
|
|
201
|
+
this.signOutOfAccount(providerId, session.account.label);
|
|
202
|
+
}
|
|
203
|
+
}));
|
|
204
|
+
this.menus.registerSubmenu(providerAccountSubmenu, `${session.account.label} (${providerLabel})`);
|
|
205
|
+
disposables.push(this.menus.registerMenuAction(providerAccountSubmenu, {
|
|
206
|
+
label: nls.localizeByDefault('Sign Out'),
|
|
207
|
+
commandId: providerAccountId
|
|
208
|
+
}));
|
|
209
|
+
return disposables;
|
|
210
|
+
}
|
|
211
|
+
|
|
168
212
|
getProviderIds(): string[] {
|
|
169
213
|
const providerIds: string[] = [];
|
|
170
214
|
this.authenticationProviders.forEach(provider => {
|
|
@@ -219,7 +263,7 @@ export class AuthenticationServiceImpl implements AuthenticationService {
|
|
|
219
263
|
}
|
|
220
264
|
}
|
|
221
265
|
|
|
222
|
-
async updateSessions(id: string, event:
|
|
266
|
+
async updateSessions(id: string, event: AuthenticationProviderAuthenticationSessionsChangeEvent): Promise<void> {
|
|
223
267
|
const provider = this.authenticationProviders.get(id);
|
|
224
268
|
if (provider) {
|
|
225
269
|
await provider.updateSessionItems(event);
|
|
@@ -264,11 +308,11 @@ export class AuthenticationServiceImpl implements AuthenticationService {
|
|
|
264
308
|
// Activate has already been called for the authentication provider, but it cannot block on registering itself
|
|
265
309
|
// since this is sync and returns a disposable. So, wait for registration event to fire that indicates the
|
|
266
310
|
// provider is now in the map.
|
|
267
|
-
await new Promise((resolve, _) => {
|
|
311
|
+
await new Promise<void>((resolve, _) => {
|
|
268
312
|
this.onDidRegisterAuthenticationProvider(e => {
|
|
269
313
|
if (e.id === providerId) {
|
|
270
314
|
provider = this.authenticationProviders.get(providerId);
|
|
271
|
-
resolve();
|
|
315
|
+
resolve(undefined);
|
|
272
316
|
}
|
|
273
317
|
});
|
|
274
318
|
});
|
|
@@ -344,10 +388,10 @@ export class AuthenticationServiceImpl implements AuthenticationService {
|
|
|
344
388
|
}
|
|
345
389
|
}
|
|
346
390
|
|
|
347
|
-
async getSessions(id: string): Promise<ReadonlyArray<AuthenticationSession>> {
|
|
391
|
+
async getSessions(id: string, scopes?: string[]): Promise<ReadonlyArray<AuthenticationSession>> {
|
|
348
392
|
const authProvider = this.authenticationProviders.get(id);
|
|
349
393
|
if (authProvider) {
|
|
350
|
-
return authProvider.getSessions();
|
|
394
|
+
return authProvider.getSessions(scopes);
|
|
351
395
|
} else {
|
|
352
396
|
throw new Error(`No authentication provider '${id}' is currently registered.`);
|
|
353
397
|
}
|
|
@@ -119,6 +119,7 @@ import {
|
|
|
119
119
|
} from './breadcrumbs';
|
|
120
120
|
import { RendererHost } from './widgets';
|
|
121
121
|
import { TooltipService, TooltipServiceImpl } from './tooltip-service';
|
|
122
|
+
import { bindFrontendStopwatch, bindBackendStopwatch } from './performance';
|
|
122
123
|
|
|
123
124
|
export { bindResourceProvider, bindMessageService, bindPreferenceService };
|
|
124
125
|
|
|
@@ -390,4 +391,7 @@ export const frontendApplicationModule = new ContainerModule((bind, unbind, isBo
|
|
|
390
391
|
child.bind(Coordinate).toConstantValue(position);
|
|
391
392
|
return child.get(BreadcrumbPopupContainer);
|
|
392
393
|
});
|
|
394
|
+
|
|
395
|
+
bindFrontendStopwatch(bind);
|
|
396
|
+
bindBackendStopwatch(bind);
|
|
393
397
|
});
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
********************************************************************************/
|
|
16
16
|
|
|
17
17
|
import { inject, injectable, named } from 'inversify';
|
|
18
|
-
import { ContributionProvider, CommandRegistry, MenuModelRegistry, isOSX } from '../common';
|
|
18
|
+
import { ContributionProvider, CommandRegistry, MenuModelRegistry, isOSX, BackendStopwatch, LogLevel, Stopwatch } from '../common';
|
|
19
19
|
import { MaybePromise } from '../common/types';
|
|
20
20
|
import { KeybindingRegistry } from './keybinding';
|
|
21
21
|
import { Widget } from './widgets';
|
|
@@ -127,6 +127,12 @@ export class FrontendApplication {
|
|
|
127
127
|
@inject(TooltipService)
|
|
128
128
|
protected readonly tooltipService: TooltipService;
|
|
129
129
|
|
|
130
|
+
@inject(Stopwatch)
|
|
131
|
+
protected readonly stopwatch: Stopwatch;
|
|
132
|
+
|
|
133
|
+
@inject(BackendStopwatch)
|
|
134
|
+
protected readonly backendStopwatch: BackendStopwatch;
|
|
135
|
+
|
|
130
136
|
constructor(
|
|
131
137
|
@inject(CommandRegistry) protected readonly commands: CommandRegistry,
|
|
132
138
|
@inject(MenuModelRegistry) protected readonly menus: MenuModelRegistry,
|
|
@@ -152,7 +158,9 @@ export class FrontendApplication {
|
|
|
152
158
|
* - reveal the application shell if it was hidden by a startup indicator
|
|
153
159
|
*/
|
|
154
160
|
async start(): Promise<void> {
|
|
155
|
-
|
|
161
|
+
const startup = this.backendStopwatch.start('frontend');
|
|
162
|
+
|
|
163
|
+
await this.measure('startContributions', () => this.startContributions(), 'Start frontend contributions', false);
|
|
156
164
|
this.stateService.state = 'started_contributions';
|
|
157
165
|
|
|
158
166
|
const host = await this.getHost();
|
|
@@ -161,13 +169,15 @@ export class FrontendApplication {
|
|
|
161
169
|
await animationFrame();
|
|
162
170
|
this.stateService.state = 'attached_shell';
|
|
163
171
|
|
|
164
|
-
await this.initializeLayout();
|
|
172
|
+
await this.measure('initializeLayout', () => this.initializeLayout(), 'Initialize the workbench layout', false);
|
|
165
173
|
this.stateService.state = 'initialized_layout';
|
|
166
174
|
await this.fireOnDidInitializeLayout();
|
|
167
175
|
|
|
168
|
-
await this.revealShell(host);
|
|
176
|
+
await this.measure('revealShell', () => this.revealShell(host), 'Replace loading indicator with ready workbench UI (animation)', false);
|
|
169
177
|
this.registerEventListeners();
|
|
170
178
|
this.stateService.state = 'ready';
|
|
179
|
+
|
|
180
|
+
startup.then(idToken => this.backendStopwatch.stop(idToken, 'Frontend application start', []));
|
|
171
181
|
}
|
|
172
182
|
|
|
173
183
|
/**
|
|
@@ -266,7 +276,6 @@ export class FrontendApplication {
|
|
|
266
276
|
return new Promise(resolve => {
|
|
267
277
|
window.requestAnimationFrame(() => {
|
|
268
278
|
startupElem.classList.add('theia-hidden');
|
|
269
|
-
console.log(`Finished loading frontend application after ${(performance.now() / 1000).toFixed(3)} seconds`);
|
|
270
279
|
const preloadStyle = window.getComputedStyle(startupElem);
|
|
271
280
|
const transitionDuration = parseCssTime(preloadStyle.transitionDuration, 0);
|
|
272
281
|
window.setTimeout(() => {
|
|
@@ -408,23 +417,9 @@ export class FrontendApplication {
|
|
|
408
417
|
console.info('<<< All frontend contributions have been stopped.');
|
|
409
418
|
}
|
|
410
419
|
|
|
411
|
-
protected async measure<T>(name: string, fn: () => MaybePromise<T
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
performance.mark(startMark);
|
|
415
|
-
const result = await fn();
|
|
416
|
-
performance.mark(endMark);
|
|
417
|
-
performance.measure(name, startMark, endMark);
|
|
418
|
-
for (const item of performance.getEntriesByName(name)) {
|
|
419
|
-
const contribution = `Frontend ${item.name}`;
|
|
420
|
-
if (item.duration > TIMER_WARNING_THRESHOLD) {
|
|
421
|
-
console.warn(`${contribution} is slow, took: ${item.duration.toFixed(1)} ms`);
|
|
422
|
-
} else {
|
|
423
|
-
console.debug(`${contribution} took: ${item.duration.toFixed(1)} ms`);
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
performance.clearMeasures(name);
|
|
427
|
-
return result;
|
|
420
|
+
protected async measure<T>(name: string, fn: () => MaybePromise<T>, message = `Frontend ${name}`, threshold = true): Promise<T> {
|
|
421
|
+
return this.stopwatch.startAsync(name, message, fn,
|
|
422
|
+
threshold ? { thresholdMillis: TIMER_WARNING_THRESHOLD, defaultLogLevel: LogLevel.DEBUG } : {});
|
|
428
423
|
}
|
|
429
424
|
|
|
430
425
|
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2019, 2021 TypeFox, STMicroelectronics and others.
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made available under the
|
|
5
|
+
* terms of the Eclipse Public License 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 { injectable } from 'inversify';
|
|
18
|
+
import { Measurement, MeasurementOptions, Stopwatch } from '../../common';
|
|
19
|
+
|
|
20
|
+
@injectable()
|
|
21
|
+
export class FrontendStopwatch extends Stopwatch {
|
|
22
|
+
|
|
23
|
+
constructor() {
|
|
24
|
+
super({
|
|
25
|
+
owner: 'frontend',
|
|
26
|
+
now: () => performance.now(),
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
start(name: string, options?: MeasurementOptions): Measurement {
|
|
31
|
+
const startMarker = `${name}-start`;
|
|
32
|
+
const endMarker = `${name}-end`;
|
|
33
|
+
performance.clearMeasures(name);
|
|
34
|
+
performance.clearMarks(startMarker);
|
|
35
|
+
performance.clearMarks(endMarker);
|
|
36
|
+
|
|
37
|
+
performance.mark(startMarker);
|
|
38
|
+
|
|
39
|
+
return this.createMeasurement(name, () => {
|
|
40
|
+
performance.mark(endMarker);
|
|
41
|
+
|
|
42
|
+
let duration: number;
|
|
43
|
+
|
|
44
|
+
try {
|
|
45
|
+
performance.measure(name, startMarker, endMarker);
|
|
46
|
+
|
|
47
|
+
const entries = performance.getEntriesByName(name);
|
|
48
|
+
// If no entries, then performance measurement was disabled or failed, so
|
|
49
|
+
// signal that with a `NaN` result
|
|
50
|
+
duration = entries.length > 0 ? entries[0].duration : Number.NaN;
|
|
51
|
+
} catch (e) {
|
|
52
|
+
console.warn(e);
|
|
53
|
+
duration = Number.NaN;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
performance.clearMeasures(name);
|
|
57
|
+
performance.clearMarks(startMarker);
|
|
58
|
+
performance.clearMarks(endMarker);
|
|
59
|
+
return duration;
|
|
60
|
+
}, options);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (C) 2021 STMicroelectronics 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
|
+
export * from './frontend-stopwatch';
|
|
18
|
+
export * from './measurement-frontend-bindings';
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2021 STMicroelectronics and others.
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made available under the
|
|
5
|
+
* terms of the Eclipse Public License 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 { interfaces } from 'inversify';
|
|
18
|
+
import { BackendStopwatch, Stopwatch, stopwatchPath } from '../../common';
|
|
19
|
+
import { WebSocketConnectionProvider } from '../messaging';
|
|
20
|
+
import { FrontendStopwatch } from './frontend-stopwatch';
|
|
21
|
+
|
|
22
|
+
export function bindFrontendStopwatch(bind: interfaces.Bind): interfaces.BindingWhenOnSyntax<Stopwatch> {
|
|
23
|
+
return bind(Stopwatch).to(FrontendStopwatch).inSingletonScope();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function bindBackendStopwatch(bind: interfaces.Bind): interfaces.BindingWhenOnSyntax<unknown> {
|
|
27
|
+
return bind(BackendStopwatch).toDynamicValue(({ container }) => {
|
|
28
|
+
const connection = container.get(WebSocketConnectionProvider);
|
|
29
|
+
return connection.createProxy<BackendStopwatch>(stopwatchPath);
|
|
30
|
+
}).inSingletonScope();
|
|
31
|
+
}
|
|
@@ -42,21 +42,35 @@ export class PreferenceLanguageOverrideService {
|
|
|
42
42
|
return PreferenceSchemaProperties.is(value) && OVERRIDE_PROPERTY_PATTERN.test(name);
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
/**
|
|
46
|
+
* @param overrideIdentifier the language id associated for a language override, e.g. `typescript`
|
|
47
|
+
* @returns the form used to mark language overrides in preference files, e.g. `[typescript]`
|
|
48
|
+
*/
|
|
49
|
+
markLanguageOverride(overrideIdentifier: string): string {
|
|
50
|
+
return `[${overrideIdentifier}]`;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* @returns the flat JSON path to an overridden preference, e.g. [typescript].editor.tabSize.
|
|
55
|
+
*/
|
|
45
56
|
overridePreferenceName({ preferenceName, overrideIdentifier }: OverridePreferenceName): string {
|
|
46
|
-
return
|
|
57
|
+
return `${this.markLanguageOverride(overrideIdentifier)}.${preferenceName}`;
|
|
47
58
|
}
|
|
48
59
|
|
|
60
|
+
/**
|
|
61
|
+
* @returns an OverridePreferenceName if the `name` contains a language override, e.g. [typescript].editor.tabSize.
|
|
62
|
+
*/
|
|
49
63
|
overriddenPreferenceName(name: string): OverridePreferenceName | undefined {
|
|
50
64
|
const index = name.indexOf('.');
|
|
51
65
|
if (index === -1) {
|
|
52
66
|
return undefined;
|
|
53
67
|
}
|
|
54
|
-
const matches = name.
|
|
68
|
+
const matches = name.substring(0, index).match(OVERRIDE_PROPERTY_PATTERN);
|
|
55
69
|
const overrideIdentifier = matches && matches[1];
|
|
56
70
|
if (!overrideIdentifier || !this.overrideIdentifiers.has(overrideIdentifier)) {
|
|
57
71
|
return undefined;
|
|
58
72
|
}
|
|
59
|
-
const preferenceName = name.
|
|
73
|
+
const preferenceName = name.substring(index + 1);
|
|
60
74
|
return { preferenceName, overrideIdentifier };
|
|
61
75
|
}
|
|
62
76
|
|
package/src/browser/saveable.ts
CHANGED
|
@@ -93,51 +93,93 @@ export namespace Saveable {
|
|
|
93
93
|
await saveable.save(options);
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
if (!saveable) {
|
|
102
|
-
return undefined;
|
|
96
|
+
|
|
97
|
+
async function closeWithoutSaving(this: PostCreationSaveableWidget, doRevert: boolean = true): Promise<void> {
|
|
98
|
+
const saveable = get(this);
|
|
99
|
+
if (saveable && doRevert && saveable.dirty && saveable.revert) {
|
|
100
|
+
await saveable.revert();
|
|
103
101
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
await saveable.revert();
|
|
110
|
-
}
|
|
111
|
-
closeWidget();
|
|
112
|
-
return waitForClosed(widget);
|
|
113
|
-
};
|
|
102
|
+
this[close]();
|
|
103
|
+
return waitForClosed(this);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function createCloseWithSaving(getOtherSaveables?: () => Array<Widget | SaveableWidget>): (this: SaveableWidget, options?: SaveableWidget.CloseOptions) => Promise<void> {
|
|
114
107
|
let closing = false;
|
|
115
|
-
|
|
116
|
-
if (closing) {
|
|
117
|
-
|
|
118
|
-
}
|
|
108
|
+
return async function (this: SaveableWidget, options: SaveableWidget.CloseOptions): Promise<void> {
|
|
109
|
+
if (closing) { return; }
|
|
110
|
+
const saveable = get(this);
|
|
111
|
+
if (!saveable) { return; }
|
|
119
112
|
closing = true;
|
|
120
113
|
try {
|
|
121
114
|
const result = await shouldSave(saveable, () => {
|
|
115
|
+
const notLastWithDocument = !closingWidgetWouldLoseSaveable(this, getOtherSaveables?.() ?? []);
|
|
116
|
+
if (notLastWithDocument) {
|
|
117
|
+
return this.closeWithoutSaving(false).then(() => undefined);
|
|
118
|
+
}
|
|
122
119
|
if (options && options.shouldSave) {
|
|
123
120
|
return options.shouldSave();
|
|
124
121
|
}
|
|
125
|
-
return new ShouldSaveDialog(
|
|
122
|
+
return new ShouldSaveDialog(this).open();
|
|
126
123
|
});
|
|
127
124
|
if (typeof result === 'boolean') {
|
|
128
125
|
if (result) {
|
|
129
|
-
await Saveable.save(
|
|
126
|
+
await Saveable.save(this);
|
|
130
127
|
}
|
|
131
|
-
await closeWithoutSaving();
|
|
128
|
+
await this.closeWithoutSaving();
|
|
132
129
|
}
|
|
133
130
|
} finally {
|
|
134
131
|
closing = false;
|
|
135
132
|
}
|
|
136
133
|
};
|
|
137
|
-
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export async function confirmSaveBeforeClose(toClose: Iterable<Widget>, others: Widget[]): Promise<boolean | undefined> {
|
|
137
|
+
for (const widget of toClose) {
|
|
138
|
+
const saveable = Saveable.get(widget);
|
|
139
|
+
if (saveable?.dirty) {
|
|
140
|
+
if (!closingWidgetWouldLoseSaveable(widget, others)) {
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const userWantsToSave = await new ShouldSaveDialog(widget).open();
|
|
144
|
+
if (userWantsToSave === undefined) { // User clicked cancel.
|
|
145
|
+
return undefined;
|
|
146
|
+
} else if (userWantsToSave) {
|
|
147
|
+
await saveable.save();
|
|
148
|
+
} else {
|
|
149
|
+
await saveable.revert?.();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* @param widget the widget that may be closed
|
|
158
|
+
* @param others widgets that will not be closed.
|
|
159
|
+
* @returns `true` if widget is saveable and no widget among the `others` refers to the same saveable. `false` otherwise.
|
|
160
|
+
*/
|
|
161
|
+
function closingWidgetWouldLoseSaveable(widget: Widget, others: Widget[]): boolean {
|
|
162
|
+
const saveable = get(widget);
|
|
163
|
+
return !!saveable && !others.some(otherWidget => otherWidget !== widget && get(otherWidget) === saveable);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export function apply(widget: Widget, getOtherSaveables?: () => Array<Widget | SaveableWidget>): SaveableWidget | undefined {
|
|
167
|
+
if (SaveableWidget.is(widget)) {
|
|
168
|
+
return widget;
|
|
169
|
+
}
|
|
170
|
+
const saveable = Saveable.get(widget);
|
|
171
|
+
if (!saveable) {
|
|
172
|
+
return undefined;
|
|
173
|
+
}
|
|
174
|
+
const saveableWidget = widget as SaveableWidget;
|
|
175
|
+
setDirty(saveableWidget, saveable.dirty);
|
|
176
|
+
saveable.onDirtyChanged(() => setDirty(saveableWidget, saveable.dirty));
|
|
177
|
+
const closeWithSaving = createCloseWithSaving(getOtherSaveables);
|
|
178
|
+
return Object.assign(saveableWidget, {
|
|
138
179
|
closeWithoutSaving,
|
|
139
180
|
closeWithSaving,
|
|
140
|
-
close:
|
|
181
|
+
close: closeWithSaving,
|
|
182
|
+
[close]: saveableWidget.close,
|
|
141
183
|
});
|
|
142
184
|
}
|
|
143
185
|
export async function shouldSave(saveable: Saveable, cb: () => MaybePromise<boolean | undefined>): Promise<boolean | undefined> {
|
|
@@ -154,9 +196,24 @@ export namespace Saveable {
|
|
|
154
196
|
}
|
|
155
197
|
|
|
156
198
|
export interface SaveableWidget extends Widget {
|
|
157
|
-
|
|
199
|
+
/**
|
|
200
|
+
* @param doRevert whether the saveable should be reverted before being saved. Defaults to `true`.
|
|
201
|
+
*/
|
|
202
|
+
closeWithoutSaving(doRevert?: boolean): Promise<void>;
|
|
158
203
|
closeWithSaving(options?: SaveableWidget.CloseOptions): Promise<void>;
|
|
159
204
|
}
|
|
205
|
+
|
|
206
|
+
export const close = Symbol('close');
|
|
207
|
+
/**
|
|
208
|
+
* An interface describing saveable widgets that are created by the `Saveable.apply` function.
|
|
209
|
+
* The original `close` function is reassigned to a locally-defined `Symbol`
|
|
210
|
+
*/
|
|
211
|
+
export interface PostCreationSaveableWidget extends SaveableWidget {
|
|
212
|
+
/**
|
|
213
|
+
* The original `close` function of the widget
|
|
214
|
+
*/
|
|
215
|
+
[close](): void;
|
|
216
|
+
}
|
|
160
217
|
export namespace SaveableWidget {
|
|
161
218
|
export function is(widget: Widget | undefined): widget is SaveableWidget {
|
|
162
219
|
return !!widget && 'closeWithoutSaving' in widget;
|