@yuebai008/cli
Version:
Command line interface for rapid qg-minigame development
1 lines • 37 kB
JavaScript
import*as Common from"../../core/common/common.js";import*as Host from"../../core/host/host.js";import*as i18n from"../../core/i18n/i18n.js";import*as Platform from"../../core/platform/platform.js";import*as Root from"../../core/root/root.js";import*as SDK from"../../core/sdk/sdk.js";import*as Bindings from"../../models/bindings/bindings.js";import*as Persistence from"../../models/persistence/persistence.js";import*as Workspace from"../../models/workspace/workspace.js";import*as IconButton from"../../ui/components/icon_button/icon_button.js";import*as UI from"../../ui/legacy/legacy.js";import*as Snippets from"../snippets/snippets.js";import navigatorTreeStyles from"./navigatorTree.css.js";import navigatorViewStyles from"./navigatorView.css.js";import{SearchSourcesView}from"./SearchSourcesView.js";const UIStrings={searchInFolder:"Search in folder",searchInAllFiles:"Search in all files",noDomain:"(no domain)",authored:"Authored",authoredTooltip:"Contains original sources",deployed:"Deployed",deployedTooltip:"Contains final sources the browser sees",areYouSureYouWantToExcludeThis:"Are you sure you want to exclude this folder?",areYouSureYouWantToDeleteThis:"Are you sure you want to delete this file?",rename:"Rename…",makeACopy:"Make a copy…",delete:"Delete",remove:"Remove",areYouSureYouWantToDeleteAll:"Are you sure you want to delete all overrides in this folder?",openFolder:"Open folder",newFile:"New file",excludeFolder:"Exclude from workspace",removeFolderFromWorkspace:"Remove from workspace",areYouSureYouWantToRemoveThis:"Remove ‘{PH1}’ from Workspace?",workspaceStopSyncing:"This will stop syncing changes from DevTools to your sources.",deleteAllOverrides:"Delete all overrides",sFromSourceMap:"{PH1} (from source map)",sIgnoreListed:"{PH1} (ignore listed)"},str_=i18n.i18n.registerUIStrings("panels/sources/NavigatorView.ts",UIStrings),i18nString=i18n.i18n.getLocalizedString.bind(void 0,str_);export const Types={Authored:"authored",Deployed:"deployed",Domain:"domain",File:"file",FileSystem:"fs",FileSystemFolder:"fs-folder",Frame:"frame",NetworkFolder:"nw-folder",Root:"root",Worker:"worker"};const TYPE_ORDERS=new Map([[Types.Root,1],[Types.Authored,1],[Types.Deployed,5],[Types.Domain,10],[Types.FileSystemFolder,1],[Types.NetworkFolder,1],[Types.File,10],[Types.Frame,70],[Types.Worker,90],[Types.FileSystem,100]]);export class NavigatorView extends UI.Widget.VBox{placeholder;scriptsTree;uiSourceCodeNodes;subfolderNodes;rootNode;frameNodes;authoredNode;deployedNode;navigatorGroupByFolderSetting;navigatorGroupByAuthoredExperiment;workspaceInternal;lastSelectedUISourceCode;groupByFrame;groupByAuthored;groupByDomain;groupByFolder;constructor(e){super(!0),this.placeholder=null,this.scriptsTree=new UI.TreeOutline.TreeOutlineInShadow,this.scriptsTree.setComparator(NavigatorView.treeElementsCompare),this.scriptsTree.setFocusable(!1),this.contentElement.appendChild(this.scriptsTree.element),this.setDefaultFocusedElement(this.scriptsTree.element),this.uiSourceCodeNodes=new Platform.MapUtilities.Multimap,this.subfolderNodes=new Map,this.rootNode=new NavigatorRootTreeNode(this),this.rootNode.populate(),this.frameNodes=new Map,this.contentElement.addEventListener("contextmenu",this.handleContextMenu.bind(this),!1),UI.ShortcutRegistry.ShortcutRegistry.instance().addShortcutListener(this.contentElement,{"sources.rename":this.renameShortcut.bind(this)}),this.navigatorGroupByFolderSetting=Common.Settings.Settings.instance().moduleSetting("navigatorGroupByFolder"),this.navigatorGroupByFolderSetting.addChangeListener(this.groupingChanged.bind(this)),e&&(this.navigatorGroupByAuthoredExperiment=Root.Runtime.ExperimentName.AUTHORED_DEPLOYED_GROUPING),Bindings.IgnoreListManager.IgnoreListManager.instance().addChangeListener(this.ignoreListChanged.bind(this)),this.initGrouping(),Persistence.Persistence.PersistenceImpl.instance().addEventListener(Persistence.Persistence.Events.BindingCreated,this.onBindingChanged,this),Persistence.Persistence.PersistenceImpl.instance().addEventListener(Persistence.Persistence.Events.BindingRemoved,this.onBindingChanged,this),Persistence.NetworkPersistenceManager.NetworkPersistenceManager.instance().addEventListener(Persistence.NetworkPersistenceManager.Events.RequestsForHeaderOverridesFileChanged,this.#e,this),SDK.TargetManager.TargetManager.instance().addEventListener(SDK.TargetManager.Events.NameChanged,this.targetNameChanged,this),SDK.TargetManager.TargetManager.instance().observeTargets(this),this.resetWorkspace(Workspace.Workspace.WorkspaceImpl.instance()),this.workspaceInternal.uiSourceCodes().forEach(this.addUISourceCode.bind(this)),Bindings.NetworkProject.NetworkProjectManager.instance().addEventListener(Bindings.NetworkProject.Events.FrameAttributionAdded,this.frameAttributionAdded,this),Bindings.NetworkProject.NetworkProjectManager.instance().addEventListener(Bindings.NetworkProject.Events.FrameAttributionRemoved,this.frameAttributionRemoved,this)}static treeElementOrder(e){if(boostOrderForNode.has(e))return 0;const t=e;let r=TYPE_ORDERS.get(t.nodeType)||0;if(t.uiSourceCode){const e=t.uiSourceCode.contentType();e.isDocument()?r+=3:e.isScript()?r+=5:e.isStyleSheet()?r+=10:r+=15}return r}static appendSearchItem(e,t){let r=i18nString(UIStrings.searchInFolder);t&&t.trim()||(t="*",r=i18nString(UIStrings.searchInAllFiles)),e.viewSection().appendItem(r,(()=>{t&&SearchSourcesView.openSearch(`file:${t.trim()}`)}))}static treeElementsCompare(e,t){const r=NavigatorView.treeElementOrder(e),i=NavigatorView.treeElementOrder(t);return r>i?1:r<i?-1:Platform.StringUtilities.naturalOrderComparator(e.titleAsText(),t.titleAsText())}setPlaceholder(e){function t(){const t=this.scriptsTree.firstChild();t?e.hideWidget():e.showWidget(),this.scriptsTree.element.classList.toggle("hidden",!t)}console.assert(!this.placeholder,"A placeholder widget was already set"),this.placeholder=e,e.show(this.contentElement,this.contentElement.firstChild),t.call(this),this.scriptsTree.addEventListener(UI.TreeOutline.Events.ElementAttached,t.bind(this)),this.scriptsTree.addEventListener(UI.TreeOutline.Events.ElementsDetached,t.bind(this))}onBindingChanged(e){const t=e.data;let r=!1;const i=this.uiSourceCodeNodes.get(t.network);for(const e of i)e.updateTitle(),r||=e.uiSourceCode().contentType().isFromSourceMap();const o=this.uiSourceCodeNodes.get(t.fileSystem);for(const e of o)e.updateTitle(),r||=e.uiSourceCode().contentType().isFromSourceMap();const s=Persistence.FileSystemWorkspaceBinding.FileSystemWorkspaceBinding.relativePath(t.fileSystem);let n=Platform.DevToolsPath.EmptyEncodedPathString;for(let e=0;e<s.length-1;++e){n=Common.ParsedURL.ParsedURL.concatenate(n,s[e]);const i=this.folderNodeId(t.fileSystem.project(),null,null,t.fileSystem.origin(),r,n),o=this.subfolderNodes.get(i);o&&o.updateTitle(),n=Common.ParsedURL.ParsedURL.concatenate(n,"/")}const a=this.rootOrDeployedNode().child(t.fileSystem.project().id());a&&a.updateTitle()}#e(e){const t=e.data,r=this.uiSourceCodeNodes.get(t);for(const e of r)e.updateTitle()}focus(){this.scriptsTree.focus()}appendChild(e,t){this.scriptsTree.setFocusable(!0),e.appendChild(t)}removeChild(e,t){e.removeChild(t),0===this.scriptsTree.rootElement().childCount()&&this.scriptsTree.setFocusable(!1)}resetWorkspace(e){this.workspaceInternal&&(this.workspaceInternal.removeEventListener(Workspace.Workspace.Events.UISourceCodeAdded,this.uiSourceCodeAddedCallback,this),this.workspaceInternal.removeEventListener(Workspace.Workspace.Events.UISourceCodeRemoved,this.uiSourceCodeRemovedCallback,this),this.workspaceInternal.removeEventListener(Workspace.Workspace.Events.ProjectAdded,this.projectAddedCallback,this),this.workspaceInternal.removeEventListener(Workspace.Workspace.Events.ProjectRemoved,this.projectRemovedCallback,this)),this.workspaceInternal=e,this.workspaceInternal.addEventListener(Workspace.Workspace.Events.UISourceCodeAdded,this.uiSourceCodeAddedCallback,this),this.workspaceInternal.addEventListener(Workspace.Workspace.Events.UISourceCodeRemoved,this.uiSourceCodeRemovedCallback,this),this.workspaceInternal.addEventListener(Workspace.Workspace.Events.ProjectAdded,this.projectAddedCallback,this),this.workspaceInternal.addEventListener(Workspace.Workspace.Events.ProjectRemoved,this.projectRemovedCallback,this),this.workspaceInternal.projects().forEach(this.projectAdded.bind(this)),this.computeUniqueFileSystemProjectNames()}projectAddedCallback(e){const t=e.data;this.projectAdded(t),t.type()===Workspace.Workspace.projectTypes.FileSystem&&this.computeUniqueFileSystemProjectNames()}projectRemovedCallback(e){const t=e.data;this.removeProject(t),t.type()===Workspace.Workspace.projectTypes.FileSystem&&this.computeUniqueFileSystemProjectNames()}workspace(){return this.workspaceInternal}acceptProject(e){return!e.isServiceProject()}frameAttributionAdded(e){const{uiSourceCode:t}=e.data;if(!this.acceptsUISourceCode(t))return;const r=e.data.frame;this.addUISourceCodeNode(t,r)}frameAttributionRemoved(e){const{uiSourceCode:t}=e.data;if(!this.acceptsUISourceCode(t))return;const r=e.data.frame,i=Array.from(this.uiSourceCodeNodes.get(t)).find((e=>e.frame()===r));i&&this.removeUISourceCodeNode(i)}acceptsUISourceCode(e){return this.acceptProject(e.project())}addUISourceCode(e){if(Root.Runtime.experiments.isEnabled(Root.Runtime.ExperimentName.JUST_MY_CODE)&&Bindings.IgnoreListManager.IgnoreListManager.instance().isUserOrSourceMapIgnoreListedUISourceCode(e))return;if(!this.acceptsUISourceCode(e))return;if(e.isFetchXHR())return;const t=Bindings.NetworkProject.NetworkProject.framesForUISourceCode(e);if(t.length)for(const r of t)this.addUISourceCodeNode(e,r);else this.addUISourceCodeNode(e,null);this.uiSourceCodeAdded(e)}addUISourceCodeNode(e,t){const r=e.contentType().isFromSourceMap();let i;i=e.project().type()===Workspace.Workspace.projectTypes.FileSystem?Persistence.FileSystemWorkspaceBinding.FileSystemWorkspaceBinding.relativePath(e).slice(0,-1):Common.ParsedURL.ParsedURL.extractPath(e.url()).split("/").slice(1,-1);const o=e.project(),s=Bindings.NetworkProject.NetworkProject.targetForUISourceCode(e),n=this.folderNode(e,o,s,t,e.origin(),i,r),a=new NavigatorUISourceCodeTreeNode(this,e,t),d=n.child(a.id);d&&d instanceof NavigatorUISourceCodeTreeNode?this.uiSourceCodeNodes.set(e,d):(n.appendChild(a),this.uiSourceCodeNodes.set(e,a),a.updateTitleBubbleUp()),this.selectDefaultTreeNode()}uiSourceCodeAdded(e){}uiSourceCodeAddedCallback(e){const t=e.data;this.addUISourceCode(t)}uiSourceCodeRemovedCallback(e){this.removeUISourceCodes([e.data])}tryAddProject(e){this.projectAdded(e);for(const t of e.uiSourceCodes())this.addUISourceCode(t)}projectAdded(e){const t=this.rootOrDeployedNode();!this.acceptProject(e)||e.type()!==Workspace.Workspace.projectTypes.FileSystem||Snippets.ScriptSnippetFileSystem.isSnippetsProject(e)||t.child(e.id())||(t.appendChild(new NavigatorGroupTreeNode(this,e,e.id(),Types.FileSystem,e.displayName())),this.selectDefaultTreeNode())}selectDefaultTreeNode(){const e=this.rootNode.children();e.length&&!this.scriptsTree.selectedTreeElement&&e[0].treeNode().select(!0,!1)}computeUniqueFileSystemProjectNames(){const e=this.workspaceInternal.projectsForType(Workspace.Workspace.projectTypes.FileSystem);if(!e.length)return;const t=Common.Trie.Trie.newArrayTrie(),r=[];for(const i of e){const e=i.fileSystemPath().split("/").reverse();r.push(e),t.add(e)}const i=this.rootOrDeployedNode();for(let o=0;o<e.length;++o){const s=r[o],n=e[o];t.remove(s);const a=t.longestPrefix(s,!1);t.add(s);const d=s.slice(0,a.length+1),l=Common.ParsedURL.ParsedURL.encodedPathToRawPathString(d.reverse().join("/")),c=i.child(n.id());c&&c.setTitle(l)}}removeProject(e){if(this.removeUISourceCodes(e.uiSourceCodes()),e.type()!==Workspace.Workspace.projectTypes.FileSystem)return;const t=this.rootNode.child(e.id());t&&this.rootNode.removeChild(t)}folderNodeId(e,t,r,i,o,s){const n=e.type()===Workspace.Workspace.projectTypes.FileSystem?e.id():"";let a=!t||this.groupByAuthored&&o?"":t.id(),d=this.groupByFrame&&r?r.id:"";return this.groupByAuthored&&(o?(a="Authored",d=""):a="Deployed:"+a),a+":"+n+":"+d+":"+i+":"+s}folderNode(e,t,r,i,o,s,n){if(Snippets.ScriptSnippetFileSystem.isSnippetsUISourceCode(e))return this.rootNode;if(r&&!this.groupByFolder&&!n)return this.domainNode(e,t,r,i,o);const a=Common.ParsedURL.ParsedURL.join(s,"/"),d=this.folderNodeId(t,r,i,o,n,a);let l=this.subfolderNodes.get(d);if(l)return l;if(!s.length)return r?this.domainNode(e,t,r,i,o):this.rootOrDeployedNode().child(t.id());const c=this.folderNode(e,t,r,i,o,s.slice(0,-1),n);let h=Types.NetworkFolder;t.type()===Workspace.Workspace.projectTypes.FileSystem&&(h=Types.FileSystemFolder);const p=Common.ParsedURL.ParsedURL.encodedPathToRawPathString(s[s.length-1]);return l=new NavigatorFolderTreeNode(this,t,d,h,a,p,o),this.subfolderNodes.set(d,l),c.appendChild(l),l}domainNode(e,t,r,i,o){const s=e.contentType().isFromSourceMap(),n=this.frameNode(t,r,i,s);if(!this.groupByDomain)return n;let a=n.child(o);return a||(a=new NavigatorGroupTreeNode(this,t,o,Types.Domain,this.computeProjectDisplayName(r,o)),i&&o===Common.ParsedURL.ParsedURL.extractOrigin(i.url)&&boostOrderForNode.add(a.treeNode()),n.appendChild(a),s&&this.groupByAuthored&&a.treeNode().expand(),a)}frameNode(e,t,r,i){if(!this.groupByFrame||!r||this.groupByAuthored&&i)return this.targetNode(e,t,i);let o=this.frameNodes.get(r);if(o)return o;o=new NavigatorGroupTreeNode(this,e,t.id()+":"+r.id,Types.Frame,r.displayName()),o.setHoverCallback((function(e){if(e){const e=t.model(SDK.OverlayModel.OverlayModel);e&&r&&e.highlightFrame(r.id)}else SDK.OverlayModel.OverlayModel.hideDOMNodeHighlight()})),this.frameNodes.set(r,o);const s=r.parentFrame();return this.frameNode(e,s?s.resourceTreeModel().target():t,s,i).appendChild(o),s||(boostOrderForNode.add(o.treeNode()),o.treeNode().expand()),o}targetNode(e,t,r){if(this.groupByAuthored&&r)return this.authoredNode||(this.authoredNode=new NavigatorGroupTreeNode(this,null,"group:Authored",Types.Authored,i18nString(UIStrings.authored),i18nString(UIStrings.authoredTooltip)),this.rootNode.appendChild(this.authoredNode),this.authoredNode.treeNode().expand()),this.authoredNode;const i=this.rootOrDeployedNode();if(t===SDK.TargetManager.TargetManager.instance().scopeTarget())return i;let o=i.child("target:"+t.id());return o||(o=new NavigatorGroupTreeNode(this,e,"target:"+t.id(),t.type()===SDK.Target.Type.Frame?Types.Frame:Types.Worker,t.name()),i.appendChild(o)),o}rootOrDeployedNode(){return this.groupByAuthored?(this.deployedNode||(this.deployedNode=new NavigatorGroupTreeNode(this,null,"group:Deployed",Types.Deployed,i18nString(UIStrings.deployed),i18nString(UIStrings.deployedTooltip)),this.rootNode.appendChild(this.deployedNode)),this.deployedNode):this.rootNode}computeProjectDisplayName(e,t){const r=e.model(SDK.RuntimeModel.RuntimeModel),i=r?r.executionContexts():[];for(const e of i)if(e.name&&e.origin&&t.startsWith(e.origin))return e.name;if(!t)return i18nString(UIStrings.noDomain);const o=new Common.ParsedURL.ParsedURL(t);return(o.isValid?o.host+(o.port?":"+o.port:""):"")||t}revealUISourceCode(e,t){const r=this.uiSourceCodeNodes.get(e);if(0===r.size)return null;const i=r.values().next().value;if(!i)return null;if(this.scriptsTree.selectedTreeElement){if(UI.UIUtils.isBeingEdited(this.scriptsTree.selectedTreeElement.treeOutline?.element))return null;this.scriptsTree.selectedTreeElement.deselect()}return this.lastSelectedUISourceCode=e,i.reveal(t),i}sourceSelected(e,t){this.lastSelectedUISourceCode=e,Common.Revealer.reveal(e,!t)}#t(e){const t=this.scriptsTree.selectedTreeElement,r=t&&t.node;let i=e;for(;i;){if(i===r)return!0;if(i=i.parent,!(e instanceof NavigatorGroupTreeNode||e instanceof NavigatorFolderTreeElement))break}return!1}removeUISourceCodes(e){const t=[];for(const r of e){const e=this.uiSourceCodeNodes.get(r);for(const r of e)this.#t(r)?t.push(r):this.removeUISourceCodeNode(r)}t.forEach(this.removeUISourceCodeNode.bind(this))}removeUISourceCodeNode(e){const t=e.uiSourceCode();this.uiSourceCodeNodes.delete(t,e);const r=t.project(),i=Bindings.NetworkProject.NetworkProject.targetForUISourceCode(t),o=e.frame();let s=e.parent;if(!s)return;s.removeChild(e);let n=s;for(;n&&(s=n.parent,s)&&(s!==this.rootNode&&s!==this.deployedNode||r.type()!==Workspace.Workspace.projectTypes.FileSystem)&&(n instanceof NavigatorGroupTreeNode||n instanceof NavigatorFolderTreeNode);){if(!n.isEmpty()){n.updateTitleBubbleUp();break}if(n.type===Types.Frame){this.discardFrame(o,Boolean(this.groupByAuthored)&&t.contentType().isFromSourceMap());break}const e=this.folderNodeId(r,i,o,t.origin(),t.contentType().isFromSourceMap(),n instanceof NavigatorFolderTreeNode&&n.folderPath||Platform.DevToolsPath.EmptyEncodedPathString);this.subfolderNodes.delete(e),s.removeChild(n),n===this.authoredNode?this.authoredNode=void 0:n===this.deployedNode&&(this.deployedNode=void 0),n=s}}reset(e){for(const e of this.uiSourceCodeNodes.valuesArray())e.dispose();this.scriptsTree.removeChildren(),this.scriptsTree.setFocusable(!1),this.uiSourceCodeNodes.clear(),this.subfolderNodes.clear(),this.frameNodes.clear(),this.rootNode.reset(),this.authoredNode=void 0,this.deployedNode=void 0,e||this.resetWorkspace(Workspace.Workspace.WorkspaceImpl.instance())}handleContextMenu(e){}async renameShortcut(){const e=this.scriptsTree.selectedTreeElement,t=e&&e.node;return!!(t&&t.uiSourceCode()&&t.uiSourceCode().canRename())&&(this.rename(t,!1),!0)}handleContextMenuCreate(e,t,r){if(r){const e=Persistence.FileSystemWorkspaceBinding.FileSystemWorkspaceBinding.relativePath(r);e.pop(),t=Common.ParsedURL.ParsedURL.join(e,"/")}this.create(e,t,r)}handleContextMenuRename(e){this.rename(e,!1)}async handleContextMenuExclude(e,t){await UI.UIUtils.ConfirmDialog.show(i18nString(UIStrings.areYouSureYouWantToExcludeThis))&&(UI.UIUtils.startBatchUpdate(),e.excludeFolder(Persistence.FileSystemWorkspaceBinding.FileSystemWorkspaceBinding.completeURL(e,t)),UI.UIUtils.endBatchUpdate())}async handleContextMenuDelete(e){await UI.UIUtils.ConfirmDialog.show(i18nString(UIStrings.areYouSureYouWantToDeleteThis))&&e.project().deleteFile(e)}handleFileContextMenu(e,t){const r=t.uiSourceCode(),i=new UI.ContextMenu.ContextMenu(e);i.appendApplicableItems(r);const o=r.project();o.type()===Workspace.Workspace.projectTypes.FileSystem&&(i.editSection().appendItem(i18nString(UIStrings.rename),this.handleContextMenuRename.bind(this,t)),i.editSection().appendItem(i18nString(UIStrings.makeACopy),this.handleContextMenuCreate.bind(this,o,Platform.DevToolsPath.EmptyEncodedPathString,r)),i.editSection().appendItem(i18nString(UIStrings.delete),this.handleContextMenuDelete.bind(this,r))),i.show()}async handleDeleteOverrides(e){await UI.UIUtils.ConfirmDialog.show(i18nString(UIStrings.areYouSureYouWantToDeleteAll))&&this.handleDeleteOverridesHelper(e)}handleDeleteOverridesHelper(e){if(e.children().forEach((e=>{this.handleDeleteOverridesHelper(e)})),e instanceof NavigatorUISourceCodeTreeNode){Persistence.Persistence.PersistenceImpl.instance().binding(e.uiSourceCode())&&e.uiSourceCode().project().deleteFile(e.uiSourceCode())}}handleFolderContextMenu(e,t){const r=t.folderPath||Platform.DevToolsPath.EmptyEncodedPathString,i=t.project||null,o=new UI.ContextMenu.ContextMenu(e);if(NavigatorView.appendSearchItem(o,r),i){if(i.type()===Workspace.Workspace.projectTypes.FileSystem){const e=Common.ParsedURL.ParsedURL.urlToRawPathString(Persistence.FileSystemWorkspaceBinding.FileSystemWorkspaceBinding.completeURL(i,r),Host.Platform.isWin());o.revealSection().appendItem(i18nString(UIStrings.openFolder),(()=>Host.InspectorFrontendHost.InspectorFrontendHostInstance.showItemInFolder(e))),i.canCreateFile()&&o.defaultSection().appendItem(i18nString(UIStrings.newFile),(()=>{this.handleContextMenuCreate(i,r,void 0)}))}else if(t.origin&&t.folderPath){const e=Common.ParsedURL.ParsedURL.concatenate(t.origin,"/",t.folderPath),r={isContentScript:t.recursiveProperties.exclusivelyContentScripts||!1,isKnownThirdParty:t.recursiveProperties.exclusivelyThirdParty||!1};for(const{text:t,callback:i}of Bindings.IgnoreListManager.IgnoreListManager.instance().getIgnoreListFolderContextMenuItems(e,r))o.defaultSection().appendItem(t,i)}if(i.canExcludeFolder(r)&&o.defaultSection().appendItem(i18nString(UIStrings.excludeFolder),this.handleContextMenuExclude.bind(this,i,r)),i.type()===Workspace.Workspace.projectTypes.FileSystem){"overrides"===i.fileSystem().type()?o.defaultSection().appendItem(i18nString(UIStrings.deleteAllOverrides),this.handleDeleteOverrides.bind(this,t)):t instanceof NavigatorGroupTreeNode&&o.defaultSection().appendItem(i18nString(UIStrings.removeFolderFromWorkspace),(async()=>{const e=`${i18nString(UIStrings.areYouSureYouWantToRemoveThis,{PH1:t.title})}\n${i18nString(UIStrings.workspaceStopSyncing)}`;await UI.UIUtils.ConfirmDialog.show(e,void 0,{okButtonLabel:i18nString(UIStrings.remove)})&&i.remove()}))}o.show()}}rename(e,t){const r=e.uiSourceCode();e.rename(function(i){if(!t)return;i?e.treeElement&&e.treeElement.listItemElement.hasFocus()&&this.sourceSelected(r,!0):r.remove()}.bind(this))}async create(e,t,r){let i="";r&&(i=(await r.requestContent()).content||"");const o=await e.createFile(t,null,i);if(!o)return;this.sourceSelected(o,!1);const s=this.revealUISourceCode(o,!0);s&&this.rename(s,!0)}groupingChanged(){this.reset(!0),this.initGrouping(),this.resetWorkspace(Workspace.Workspace.WorkspaceImpl.instance()),this.workspaceInternal.uiSourceCodes().forEach(this.addUISourceCode.bind(this))}ignoreListChanged(){Root.Runtime.experiments.isEnabled(Root.Runtime.ExperimentName.JUST_MY_CODE)?this.groupingChanged():this.rootNode.updateTitleRecursive()}initGrouping(){this.groupByFrame=!0,this.groupByDomain=this.navigatorGroupByFolderSetting.get(),this.groupByFolder=this.groupByDomain,this.navigatorGroupByAuthoredExperiment?this.groupByAuthored=Root.Runtime.experiments.isEnabled(this.navigatorGroupByAuthoredExperiment):this.groupByAuthored=!1}resetForTest(){this.reset(),this.workspaceInternal.uiSourceCodes().forEach(this.addUISourceCode.bind(this))}discardFrame(e,t){if(t)return;const r=this.frameNodes.get(e);if(r){r.parent&&r.parent.removeChild(r),this.frameNodes.delete(e);for(const r of e.childFrames)this.discardFrame(r,t)}}targetAdded(e){}targetRemoved(e){const t=this.rootOrDeployedNode(),r=t.child("target:"+e.id());r&&t.removeChild(r)}targetNameChanged(e){const t=e.data,r=this.rootOrDeployedNode().child("target:"+t.id());r&&r.setTitle(t.name())}wasShown(){super.wasShown(),this.scriptsTree.registerCSSFiles([navigatorTreeStyles]),this.registerCSSFiles([navigatorViewStyles])}}const boostOrderForNode=new WeakSet;export class NavigatorFolderTreeElement extends UI.TreeOutline.TreeElement{nodeType;navigatorView;hoverCallback;node;hovered;isIgnoreListed;isFromSourceMap;constructor(e,t,r,i){super("",!0),this.listItemElement.classList.add("navigator-"+t+"-tree-item","navigator-folder-tree-item"),UI.ARIAUtils.setLabel(this.listItemElement,`${r}, ${t}`),this.nodeType=t,this.title=r,this.tooltip=r,this.navigatorView=e,this.hoverCallback=i,this.isFromSourceMap=!1;let o="folder";t===Types.Domain?o="cloud":t===Types.Frame?o="frame":t===Types.Worker?o="gears":t===Types.Authored?o="code":t===Types.Deployed&&(o="deployed");const s=new IconButton.Icon.Icon,n=new URL(`../../Images/${o}.svg`,import.meta.url).toString();s.data={iconPath:n,color:"var(--override-folder-tree-item-color)",width:"20px",height:"20px"},this.setLeadingIcons([s])}async onpopulate(){this.node.populate()}onattach(){this.collapse(),this.node.onattach(),this.listItemElement.addEventListener("contextmenu",this.handleContextMenuEvent.bind(this),!1),this.listItemElement.addEventListener("mousemove",this.mouseMove.bind(this),!1),this.listItemElement.addEventListener("mouseleave",this.mouseLeave.bind(this),!1)}setIgnoreListed(e){this.isIgnoreListed!==e&&(this.isIgnoreListed=e,this.listItemElement.classList.toggle("is-ignore-listed",e),this.updateTooltip())}setFromSourceMap(e){this.isFromSourceMap=e,this.listItemElement.classList.toggle("is-from-source-map",e)}setNode(e){this.node=e,this.updateTooltip(),UI.ARIAUtils.setLabel(this.listItemElement,`${this.title}, ${this.nodeType}`)}updateTooltip(){if(this.node.tooltip)this.tooltip=this.node.tooltip;else{const e=[];let t=this.node;for(;t&&!t.isRoot()&&t.type===this.node.type;)e.push(t.title),t=t.parent;e.reverse();let r=e.join("/");this.isIgnoreListed&&(r=i18nString(UIStrings.sIgnoreListed,{PH1:r})),this.tooltip=r}}handleContextMenuEvent(e){this.node&&(this.select(),this.navigatorView.handleFolderContextMenu(e,this.node))}mouseMove(e){!this.hovered&&this.hoverCallback&&(this.hovered=!0,this.hoverCallback(!0))}mouseLeave(e){this.hoverCallback&&(this.hovered=!1,this.hoverCallback(!1))}}export class NavigatorSourceTreeElement extends UI.TreeOutline.TreeElement{nodeType;node;navigatorView;uiSourceCodeInternal;constructor(e,t,r,i){super("",!1),this.nodeType=Types.File,this.node=i,this.title=r,this.listItemElement.classList.add("navigator-"+t.contentType().name()+"-tree-item","navigator-file-tree-item"),this.tooltip=t.url(),UI.ARIAUtils.setLabel(this.listItemElement,`${t.name()}, ${this.nodeType}`),Common.EventTarget.fireEvent("source-tree-file-added",t.fullDisplayName()),this.navigatorView=e,this.uiSourceCodeInternal=t,this.updateIcon()}updateIcon(){const e=Persistence.Persistence.PersistenceImpl.instance().binding(this.uiSourceCodeInternal);let t="document",r=[];if(e){Snippets.ScriptSnippetFileSystem.isSnippetsUISourceCode(e.fileSystem)&&(t="snippet");r=Persistence.NetworkPersistenceManager.NetworkPersistenceManager.instance().project()===e.fileSystem.project()?["dot","purple"]:["dot","green"]}else this.uiSourceCodeInternal.url().endsWith(Persistence.NetworkPersistenceManager.HEADERS_FILENAME)&&Persistence.NetworkPersistenceManager.NetworkPersistenceManager.instance().hasMatchingNetworkUISourceCodeForHeaderOverridesFile(this.uiSourceCodeInternal)?r=["dot","purple"]:Snippets.ScriptSnippetFileSystem.isSnippetsUISourceCode(this.uiSourceCodeInternal)&&(t="snippet");const i=new IconButton.Icon.Icon,o=new URL(`../../Images/${t}.svg`,import.meta.url).toString();i.data={iconPath:o,color:"var(--override-file-tree-item-color)",width:"20px",height:"20px"};for(const e of r)i.classList.add(e);e&&UI.Tooltip.Tooltip.install(i,Persistence.PersistenceUtils.PersistenceUtils.tooltipForUISourceCode(this.uiSourceCodeInternal)),this.setLeadingIcons([i])}updateAccessibleName(){UI.ARIAUtils.setLabel(this.listItemElement,`${this.uiSourceCodeInternal.name()}, ${this.nodeType}`)}get uiSourceCode(){return this.uiSourceCodeInternal}onattach(){this.listItemElement.draggable=!0,this.listItemElement.addEventListener("click",this.onclick.bind(this),!1),this.listItemElement.addEventListener("contextmenu",this.handleContextMenuEvent.bind(this),!1),this.listItemElement.addEventListener("dragstart",this.ondragstart.bind(this),!1)}shouldRenameOnMouseDown(){if(!this.uiSourceCodeInternal.canRename())return!1;if(!this.treeOutline)return!1;return this===this.treeOutline.selectedTreeElement&&this.treeOutline.element.hasFocus()&&!UI.UIUtils.isBeingEdited(this.treeOutline.element)}selectOnMouseDown(e){1===e.which&&this.shouldRenameOnMouseDown()?window.setTimeout(function(){this.shouldRenameOnMouseDown()&&this.navigatorView.rename(this.node,!1)}.bind(this),300):super.selectOnMouseDown(e)}ondragstart(e){e.dataTransfer&&(e.dataTransfer.setData("text/plain",this.uiSourceCodeInternal.url()),e.dataTransfer.effectAllowed="copy")}onspace(){return this.navigatorView.sourceSelected(this.uiSourceCode,!0),!0}onclick(e){this.navigatorView.sourceSelected(this.uiSourceCode,!1)}ondblclick(e){const t=1===e.button;return this.navigatorView.sourceSelected(this.uiSourceCode,!t),!1}onenter(){return this.navigatorView.sourceSelected(this.uiSourceCode,!0),!0}ondelete(){return!0}handleContextMenuEvent(e){this.select(),this.navigatorView.handleFileContextMenu(e,this.node)}}export class NavigatorTreeNode{id;navigatorView;type;childrenInternal;populated;isMerged;parent;title;tooltip;recursiveProperties;constructor(e,t,r,i){this.id=t,this.navigatorView=e,this.type=r,this.childrenInternal=new Map,this.tooltip=i,this.populated=!1,this.isMerged=!1,this.recursiveProperties={exclusivelySourceMapped:null,exclusivelyIgnored:null,exclusivelyContentScripts:null,exclusivelyThirdParty:null}}treeNode(){throw"Not implemented"}dispose(){}updateTitle(){}updateTitleRecursive(){for(const e of this.children())e.updateTitleRecursive();this.updateTitle()}updateTitleBubbleUp(){this.updateTitle(),this.parent&&this.parent.updateTitleBubbleUp()}isRoot(){return!1}hasChildren(){return!0}onattach(){}setTitle(e){throw"Not implemented"}populate(){this.isPopulated()||(this.parent&&this.parent.populate(),this.populated=!0,this.wasPopulated())}wasPopulated(){const e=this.children();for(let t=0;t<e.length;++t)this.navigatorView.appendChild(this.treeNode(),e[t].treeNode())}didAddChild(e){this.isPopulated()&&this.navigatorView.appendChild(this.treeNode(),e.treeNode())}willRemoveChild(e){this.isPopulated()&&this.navigatorView.removeChild(this.treeNode(),e.treeNode())}isPopulated(){return this.populated}isEmpty(){return!this.childrenInternal.size}children(){return[...this.childrenInternal.values()]}child(e){return this.childrenInternal.get(e)||null}appendChild(e){this.childrenInternal.set(e.id,e),e.parent=this,this.didAddChild(e)}removeChild(e){this.willRemoveChild(e),this.childrenInternal.delete(e.id),e.parent=null,e.dispose()}reset(){this.childrenInternal.clear()}}export class NavigatorRootTreeNode extends NavigatorTreeNode{constructor(e){super(e,"",Types.Root)}isRoot(){return!0}treeNode(){return this.navigatorView.scriptsTree.rootElement()}}export class NavigatorUISourceCodeTreeNode extends NavigatorTreeNode{uiSourceCodeInternal;treeElement;eventListeners;frameInternal;constructor(e,t,r){super(e,"UISourceCode:"+t.canononicalScriptId(),Types.File),this.uiSourceCodeInternal=t,this.treeElement=null,this.eventListeners=[],this.frameInternal=r,this.recursiveProperties.exclusivelySourceMapped=t.contentType().isFromSourceMap(),t.contentType().isScript()&&(this.recursiveProperties.exclusivelyThirdParty=t.isKnownThirdParty(),this.recursiveProperties.exclusivelyContentScripts=t.project().type()===Workspace.Workspace.projectTypes.ContentScripts)}frame(){return this.frameInternal}uiSourceCode(){return this.uiSourceCodeInternal}treeNode(){if(this.treeElement)return this.treeElement;this.treeElement=new NavigatorSourceTreeElement(this.navigatorView,this.uiSourceCodeInternal,"",this),this.updateTitle();const e=this.updateTitle.bind(this,void 0);return this.eventListeners=[this.uiSourceCodeInternal.addEventListener(Workspace.UISourceCode.Events.TitleChanged,e),this.uiSourceCodeInternal.addEventListener(Workspace.UISourceCode.Events.WorkingCopyChanged,e),this.uiSourceCodeInternal.addEventListener(Workspace.UISourceCode.Events.WorkingCopyCommitted,e)],this.treeElement}updateTitle(e){const t=Bindings.IgnoreListManager.IgnoreListManager.instance().isUserOrSourceMapIgnoreListedUISourceCode(this.uiSourceCodeInternal);if((this.uiSourceCodeInternal.contentType().isScript()||t)&&(this.recursiveProperties.exclusivelyIgnored=t),!this.treeElement)return;let r=this.uiSourceCodeInternal.displayName();!e&&this.uiSourceCodeInternal.isDirty()&&(r="*"+r),this.treeElement.title=r,this.treeElement.updateIcon(),this.treeElement.listItemElement.classList.toggle("is-ignore-listed",t);let i=this.uiSourceCodeInternal.url();this.uiSourceCodeInternal.contentType().isFromSourceMap()&&(i=i18nString(UIStrings.sFromSourceMap,{PH1:this.uiSourceCodeInternal.displayName()})),t&&(i=i18nString(UIStrings.sIgnoreListed,{PH1:i})),this.treeElement.tooltip=i,this.treeElement.updateAccessibleName(),this.parent?.childrenInternal.delete(this.id),this.id="UISourceCode:"+this.uiSourceCodeInternal.canononicalScriptId(),this.parent?.childrenInternal.set(this.id,this)}hasChildren(){return!1}dispose(){Common.EventTarget.removeEventListeners(this.eventListeners)}reveal(e){this.parent&&(this.parent.populate(),this.parent.treeNode().expand()),this.treeElement&&(this.treeElement.reveal(!0),e&&this.treeElement.select(!0))}rename(e){if(!this.treeElement)return;if(this.treeElement.listItemElement.focus(),!this.treeElement.treeOutline)return;const t=this.treeElement.treeOutline.element;function r(r){if(!r)return UI.UIUtils.markBeingEdited(t,!1),this.updateTitle(),void this.rename(e);if(this.treeElement){const{parent:e}=this.treeElement;e&&(e.removeChild(this.treeElement),e.appendChild(this.treeElement),this.treeElement.select())}i.call(this,!0)}function i(r){UI.UIUtils.markBeingEdited(t,!1),this.updateTitle(),e&&e(r)}UI.UIUtils.markBeingEdited(t,!0),this.updateTitle(!0),this.treeElement.startEditingTitle(new UI.InplaceEditor.Config(function(e,t,o){if(t!==o)return this.treeElement&&(this.treeElement.title=t),void this.uiSourceCodeInternal.rename(t).then(r.bind(this));i.call(this,!0)}.bind(this),i.bind(this,!1)))}}export class NavigatorFolderTreeNode extends NavigatorTreeNode{project;folderPath;origin;title;treeElement;constructor(e,t,r,i,o,s,n){super(e,r,i),this.project=t,this.folderPath=o,this.title=s,this.origin=n}treeNode(){return this.treeElement||(this.treeElement=this.createTreeElement(this.title,this),this.updateTitle()),this.treeElement}updateTitle(){let e;for(e in this.recursiveProperties){let t=null;for(const r of this.children()){if(!1===r.recursiveProperties[e]){t=!1;break}r.recursiveProperties[e]&&(t=!0)}this.recursiveProperties[e]=t}if(!this.treeElement)return;if(this.treeElement.setFromSourceMap(this.recursiveProperties.exclusivelySourceMapped||!1),this.treeElement.setIgnoreListed(this.recursiveProperties.exclusivelyIgnored||!1),!this.project||this.project.type()!==Workspace.Workspace.projectTypes.FileSystem)return;const t=Common.ParsedURL.ParsedURL.concatenate(Persistence.FileSystemWorkspaceBinding.FileSystemWorkspaceBinding.fileSystemPath(this.project.id()),"/",this.folderPath),r=Persistence.Persistence.PersistenceImpl.instance().filePathHasBindings(t);this.treeElement.listItemElement.classList.toggle("has-mapped-files",r)}createTreeElement(e,t){const r=new NavigatorFolderTreeElement(this.navigatorView,this.type,e);return r.setNode(t),r}wasPopulated(){this.treeElement&&this.treeElement.node===this&&this.addChildrenRecursive()}addChildrenRecursive(){const e=this.children();for(let t=0;t<e.length;++t){const r=e[t];this.didAddChild(r),r instanceof NavigatorFolderTreeNode&&r.addChildrenRecursive()}}shouldMerge(e){return this.type!==Types.Domain&&e instanceof NavigatorFolderTreeNode}didAddChild(e){if(!this.treeElement)return;let t,r=this.children();if(1===r.length&&this.shouldMerge(e))return e.isMerged=!0,this.treeElement.title=this.treeElement.title+"/"+e.title,e.treeElement=this.treeElement,e.updateTitle(),void this.treeElement.setNode(e);if(2===r.length&&(t=r[0]!==e?r[0]:r[1]),t&&t.isMerged){t.isMerged=!1;const e=[];e.push(this);let i=this;for(;i&&i.isMerged;)i=i.parent,i&&e.push(i);e.reverse();const o=e.map((e=>e.title)).join("/"),s=[];i=t;do{s.push(i),r=i.children(),i=1===r.length?r[0]:null}while(i&&i.isMerged);if(!this.isPopulated()){this.treeElement.title=o,this.treeElement.setNode(this);for(let e=0;e<s.length;++e)s[e].treeElement=null,s[e].isMerged=!1;return void this.updateTitle()}const n=this.treeElement,a=this.createTreeElement(o,this);for(let t=0;t<e.length;++t)e[t].treeElement=a,e[t].updateTitle();n.parent&&this.navigatorView.appendChild(n.parent,a),n.setNode(s[s.length-1]),n.title=s.map((e=>e.title)).join("/"),n.parent&&this.navigatorView.removeChild(n.parent,n),this.navigatorView.appendChild(this.treeElement,n),n.expanded&&a.expand(),this.updateTitle()}this.isPopulated()&&this.navigatorView.appendChild(this.treeElement,e.treeNode())}willRemoveChild(e){const t=e;!t.isMerged&&this.isPopulated()&&this.treeElement&&t.treeElement&&this.navigatorView.removeChild(this.treeElement,t.treeElement)}}export class NavigatorGroupTreeNode extends NavigatorTreeNode{project;title;hoverCallback;treeElement;constructor(e,t,r,i,o,s){super(e,r,i,s),this.project=t,this.title=o,this.populate()}setHoverCallback(e){this.hoverCallback=e}treeNode(){return this.treeElement||(this.treeElement=new NavigatorFolderTreeElement(this.navigatorView,this.type,this.title,this.hoverCallback),this.treeElement.setNode(this)),this.treeElement}onattach(){this.updateTitle()}updateTitle(){if(!this.treeElement||!this.project||this.project.type()!==Workspace.Workspace.projectTypes.FileSystem)return;const e=Persistence.FileSystemWorkspaceBinding.FileSystemWorkspaceBinding.fileSystemPath(this.project.id()),t=this.treeElement.listItemElement.classList.contains("has-mapped-files"),r=Persistence.Persistence.PersistenceImpl.instance().filePathHasBindings(e);t!==r&&(this.treeElement.listItemElement.classList.toggle("has-mapped-files",r),this.treeElement.childrenListElement.hasFocus()||(r?this.treeElement.expand():this.treeElement.collapse()))}setTitle(e){this.title=e,this.treeElement&&(this.treeElement.title=this.title)}}