Skip to content

Commit 96bf637

Browse files
authored
Merge pull request microsoft#165831 from microsoft/alexd/inclined-panda
Always use app root for resource URIs (avoid usage of `require`)
2 parents 8fd500e + f46738b commit 96bf637

File tree

53 files changed

+176
-137
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+176
-137
lines changed

src/typings/require.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ interface NodeRequire {
4949
config(data: any): any;
5050
onError: Function;
5151
__$__nodeRequire<T>(moduleName: string): T;
52-
getStats(): ReadonlyArray<LoaderEvent>;
53-
hasDependencyCycle(): boolean;
52+
getStats?(): ReadonlyArray<LoaderEvent>;
53+
hasDependencyCycle?(): boolean;
5454
define(amdModuleId: string, dependencies: string[], callback: (...args: any[]) => any): any;
5555
}
5656

src/vs/base/browser/dom.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1199,7 +1199,7 @@ export function asCSSUrl(uri: URI | null | undefined): string {
11991199
if (!uri) {
12001200
return `url('')`;
12011201
}
1202-
return `url('${FileAccess.asBrowserUri(uri).toString(true).replace(/'/g, '%27')}')`;
1202+
return `url('${FileAccess.uriToBrowserUri(uri).toString(true).replace(/'/g, '%27')}')`;
12031203
}
12041204

