chrome-devtools-frontend
Version:
Chrome DevTools UI
613 lines (448 loc) • 27.5 kB
text/typescript
// Copyright 2020 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 Platform from '../../core/platform/platform.js';
import * as SDK from '../../core/sdk/sdk.js';
import type * as Protocol from '../../generated/protocol.js';
import {createTarget} from '../../testing/EnvironmentHelpers.js';
import {describeWithMockConnection} from '../../testing/MockConnection.js';
import {createResource, getMainFrame} from '../../testing/ResourceTreeHelpers.js';
import {createContentProviderUISourceCode} from '../../testing/UISourceCodeHelpers.js';
import * as Workspace from '../workspace/workspace.js';
import * as Bindings from './bindings.js';
const {urlString} = Platform.DevToolsPath;
// Same as in IgnoreListManager.ts.
const UIStrings = {
removeFromIgnoreList: 'Remove from ignore list',
addScriptToIgnoreList: 'Add script to ignore list',
addDirectoryToIgnoreList: 'Add directory to ignore list',
addAllContentScriptsToIgnoreList: 'Add all extension scripts to ignore list',
addAllThirdPartyScriptsToIgnoreList: 'Add all third-party scripts to ignore list',
addAllAnonymousScriptsToIgnoreList: 'Add all anonymous scripts to ignore list',
} as const;
const sourceMapThirdPartyFolderUrl = urlString`http://a.b.c/lib`;
const sourceMapThirdPartyUrl = urlString`http://a.b.c/lib/source1.ts`;
const sourceMapNodeModulesUrl = urlString`http://a.b.c/node_modules/library/source3.ts`;
const sourceMapFolderUrl = urlString`http://a.b.c/myapp`;
const sourceMapFile1Url = urlString`http://a.b.c/myapp/file1.ts`;
const sourceMapFile2Url = urlString`http://a.b.c/myapp/file2.ts`;
const sourceMap = {
version: 3,
file: './foo.js',
mappings: '',
sources: [sourceMapThirdPartyUrl, sourceMapFile1Url, sourceMapFile2Url, sourceMapNodeModulesUrl],
sourcesContent: ['// File 1\n'],
names: [],
sourceRoot: '',
x_google_ignoreList: [0],
};
function notNull<T>(val: T|null|undefined): T {
assert.exists(val);
return val;
}
describeWithMockConnection('IgnoreListManager', () => {
let debuggerModel: SDK.DebuggerModel.DebuggerModel;
let ignoreListManager: Bindings.IgnoreListManager.IgnoreListManager;
let uiSourceCode: Workspace.UISourceCode.UISourceCode;
let webpackUiSourceCode: Workspace.UISourceCode.UISourceCode;
let thirdPartyUiSourceCode: Workspace.UISourceCode.UISourceCode;
let nodeModulesUiSourceCode: Workspace.UISourceCode.UISourceCode;
let sourceMapFile1UiSourceCode: Workspace.UISourceCode.UISourceCode;
let sourceMapFile2UiSourceCode: Workspace.UISourceCode.UISourceCode;
let contentScriptUiSourceCode: Workspace.UISourceCode.UISourceCode;
let anonymousScriptUiSourceCode: Workspace.UISourceCode.UISourceCode;
// This test simulates the behavior of the IgnoreListManager with the
// following document, which contains two inline <script>s, one with
// a `//# sourceURL` annotation and one without.
//
// <!DOCTYPE html>
// <html>
// <head>
// <meta charset=utf-8>
// <script>
// function foo() { console.log("foo"); }
// foo();
// //# sourceURL=webpack:///src/foo.js
// </script>
// </head>
// <body>
// <script>console.log("bar");</script>
// </body>
// </html>
//
const url = urlString`http://example.com/index.html`;
const webpackUrl = urlString`webpack:///src/subfolder/foo.js`;
const webpackFolderUrl = urlString`webpack:///src`;
const webpackSubfolderUrl = urlString`webpack:///src/subfolder`;
const contentScriptFolderUrl = urlString`chrome-extension://abc`;
const contentScriptUrl = urlString`chrome-extension://abc/content.js`;
const emptyUrl = urlString``;
const SCRIPTS = [
{
scriptId: '1' as Protocol.Runtime.ScriptId,
startLine: 4,
startColumn: 8,
endLine: 8,
endColumn: 0,
sourceURL: webpackUrl,
hasSourceURLComment: true,
executionContextAuxData: undefined,
},
{
scriptId: '2' as Protocol.Runtime.ScriptId,
startLine: 11,
startColumn: 8,
endLine: 11,
endColumn: 27,
sourceURL: url,
sourceMapURL: 'data:,' + encodeURIComponent(JSON.stringify(sourceMap)),
hasSourceURLComment: false,
},
{
scriptId: '3' as Protocol.Runtime.ScriptId,
startLine: 4,
startColumn: 8,
endLine: 8,
endColumn: 0,
sourceURL: contentScriptUrl,
executionContextAuxData: {isDefault: false},
hasSourceURLComment: true,
},
{
scriptId: '4' as Protocol.Runtime.ScriptId,
startLine: 11,
startColumn: 8,
endLine: 11,
endColumn: 27,
sourceURL: emptyUrl,
hasSourceURLComment: false,
},
];
const ALL_URLS = [...sourceMap.sources, ...SCRIPTS.map(({sourceURL}) => sourceURL)];
beforeEach(async () => {
const forceNew = true;
const target = createTarget();
const targetManager = target.targetManager();
SDK.PageResourceLoader.PageResourceLoader.instance({forceNew, maxConcurrentLoads: 1, loadOverride: null});
const workspace = Workspace.Workspace.WorkspaceImpl.instance();
const resourceMapping = new Bindings.ResourceMapping.ResourceMapping(targetManager, workspace);
const debuggerWorkspaceBinding =
Bindings.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding.instance({forceNew, resourceMapping, targetManager});
ignoreListManager = Bindings.IgnoreListManager.IgnoreListManager.instance({forceNew, debuggerWorkspaceBinding});
// Inject the HTML document resource.
createResource(getMainFrame(target), url, 'text/html', '');
uiSourceCode = notNull(workspace.uiSourceCodeForURL(url));
// Register the inline <script>s.
const hash = '';
const length = 0;
const embedderName = url;
const executionContextId = 1;
debuggerModel = target.model(SDK.DebuggerModel.DebuggerModel) as SDK.DebuggerModel.DebuggerModel;
const scripts = SCRIPTS.map(({
scriptId,
startLine,
startColumn,
endLine,
endColumn,
executionContextAuxData,
sourceURL,
hasSourceURLComment,
sourceMapURL,
}) => {
return debuggerModel.parsedScriptSource(
scriptId, sourceURL, startLine, startColumn, endLine, endColumn, executionContextId, hash,
executionContextAuxData, false, sourceMapURL, hasSourceURLComment, false, length, false, null, null, null,
null, embedderName, null);
});
assert.lengthOf(debuggerModel.scripts(), SCRIPTS.length);
webpackUiSourceCode = notNull(workspace.uiSourceCodeForURL(webpackUrl));
contentScriptUiSourceCode = notNull(workspace.uiSourceCodeForURL(contentScriptUrl));
thirdPartyUiSourceCode = await debuggerWorkspaceBinding.waitForUISourceCodeAdded(sourceMapThirdPartyUrl, target);
sourceMapFile1UiSourceCode = notNull(workspace.uiSourceCodeForURL(sourceMapFile1Url));
sourceMapFile2UiSourceCode = notNull(workspace.uiSourceCodeForURL(sourceMapFile2Url));
nodeModulesUiSourceCode = notNull(workspace.uiSourceCodeForURL(sourceMapNodeModulesUrl));
anonymousScriptUiSourceCode = notNull(debuggerWorkspaceBinding.uiSourceCodeForScript(scripts[3]));
});
// Wrapper around getIgnoreListURLContextMenuItems to make its result more convenient for testing
function getContextMenu(uiSourceCode: Workspace.UISourceCode.UISourceCode):
{items: string[], callbacks: Map<string, () => void>} {
const items: string[] = [];
const callbacks = new Map<string, () => void>();
for (const {text, callback} of ignoreListManager.getIgnoreListURLContextMenuItems(uiSourceCode)) {
items.push(text);
callbacks.set(text, callback);
}
return {items, callbacks};
}
// Wrapper around getIgnoreListFolderContextMenuItems to make its result more convenient for testing
function getFolderContextMenu(url: Platform.DevToolsPath.UrlString):
{items: string[], callbacks: Map<string, () => void>} {
const items: string[] = [];
const callbacks = new Map<string, () => void>();
const workspace = Workspace.Workspace.WorkspaceImpl.instance();
const options: Bindings.IgnoreListManager.IgnoreListGeneralRules = {
isContentScript: url === contentScriptFolderUrl,
isKnownThirdParty: url === sourceMapThirdPartyFolderUrl,
isCurrentlyIgnoreListed: ALL_URLS.every(
scriptUrl => !scriptUrl.startsWith(url) ||
ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(
notNull(workspace.uiSourceCodeForURL(scriptUrl)))),
};
for (const {text, callback} of ignoreListManager.getIgnoreListFolderContextMenuItems(url, options)) {
items.push(text);
callbacks.set(text, callback);
}
return {items, callbacks};
}
it('default is do not ignore', () => {
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(webpackUiSourceCode));
});
it('default is ignore third party', () => {
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(thirdPartyUiSourceCode));
});
it('default is ignore content scripts from extensions', () => {
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(contentScriptUiSourceCode));
});
it('default is not ignore anonymous script', () => {
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(anonymousScriptUiSourceCode));
});
it('script context menu enables and disables ignore listing', () => {
let {items, callbacks} = getContextMenu(webpackUiSourceCode);
assert.sameMembers(items, [UIStrings.addScriptToIgnoreList]);
notNull(callbacks.get(UIStrings.addScriptToIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(webpackUiSourceCode));
({items, callbacks} = getContextMenu(webpackUiSourceCode));
assert.sameMembers(items, [UIStrings.removeFromIgnoreList]);
notNull(callbacks.get(UIStrings.removeFromIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(webpackUiSourceCode));
});
it('script context menu enables and disables ignore listing for content scripts', () => {
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(contentScriptUiSourceCode));
let {items, callbacks} = getContextMenu(contentScriptUiSourceCode);
assert.sameMembers(items, [UIStrings.removeFromIgnoreList]);
notNull(callbacks.get(UIStrings.removeFromIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(contentScriptUiSourceCode));
({items, callbacks} = getContextMenu(contentScriptUiSourceCode));
assert.sameMembers(items, [UIStrings.addScriptToIgnoreList, UIStrings.addAllContentScriptsToIgnoreList]);
notNull(callbacks.get(UIStrings.addAllContentScriptsToIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(contentScriptUiSourceCode));
});
it('folder context menu enables and disables ignore listing for content scripts', () => {
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(contentScriptUiSourceCode));
let {items, callbacks} = getFolderContextMenu(contentScriptFolderUrl);
assert.sameMembers(items, [UIStrings.removeFromIgnoreList]);
notNull(callbacks.get(UIStrings.removeFromIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(contentScriptUiSourceCode));
({items, callbacks} = getFolderContextMenu(contentScriptFolderUrl));
assert.sameMembers(items, [UIStrings.addDirectoryToIgnoreList, UIStrings.addAllContentScriptsToIgnoreList]);
notNull(callbacks.get(UIStrings.addAllContentScriptsToIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(contentScriptUiSourceCode));
});
it('script context menu enables and disables ignore listing for third party scripts', () => {
let {items, callbacks} = getContextMenu(thirdPartyUiSourceCode);
assert.sameMembers(items, [UIStrings.removeFromIgnoreList]);
notNull(callbacks.get(UIStrings.removeFromIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(thirdPartyUiSourceCode));
({items, callbacks} = getContextMenu(thirdPartyUiSourceCode));
assert.sameMembers(items, [UIStrings.addScriptToIgnoreList, UIStrings.addAllThirdPartyScriptsToIgnoreList]);
notNull(callbacks.get(UIStrings.addAllThirdPartyScriptsToIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(thirdPartyUiSourceCode));
});
it('folder context menu enables and disables ignore listing for third party scripts', () => {
let {items, callbacks} = getFolderContextMenu(sourceMapThirdPartyFolderUrl);
assert.sameMembers(items, [UIStrings.removeFromIgnoreList]);
notNull(callbacks.get(UIStrings.removeFromIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(thirdPartyUiSourceCode));
({items, callbacks} = getFolderContextMenu(sourceMapThirdPartyFolderUrl));
assert.sameMembers(items, [UIStrings.addDirectoryToIgnoreList, UIStrings.addAllThirdPartyScriptsToIgnoreList]);
notNull(callbacks.get(UIStrings.addAllThirdPartyScriptsToIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(thirdPartyUiSourceCode));
});
it('folder context menu disables default node_modules ignore listing rule', () => {
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(nodeModulesUiSourceCode));
const {items, callbacks} = getFolderContextMenu(sourceMapNodeModulesUrl);
assert.sameMembers(items, [UIStrings.removeFromIgnoreList]);
notNull(callbacks.get(UIStrings.removeFromIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(nodeModulesUiSourceCode));
});
it('folder context menu enables and disables ignore listing', () => {
let {items, callbacks} = getFolderContextMenu(webpackFolderUrl);
assert.sameMembers(items, [UIStrings.addDirectoryToIgnoreList]);
notNull(callbacks.get(UIStrings.addDirectoryToIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(webpackUiSourceCode));
({items, callbacks} = getFolderContextMenu(webpackFolderUrl));
assert.sameMembers(items, [UIStrings.removeFromIgnoreList]);
notNull(callbacks.get(UIStrings.removeFromIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(webpackUiSourceCode));
});
it('ignore listed folder can be reenabled by script context menu', () => {
let {items, callbacks} = getFolderContextMenu(webpackFolderUrl);
assert.sameMembers(items, [UIStrings.addDirectoryToIgnoreList]);
notNull(callbacks.get(UIStrings.addDirectoryToIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(webpackUiSourceCode));
({items, callbacks} = getContextMenu(webpackUiSourceCode));
assert.sameMembers(items, [UIStrings.removeFromIgnoreList]);
notNull(callbacks.get(UIStrings.removeFromIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(webpackUiSourceCode));
({items, callbacks} = getFolderContextMenu(webpackFolderUrl));
assert.sameMembers(items, [UIStrings.addDirectoryToIgnoreList]);
notNull(callbacks.get(UIStrings.addDirectoryToIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(webpackUiSourceCode));
});
it('ignore listed folder can be reenabled by subfolder context menu', () => {
let {items, callbacks} = getFolderContextMenu(webpackFolderUrl);
assert.sameMembers(items, [UIStrings.addDirectoryToIgnoreList]);
notNull(callbacks.get(UIStrings.addDirectoryToIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(webpackUiSourceCode));
({items, callbacks} = getFolderContextMenu(webpackSubfolderUrl));
assert.sameMembers(items, [UIStrings.removeFromIgnoreList]);
notNull(callbacks.get(UIStrings.removeFromIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(webpackUiSourceCode));
({items, callbacks} = getFolderContextMenu(webpackFolderUrl));
assert.sameMembers(items, [UIStrings.addDirectoryToIgnoreList]);
notNull(callbacks.get(UIStrings.addDirectoryToIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(webpackUiSourceCode));
});
it('enable ignore listing undoes disable', () => {
// Ignore the folder
let {items, callbacks} = getFolderContextMenu(sourceMapFolderUrl);
assert.sameMembers(items, [UIStrings.addDirectoryToIgnoreList]);
notNull(callbacks.get(UIStrings.addDirectoryToIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(sourceMapFile1UiSourceCode));
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(sourceMapFile2UiSourceCode));
// Disable the folder ignore list rule by way of the script context menu
({items, callbacks} = getContextMenu(sourceMapFile1UiSourceCode));
assert.sameMembers(items, [UIStrings.removeFromIgnoreList]);
notNull(callbacks.get(UIStrings.removeFromIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(sourceMapFile1UiSourceCode));
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(sourceMapFile2UiSourceCode));
// Verify that we have option to add folder to ignore list (but we won't use it)
({items, callbacks} = getFolderContextMenu(sourceMapFolderUrl));
assert.sameMembers(items, [UIStrings.addDirectoryToIgnoreList]);
// Reenable from same context menu on same file
({items, callbacks} = getContextMenu(sourceMapFile1UiSourceCode));
assert.sameMembers(items, [UIStrings.addScriptToIgnoreList]);
notNull(callbacks.get(UIStrings.addScriptToIgnoreList))();
// This undoes the disable -- reenabling the directory rule
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(sourceMapFile1UiSourceCode));
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(sourceMapFile2UiSourceCode));
// Verify that we have option to remove folder from ignore list
({items, callbacks} = getFolderContextMenu(sourceMapFolderUrl));
assert.sameMembers(items, [UIStrings.removeFromIgnoreList]);
// Remove folder from ignore list to verify there are no other ignore listing rules
notNull(callbacks.get(UIStrings.removeFromIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(sourceMapFile1UiSourceCode));
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(sourceMapFile2UiSourceCode));
});
it('enable ignore listing does not undo disable if done from a different file', () => {
// Ignore the folder
let {items, callbacks} = getFolderContextMenu(sourceMapFolderUrl);
assert.sameMembers(items, [UIStrings.addDirectoryToIgnoreList]);
notNull(callbacks.get(UIStrings.addDirectoryToIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(sourceMapFile1UiSourceCode));
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(sourceMapFile2UiSourceCode));
// Disable the folder ignore list rule by way of the script context menu
({items, callbacks} = getContextMenu(sourceMapFile1UiSourceCode));
assert.sameMembers(items, [UIStrings.removeFromIgnoreList]);
notNull(callbacks.get(UIStrings.removeFromIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(sourceMapFile1UiSourceCode));
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(sourceMapFile2UiSourceCode));
// Enable ignore listing on a different file in same folder
({items, callbacks} = getContextMenu(sourceMapFile2UiSourceCode));
assert.sameMembers(items, [UIStrings.addScriptToIgnoreList]);
notNull(callbacks.get(UIStrings.addScriptToIgnoreList))();
// This creates a rule for just that file
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(sourceMapFile1UiSourceCode));
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(sourceMapFile2UiSourceCode));
});
it('script context menu enables global ignore listing toggle', () => {
let {items, callbacks} = getContextMenu(webpackUiSourceCode);
assert.sameMembers(items, [UIStrings.addScriptToIgnoreList]);
notNull(callbacks.get(UIStrings.addScriptToIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(webpackUiSourceCode));
ignoreListManager.enableIgnoreListing = false;
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(webpackUiSourceCode));
({items, callbacks} = getContextMenu(webpackUiSourceCode));
assert.sameMembers(items, [UIStrings.addScriptToIgnoreList]);
notNull(callbacks.get(UIStrings.addScriptToIgnoreList))();
assert.isTrue(ignoreListManager.enableIgnoreListing);
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(webpackUiSourceCode));
});
it('content script context menu enables global ignore listing toggle', () => {
ignoreListManager.enableIgnoreListing = false;
const {items, callbacks} = getContextMenu(contentScriptUiSourceCode);
assert.sameMembers(items, [UIStrings.addScriptToIgnoreList, UIStrings.addAllContentScriptsToIgnoreList]);
notNull(callbacks.get(UIStrings.addAllContentScriptsToIgnoreList))();
assert.isTrue(ignoreListManager.enableIgnoreListing);
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(contentScriptUiSourceCode));
});
it('third party script context menu enables global ignore listing toggle', () => {
ignoreListManager.enableIgnoreListing = false;
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(thirdPartyUiSourceCode));
const {items, callbacks} = getContextMenu(thirdPartyUiSourceCode);
assert.sameMembers(items, [UIStrings.addScriptToIgnoreList, UIStrings.addAllThirdPartyScriptsToIgnoreList]);
notNull(callbacks.get(UIStrings.addAllThirdPartyScriptsToIgnoreList))();
assert.isTrue(ignoreListManager.enableIgnoreListing);
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(thirdPartyUiSourceCode));
});
it('provides no context menu items when all contents in folder are individually ignored', () => {
let {items, callbacks} = getContextMenu(webpackUiSourceCode);
assert.sameMembers(items, [UIStrings.addScriptToIgnoreList]);
// Disable webpack script
notNull(callbacks.get(UIStrings.addScriptToIgnoreList))();
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(webpackUiSourceCode));
// Get context menu for folder only containing the script we disabled
({items, callbacks} = getFolderContextMenu(webpackFolderUrl));
// Verify that no context menu items are provided
assert.sameMembers(items, []);
});
it('script context menu enables and disables ignore listing for anonymous scripts', () => {
let {items, callbacks} = getContextMenu(anonymousScriptUiSourceCode);
assert.sameMembers(items, [UIStrings.addAllAnonymousScriptsToIgnoreList]);
notNull(callbacks.get(UIStrings.addAllAnonymousScriptsToIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(anonymousScriptUiSourceCode));
({items, callbacks} = getContextMenu(anonymousScriptUiSourceCode));
assert.sameMembers(items, [UIStrings.removeFromIgnoreList]);
notNull(callbacks.get(UIStrings.removeFromIgnoreList))();
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
assert.isFalse(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(anonymousScriptUiSourceCode));
});
describe('isUserOrSourceMapIgnoreListedUISourceCode', () => {
it('ignores UISourceCodes that are marked', () => {
const {uiSourceCode} = createContentProviderUISourceCode({
url: urlString`debugger://foo`,
projectType: Workspace.Workspace.projectTypes.Debugger,
mimeType: 'text/javascript',
});
uiSourceCode.markAsUnconditionallyIgnoreListed();
assert.isTrue(ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(uiSourceCode));
});
});
});