blob: 60ded3cb88f977d56f9510eb9237987ceff3f588 [file] [log] [blame]
// Copyright 2022 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import * as Common from '../core/common/common.js';
import * as Platform from '../core/platform/platform.js';
import * as SDK from '../core/sdk/sdk.js';
import type * as Protocol from '../generated/protocol.js';
import * as Bindings from '../models/bindings/bindings.js';
import * as Persistence from '../models/persistence/persistence.js';
import * as TextUtils from '../models/text_utils/text_utils.js';
import * as Workspace from '../models/workspace/workspace.js';
const {urlString} = Platform.DevToolsPath;
export function createContentProviderUISourceCodes(options: {
items: Array<{
url: Platform.DevToolsPath.UrlString,
content?: string, mimeType: string,
resourceType?: Common.ResourceType.ResourceType,
metadata?: Workspace.UISourceCode.UISourceCodeMetadata,
}>,
projectType?: Workspace.Workspace.projectTypes,
projectId?: string,
target?: SDK.Target.Target,
}): {
project: Bindings.ContentProviderBasedProject.ContentProviderBasedProject,
uiSourceCodes: Workspace.UISourceCode.UISourceCode[],
} {
const workspace = Workspace.Workspace.WorkspaceImpl.instance();
const projectType = options.projectType || Workspace.Workspace.projectTypes.Formatter;
assert.notEqual(
projectType, Workspace.Workspace.projectTypes.FileSystem,
'For creating file system UISourceCodes use \'createFileSystemUISourceCode\' helper.');
const project = new Bindings.ContentProviderBasedProject.ContentProviderBasedProject(
workspace, options.projectId || 'PROJECT_ID', projectType, 'Test project', false /* isServiceProject*/);
if (options.target) {
Bindings.NetworkProject.NetworkProject.setTargetForProject(project, options.target);
}
const uiSourceCodes: Workspace.UISourceCode.UISourceCode[] = [];
for (const item of options.items) {
const resourceType = item.resourceType || Common.ResourceType.ResourceType.fromMimeType(item.mimeType);
const uiSourceCode = project.createUISourceCode(item.url, resourceType);
const contentProvider =
TextUtils.StaticContentProvider.StaticContentProvider.fromString(item.url, resourceType, item.content || '');
const metadata = item.metadata || new Workspace.UISourceCode.UISourceCodeMetadata(null, null);
project.addUISourceCodeWithProvider(uiSourceCode, contentProvider, metadata, item.mimeType);
uiSourceCodes.push(uiSourceCode);
}
return {project, uiSourceCodes};
}
export function createContentProviderUISourceCode(options: {
url: Platform.DevToolsPath.UrlString,
content?: string, mimeType: string,
projectType?: Workspace.Workspace.projectTypes,
projectId?: string,
metadata?: Workspace.UISourceCode.UISourceCodeMetadata,
target?: SDK.Target.Target,
}): {
project: Bindings.ContentProviderBasedProject.ContentProviderBasedProject,
uiSourceCode: Workspace.UISourceCode.UISourceCode,
} {
const {url, content, mimeType, metadata, projectType, projectId, target} = options;
const {project, uiSourceCodes} =
createContentProviderUISourceCodes({items: [{url, content, mimeType, metadata}], projectType, projectId, target});
return {project, uiSourceCode: uiSourceCodes[0]};
}
class TestPlatformFileSystem extends Persistence.PlatformFileSystem.PlatformFileSystem {
readonly #mimeType: string;
readonly #autoMapping: boolean;
constructor(
path: Platform.DevToolsPath.UrlString, type: Persistence.PlatformFileSystem.PlatformFileSystemType,
mimeType: string, autoMapping: boolean) {
super(path, type, false);
this.#mimeType = mimeType;
this.#autoMapping = autoMapping;
}
override tooltipForURL(_url: Platform.DevToolsPath.UrlString): string {
return 'tooltip-for-url';
}
override supportsAutomapping(): boolean {
return this.#autoMapping;
}
override mimeFromPath(_path: Platform.DevToolsPath.UrlString): string {
return this.#mimeType;
}
}
class TestFileSystem extends Persistence.FileSystemWorkspaceBinding.FileSystem {
readonly #content: string;
readonly #metadata: Workspace.UISourceCode.UISourceCodeMetadata;
constructor(options: {
fileSystemWorkspaceBinding: Persistence.FileSystemWorkspaceBinding.FileSystemWorkspaceBinding,
platformFileSystem: Persistence.PlatformFileSystem.PlatformFileSystem,
workspace: Workspace.Workspace.WorkspaceImpl,
content: string,
metadata: Workspace.UISourceCode.UISourceCodeMetadata,
}) {
super(options.fileSystemWorkspaceBinding, options.platformFileSystem, options.workspace);
this.#content = options.content;
this.#metadata = options.metadata;
}
override requestFileContent(_uiSourceCode: Workspace.UISourceCode.UISourceCode):
Promise<TextUtils.ContentData.ContentDataOrError> {
return Promise.resolve(new TextUtils.ContentData.ContentData(this.#content, /* isBase64 */ false, 'text/plain'));
}
override requestMetadata(_uiSourceCode: Workspace.UISourceCode.UISourceCode):
Promise<Workspace.UISourceCode.UISourceCodeMetadata|null> {
return Promise.resolve(this.#metadata);
}
}
export function createFileSystemUISourceCode(options: {
url: Platform.DevToolsPath.UrlString,
mimeType: string,
content?: string,
fileSystemPath?: string,
autoMapping?: boolean,
type?: Persistence.PlatformFileSystem.PlatformFileSystemType,
metadata?: Workspace.UISourceCode.UISourceCodeMetadata,
}): {uiSourceCode: Workspace.UISourceCode.UISourceCode, project: Persistence.FileSystemWorkspaceBinding.FileSystem} {
const workspace = Workspace.Workspace.WorkspaceImpl.instance();
const isolatedFileSystemManager = Persistence.IsolatedFileSystemManager.IsolatedFileSystemManager.instance();
const fileSystemWorkspaceBinding =
new Persistence.FileSystemWorkspaceBinding.FileSystemWorkspaceBinding(isolatedFileSystemManager, workspace);
const fileSystemPath = urlString`${options.fileSystemPath || ''}`;
const type = options.type || '';
const content = options.content || '';
const platformFileSystem = new TestPlatformFileSystem(
fileSystemPath, type || Persistence.PlatformFileSystem.PlatformFileSystemType.WORKSPACE_PROJECT, options.mimeType,
Boolean(options.autoMapping));
const metadata = options.metadata || new Workspace.UISourceCode.UISourceCodeMetadata(null, null);
const project = new TestFileSystem({fileSystemWorkspaceBinding, platformFileSystem, workspace, content, metadata});
const uiSourceCode =
project.createUISourceCode(options.url, Common.ResourceType.ResourceType.fromMimeType(options.mimeType));
project.addUISourceCode(uiSourceCode);
return {uiSourceCode, project};
}
export function setupMockedUISourceCode(url = 'https://example.com/') {
const projectStub = sinon.createStubInstance(Bindings.ContentProviderBasedProject.ContentProviderBasedProject);
const urlStringTagExample = urlString`${url}`;
const contentTypeStub = sinon.createStubInstance(Common.ResourceType.ResourceType);
const uiSourceCode = new Workspace.UISourceCode.UISourceCode(projectStub, urlStringTagExample, contentTypeStub);
return {sut: uiSourceCode, projectStub, contentTypeStub};
}
export function createFakeScriptMapping(
debuggerModel: SDK.DebuggerModel.DebuggerModel, uiSourceCode: Workspace.UISourceCode.UISourceCode,
uiLineNumber: number,
scriptId: Protocol.Runtime.ScriptId): Bindings.DebuggerWorkspaceBinding.DebuggerSourceMapping {
const sdkLocation = new SDK.DebuggerModel.Location(debuggerModel, scriptId, 13);
const uiLocation = new Workspace.UISourceCode.UILocation(uiSourceCode, uiLineNumber);
const mapping: Bindings.DebuggerWorkspaceBinding.DebuggerSourceMapping = {
rawLocationToUILocation: (_: SDK.DebuggerModel.Location) => uiLocation,
uiLocationToRawLocations:
(_uiSourceCode: Workspace.UISourceCode.UISourceCode, _lineNumber: number,
_columnNumber?: number) => [sdkLocation],
uiLocationRangeToRawLocationRanges:
(_uiSourceCode: Workspace.UISourceCode.UISourceCode, _textRange: TextUtils.TextRange.TextRange) => {
throw new Error('Not implemented');
},
};
return mapping;
}