diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 06ce9b9d2f09fc5a7a03c8813647e5e122eba18e..374f053e2595a9148f677d061a227c98c2e42542 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -54,9 +54,9 @@ import { getMachineId } from 'vs/base/node/id'; import { Win32UpdateService } from 'vs/platform/update/electron-main/updateService.win32'; import { LinuxUpdateService } from 'vs/platform/update/electron-main/updateService.linux'; import { DarwinUpdateService } from 'vs/platform/update/electron-main/updateService.darwin'; -import { IIssueService } from 'vs/platform/issue/common/issue'; +import { IRawIssueService } from 'vs/platform/issue/common/issue'; import { IssueChannel } from 'vs/platform/issue/common/issueIpc'; -import { IssueService } from 'vs/platform/issue/electron-main/issueService'; +import { RawIssueService } from 'vs/platform/issue/electron-main/rawIssueService'; import { LogLevelSetterChannel } from 'vs/platform/log/common/logIpc'; export class CodeApplication { @@ -321,7 +321,7 @@ export class CodeApplication { services.set(IWindowsMainService, new SyncDescriptor(WindowsManager, machineId)); services.set(IWindowsService, new SyncDescriptor(WindowsService, this.sharedProcess)); services.set(ILaunchService, new SyncDescriptor(LaunchService)); - services.set(IIssueService, new SyncDescriptor(IssueService, machineId)); + services.set(IRawIssueService, new SyncDescriptor(RawIssueService, machineId)); // Telemtry if (this.environmentService.isBuilt && !this.environmentService.isExtensionDevelopment && !this.environmentService.args['disable-telemetry'] && !!product.enableTelemetry) { @@ -366,7 +366,7 @@ export class CodeApplication { const urlChannel = appInstantiationService.createInstance(URLChannel, urlService); this.electronIpcServer.registerChannel('url', urlChannel); - const issueService = accessor.get(IIssueService); + const issueService = accessor.get(IRawIssueService); const issueChannel = new IssueChannel(issueService); this.electronIpcServer.registerChannel('issue', issueChannel); diff --git a/src/vs/platform/issue/common/issue.ts b/src/vs/platform/issue/common/issue.ts index 4d171950708c08a70d7ae060e25472e38c13917a..bcc5dd91305cf4952bbb95b4fdd1b0c4242bee7f 100644 --- a/src/vs/platform/issue/common/issue.ts +++ b/src/vs/platform/issue/common/issue.ts @@ -9,8 +9,8 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ILocalExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; -export const ID = 'issueService'; -export const IIssueService = createDecorator(ID); +export const IIssueService = createDecorator('issueService'); +export const IRawIssueService = createDecorator('rawIssueService'); export enum IssueType { Bug, @@ -57,6 +57,11 @@ export interface ISettingsSearchIssueReporterData extends IssueReporterData { } export interface IIssueService { + _serviceBrand: any; + openReporter(dataOverrides: Partial): TPromise; +} + +export interface IRawIssueService { _serviceBrand: any; openReporter(data: IssueReporterData): TPromise; -} \ No newline at end of file +} diff --git a/src/vs/platform/issue/common/issueIpc.ts b/src/vs/platform/issue/common/issueIpc.ts index 99d73534b5ed94685df395f29c2c944456111cb7..b0eb96de46925d5c36935a3a0cc250f6d51b0964 100644 --- a/src/vs/platform/issue/common/issueIpc.ts +++ b/src/vs/platform/issue/common/issueIpc.ts @@ -7,7 +7,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IChannel } from 'vs/base/parts/ipc/common/ipc'; -import { IIssueService, IssueReporterData } from './issue'; +import { IRawIssueService, IssueReporterData } from './issue'; export interface IIssueChannel extends IChannel { call(command: 'openIssueReporter', arg: IssueReporterData): TPromise; @@ -17,7 +17,7 @@ export interface IIssueChannel extends IChannel { export class IssueChannel implements IIssueChannel { - constructor(private service: IIssueService) { } + constructor(private service: IRawIssueService) { } call(command: string, arg?: any): TPromise { switch (command) { @@ -28,7 +28,7 @@ export class IssueChannel implements IIssueChannel { } } -export class IssueChannelClient implements IIssueService { +export class IssueChannelClient implements IRawIssueService { _serviceBrand: any; diff --git a/src/vs/platform/issue/electron-browser/issueService.ts b/src/vs/platform/issue/electron-browser/issueService.ts new file mode 100644 index 0000000000000000000000000000000000000000..ef8884cc6ff09fec3e0591f11517ddfc13b47b5f --- /dev/null +++ b/src/vs/platform/issue/electron-browser/issueService.ts @@ -0,0 +1,63 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { IIssueService, IssueReporterStyles, IRawIssueService, IssueReporterData } from 'vs/platform/issue/common/issue'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { ITheme, IThemeService } from 'vs/platform/theme/common/themeService'; +import { textLinkForeground, inputBackground, inputBorder, inputForeground, buttonBackground, buttonHoverBackground, buttonForeground, inputValidationErrorBorder, foreground, inputActiveOptionBorder, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground } from 'vs/platform/theme/common/colorRegistry'; +import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; +import { IExtensionManagementService, IExtensionEnablementService, LocalExtensionType } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { getGalleryExtensionIdFromLocal } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; +import { webFrame } from 'electron'; +import { assign } from 'vs/base/common/objects'; + +export class IssueService implements IIssueService { + _serviceBrand: any; + + constructor( + @IRawIssueService private issueService: IRawIssueService, + @IThemeService private themeService: IThemeService, + @IExtensionManagementService private extensionManagementService: IExtensionManagementService, + @IExtensionEnablementService private extensionEnablementService: IExtensionEnablementService + ) { + } + + openReporter(dataOverrides: Partial): TPromise { + return this.extensionManagementService.getInstalled(LocalExtensionType.User).then(extensions => { + const enabledExtensions = extensions.filter(extension => this.extensionEnablementService.isEnabled({ id: getGalleryExtensionIdFromLocal(extension) })); + const theme = this.themeService.getTheme(); + const issueReporterData: IssueReporterData = assign( + { + styles: getIssueReporterStyles(theme), + zoomLevel: webFrame.getZoomLevel(), + enabledExtensions + }, + dataOverrides); + + return this.issueService.openReporter(issueReporterData); + }); + } +} + +export function getIssueReporterStyles(theme: ITheme): IssueReporterStyles { + return { + backgroundColor: theme.getColor(SIDE_BAR_BACKGROUND) && theme.getColor(SIDE_BAR_BACKGROUND).toString(), + color: theme.getColor(foreground).toString(), + textLinkColor: theme.getColor(textLinkForeground) && theme.getColor(textLinkForeground).toString(), + inputBackground: theme.getColor(inputBackground) && theme.getColor(inputBackground).toString(), + inputForeground: theme.getColor(inputForeground) && theme.getColor(inputForeground).toString(), + inputBorder: theme.getColor(inputBorder) && theme.getColor(inputBorder).toString(), + inputActiveBorder: theme.getColor(inputActiveOptionBorder) && theme.getColor(inputActiveOptionBorder).toString(), + inputErrorBorder: theme.getColor(inputValidationErrorBorder) && theme.getColor(inputValidationErrorBorder).toString(), + buttonBackground: theme.getColor(buttonBackground) && theme.getColor(buttonBackground).toString(), + buttonForeground: theme.getColor(buttonForeground) && theme.getColor(buttonForeground).toString(), + buttonHoverBackground: theme.getColor(buttonHoverBackground) && theme.getColor(buttonHoverBackground).toString(), + sliderActiveColor: theme.getColor(scrollbarSliderActiveBackground) && theme.getColor(scrollbarSliderActiveBackground).toString(), + sliderBackgroundColor: theme.getColor(scrollbarSliderBackground) && theme.getColor(scrollbarSliderBackground).toString(), + sliderHoverColor: theme.getColor(scrollbarSliderHoverBackground) && theme.getColor(scrollbarSliderHoverBackground).toString() + }; +} diff --git a/src/vs/platform/issue/electron-main/issueService.ts b/src/vs/platform/issue/electron-main/rawIssueService.ts similarity index 97% rename from src/vs/platform/issue/electron-main/issueService.ts rename to src/vs/platform/issue/electron-main/rawIssueService.ts index 13179eb7184140f169854f289e8f8782a785eeb2..32fd2c0adf58c9340b5991e0afe7aec6d1f1dfa5 100644 --- a/src/vs/platform/issue/electron-main/issueService.ts +++ b/src/vs/platform/issue/electron-main/rawIssueService.ts @@ -9,7 +9,7 @@ import { TPromise, Promise } from 'vs/base/common/winjs.base'; import { localize } from 'vs/nls'; import * as objects from 'vs/base/common/objects'; import { parseArgs } from 'vs/platform/environment/node/argv'; -import { IIssueService, IssueReporterData } from 'vs/platform/issue/common/issue'; +import { IRawIssueService, IssueReporterData } from 'vs/platform/issue/common/issue'; import { BrowserWindow, ipcMain, screen } from 'electron'; import { ILaunchService } from 'vs/code/electron-main/launch'; import { getPerformanceInfo, PerformanceInfo, getSystemInfo, SystemInfo } from 'vs/code/electron-main/diagnostics'; @@ -18,7 +18,7 @@ import { isMacintosh } from 'vs/base/common/platform'; const DEFAULT_BACKGROUND_COLOR = '#1E1E1E'; -export class IssueService implements IIssueService { +export class RawIssueService implements IRawIssueService { _serviceBrand: any; _issueWindow: BrowserWindow; _parentWindow: BrowserWindow; diff --git a/src/vs/workbench/electron-browser/actions.ts b/src/vs/workbench/electron-browser/actions.ts index 13e91f0442849de96ccd0da6fe1c5100a8a5198d..438dc7b1921dc17c1a4c91a5eec2e3a9ad71865e 100644 --- a/src/vs/workbench/electron-browser/actions.ts +++ b/src/vs/workbench/electron-browser/actions.ts @@ -44,7 +44,7 @@ import { FileKind } from 'vs/platform/files/common/files'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IExtensionService, ActivationTimes } from 'vs/platform/extensions/common/extensions'; import { getEntries } from 'vs/base/common/performance'; -import { IIssueService, IssueReporterData, IssueType, IssueReporterStyles } from 'vs/platform/issue/common/issue'; +import { IRawIssueService, IssueReporterData, IssueType, IssueReporterStyles } from 'vs/platform/issue/common/issue'; import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; import { textLinkForeground, inputBackground, inputBorder, inputForeground, buttonBackground, buttonHoverBackground, buttonForeground, inputValidationErrorBorder, foreground, inputActiveOptionBorder, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground } from 'vs/platform/theme/common/colorRegistry'; import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; @@ -895,7 +895,7 @@ export class OpenIssueReporterAction extends Action { constructor( id: string, label: string, - @IIssueService private issueService: IIssueService, + @IRawIssueService private issueService: IRawIssueService, @IThemeService private themeService: IThemeService, @IExtensionManagementService private extensionManagementService: IExtensionManagementService, @IExtensionEnablementService private extensionEnablementService: IExtensionEnablementService @@ -927,7 +927,7 @@ export class ReportPerformanceIssueUsingReporterAction extends Action { constructor( id: string, label: string, - @IIssueService private issueService: IIssueService, + @IRawIssueService private issueService: IRawIssueService, @IThemeService private themeService: IThemeService, @IExtensionManagementService private extensionManagementService: IExtensionManagementService, @IExtensionEnablementService private extensionEnablementService: IExtensionEnablementService diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index 6c93107c6ccb7e1568e8ff6a836071a868129a07..fd950254d0839075f7f45320cf4350c31eae333d 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -45,7 +45,7 @@ import { createSpdLogService } from 'vs/platform/log/node/spdlogService'; import fs = require('fs'); import { ConsoleLogService, MultiplexLogService, ILogService } from 'vs/platform/log/common/log'; import { IssueChannelClient } from 'vs/platform/issue/common/issueIpc'; -import { IIssueService } from 'vs/platform/issue/common/issue'; +import { IRawIssueService } from 'vs/platform/issue/common/issue'; import { LogLevelSetterChannelClient, FollowerLogService } from 'vs/platform/log/common/logIpc'; gracefulFs.gracefulify(fs); // enable gracefulFs @@ -219,7 +219,7 @@ function createMainProcessServices(mainProcessClient: ElectronIPCClient, configu serviceCollection.set(IURLService, new SyncDescriptor(URLChannelClient, urlChannel, configuration.windowId)); const issueChannel = mainProcessClient.getChannel('issue'); - serviceCollection.set(IIssueService, new SyncDescriptor(IssueChannelClient, issueChannel)); + serviceCollection.set(IRawIssueService, new SyncDescriptor(IssueChannelClient, issueChannel)); const workspacesChannel = mainProcessClient.getChannel('workspaces'); serviceCollection.set(IWorkspacesService, new WorkspacesChannelClient(workspacesChannel)); diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index dfce549450b22dce8aa152f4e2d38f9a79399195..707d789ad78aeef4cec20e4fc2aba0a091b62c56 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -92,6 +92,8 @@ import { stat } from 'fs'; import { join } from 'path'; import { ILocalizationsChannel, LocalizationsChannelClient } from 'vs/platform/localizations/common/localizationsIpc'; import { ILocalizationsService } from 'vs/platform/localizations/common/localizations'; +import { IIssueService } from 'vs/platform/issue/common/issue'; +import { IssueService } from 'vs/platform/issue/electron-browser/issueService'; /** * Services that we require for the Shell @@ -445,6 +447,8 @@ export class WorkbenchShell { serviceCollection.set(ISearchService, new SyncDescriptor(SearchService)); + serviceCollection.set(IIssueService, new SyncDescriptor(IssueService)); + serviceCollection.set(ICodeEditorService, new SyncDescriptor(CodeEditorServiceImpl)); serviceCollection.set(IIntegrityService, new SyncDescriptor(IntegrityServiceImpl)); diff --git a/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts b/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts index 648b0367d6dc010dcd20de22638c5ca7b15dc2d7..93100f06c867376b9849db1d1d063adc05c63967 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts @@ -36,11 +36,8 @@ import { ITextModel, IModelDeltaDecoration, TrackedRangeStickiness } from 'vs/ed import { CodeLensProviderRegistry, CodeLensProvider, ICodeLensSymbol } from 'vs/editor/common/modes'; import { CancellationToken } from 'vs/base/common/cancellation'; import { getDomNodePagePosition } from 'vs/base/browser/dom'; -import { IIssueService, IssueType, ISettingsSearchIssueReporterData, ISettingSearchResult } from 'vs/platform/issue/common/issue'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { IssueType, ISettingsSearchIssueReporterData, ISettingSearchResult, IIssueService } from 'vs/platform/issue/common/issue'; import { IExtensionManagementService, IExtensionEnablementService, LocalExtensionType, ILocalExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { getIssueReporterStyles } from 'vs/workbench/electron-browser/actions'; -import { webFrame } from 'electron'; export interface IPreferencesRenderer extends IDisposable { readonly preferencesModel: IPreferencesEditorModel; @@ -582,7 +579,6 @@ export class FeedbackWidgetRenderer extends Disposable { @IInstantiationService private instantiationService: IInstantiationService, @IIssueService private issueService: IIssueService, @IConfigurationService private configurationService: IConfigurationService, - @IThemeService private themeService: IThemeService, @IExtensionManagementService private extensionManagementService: IExtensionManagementService, @IExtensionEnablementService private extensionEnablementService: IExtensionEnablementService ) { @@ -619,7 +615,6 @@ export class FeedbackWidgetRenderer extends Disposable { const enabledExtensions = extensions .filter(extension => this.extensionEnablementService.isEnabled(extension.identifier)) .filter(ext => ext.manifest.contributes && ext.manifest.contributes.configuration); - const theme = this.themeService.getTheme(); const issueResults = Object.keys(results) .map(key => ({ @@ -631,9 +626,7 @@ export class FeedbackWidgetRenderer extends Disposable { })) .slice(0, 20); - const issueReporterData: ISettingsSearchIssueReporterData = { - styles: getIssueReporterStyles(theme), - zoomLevel: webFrame.getZoomLevel(), + const issueReporterData: Partial = { enabledExtensions, issueType: IssueType.SettingsSearchIssue, actualSearchResults: issueResults,