155 lines
5.7 KiB
JavaScript
155 lines
5.7 KiB
JavaScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
import * as platform from './platform.js';
|
|
import { URI } from './uri.js';
|
|
export var Schemas;
|
|
(function (Schemas) {
|
|
/**
|
|
* A schema that is used for models that exist in memory
|
|
* only and that have no correspondence on a server or such.
|
|
*/
|
|
Schemas.inMemory = 'inmemory';
|
|
/**
|
|
* A schema that is used for setting files
|
|
*/
|
|
Schemas.vscode = 'vscode';
|
|
/**
|
|
* A schema that is used for internal private files
|
|
*/
|
|
Schemas.internal = 'private';
|
|
/**
|
|
* A walk-through document.
|
|
*/
|
|
Schemas.walkThrough = 'walkThrough';
|
|
/**
|
|
* An embedded code snippet.
|
|
*/
|
|
Schemas.walkThroughSnippet = 'walkThroughSnippet';
|
|
Schemas.http = 'http';
|
|
Schemas.https = 'https';
|
|
Schemas.file = 'file';
|
|
Schemas.mailto = 'mailto';
|
|
Schemas.untitled = 'untitled';
|
|
Schemas.data = 'data';
|
|
Schemas.command = 'command';
|
|
Schemas.vscodeRemote = 'vscode-remote';
|
|
Schemas.vscodeRemoteResource = 'vscode-remote-resource';
|
|
Schemas.vscodeUserData = 'vscode-userdata';
|
|
Schemas.vscodeCustomEditor = 'vscode-custom-editor';
|
|
Schemas.vscodeNotebook = 'vscode-notebook';
|
|
Schemas.vscodeNotebookCell = 'vscode-notebook-cell';
|
|
Schemas.vscodeNotebookCellMetadata = 'vscode-notebook-cell-metadata';
|
|
Schemas.vscodeNotebookCellOutput = 'vscode-notebook-cell-output';
|
|
Schemas.vscodeInteractive = 'vscode-interactive';
|
|
Schemas.vscodeInteractiveInput = 'vscode-interactive-input';
|
|
Schemas.vscodeSettings = 'vscode-settings';
|
|
Schemas.vscodeWorkspaceTrust = 'vscode-workspace-trust';
|
|
Schemas.vscodeTerminal = 'vscode-terminal';
|
|
/**
|
|
* Scheme used internally for webviews that aren't linked to a resource (i.e. not custom editors)
|
|
*/
|
|
Schemas.webviewPanel = 'webview-panel';
|
|
/**
|
|
* Scheme used for loading the wrapper html and script in webviews.
|
|
*/
|
|
Schemas.vscodeWebview = 'vscode-webview';
|
|
/**
|
|
* Scheme used for extension pages
|
|
*/
|
|
Schemas.extension = 'extension';
|
|
/**
|
|
* Scheme used as a replacement of `file` scheme to load
|
|
* files with our custom protocol handler (desktop only).
|
|
*/
|
|
Schemas.vscodeFileResource = 'vscode-file';
|
|
/**
|
|
* Scheme used for temporary resources
|
|
*/
|
|
Schemas.tmp = 'tmp';
|
|
/**
|
|
* Scheme used vs live share
|
|
*/
|
|
Schemas.vsls = 'vsls';
|
|
/**
|
|
* Scheme used for the Source Control commit input's text document
|
|
*/
|
|
Schemas.vscodeSourceControl = 'vscode-scm';
|
|
})(Schemas || (Schemas = {}));
|
|
export const connectionTokenQueryName = 'tkn';
|
|
class RemoteAuthoritiesImpl {
|
|
constructor() {
|
|
this._hosts = Object.create(null);
|
|
this._ports = Object.create(null);
|
|
this._connectionTokens = Object.create(null);
|
|
this._preferredWebSchema = 'http';
|
|
this._delegate = null;
|
|
this._remoteResourcesPath = `/${Schemas.vscodeRemoteResource}`;
|
|
}
|
|
setPreferredWebSchema(schema) {
|
|
this._preferredWebSchema = schema;
|
|
}
|
|
rewrite(uri) {
|
|
if (this._delegate) {
|
|
return this._delegate(uri);
|
|
}
|
|
const authority = uri.authority;
|
|
let host = this._hosts[authority];
|
|
if (host && host.indexOf(':') !== -1) {
|
|
host = `[${host}]`;
|
|
}
|
|
const port = this._ports[authority];
|
|
const connectionToken = this._connectionTokens[authority];
|
|
let query = `path=${encodeURIComponent(uri.path)}`;
|
|
if (typeof connectionToken === 'string') {
|
|
query += `&${connectionTokenQueryName}=${encodeURIComponent(connectionToken)}`;
|
|
}
|
|
return URI.from({
|
|
scheme: platform.isWeb ? this._preferredWebSchema : Schemas.vscodeRemoteResource,
|
|
authority: `${host}:${port}`,
|
|
path: this._remoteResourcesPath,
|
|
query
|
|
});
|
|
}
|
|
}
|
|
export const RemoteAuthorities = new RemoteAuthoritiesImpl();
|
|
class FileAccessImpl {
|
|
asBrowserUri(uriOrModule, moduleIdToUrl) {
|
|
const uri = this.toUri(uriOrModule, moduleIdToUrl);
|
|
// Handle remote URIs via `RemoteAuthorities`
|
|
if (uri.scheme === Schemas.vscodeRemote) {
|
|
return RemoteAuthorities.rewrite(uri);
|
|
}
|
|
// Convert to `vscode-file` resource..
|
|
if (
|
|
// ...only ever for `file` resources
|
|
uri.scheme === Schemas.file &&
|
|
(
|
|
// ...and we run in native environments
|
|
platform.isNative ||
|
|
// ...or web worker extensions on desktop
|
|
(platform.isWebWorker && platform.globals.origin === `${Schemas.vscodeFileResource}://${FileAccessImpl.FALLBACK_AUTHORITY}`))) {
|
|
return uri.with({
|
|
scheme: Schemas.vscodeFileResource,
|
|
// We need to provide an authority here so that it can serve
|
|
// as origin for network and loading matters in chromium.
|
|
// If the URI is not coming with an authority already, we
|
|
// add our own
|
|
authority: uri.authority || FileAccessImpl.FALLBACK_AUTHORITY,
|
|
query: null,
|
|
fragment: null
|
|
});
|
|
}
|
|
return uri;
|
|
}
|
|
toUri(uriOrModule, moduleIdToUrl) {
|
|
if (URI.isUri(uriOrModule)) {
|
|
return uriOrModule;
|
|
}
|
|
return URI.parse(moduleIdToUrl.toUrl(uriOrModule));
|
|
}
|
|
}
|
|
FileAccessImpl.FALLBACK_AUTHORITY = 'vscode-app';
|
|
export const FileAccess = new FileAccessImpl();
|