mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 10:58:30 -05:00
Merge from vscode a4177f50c475fc0fa278a78235e3bee9ffdec781 (#8649)
* Merge from vscode a4177f50c475fc0fa278a78235e3bee9ffdec781 * distro * fix tests
This commit is contained in:
@@ -17,9 +17,13 @@ import { ILogService } from 'vs/platform/log/common/log';
|
||||
import { IExtensionDescription } from 'vs/platform/extensions/common/extensions';
|
||||
import * as platform from 'vs/base/common/platform';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import { IExtensionHostStarter } from 'vs/workbench/services/extensions/common/extensions';
|
||||
import { IExtensionHostStarter, ExtensionHostLogFileName } from 'vs/workbench/services/extensions/common/extensions';
|
||||
import { IProductService } from 'vs/platform/product/common/productService';
|
||||
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
|
||||
import { joinPath } from 'vs/base/common/resources';
|
||||
import { Registry } from 'vs/platform/registry/common/platform';
|
||||
import { IOutputChannelRegistry, Extensions } from 'vs/workbench/services/output/common/output';
|
||||
import { localize } from 'vs/nls';
|
||||
|
||||
export class WebWorkerExtensionHostStarter implements IExtensionHostStarter {
|
||||
|
||||
@@ -30,6 +34,8 @@ export class WebWorkerExtensionHostStarter implements IExtensionHostStarter {
|
||||
private readonly _onDidExit = new Emitter<[number, string | null]>();
|
||||
readonly onExit: Event<[number, string | null]> = this._onDidExit.event;
|
||||
|
||||
private readonly _extensionHostLogFile: URI;
|
||||
|
||||
constructor(
|
||||
private readonly _autoStart: boolean,
|
||||
private readonly _extensions: Promise<IExtensionDescription[]>,
|
||||
@@ -41,7 +47,7 @@ export class WebWorkerExtensionHostStarter implements IExtensionHostStarter {
|
||||
@IWorkbenchEnvironmentService private readonly _environmentService: IWorkbenchEnvironmentService,
|
||||
@IProductService private readonly _productService: IProductService,
|
||||
) {
|
||||
|
||||
this._extensionHostLogFile = joinPath(this._extensionHostLogsLocation, `${ExtensionHostLogFileName}.log`);
|
||||
}
|
||||
|
||||
async start(): Promise<IMessagePassingProtocol> {
|
||||
@@ -90,6 +96,9 @@ export class WebWorkerExtensionHostStarter implements IExtensionHostStarter {
|
||||
protocol.send(VSBuffer.fromString(JSON.stringify(await this._createExtHostInitData())));
|
||||
await Event.toPromise(Event.filter(protocol.onMessage, msg => isMessageOfType(msg, MessageType.Initialized)));
|
||||
|
||||
// Register log channel for web worker exthost log
|
||||
Registry.as<IOutputChannelRegistry>(Extensions.OutputChannels).registerChannel({ id: 'webWorkerExtHostLog', label: localize('name', "Worker Extension Host"), file: this._extensionHostLogFile, log: true });
|
||||
|
||||
this._protocol = protocol;
|
||||
}
|
||||
return this._protocol;
|
||||
@@ -150,6 +159,7 @@ export class WebWorkerExtensionHostStarter implements IExtensionHostStarter {
|
||||
telemetryInfo,
|
||||
logLevel: this._logService.getLevel(),
|
||||
logsLocation: this._extensionHostLogsLocation,
|
||||
logFile: this._extensionHostLogFile,
|
||||
autoStart: this._autoStart,
|
||||
remote: {
|
||||
authority: this._environmentService.configuration.remoteAuthority,
|
||||
|
||||
@@ -141,6 +141,7 @@ export class ExtensionHostMain {
|
||||
initData.environment.globalStorageHome = URI.revive(rpcProtocol.transformIncomingURIs(initData.environment.globalStorageHome));
|
||||
initData.environment.userHome = URI.revive(rpcProtocol.transformIncomingURIs(initData.environment.userHome));
|
||||
initData.logsLocation = URI.revive(rpcProtocol.transformIncomingURIs(initData.logsLocation));
|
||||
initData.logFile = URI.revive(rpcProtocol.transformIncomingURIs(initData.logFile));
|
||||
initData.workspace = rpcProtocol.transformIncomingURIs(initData.workspace);
|
||||
return initData;
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ export function getExtensionKind(manifest: IExtensionManifest, productService: I
|
||||
// check product.json
|
||||
result = getProductExtensionKind(manifest, productService);
|
||||
if (typeof result !== 'undefined') {
|
||||
return toArray(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
// check the manifest itself
|
||||
@@ -88,10 +88,10 @@ function isUIExtensionPoint(extensionPoint: string): boolean {
|
||||
return _uiExtensionPoints.has(extensionPoint);
|
||||
}
|
||||
|
||||
let _productExtensionKindsMap: Map<string, ExtensionKind | ExtensionKind[]> | null = null;
|
||||
function getProductExtensionKind(manifest: IExtensionManifest, productService: IProductService): ExtensionKind | ExtensionKind[] | undefined {
|
||||
let _productExtensionKindsMap: Map<string, ExtensionKind[]> | null = null;
|
||||
function getProductExtensionKind(manifest: IExtensionManifest, productService: IProductService): ExtensionKind[] | undefined {
|
||||
if (_productExtensionKindsMap === null) {
|
||||
const productExtensionKindsMap = new Map<string, ExtensionKind | ExtensionKind[]>();
|
||||
const productExtensionKindsMap = new Map<string, ExtensionKind[]>();
|
||||
if (productService.extensionKind) {
|
||||
for (const id of Object.keys(productService.extensionKind)) {
|
||||
productExtensionKindsMap.set(ExtensionIdentifier.toKey(id), productService.extensionKind[id]);
|
||||
|
||||
@@ -13,7 +13,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
||||
import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace';
|
||||
import { IInitData, UIKind } from 'vs/workbench/api/common/extHost.protocol';
|
||||
import { MessageType, createMessageOfType, isMessageOfType } from 'vs/workbench/services/extensions/common/extensionHostProtocol';
|
||||
import { IExtensionHostStarter } from 'vs/workbench/services/extensions/common/extensions';
|
||||
import { IExtensionHostStarter, ExtensionHostLogFileName } from 'vs/workbench/services/extensions/common/extensions';
|
||||
import { parseExtensionDevOptions } from 'vs/workbench/services/extensions/common/extensionDevOptions';
|
||||
import { IRemoteAgentEnvironment } from 'vs/platform/remote/common/remoteAgentEnvironment';
|
||||
import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver';
|
||||
@@ -27,6 +27,11 @@ import { VSBuffer } from 'vs/base/common/buffer';
|
||||
import { IExtensionHostDebugService } from 'vs/platform/debug/common/extensionHostDebug';
|
||||
import { IProductService } from 'vs/platform/product/common/productService';
|
||||
import { ISignService } from 'vs/platform/sign/common/sign';
|
||||
import { joinPath } from 'vs/base/common/resources';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import { Registry } from 'vs/platform/registry/common/platform';
|
||||
import { IOutputChannelRegistry, Extensions } from 'vs/workbench/services/output/common/output';
|
||||
import { localize } from 'vs/nls';
|
||||
|
||||
export interface IInitDataProvider {
|
||||
readonly remoteAuthority: string;
|
||||
@@ -131,11 +136,16 @@ export class RemoteExtensionHostClient extends Disposable implements IExtensionH
|
||||
reject('timeout');
|
||||
}, 60 * 1000);
|
||||
|
||||
let logFile: URI;
|
||||
|
||||
const disposable = protocol.onMessage(msg => {
|
||||
|
||||
if (isMessageOfType(msg, MessageType.Ready)) {
|
||||
// 1) Extension Host is ready to receive messages, initialize it
|
||||
this._createExtHostInitData(isExtensionDevelopmentDebug).then(data => protocol.send(VSBuffer.fromString(JSON.stringify(data))));
|
||||
this._createExtHostInitData(isExtensionDevelopmentDebug).then(data => {
|
||||
logFile = data.logFile;
|
||||
protocol.send(VSBuffer.fromString(JSON.stringify(data)));
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -147,9 +157,13 @@ export class RemoteExtensionHostClient extends Disposable implements IExtensionH
|
||||
// stop listening for messages here
|
||||
disposable.dispose();
|
||||
|
||||
// Register log channel for remote exthost log
|
||||
Registry.as<IOutputChannelRegistry>(Extensions.OutputChannels).registerChannel({ id: 'remoteExtHostLog', label: localize('remote extension host Log', "Remote Extension Host"), file: logFile, log: true });
|
||||
|
||||
// release this promise
|
||||
this._protocol = protocol;
|
||||
resolve(protocol);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -215,6 +229,7 @@ export class RemoteExtensionHostClient extends Disposable implements IExtensionH
|
||||
telemetryInfo,
|
||||
logLevel: this._logService.getLevel(),
|
||||
logsLocation: remoteExtensionHostData.extensionHostLogsPath,
|
||||
logFile: joinPath(remoteExtensionHostData.extensionHostLogsPath, `${ExtensionHostLogFileName}.log`),
|
||||
autoStart: true,
|
||||
uiKind: platform.isWeb ? UIKind.Web : UIKind.Desktop
|
||||
};
|
||||
|
||||
@@ -36,9 +36,12 @@ import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'
|
||||
import { parseExtensionDevOptions } from '../common/extensionDevOptions';
|
||||
import { VSBuffer } from 'vs/base/common/buffer';
|
||||
import { IExtensionHostDebugService } from 'vs/platform/debug/common/extensionHostDebug';
|
||||
import { IExtensionHostStarter } from 'vs/workbench/services/extensions/common/extensions';
|
||||
import { IExtensionHostStarter, ExtensionHostLogFileName } from 'vs/workbench/services/extensions/common/extensions';
|
||||
import { isUntitledWorkspace } from 'vs/platform/workspaces/common/workspaces';
|
||||
import { IHostService } from 'vs/workbench/services/host/browser/host';
|
||||
import { joinPath } from 'vs/base/common/resources';
|
||||
import { Registry } from 'vs/platform/registry/common/platform';
|
||||
import { IOutputChannelRegistry, Extensions } from 'vs/workbench/services/output/common/output';
|
||||
|
||||
export class ExtensionHostProcessWorker implements IExtensionHostStarter {
|
||||
|
||||
@@ -65,6 +68,8 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter {
|
||||
private _extensionHostConnection: Socket | null;
|
||||
private _messageProtocol: Promise<PersistentProtocol> | null;
|
||||
|
||||
private readonly _extensionHostLogFile: URI;
|
||||
|
||||
constructor(
|
||||
private readonly _autoStart: boolean,
|
||||
private readonly _extensions: Promise<IExtensionDescription[]>,
|
||||
@@ -95,6 +100,8 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter {
|
||||
this._extensionHostConnection = null;
|
||||
this._messageProtocol = null;
|
||||
|
||||
this._extensionHostLogFile = joinPath(this._extensionHostLogsLocation, `${ExtensionHostLogFileName}.log`);
|
||||
|
||||
this._toDispose.add(this._onExit);
|
||||
this._toDispose.add(this._lifecycleService.onWillShutdown(e => this._onWillShutdown(e)));
|
||||
this._toDispose.add(this._lifecycleService.onShutdown(reason => this.terminate()));
|
||||
@@ -112,7 +119,7 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter {
|
||||
const globalExitListener = () => this.terminate();
|
||||
process.once('exit', globalExitListener);
|
||||
this._toDispose.add(toDisposable(() => {
|
||||
process.removeListener('exit', globalExitListener);
|
||||
process.removeListener('exit' as 'loaded', globalExitListener); // https://github.com/electron/electron/issues/21475
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -373,6 +380,9 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter {
|
||||
// stop listening for messages here
|
||||
disposable.dispose();
|
||||
|
||||
// Register log channel for exthost log
|
||||
Registry.as<IOutputChannelRegistry>(Extensions.OutputChannels).registerChannel({ id: 'extHostLog', label: nls.localize('extension host Log', "Extension Host"), file: this._extensionHostLogFile, log: true });
|
||||
|
||||
// release this promise
|
||||
resolve(protocol);
|
||||
return;
|
||||
@@ -425,6 +435,7 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter {
|
||||
telemetryInfo,
|
||||
logLevel: this._logService.getLevel(),
|
||||
logsLocation: this._extensionHostLogsLocation,
|
||||
logFile: this._extensionHostLogFile,
|
||||
autoStart: this._autoStart,
|
||||
uiKind: UIKind.Desktop
|
||||
};
|
||||
|
||||
@@ -10,6 +10,7 @@ import { IExtensionHostProfile, IExtensionService, ProfileSegmentId, ProfileSess
|
||||
import { IExtensionDescription } from 'vs/platform/extensions/common/extensions';
|
||||
import { withNullAsUndefined } from 'vs/base/common/types';
|
||||
import { Schemas } from 'vs/base/common/network';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
|
||||
export class ExtensionHostProfiler {
|
||||
|
||||
@@ -32,7 +33,7 @@ export class ExtensionHostProfiler {
|
||||
let searchTree = TernarySearchTree.forPaths<IExtensionDescription>();
|
||||
for (let extension of extensions) {
|
||||
if (extension.extensionLocation.scheme === Schemas.file) {
|
||||
searchTree.set(realpathSync(extension.extensionLocation.fsPath), extension);
|
||||
searchTree.set(URI.file(realpathSync(extension.extensionLocation.fsPath)).toString(), extension);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,7 +60,12 @@ export class ExtensionHostProfiler {
|
||||
break;
|
||||
}
|
||||
} else if (segmentId === 'self' && node.callFrame.url) {
|
||||
let extension = searchTree.findSubstr(node.callFrame.url);
|
||||
let extension: IExtensionDescription | undefined;
|
||||
try {
|
||||
extension = searchTree.findSubstr(URI.parse(node.callFrame.url).toString());
|
||||
} catch {
|
||||
// ignore
|
||||
}
|
||||
if (extension) {
|
||||
segmentId = extension.identifier.value;
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ import { ExtHostExtensionService } from 'vs/workbench/api/worker/extHostExtensio
|
||||
import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { ILogService } from 'vs/platform/log/common/log';
|
||||
import { ExtHostLogService } from 'vs/workbench/api/worker/extHostLogService';
|
||||
import { IExtHostTunnelService, ExtHostTunnelService } from 'vs/workbench/api/common/extHostTunnelService';
|
||||
|
||||
// register singleton services
|
||||
registerSingleton(ILogService, ExtHostLogService);
|
||||
@@ -33,6 +34,7 @@ registerSingleton(IExtHostDocumentsAndEditors, ExtHostDocumentsAndEditors);
|
||||
registerSingleton(IExtHostStorage, ExtHostStorage);
|
||||
registerSingleton(IExtHostExtensionService, ExtHostExtensionService);
|
||||
registerSingleton(IExtHostSearch, ExtHostSearch);
|
||||
registerSingleton(IExtHostTunnelService, ExtHostTunnelService);
|
||||
|
||||
// register services that only throw errors
|
||||
function NotImplementedProxy<T>(name: ServiceIdentifier<T>): { new(): T } {
|
||||
|
||||
Reference in New Issue
Block a user