12051205
export function asCSSPropertyValue(value: string) {

src/vs/base/browser/markdownRenderer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ export function renderMarkdown(markdown: IMarkdownString, options: MarkdownRende
126126
// and because of that special rewriting needs to be done
127127
// so that the URI uses a protocol that's understood by
128128
// browsers (like http or https)
129-
return FileAccess.asBrowserUri(uri).toString(true);
129+
return FileAccess.uriToBrowserUri(uri).toString(true);
130130
}
131131
if (!uri) {
132132
return href;

src/vs/base/common/amd.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,10 @@ export abstract class LoaderStats {
4040
map.set(stat.detail, duration + stat.timestamp);
4141
}
4242

43-
const stats = require.getStats().slice(0).sort((a, b) => a.timestamp - b.timestamp);
43+
let stats: readonly LoaderEvent[] = [];
44+
if (typeof require.getStats === 'function') {
45+
stats = require.getStats().slice(0).sort((a, b) => a.timestamp - b.timestamp);
46+
}
4447

4548
for (const stat of stats) {
4649
switch (stat.type) {

src/vs/base/common/network.ts

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,22 @@ class RemoteAuthoritiesImpl {
170170

171171
export const RemoteAuthorities = new RemoteAuthoritiesImpl();
172172

173+
/**
174+
* A string pointing to a path inside the app. It should not begin with ./ or ../
175+
*/
176+
export type AppResourcePath = (
177+
`a${string}` | `b${string}` | `c${string}` | `d${string}` | `e${string}` | `f${string}`
178+
| `g${string}` | `h${string}` | `i${string}` | `j${string}` | `k${string}` | `l${string}`
179+
| `m${string}` | `n${string}` | `o${string}` | `p${string}` | `q${string}` | `r${string}`
180+
| `s${string}` | `t${string}` | `u${string}` | `v${string}` | `w${string}` | `x${string}`
181+
| `y${string}` | `z${string}`
182+
);
183+
184+
export const builtinExtensionsPath: AppResourcePath = 'vs/../../extensions';
185+
export const nodeModulesPath: AppResourcePath = 'vs/../../node_modules';
186+
export const nodeModulesAsarPath: AppResourcePath = 'vs/../../node_modules.asar';
187+
export const nodeModulesAsarUnpackedPath: AppResourcePath = 'vs/../../node_modules.asar.unpacked';
188+
173189
class FileAccessImpl {
174190

175191
private static readonly FALLBACK_AUTHORITY = 'vscode-app';
@@ -180,11 +196,18 @@ class FileAccessImpl {
180196
*
181197
* **Note:** use `dom.ts#asCSSUrl` whenever the URL is to be used in CSS context.
182198
*/
183-
asBrowserUri(uri: URI): URI;
184-
asBrowserUri(moduleId: string, moduleIdToUrl: { toUrl(moduleId: string): string }): URI;
185-
asBrowserUri(uriOrModule: URI | string, moduleIdToUrl?: { toUrl(moduleId: string): string }): URI {
186-
const uri = this.toUri(uriOrModule, moduleIdToUrl);
199+
asBrowserUri(resourcePath: AppResourcePath | ''): URI {
200+
const uri = this.toUri(resourcePath, require);
201+
return this.uriToBrowserUri(uri);
202+
}
187203

204+
/**
205+
* Returns a URI to use in contexts where the browser is responsible
206+
* for loading (e.g. fetch()) or when used within the DOM.
207+
*
208+
* **Note:** use `dom.ts#asCSSUrl` whenever the URL is to be used in CSS context.
209+
*/
210+
uriToBrowserUri(uri: URI): URI {
188211
// Handle remote URIs via `RemoteAuthorities`
189212
if (uri.scheme === Schemas.vscodeRemote) {
190213
return RemoteAuthorities.rewrite(uri);
@@ -220,11 +243,16 @@ class FileAccessImpl {
220243
* Returns the `file` URI to use in contexts where node.js
221244
* is responsible for loading.
222245
*/
223-
asFileUri(uri: URI): URI;
224-
asFileUri(moduleId: string, moduleIdToUrl: { toUrl(moduleId: string): string }): URI;
225-
asFileUri(uriOrModule: URI | string, moduleIdToUrl?: { toUrl(moduleId: string): string }): URI {
226-
const uri = this.toUri(uriOrModule, moduleIdToUrl);
246+
asFileUri(resourcePath: AppResourcePath | ''): URI {
247+
const uri = this.toUri(resourcePath, require);
248+
return this.uriToFileUri(uri);
249+
}
227250

251+
/**
252+
* Returns the `file` URI to use in contexts where node.js
253+
* is responsible for loading.
254+
*/
255+
uriToFileUri(uri: URI): URI {
228256
// Only convert the URI if it is `vscode-file:` scheme
229257
if (uri.scheme === Schemas.vscodeFileResource) {
230258
return uri.with({
@@ -241,12 +269,12 @@ class FileAccessImpl {
241269
return uri;
242270
}
243271

244-
private toUri(uriOrModule: URI | string, moduleIdToUrl?: { toUrl(moduleId: string): string }): URI {
272+
private toUri(uriOrModule: URI | string, moduleIdToUrl: { toUrl(moduleId: string): string }): URI {
245273
if (URI.isUri(uriOrModule)) {
246274
return uriOrModule;
247275
}
248276

249-
return URI.parse(moduleIdToUrl!.toUrl(uriOrModule));
277+
return URI.parse(moduleIdToUrl.toUrl(uriOrModule));
250278
}
251279
}
252280

src/vs/base/node/ps.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ export function listProcesses(rootPid: number): Promise<ProcessItem> {
198198
// The cpu usage value reported on Linux is the average over the process lifetime,
199199
// recalculate the usage over a one second interval
200200
// JSON.stringify is needed to escape spaces, https://github.com/nodejs/node/issues/6803
201-
let cmd = JSON.stringify(FileAccess.asFileUri('vs/base/node/cpuUsage.sh', require).fsPath);
201+
let cmd = JSON.stringify(FileAccess.asFileUri('vs/base/node/cpuUsage.sh').fsPath);
202202
cmd += ' ' + pids.join(' ');
203203

204204
exec(cmd, {}, (err, stdout, stderr) => {
@@ -226,7 +226,7 @@ export function listProcesses(rootPid: number): Promise<ProcessItem> {
226226
if (process.platform !== 'linux') {
227227
reject(err || new Error(stderr.toString()));
228228
} else {
229-
const cmd = JSON.stringify(FileAccess.asFileUri('vs/base/node/ps.sh', require).fsPath);
229+
const cmd = JSON.stringify(FileAccess.asFileUri('vs/base/node/ps.sh').fsPath);
230230
exec(cmd, {}, (err, stdout, stderr) => {
231231
if (err || stderr) {
232232
reject(err || new Error(stderr.toString()));

src/vs/base/test/common/network.test.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,55 +15,55 @@ suite('network', () => {
1515

1616
// asCodeUri() & asFileUri(): simple, without authority
1717
let originalFileUri = URI.file('network.test.ts');
18-
let browserUri = FileAccess.asBrowserUri(originalFileUri);
18+
let browserUri = FileAccess.uriToBrowserUri(originalFileUri);
1919
assert.ok(browserUri.authority.length > 0);
20-
let fileUri = FileAccess.asFileUri(browserUri);
20+
let fileUri = FileAccess.uriToFileUri(browserUri);
2121
assert.strictEqual(fileUri.authority.length, 0);
2222
assert(isEqual(originalFileUri, fileUri));
2323

2424
// asCodeUri() & asFileUri(): with authority
2525
originalFileUri = URI.file('network.test.ts').with({ authority: 'test-authority' });
26-
browserUri = FileAccess.asBrowserUri(originalFileUri);
26+
browserUri = FileAccess.uriToBrowserUri(originalFileUri);
2727
assert.strictEqual(browserUri.authority, originalFileUri.authority);
28-
fileUri = FileAccess.asFileUri(browserUri);
28+
fileUri = FileAccess.uriToFileUri(browserUri);
2929
assert(isEqual(originalFileUri, fileUri));
3030
});
3131

3232
(isWeb ? test.skip : test)('FileAccess: moduleId (native)', () => {
33-
const browserUri = FileAccess.asBrowserUri('vs/base/test/node/network.test', require);
33+
const browserUri = FileAccess.asBrowserUri('vs/base/test/node/network.test');
3434
assert.strictEqual(browserUri.scheme, Schemas.vscodeFileResource);
3535

36-
const fileUri = FileAccess.asFileUri('vs/base/test/node/network.test', require);
36+
const fileUri = FileAccess.asFileUri('vs/base/test/node/network.test');
3737
assert.strictEqual(fileUri.scheme, Schemas.file);
3838
});
3939

4040
(isWeb ? test.skip : test)('FileAccess: query and fragment is dropped (native)', () => {
4141
const originalFileUri = URI.file('network.test.ts').with({ query: 'foo=bar', fragment: 'something' });
42-
const browserUri = FileAccess.asBrowserUri(originalFileUri);
42+
const browserUri = FileAccess.uriToBrowserUri(originalFileUri);
4343
assert.strictEqual(browserUri.query, '');
4444
assert.strictEqual(browserUri.fragment, '');
4545
});
4646

4747
(isWeb ? test.skip : test)('FileAccess: query and fragment is kept if URI is already of same scheme (native)', () => {
4848
const originalFileUri = URI.file('network.test.ts').with({ query: 'foo=bar', fragment: 'something' });
49-
const browserUri = FileAccess.asBrowserUri(originalFileUri.with({ scheme: Schemas.vscodeFileResource }));
49+
const browserUri = FileAccess.uriToBrowserUri(originalFileUri.with({ scheme: Schemas.vscodeFileResource }));
5050
assert.strictEqual(browserUri.query, 'foo=bar');
5151
assert.strictEqual(browserUri.fragment, 'something');
5252

53-
const fileUri = FileAccess.asFileUri(originalFileUri);
53+
const fileUri = FileAccess.uriToFileUri(originalFileUri);
5454
assert.strictEqual(fileUri.query, 'foo=bar');
5555
assert.strictEqual(fileUri.fragment, 'something');
5656
});
5757

5858
(isWeb ? test.skip : test)('FileAccess: web', () => {
5959
const originalHttpsUri = URI.file('network.test.ts').with({ scheme: 'https' });
60-
const browserUri = FileAccess.asBrowserUri(originalHttpsUri);
60+
const browserUri = FileAccess.uriToBrowserUri(originalHttpsUri);
6161
assert.strictEqual(originalHttpsUri.toString(), browserUri.toString());
6262
});
6363

6464
test('FileAccess: remote URIs', () => {
6565
const originalRemoteUri = URI.file('network.test.ts').with({ scheme: Schemas.vscodeRemote });
66-
const browserUri = FileAccess.asBrowserUri(originalRemoteUri);
66+
const browserUri = FileAccess.uriToBrowserUri(originalRemoteUri);
6767
assert.notStrictEqual(originalRemoteUri.scheme, browserUri.scheme);
6868
});
6969
});

src/vs/code/node/cli.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@ export async function main(argv: string[]): Promise<any> {
496496
}
497497

498498
function getAppRoot() {
499-
return dirname(FileAccess.asFileUri('', require).fsPath);
499+
return dirname(FileAccess.asFileUri('').fsPath);
500500
}
501501

502502
function eventuallyExit(code: number): void {

src/vs/platform/environment/common/environmentService.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export abstract class AbstractNativeEnvironmentService implements INativeEnviron
4444
declare readonly _serviceBrand: undefined;
4545

4646
@memoize
47-
get appRoot(): string { return dirname(FileAccess.asFileUri('', require).fsPath); }
47+
get appRoot(): string { return dirname(FileAccess.asFileUri('').fsPath); }
4848

4949
@memoize
5050
get userHome(): URI { return URI.file(this.paths.homeDir); }
@@ -129,7 +129,7 @@ export abstract class AbstractNativeEnvironmentService implements INativeEnviron
129129
return resolve(cliBuiltinExtensionsDir);
130130
}
131131

132-
return normalize(join(FileAccess.asFileUri('', require).fsPath, '..', 'extensions'));
132+
return normalize(join(FileAccess.asFileUri('').fsPath, '..', 'extensions'));
133133
}
134134

135135
get extensionsDownloadLocation(): URI {

src/vs/platform/extensionManagement/common/extensionsScannerService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ export abstract class AbstractExtensionsScannerService extends Disposable implem
355355
this.logService.trace('Started scanning dev system extensions');
356356
const builtinExtensionControl = checkControlFile ? await this.getBuiltInExtensionControl() : {};
357357
const devSystemExtensionsLocations: URI[] = [];
358-
const devSystemExtensionsLocation = URI.file(path.normalize(path.join(FileAccess.asFileUri('', require).fsPath, '..', '.build', 'builtInExtensions')));
358+
const devSystemExtensionsLocation = URI.file(path.normalize(path.join(FileAccess.asFileUri('').fsPath, '..', '.build', 'builtInExtensions')));
359359
for (const extension of devSystemExtensionsList) {
360360
const controlState = builtinExtensionControl[extension.name] || 'marketplace';
361361
switch (controlState) {

0 commit comments

Comments
 (0)