blob: afa337c1a6a764c47376bd61ab312fb93193fe10 [file] [edit]
// Copyright 2026 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import {assert} from 'chai';
import * as Common from '../../core/common/common.js';
import * as Host from '../../core/host/host.js';
import * as Platform from '../../core/platform/platform.js';
import {setupLocaleHooks} from '../../testing/LocaleHelpers.js';
import {setupRuntimeHooks} from '../../testing/RuntimeHelpers.js';
import {setupSettingsHooks} from '../../testing/SettingsHelpers.js';
import {TestUniverse} from '../../testing/TestUniverse.js';
import * as Persistence from './persistence.js';
const {urlString} = Platform.DevToolsPath;
class TestPlatformFileSystem extends Persistence.PlatformFileSystem.PlatformFileSystem {
readonly #manager: Persistence.IsolatedFileSystemManager.IsolatedFileSystemManager;
constructor(path: Platform.DevToolsPath.UrlString,
manager: Persistence.IsolatedFileSystemManager.IsolatedFileSystemManager) {
super(path, Persistence.PlatformFileSystem.PlatformFileSystemType.WORKSPACE_PROJECT, false);
this.#manager = manager;
}
override isFileExcluded(folderPath: Platform.DevToolsPath.EncodedPathString): boolean {
const regex = this.#manager.workspaceFolderExcludePatternSetting().asRegExp();
return Boolean(regex?.test(Common.ParsedURL.ParsedURL.encodedPathToRawPathString(folderPath)));
}
override embedderPath(): Platform.DevToolsPath.RawPathString {
return Common.ParsedURL.ParsedURL.urlToRawPathString(this.path(), Host.Platform.isWin());
}
}
describe('IsolatedFileSystemManager', () => {
setupLocaleHooks();
setupSettingsHooks();
setupRuntimeHooks();
let universe: TestUniverse;
beforeEach(() => {
universe = new TestUniverse();
});
afterEach(() => {
universe.dispose();
});
it('does not propagate events for ignored files', () => {
const manager = universe.isolatedFileSystemManager;
manager.workspaceFolderExcludePatternSetting().set('[iI]gnored');
const fileSystemPath = urlString`file:///var/www`;
const fileSystem = new TestPlatformFileSystem(fileSystemPath, manager);
manager.addPlatformFileSystem(fileSystemPath, fileSystem);
const changedFiles: string[] = [];
const addedFiles: string[] = [];
manager.addEventListener(Persistence.IsolatedFileSystemManager.Events.FileSystemFilesChanged, event => {
for (const file of event.data.added.valuesArray()) {
addedFiles.push(file);
}
for (const file of event.data.changed.valuesArray()) {
changedFiles.push(file);
}
});
const hostInstance = Host.InspectorFrontendHost.InspectorFrontendHostInstance;
// Simulate adding files
hostInstance.events.dispatchEventToListeners(
Host.InspectorFrontendHostAPI.Events.FileSystemFilesChangedAddedRemoved, {
added: [
'/var/www/ignoredFile' as Platform.DevToolsPath.RawPathString,
'/var/www/alsoIgnoredFile' as Platform.DevToolsPath.RawPathString,
'/var/www/friendlyFile' as Platform.DevToolsPath.RawPathString,
],
changed: [],
removed: [],
});
assert.deepEqual(addedFiles, ['file:///var/www/friendlyFile']);
assert.deepEqual(changedFiles, []);
// Reset received files
addedFiles.length = 0;
changedFiles.length = 0;
// Simulate modifying files
hostInstance.events.dispatchEventToListeners(
Host.InspectorFrontendHostAPI.Events.FileSystemFilesChangedAddedRemoved, {
added: [],
changed: [
'/var/www/ignoredFile' as Platform.DevToolsPath.RawPathString,
'/var/www/alsoIgnoredFile' as Platform.DevToolsPath.RawPathString,
'/var/www/friendlyFile' as Platform.DevToolsPath.RawPathString,
],
removed: [],
});
assert.deepEqual(addedFiles, []);
assert.deepEqual(changedFiles, ['file:///var/www/friendlyFile']);
});
it('unregisters event listeners on dispose', () => {
const universe = new TestUniverse();
const manager =
new Persistence.IsolatedFileSystemManager.IsolatedFileSystemManager(universe.settings, universe.console);
const events = Host.InspectorFrontendHost.InspectorFrontendHostInstance.events;
const registeredEvents = [
Host.InspectorFrontendHostAPI.Events.FileSystemRemoved,
Host.InspectorFrontendHostAPI.Events.FileSystemAdded,
Host.InspectorFrontendHostAPI.Events.FileSystemFilesChangedAddedRemoved,
Host.InspectorFrontendHostAPI.Events.IndexingTotalWorkCalculated,
Host.InspectorFrontendHostAPI.Events.IndexingWorked,
Host.InspectorFrontendHostAPI.Events.IndexingDone,
Host.InspectorFrontendHostAPI.Events.SearchCompleted,
];
for (const event of registeredEvents) {
assert.isTrue(events.hasEventListeners(event), `Expected listener for ${event} to be registered`);
}
manager.dispose();
for (const event of registeredEvents) {
assert.isFalse(events.hasEventListeners(event), `Expected listener for ${event} to be unregistered`);
}
});
});