| // Copyright 2012 The Chromium Authors |
| // 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 Host from '../../core/host/host.js'; |
| import type * as Platform from '../../core/platform/platform.js'; |
| import type * as TextUtils from '../text_utils/text_utils.js'; |
| |
| let fileManagerInstance: FileManager|null; |
| |
| export interface SaveCallbackParam { |
| fileSystemPath?: Platform.DevToolsPath.RawPathString|Platform.DevToolsPath.UrlString; |
| } |
| |
| export class FileManager extends Common.ObjectWrapper.ObjectWrapper<EventTypes> { |
| readonly #saveCallbacks = new Map< |
| Platform.DevToolsPath.RawPathString|Platform.DevToolsPath.UrlString, (arg0: SaveCallbackParam|null) => void>(); |
| private constructor() { |
| super(); |
| Host.InspectorFrontendHost.InspectorFrontendHostInstance.events.addEventListener( |
| Host.InspectorFrontendHostAPI.Events.SavedURL, this.savedURL, this); |
| Host.InspectorFrontendHost.InspectorFrontendHostInstance.events.addEventListener( |
| Host.InspectorFrontendHostAPI.Events.CanceledSaveURL, this.#canceledSavedURL, this); |
| Host.InspectorFrontendHost.InspectorFrontendHostInstance.events.addEventListener( |
| Host.InspectorFrontendHostAPI.Events.AppendedToURL, this.appendedToURL, this); |
| } |
| |
| static instance(opts: {forceNew: boolean|null} = {forceNew: null}): FileManager { |
| const {forceNew} = opts; |
| if (!fileManagerInstance || forceNew) { |
| fileManagerInstance = new FileManager(); |
| } |
| |
| return fileManagerInstance; |
| } |
| |
| /** |
| * {@link FileManager.close | close} *must* be called, for the InspectorFrontendHostStub case, to complete the saving. |
| * @param url The url of the file to save. **NOTE:** The backend truncates this filename to 64 characters. |
| */ |
| save( |
| url: Platform.DevToolsPath.RawPathString|Platform.DevToolsPath.UrlString, |
| contentData: TextUtils.ContentData.ContentData, |
| forceSaveAs: boolean, |
| ): Promise<SaveCallbackParam|null> { |
| // Remove this url from the saved URLs while it is being saved. |
| const result = new Promise<SaveCallbackParam|null>(resolve => this.#saveCallbacks.set(url, resolve)); |
| const {isTextContent} = contentData; |
| const content = isTextContent ? contentData.text : contentData.base64; |
| Host.InspectorFrontendHost.InspectorFrontendHostInstance.save(url, content, forceSaveAs, !isTextContent); |
| return result; |
| } |
| |
| /** |
| * Used in web tests |
| */ |
| private savedURL(event: Common.EventTarget.EventTargetEvent<Host.InspectorFrontendHostAPI.SavedURLEvent>): void { |
| const {url, fileSystemPath} = event.data; |
| const callback = this.#saveCallbacks.get(url); |
| this.#saveCallbacks.delete(url); |
| if (callback) { |
| callback({fileSystemPath}); |
| } |
| } |
| |
| #canceledSavedURL({data: url}: Common.EventTarget.EventTargetEvent<Platform.DevToolsPath.UrlString>): void { |
| const callback = this.#saveCallbacks.get(url); |
| this.#saveCallbacks.delete(url); |
| if (callback) { |
| callback(null); |
| } |
| } |
| |
| append(url: Platform.DevToolsPath.RawPathString|Platform.DevToolsPath.UrlString, content: string): void { |
| Host.InspectorFrontendHost.InspectorFrontendHostInstance.append(url, content); |
| } |
| |
| close(url: Platform.DevToolsPath.RawPathString|Platform.DevToolsPath.UrlString): void { |
| Host.InspectorFrontendHost.InspectorFrontendHostInstance.close(url); |
| } |
| |
| /** |
| * Used in web tests |
| */ |
| private appendedToURL({data: url}: Common.EventTarget.EventTargetEvent<string>): void { |
| this.dispatchEventToListeners(Events.APPENDED_TO_URL, url); |
| } |
| } |
| |
| export const enum Events { |
| APPENDED_TO_URL = 'AppendedToURL', |
| } |
| |
| export interface EventTypes { |
| [Events.APPENDED_TO_URL]: string; |
| } |