mirror of
https://github.com/react/react-native-devtools-frontend.git
synced 2026-09-29 05:34:21 +08:00
Fixed: 405095525 Change-Id: I547dc6bb01c06a77147c2967fae1230dcb42a2eb Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6376066 Reviewed-by: Simon Zünd <szuend@chromium.org> Auto-Submit: Ergün Erdoğmuş <ergunsh@chromium.org> Commit-Queue: Simon Zünd <szuend@chromium.org>
176 lines
8.0 KiB
TypeScript
176 lines
8.0 KiB
TypeScript
// 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;
|
|
}
|