diff --git a/packages/core-browser/src/bootstrap/app.ts b/packages/core-browser/src/bootstrap/app.ts index 97c08134ef..61eda48598 100644 --- a/packages/core-browser/src/bootstrap/app.ts +++ b/packages/core-browser/src/bootstrap/app.ts @@ -14,6 +14,7 @@ import { ContributionProvider, DefaultStorageProvider, Deferred, + DisposableCollection, GeneralSettingsId, IAppLifeCycleService, IApplicationService, @@ -89,6 +90,7 @@ export class ClientApp implements IClientApp, IDisposable { public injector: Injector; public config: AppConfig; public commandRegistry: CommandRegistry; + public runtime: ElectronRendererRuntime | BrowserRuntime; private logger: ILogServiceClient; private connectionPath: UrlProvider; @@ -98,7 +100,8 @@ export class ClientApp implements IClientApp, IDisposable { private contributionsProvider: ContributionProvider; private nextMenuRegistry: MenuRegistryImpl; private stateService: ClientAppStateService; - runtime: ElectronRendererRuntime | BrowserRuntime; + + protected _disposables = new DisposableCollection(); constructor(protected opts: IClientAppOpts) { const { @@ -618,9 +621,9 @@ export class ClientApp implements IClientApp, IDisposable { } protected initEarlyPreference(workspaceDir: string) { - registerLocalStorageProvider(GeneralSettingsId.Theme, workspaceDir); - registerLocalStorageProvider(GeneralSettingsId.Icon, workspaceDir); - registerLocalStorageProvider(GeneralSettingsId.Language, workspaceDir); + this._disposables.push(registerLocalStorageProvider(GeneralSettingsId.Theme, workspaceDir)); + this._disposables.push(registerLocalStorageProvider(GeneralSettingsId.Icon, workspaceDir)); + this._disposables.push(registerLocalStorageProvider(GeneralSettingsId.Language, workspaceDir)); } public async dispose() { @@ -633,7 +636,7 @@ export class ClientApp implements IClientApp, IDisposable { if (isOSX) { document.body.removeEventListener('wheel', this._handleWheel); } - + this._disposables.dispose(); this.disposeSideEffect(); } diff --git a/packages/core-browser/src/common/common.define.ts b/packages/core-browser/src/common/common.define.ts index 6724f70ba4..68bde29f24 100644 --- a/packages/core-browser/src/common/common.define.ts +++ b/packages/core-browser/src/common/common.define.ts @@ -18,8 +18,7 @@ export interface ClientAppContribution { onStart?(app: IClientApp): MaybePromise; /** - * 大部分模块启动完成 - * @param app + * Most of the modules have been started. */ onDidStart?(app: IClientApp): MaybePromise; @@ -49,7 +48,7 @@ export interface ClientAppContribution { onDisposeSideEffects?(app: IClientApp): void; /** - * + * Called When the application is reconnected. */ onReconnect?(app: IClientApp): void; } diff --git a/packages/core-browser/src/preferences/early-preferences.ts b/packages/core-browser/src/preferences/early-preferences.ts index 7695ba5303..a17042a5d2 100644 --- a/packages/core-browser/src/preferences/early-preferences.ts +++ b/packages/core-browser/src/preferences/early-preferences.ts @@ -1,4 +1,4 @@ -import { Event, GeneralSettingsId, PreferenceItem, getLanguageId } from '@opensumi/ide-core-common'; +import { Disposable, Event, GeneralSettingsId, PreferenceItem, getLanguageId } from '@opensumi/ide-core-common'; import { IPreferences } from '../bootstrap'; @@ -16,9 +16,16 @@ const providers = new Map(); export function registerExternalPreferenceProvider(name: string, provider: IExternalPreferenceProvider) { if (providers.get(name)) { - return; // 不可覆盖,先注册的生效 + // 不可覆盖,先注册的生效 + return Disposable.NULL; } providers.set(name, provider); + + return { + dispose() { + providers.delete(name); + }, + }; } export function getExternalPreferenceProvider(name: string) { @@ -59,14 +66,26 @@ export function getPreferenceLanguageId(defaultPreferences?: IPreferences): stri } // 默认使用 localStorage -export function registerLocalStorageProvider(key: string, workspaceFolder?: string) { +export function registerLocalStorageProvider(key: string, workspaceFolder?: string, prefix = '') { function getScopePrefix(scope: PreferenceScope) { - if (scope === PreferenceScope.Workspace) { - return workspaceFolder; + let text: string = ''; + if (scope === PreferenceScope.Workspace && workspaceFolder) { + text = workspaceFolder; + } else { + text = scope.toString(); } - return scope; + + if (prefix) { + return prefix + ':' + text; + } + return text; + } + + function createLocalStorageKey(scope: PreferenceScope) { + return getScopePrefix(scope) + `:${key}`; } - registerExternalPreferenceProvider(key, { + + return registerExternalPreferenceProvider(key, { set: (value, scope) => { if (scope >= PreferenceScope.Folder) { // earlyPreference不支持针对作用域大于等于Folder的值设置 @@ -78,17 +97,17 @@ export function registerLocalStorageProvider(key: string, workspaceFolder?: stri return; } - if ((global as any).localStorage) { + if (global.localStorage) { if (value !== undefined) { - localStorage.setItem(getScopePrefix(scope) + `:${key}`, value); + localStorage.setItem(createLocalStorageKey(scope), value); } else { - localStorage.removeItem(getScopePrefix(scope) + `:${key}`); + localStorage.removeItem(createLocalStorageKey(scope)); } } }, get: (scope) => { - if ((global as any).localStorage) { - return localStorage.getItem(getScopePrefix(scope) + `:${key}`) || undefined; + if (global.localStorage) { + return localStorage.getItem(createLocalStorageKey(scope)) || undefined; } }, }); @@ -104,7 +123,7 @@ export function getExternalPreference( : PreferenceScope.getReversedScopes(); for (const scope of scopes) { const value = providers.get(preferenceName)?.get(scope); - if (value !== undefined) { + if (value) { return { value, scope, diff --git a/packages/core-browser/src/preferences/preference-provider.ts b/packages/core-browser/src/preferences/preference-provider.ts index ac3f366dbc..305ede470f 100644 --- a/packages/core-browser/src/preferences/preference-provider.ts +++ b/packages/core-browser/src/preferences/preference-provider.ts @@ -251,7 +251,9 @@ export abstract class PreferenceProvider implements IDisposable { return this.doResolve(preferenceName, resourceUri, language).value; } - // @final 不要 override 这个 + /** + * @final + */ public resolve(preferenceName: string, resourceUri?: string, language?: string): PreferenceResolveResult { if (PreferenceProvider.PreferenceDelegatesReverse[preferenceName]) { const res = this.getDelegateToValueFromDelegated(preferenceName); diff --git a/packages/core-common/src/preferences/preference-scope.ts b/packages/core-common/src/preferences/preference-scope.ts index bb1f1cb4ec..4b251da43c 100644 --- a/packages/core-common/src/preferences/preference-scope.ts +++ b/packages/core-common/src/preferences/preference-scope.ts @@ -48,7 +48,7 @@ export namespace PreferenceScope { return names; } - // 转义 vscode 中对configuration中scope的定义 + // 转义 vscode 中对 configuration 中 scope 的定义 export function fromString(strScope: string): PreferenceScope | undefined { switch (strScope) { case 'application': diff --git a/packages/startup/entry/web/render-app.tsx b/packages/startup/entry/web/render-app.tsx index 63a8df40c1..763d409190 100644 --- a/packages/startup/entry/web/render-app.tsx +++ b/packages/startup/entry/web/render-app.tsx @@ -2,9 +2,9 @@ console.time('Render'); import { Injector } from '@opensumi/di'; -import { IClientAppOpts, SlotLocation } from '@opensumi/ide-core-browser'; +import { IClientAppOpts, SlotLocation, registerLocalStorageProvider } from '@opensumi/ide-core-browser'; import { ClientApp } from '@opensumi/ide-core-browser/lib/bootstrap/app'; -import { uuid } from '@opensumi/ide-core-common'; +import { GeneralSettingsId, uuid } from '@opensumi/ide-core-common'; import { ExpressFileServerModule } from '@opensumi/ide-express-file-server/lib/browser'; import { defaultConfig } from '@opensumi/ide-main-layout/lib/browser/default-config'; import { RemoteOpenerModule } from '@opensumi/ide-remote-opener/lib/browser'; @@ -41,6 +41,7 @@ export async function renderApp(opts: IClientAppOpts) { // eslint-disable-next-line no-console console.timeEnd('Render'); }; + registerLocalStorageProvider(GeneralSettingsId.Theme, opts.workspaceDir || '', 'prefix1'); const app = new ClientApp(opts); diff --git a/packages/storage/__tests__/browser/storage.service.test.ts b/packages/storage/__tests__/browser/storage.service.test.ts index 5b6c2b8dfc..c229edbd3d 100644 --- a/packages/storage/__tests__/browser/storage.service.test.ts +++ b/packages/storage/__tests__/browser/storage.service.test.ts @@ -141,8 +141,8 @@ describe('StorageProvider should be work', () => { const extensions = ['opensumi.test.extension']; await extensionStorage.set('extensions', extensions); expect(extensionStorage.get('extensions')).toEqual(extensions); - const browserLocalStroage = injector.get(ScopedBrowserStorageService, [MockWorkspaceService.workspace.uri]); - const cache = browserLocalStroage.getData(STORAGE_NAMESPACE.EXTENSIONS.path.toString()); + const browserLocalStorage = injector.get(ScopedBrowserStorageService, [MockWorkspaceService.workspace.uri]); + const cache = browserLocalStorage.getData(STORAGE_NAMESPACE.EXTENSIONS.path.toString()); expect(typeof cache?.expires).toBe('undefined'); expect(cache?.extensions).toBe(JSON.stringify(extensions)); }); @@ -155,8 +155,8 @@ describe('StorageProvider should be work', () => { const recents = ['opensumi.test.recent']; await recentStorage.set('recents', recents); expect(recentStorage.get('recents')).toEqual(recents); - const browserLocalStroage = injector.get(GlobalBrowserStorageService); - const cache = browserLocalStroage.getData(STORAGE_NAMESPACE.GLOBAL_RECENT_DATA.path.toString()); + const browserLocalStorage = injector.get(GlobalBrowserStorageService); + const cache = browserLocalStorage.getData(STORAGE_NAMESPACE.GLOBAL_RECENT_DATA.path.toString()); expect(cache?.expires).toBeUndefined(); expect(cache?.recents).toBe(JSON.stringify(recents)); }); @@ -170,8 +170,8 @@ describe('StorageProvider should be work', () => { const test = ['test']; await extensionStorage.set('test', test); expect(extensionStorage.get('test')).toEqual(test); - const browserLocalStroage = injector.get(ScopedBrowserStorageService, [MockWorkspaceService.workspace.uri]); - const cache = browserLocalStroage.getData(customId.path.toString()); + const browserLocalStorage = injector.get(ScopedBrowserStorageService, [MockWorkspaceService.workspace.uri]); + const cache = browserLocalStorage.getData(customId.path.toString()); expect(cache?.expires).toBeUndefined(); expect(cache?.test).toBeUndefined(); }); diff --git a/packages/storage/src/browser/storage.ts b/packages/storage/src/browser/storage.ts index c2f20255e5..56ae214893 100644 --- a/packages/storage/src/browser/storage.ts +++ b/packages/storage/src/browser/storage.ts @@ -243,7 +243,7 @@ export class Storage implements IStorage { insert: this.mapToJson(this.pendingInserts), delete: Array.from(this.pendingDeletes), }; - // 同时在 LocalStroage 中同步缓存变化 + // 同时在 LocalStorage 中同步缓存变化 if (this.browserLocalStorage) { let cache = this.mapToJson(this.cache); for (const del of updateRequest?.delete || []) { diff --git a/packages/terminal-next/src/browser/terminal.restore.ts b/packages/terminal-next/src/browser/terminal.restore.ts index b56000e625..41ecd4020a 100644 --- a/packages/terminal-next/src/browser/terminal.restore.ts +++ b/packages/terminal-next/src/browser/terminal.restore.ts @@ -29,7 +29,7 @@ export class TerminalRestore extends Disposable implements ITerminalRestore { restore() { const key = this.storageKey; const history = this.scopedBrowserStorageService.getData(key); - // this.scopedBrowserStorageService.removeData(key); // 触发恢复之后清除掉缓存 + if (history) { try { return this.controller.recovery(history); diff --git a/packages/theme/src/browser/theme.contribution.ts b/packages/theme/src/browser/theme.contribution.ts index ee53ebfd20..28dffa6edd 100644 --- a/packages/theme/src/browser/theme.contribution.ts +++ b/packages/theme/src/browser/theme.contribution.ts @@ -6,6 +6,7 @@ import { CommandRegistry, Domain, GeneralSettingsId, + ILogger, Mode, PreferenceScope, PreferenceService, @@ -20,7 +21,6 @@ import { IMenuRegistry, MenuContribution, MenuId } from '@opensumi/ide-core-brow import { BuiltinTheme, BuiltinThemeComparator, - DEFAULT_PRODUCT_ICON_THEME_ID, DEFAULT_THEME_ID, IIconService, IProductIconService, @@ -66,6 +66,9 @@ export class ThemeContribution implements MenuContribution, CommandContribution, @Autowired(ISemanticTokenRegistry) protected readonly semanticTokenRegistry: ISemanticTokenRegistry; + @Autowired(ILogger) + protected readonly logger: ILogger; + async initialize() { this.registerDefaultColorTheme(); @@ -204,7 +207,7 @@ export class ThemeContribution implements MenuContribution, CommandContribution, const selector = this.semanticTokenRegistry.parseTokenSelector(selectorString); this.semanticTokenRegistry.registerTokenStyleDefault(selector, { scopesToProbe }); } catch (e) { - // ignore error + this.logger.error('Failed to register token style default', e); } } diff --git a/packages/theme/src/browser/workbench.theme.service.ts b/packages/theme/src/browser/workbench.theme.service.ts index f5ca53a173..7c795f9773 100644 --- a/packages/theme/src/browser/workbench.theme.service.ts +++ b/packages/theme/src/browser/workbench.theme.service.ts @@ -33,7 +33,6 @@ import { selectionBackground, } from '../common/color-registry'; import { ThemeChangedEvent } from '../common/event'; -import { getIconRegistry } from '../common/icon-registry'; import { ColorIdentifier, DEFAULT_THEME_ID, @@ -77,8 +76,6 @@ const tokenGroupToScopesMap = { export class WorkbenchThemeService extends WithEventBus implements IThemeService { private colorRegistry = getColorRegistry(); - private iconRegistry = getIconRegistry(); - private colorClassNameMap = new Map(); colorThemeLoaded: Deferred = new Deferred(); @@ -307,13 +304,14 @@ export class WorkbenchThemeService extends WithEventBus implements IThemeService } protected doSetPreferenceSchema() { + const enums = this.getAvailableThemeInfos().map((info) => info.themeId); this.preferenceSchemaProvider.setSchema( { properties: { [COLOR_THEME_SETTING]: { type: 'string', - default: 'Default Dark+', - enum: this.getAvailableThemeInfos().map((info) => info.themeId), + default: enums[0], + enum: enums, }, }, }, diff --git a/packages/theme/src/common/theme.service.ts b/packages/theme/src/common/theme.service.ts index c727385559..99dac17867 100644 --- a/packages/theme/src/common/theme.service.ts +++ b/packages/theme/src/common/theme.service.ts @@ -385,7 +385,7 @@ export function getThemeId(contribution: IThemeContribution) { function toCSSSelector(extensionId: string, path: string) { if (path.indexOf('./') === 0) { - path = path.substr(2); + path = path.substring(2); } let str = `${extensionId}-${path}`;