@yuebai008/cli
Version:
Command line interface for rapid qg-minigame development
1 lines • 30.1 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 Logs from"../../models/logs/logs.js";import*as Components from"../../ui/legacy/components/utils/utils.js";import*as UI from"../../ui/legacy/legacy.js";import*as ThemeSupport from"../../ui/legacy/theme_support/theme_support.js";import*as Bindings from"../bindings/bindings.js";import*as HAR from"../har/har.js";import*as Workspace from"../workspace/workspace.js";import{ExtensionButton,ExtensionPanel,ExtensionSidebarPane}from"./ExtensionPanel.js";import{HostUrlPattern}from"./HostUrlPattern.js";import{LanguageExtensionEndpoint}from"./LanguageExtensionEndpoint.js";import{RecorderExtensionEndpoint}from"./RecorderExtensionEndpoint.js";import{RecorderPluginManager}from"./RecorderPluginManager.js";const extensionOrigins=new WeakMap,kAllowedOrigins=[].map((e=>new URL(e).origin));let extensionServerInstance;export class HostsPolicy{runtimeAllowedHosts;runtimeBlockedHosts;static create(e){const t=[],s=[];if(e){for(const s of e.runtimeAllowedHosts){const e=HostUrlPattern.parse(s);if(!e)return null;t.push(e)}for(const t of e.runtimeBlockedHosts){const e=HostUrlPattern.parse(t);if(!e)return null;s.push(e)}}return new HostsPolicy(t,s)}constructor(e,t){this.runtimeAllowedHosts=e,this.runtimeBlockedHosts=t}isAllowedOnURL(e){return e?!(this.runtimeBlockedHosts.some((t=>t.matchesUrl(e)))&&!this.runtimeAllowedHosts.some((t=>t.matchesUrl(e)))):0===this.runtimeBlockedHosts.length}}class RegisteredExtension{name;hostsPolicy;allowFileAccess;constructor(e,t,s){this.name=e,this.hostsPolicy=t,this.allowFileAccess=s}isAllowedOnTarget(e){if(e||(e=SDK.TargetManager.TargetManager.instance().primaryPageTarget()?.inspectedURL()),!e)return!1;if(!ExtensionServer.canInspectURL(e))return!1;if(!this.hostsPolicy.isAllowedOnURL(e))return!1;if(!this.allowFileAccess){let t;try{t=new URL(e)}catch(e){return!1}return"file:"!==t.protocol}return!0}}export class ExtensionServer extends Common.ObjectWrapper.ObjectWrapper{clientObjects;handlers;subscribers;subscriptionStartHandlers;subscriptionStopHandlers;extraHeaders;requests;requestIds;lastRequestId;registeredExtensions;status;sidebarPanesInternal;extensionsEnabled;inspectedTabId;extensionAPITestHook;themeChangeHandlers=new Map;#e=[];constructor(){super(),this.clientObjects=new Map,this.handlers=new Map,this.subscribers=new Map,this.subscriptionStartHandlers=new Map,this.subscriptionStopHandlers=new Map,this.extraHeaders=new Map,this.requests=new Map,this.requestIds=new Map,this.lastRequestId=0,this.registeredExtensions=new Map,this.status=new ExtensionStatus,this.sidebarPanesInternal=[],this.extensionsEnabled=!0,this.registerHandler("addRequestHeaders",this.onAddRequestHeaders.bind(this)),this.registerHandler("applyStyleSheet",this.onApplyStyleSheet.bind(this)),this.registerHandler("createPanel",this.onCreatePanel.bind(this)),this.registerHandler("createSidebarPane",this.onCreateSidebarPane.bind(this)),this.registerHandler("createToolbarButton",this.onCreateToolbarButton.bind(this)),this.registerHandler("evaluateOnInspectedPage",this.onEvaluateOnInspectedPage.bind(this)),this.registerHandler("_forwardKeyboardEvent",this.onForwardKeyboardEvent.bind(this)),this.registerHandler("getHAR",this.onGetHAR.bind(this)),this.registerHandler("getPageResources",this.onGetPageResources.bind(this)),this.registerHandler("getRequestContent",this.onGetRequestContent.bind(this)),this.registerHandler("getResourceContent",this.onGetResourceContent.bind(this)),this.registerHandler("Reload",this.onReload.bind(this)),this.registerHandler("setOpenResourceHandler",this.onSetOpenResourceHandler.bind(this)),this.registerHandler("setThemeChangeHandler",this.onSetThemeChangeHandler.bind(this)),this.registerHandler("setResourceContent",this.onSetResourceContent.bind(this)),this.registerHandler("setSidebarHeight",this.onSetSidebarHeight.bind(this)),this.registerHandler("setSidebarContent",this.onSetSidebarContent.bind(this)),this.registerHandler("setSidebarPage",this.onSetSidebarPage.bind(this)),this.registerHandler("showPanel",this.onShowPanel.bind(this)),this.registerHandler("subscribe",this.onSubscribe.bind(this)),this.registerHandler("openResource",this.onOpenResource.bind(this)),this.registerHandler("unsubscribe",this.onUnsubscribe.bind(this)),this.registerHandler("updateButton",this.onUpdateButton.bind(this)),this.registerHandler("registerLanguageExtensionPlugin",this.registerLanguageExtensionEndpoint.bind(this)),this.registerHandler("getWasmLinearMemory",this.onGetWasmLinearMemory.bind(this)),this.registerHandler("getWasmGlobal",this.onGetWasmGlobal.bind(this)),this.registerHandler("getWasmLocal",this.onGetWasmLocal.bind(this)),this.registerHandler("getWasmOp",this.onGetWasmOp.bind(this)),this.registerHandler("registerRecorderExtensionPlugin",this.registerRecorderExtensionEndpoint.bind(this)),this.registerHandler("createRecorderView",this.onCreateRecorderView.bind(this)),this.registerHandler("showRecorderView",this.onShowRecorderView.bind(this)),window.addEventListener("message",this.onWindowMessage,!1);const e=window.DevToolsAPI&&window.DevToolsAPI.getInspectedTabId&&window.DevToolsAPI.getInspectedTabId();e&&this.setInspectedTabId({data:e}),Host.InspectorFrontendHost.InspectorFrontendHostInstance.events.addEventListener(Host.InspectorFrontendHostAPI.Events.SetInspectedTabId,this.setInspectedTabId,this),this.initExtensions(),ThemeSupport.ThemeSupport.instance().addEventListener(ThemeSupport.ThemeChangeEvent.eventName,this.#t)}dispose(){ThemeSupport.ThemeSupport.instance().removeEventListener(ThemeSupport.ThemeChangeEvent.eventName,this.#t),SDK.TargetManager.TargetManager.instance().removeEventListener(SDK.TargetManager.Events.InspectedURLChanged,this.inspectedURLChanged,this),Host.InspectorFrontendHost.InspectorFrontendHostInstance.events.removeEventListener(Host.InspectorFrontendHostAPI.Events.SetInspectedTabId,this.setInspectedTabId,this),window.removeEventListener("message",this.onWindowMessage,!1)}#t=()=>{const e=ThemeSupport.ThemeSupport.instance().themeName();for(const t of this.themeChangeHandlers.values())t.postMessage({command:"host-theme-change",themeName:e})};static instance(e={forceNew:null}){const{forceNew:t}=e;return extensionServerInstance&&!t||(extensionServerInstance?.dispose(),extensionServerInstance=new ExtensionServer),extensionServerInstance}initializeExtensions(){null!==this.inspectedTabId&&Host.InspectorFrontendHost.InspectorFrontendHostInstance.setAddExtensionCallback(this.addExtension.bind(this))}hasExtensions(){return Boolean(this.registeredExtensions.size)}notifySearchAction(e,t,s){this.postNotification("panel-search-"+e,t,s)}notifyViewShown(e,t){this.postNotification("view-shown-"+e,t)}notifyViewHidden(e){this.postNotification("view-hidden,"+e)}notifyButtonClicked(e){this.postNotification("button-clicked-"+e)}registerLanguageExtensionEndpoint(e,t){if("registerLanguageExtensionPlugin"!==e.command)return this.status.E_BADARG("command","expected registerLanguageExtensionPlugin");const{pluginManager:s}=Bindings.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding.instance();if(!s)return this.status.E_FAILED("WebAssembly DWARF support needs to be enabled to use this extension");const{pluginName:n,port:i,supportedScriptTypes:{language:r,symbol_types:o}}=e,a=Array.isArray(o)&&o.every((e=>"string"==typeof e))?o:[],c=new LanguageExtensionEndpoint(n,{language:r,symbol_types:a},i);return s.addPlugin(c),this.status.OK()}async loadWasmValue(e,t){const{pluginManager:s}=Bindings.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding.instance();if(!s)return this.status.E_FAILED("WebAssembly DWARF support needs to be enabled to use this extension");const n=s.callFrameForStopId(t);if(!n)return this.status.E_BADARG("stopId","Unknown stop id");const i=await n.debuggerModel.agent.invoke_evaluateOnCallFrame({callFrameId:n.id,expression:e,silent:!0,returnByValue:!0,throwOnSideEffect:!0});return i.exceptionDetails||i.getError()?this.status.E_FAILED("Failed"):i.result.value}async onGetWasmLinearMemory(e){return"getWasmLinearMemory"!==e.command?this.status.E_BADARG("command","expected getWasmLinearMemory"):await this.loadWasmValue(`[].slice.call(new Uint8Array(memories[0].buffer, ${Number(e.offset)}, ${Number(e.length)}))`,e.stopId)}async onGetWasmGlobal(e){return"getWasmGlobal"!==e.command?this.status.E_BADARG("command","expected getWasmGlobal"):this.loadWasmValue(`globals[${Number(e.global)}]`,e.stopId)}async onGetWasmLocal(e){return"getWasmLocal"!==e.command?this.status.E_BADARG("command","expected getWasmLocal"):this.loadWasmValue(`locals[${Number(e.local)}]`,e.stopId)}async onGetWasmOp(e){return"getWasmOp"!==e.command?this.status.E_BADARG("command","expected getWasmOp"):this.loadWasmValue(`stack[${Number(e.op)}]`,e.stopId)}registerRecorderExtensionEndpoint(e,t){if("registerRecorderExtensionPlugin"!==e.command)return this.status.E_BADARG("command","expected registerRecorderExtensionPlugin");const{pluginName:s,mediaType:n,port:i,capabilities:r}=e;return RecorderPluginManager.instance().addPlugin(new RecorderExtensionEndpoint(s,i,r,n)),this.status.OK()}onShowRecorderView(e){if("showRecorderView"!==e.command)return this.status.E_BADARG("command","expected showRecorderView");RecorderPluginManager.instance().showView(e.id)}onCreateRecorderView(e,t){if("createRecorderView"!==e.command)return this.status.E_BADARG("command","expected createRecorderView");const s=e.id;if(this.clientObjects.has(s))return this.status.E_EXISTS(s);const n=ExtensionServer.expandResourcePath(this.getExtensionOrigin(t),e.pagePath);if(void 0===n)return this.status.E_BADARG("pagePath","Resources paths cannot point to non-extension resources");return RecorderPluginManager.instance().registerView({id:s,pagePath:n,title:e.title,onShown:()=>this.notifyViewShown(s),onHidden:()=>this.notifyViewHidden(s)}),this.status.OK()}inspectedURLChanged(e){if(!ExtensionServer.canInspectURL(e.data.inspectedURL()))return void this.disableExtensions();if(e.data!==SDK.TargetManager.TargetManager.instance().primaryPageTarget())return;this.requests=new Map;const t=e.data.inspectedURL();this.postNotification("inspected-url-changed",t),this.#e.forEach((e=>this.addExtension(e))),this.#e.splice(0)}hasSubscribers(e){return this.subscribers.has(e)}postNotification(e,...t){if(!this.extensionsEnabled)return;const s=this.subscribers.get(e);if(!s)return;const n={command:"notify-"+e,arguments:Array.prototype.slice.call(arguments,1)};for(const e of s)this.extensionEnabled(e)&&e.postMessage(n)}onSubscribe(e,t){if("subscribe"!==e.command)return this.status.E_BADARG("command","expected subscribe");const s=this.subscribers.get(e.type);if(s)s.add(t);else{this.subscribers.set(e.type,new Set([t]));const s=this.subscriptionStartHandlers.get(e.type);s&&s()}}onUnsubscribe(e,t){if("unsubscribe"!==e.command)return this.status.E_BADARG("command","expected unsubscribe");const s=this.subscribers.get(e.type);if(s&&(s.delete(t),!s.size)){this.subscribers.delete(e.type);const t=this.subscriptionStopHandlers.get(e.type);t&&t()}}onAddRequestHeaders(e){if("addRequestHeaders"!==e.command)return this.status.E_BADARG("command","expected addRequestHeaders");const t=e.extensionId;if("string"!=typeof t)return this.status.E_BADARGTYPE("extensionId",typeof t,"string");let s=this.extraHeaders.get(t);s||(s=new Map,this.extraHeaders.set(t,s));for(const t in e.headers)s.set(t,e.headers[t]);const n={};for(const e of this.extraHeaders.values())for(const[t,s]of e)"__proto__"!==t&&"string"==typeof s&&(n[t]=s);SDK.NetworkManager.MultitargetNetworkManager.instance().setExtraHTTPHeaders(n)}onApplyStyleSheet(e){if("applyStyleSheet"!==e.command)return this.status.E_BADARG("command","expected applyStyleSheet");if(!Root.Runtime.experiments.isEnabled("applyCustomStylesheet"))return;const t=document.createElement("style");t.textContent=e.styleSheet,document.head.appendChild(t),ThemeSupport.ThemeSupport.instance().addCustomStylesheet(e.styleSheet);for(let e=document.body;e;e=e.traverseNextNode(document.body))e instanceof ShadowRoot&&ThemeSupport.ThemeSupport.instance().injectCustomStyleSheets(e)}getExtensionOrigin(e){const t=extensionOrigins.get(e);if(!t)throw new Error("Received a message from an unregistered extension");return t}onCreatePanel(e,t){if("createPanel"!==e.command)return this.status.E_BADARG("command","expected createPanel");const s=e.id;if(this.clientObjects.has(s)||UI.InspectorView.InspectorView.instance().hasPanel(s))return this.status.E_EXISTS(s);const n=ExtensionServer.expandResourcePath(this.getExtensionOrigin(t),e.page);if(void 0===n)return this.status.E_BADARG("page","Resources paths cannot point to non-extension resources");let i=this.getExtensionOrigin(t)+e.title;i=i.replace(/\s/g,"");const r=new ExtensionServerPanelView(i,i18n.i18n.lockedString(e.title),new ExtensionPanel(this,i,s,n));return this.clientObjects.set(s,r),UI.InspectorView.InspectorView.instance().addPanel(r),this.status.OK()}onShowPanel(e){if("showPanel"!==e.command)return this.status.E_BADARG("command","expected showPanel");let t=e.id;const s=this.clientObjects.get(e.id);s&&s instanceof ExtensionServerPanelView&&(t=s.viewId()),UI.InspectorView.InspectorView.instance().showPanel(t)}onCreateToolbarButton(e,t){if("createToolbarButton"!==e.command)return this.status.E_BADARG("command","expected createToolbarButton");const s=this.clientObjects.get(e.panel);if(!(s&&s instanceof ExtensionServerPanelView))return this.status.E_NOTFOUND(e.panel);const n=ExtensionServer.expandResourcePath(this.getExtensionOrigin(t),e.icon);if(void 0===n)return this.status.E_BADARG("icon","Resources paths cannot point to non-extension resources");const i=new ExtensionButton(this,e.id,n,e.tooltip,e.disabled);return this.clientObjects.set(e.id,i),s.widget().then((function(e){e.addToolbarItem(i.toolbarButton())})),this.status.OK()}onUpdateButton(e,t){if("updateButton"!==e.command)return this.status.E_BADARG("command","expected updateButton");const s=this.clientObjects.get(e.id);if(!(s&&s instanceof ExtensionButton))return this.status.E_NOTFOUND(e.id);const n=e.icon&&ExtensionServer.expandResourcePath(this.getExtensionOrigin(t),e.icon);return e.icon&&void 0===n?this.status.E_BADARG("icon","Resources paths cannot point to non-extension resources"):(s.update(n,e.tooltip,e.disabled),this.status.OK())}onCreateSidebarPane(e){if("createSidebarPane"!==e.command)return this.status.E_BADARG("command","expected createSidebarPane");const t=e.id,s=new ExtensionSidebarPane(this,e.panel,i18n.i18n.lockedString(e.title),t);return this.sidebarPanesInternal.push(s),this.clientObjects.set(t,s),this.dispatchEventToListeners(Events.SidebarPaneAdded,s),this.status.OK()}sidebarPanes(){return this.sidebarPanesInternal}onSetSidebarHeight(e){if("setSidebarHeight"!==e.command)return this.status.E_BADARG("command","expected setSidebarHeight");const t=this.clientObjects.get(e.id);return t&&t instanceof ExtensionSidebarPane?(t.setHeight(e.height),this.status.OK()):this.status.E_NOTFOUND(e.id)}onSetSidebarContent(e,t){if("setSidebarContent"!==e.command)return this.status.E_BADARG("command","expected setSidebarContent");const{requestId:s,id:n,rootTitle:i,expression:r,evaluateOptions:o,evaluateOnPage:a}=e,c=this.clientObjects.get(n);if(!(c&&c instanceof ExtensionSidebarPane))return this.status.E_NOTFOUND(e.id);function d(e){const n=e?this.status.E_FAILED(e):this.status.OK();this.dispatchCallback(s,t,n)}a?c.setExpression(r,i,o,this.getExtensionOrigin(t),d.bind(this)):c.setObject(e.expression,e.rootTitle,d.bind(this))}onSetSidebarPage(e,t){if("setSidebarPage"!==e.command)return this.status.E_BADARG("command","expected setSidebarPage");const s=this.clientObjects.get(e.id);if(!(s&&s instanceof ExtensionSidebarPane))return this.status.E_NOTFOUND(e.id);const n=ExtensionServer.expandResourcePath(this.getExtensionOrigin(t),e.page);if(void 0===n)return this.status.E_BADARG("page","Resources paths cannot point to non-extension resources");s.setPage(n)}onOpenResource(e){if("openResource"!==e.command)return this.status.E_BADARG("command","expected openResource");const t=Workspace.Workspace.WorkspaceImpl.instance().uiSourceCodeForURL(e.url);if(t)return Common.Revealer.reveal(t.uiLocation(e.lineNumber,e.columnNumber)),this.status.OK();const s=Bindings.ResourceUtils.resourceForURL(e.url);if(s)return Common.Revealer.reveal(s),this.status.OK();const n=Logs.NetworkLog.NetworkLog.instance().requestForURL(e.url);return n?(Common.Revealer.reveal(n),this.status.OK()):this.status.E_NOTFOUND(e.url)}onSetOpenResourceHandler(e,t){if("setOpenResourceHandler"!==e.command)return this.status.E_BADARG("command","expected setOpenResourceHandler");const s=this.registeredExtensions.get(this.getExtensionOrigin(t));if(!s)throw new Error("Received a message from an unregistered extension");const{name:n}=s;e.handlerPresent?Components.Linkifier.Linkifier.registerLinkHandler(n,this.handleOpenURL.bind(this,t)):Components.Linkifier.Linkifier.unregisterLinkHandler(n)}onSetThemeChangeHandler(e,t){if("setThemeChangeHandler"!==e.command)return this.status.E_BADARG("command","expected setThemeChangeHandler");const s=this.getExtensionOrigin(t);if(!this.registeredExtensions.get(s))throw new Error("Received a message from an unregistered extension");e.handlerPresent?this.themeChangeHandlers.set(s,t):this.themeChangeHandlers.delete(s)}handleOpenURL(e,t,s){e.postMessage({command:"open-resource",resource:this.makeResource(t),lineNumber:s+1})}onReload(e){if("Reload"!==e.command)return this.status.E_BADARG("command","expected Reload");const t=e.options||{};let s;return SDK.NetworkManager.MultitargetNetworkManager.instance().setUserAgentOverride("string"==typeof t.userAgent?t.userAgent:"",null),t.injectedScript&&(s="(function(){"+t.injectedScript+"})()"),SDK.ResourceTreeModel.ResourceTreeModel.reloadAllPages(Boolean(t.ignoreCache),s),this.status.OK()}onEvaluateOnInspectedPage(e,t){if("evaluateOnInspectedPage"!==e.command)return this.status.E_BADARG("command","expected evaluateOnInspectedPage");const{requestId:s,expression:n,evaluateOptions:i}=e;return this.evaluate(n,!0,!0,i,this.getExtensionOrigin(t),function(e,n,i){let r;r=e||!n?this.status.E_PROTOCOLERROR(e?.toString()):i?{isException:!0,value:n.description}:{value:n.value},this.dispatchCallback(s,t,r)}.bind(this))}async onGetHAR(e){if("getHAR"!==e.command)return this.status.E_BADARG("command","expected getHAR");const t=Logs.NetworkLog.NetworkLog.instance().requests(),s=await HAR.Log.Log.build(t);for(let e=0;e<s.entries.length;++e)s.entries[e]._requestId=this.requestId(t[e]);return s}makeResource(e){return{url:e.contentURL(),type:e.contentType().name()}}onGetPageResources(){const e=new Map;function t(t){return e.has(t.contentURL())||e.set(t.contentURL(),this.makeResource(t)),!1}let s=Workspace.Workspace.WorkspaceImpl.instance().uiSourceCodesForProjectType(Workspace.Workspace.projectTypes.Network);s=s.concat(Workspace.Workspace.WorkspaceImpl.instance().uiSourceCodesForProjectType(Workspace.Workspace.projectTypes.ContentScripts)),s.forEach(t.bind(this));for(const e of SDK.TargetManager.TargetManager.instance().models(SDK.ResourceTreeModel.ResourceTreeModel))e.forAllResources(t.bind(this));return[...e.values()]}async getResourceContent(e,t,s){const n=e.contentURL(),i=extensionOrigins.get(s),r=i&&this.registeredExtensions.get(i);if(!r?.isAllowedOnTarget(n))return void this.dispatchCallback(t.requestId,s,this.status.E_FAILED("Permission denied"));const{content:o,isEncoded:a}=await e.requestContent();this.dispatchCallback(t.requestId,s,{encoding:a?"base64":"",content:o})}onGetRequestContent(e,t){if("getRequestContent"!==e.command)return this.status.E_BADARG("command","expected getRequestContent");const s=this.requestById(e.id);if(!s)return this.status.E_NOTFOUND(e.id);this.getResourceContent(s,e,t)}onGetResourceContent(e,t){if("getResourceContent"!==e.command)return this.status.E_BADARG("command","expected getResourceContent");const s=e.url,n=Workspace.Workspace.WorkspaceImpl.instance().uiSourceCodeForURL(s)||Bindings.ResourceUtils.resourceForURL(s);if(!n)return this.status.E_NOTFOUND(s);this.getResourceContent(n,e,t)}onSetResourceContent(e,t){if("setResourceContent"!==e.command)return this.status.E_BADARG("command","expected setResourceContent");const{url:s,requestId:n,content:i,commit:r}=e;const o=extensionOrigins.get(t),a=o&&this.registeredExtensions.get(o);if(!a?.isAllowedOnTarget(s))return this.status.E_FAILED("Permission denied");const c=Workspace.Workspace.WorkspaceImpl.instance().uiSourceCodeForURL(s);if(!c||!c.contentType().isDocumentOrScriptOrStyleSheet()){return SDK.ResourceTreeModel.ResourceTreeModel.resourceForURL(s)?this.status.E_NOTSUPPORTED("Resource is not editable"):this.status.E_NOTFOUND(s)}c.setWorkingCopy(i),r&&c.commitWorkingCopy(),function(e){const s=e?this.status.E_FAILED(e):this.status.OK();this.dispatchCallback(n,t,s)}.call(this,null)}requestId(e){const t=this.requestIds.get(e);if(void 0===t){const t=++this.lastRequestId;return this.requestIds.set(e,t),this.requests.set(t,e),t}return t}requestById(e){return this.requests.get(e)}onForwardKeyboardEvent(e){if("_forwardKeyboardEvent"!==e.command)return this.status.E_BADARG("command","expected _forwardKeyboardEvent");e.entries.forEach((function(e){const t=new window.KeyboardEvent(e.eventType,{key:e.key,code:e.code,keyCode:e.keyCode,location:e.location,ctrlKey:e.ctrlKey,altKey:e.altKey,shiftKey:e.shiftKey,metaKey:e.metaKey});t.__keyCode=function(e){let t=e.keyCode;t||e.key===Platform.KeyboardUtilities.ESCAPE_KEY&&(t=27);return t||0}(e),document.dispatchEvent(t)}))}dispatchCallback(e,t,s){e&&t.postMessage({command:"callback",requestId:e,result:s})}initExtensions(){this.registerAutosubscriptionHandler("resource-added",Workspace.Workspace.WorkspaceImpl.instance(),Workspace.Workspace.Events.UISourceCodeAdded,this.notifyResourceAdded),this.registerAutosubscriptionTargetManagerHandler("network-request-finished",SDK.NetworkManager.NetworkManager,SDK.NetworkManager.Events.RequestFinished,this.notifyRequestFinished),this.registerSubscriptionHandler("panel-objectSelected-elements",function(){UI.Context.Context.instance().addFlavorChangeListener(SDK.DOMModel.DOMNode,this.notifyElementsSelectionChanged,this)}.bind(this),function(){UI.Context.Context.instance().removeFlavorChangeListener(SDK.DOMModel.DOMNode,this.notifyElementsSelectionChanged,this)}.bind(this)),this.registerResourceContentCommittedHandler(this.notifyUISourceCodeContentCommitted),SDK.TargetManager.TargetManager.instance().addEventListener(SDK.TargetManager.Events.InspectedURLChanged,this.inspectedURLChanged,this)}notifyResourceAdded(e){const t=e.data;this.postNotification("resource-added",this.makeResource(t))}notifyUISourceCodeContentCommitted(e){const{uiSourceCode:t,content:s}=e.data;this.postNotification("resource-content-committed",this.makeResource(t),s)}async notifyRequestFinished(e){const t=e.data,s=await HAR.Log.Entry.build(t);this.postNotification("network-request-finished",this.requestId(t),s)}notifyElementsSelectionChanged(){this.postNotification("panel-objectSelected-elements")}sourceSelectionChanged(e,t){this.postNotification("panel-objectSelected-sources",{startLine:t.startLine,startColumn:t.startColumn,endLine:t.endLine,endColumn:t.endColumn,url:e})}setInspectedTabId(e){const t=this.inspectedTabId;this.inspectedTabId=e.data,null===t&&this.initializeExtensions()}addExtensionFrame({startPage:e,name:t}){const s=document.createElement("iframe");s.src=e,s.dataset.devtoolsExtension=t,s.style.display="none",document.body.appendChild(s)}addExtension(e){const t=e.startPage,s=SDK.TargetManager.TargetManager.instance().primaryPageTarget()?.inspectedURL()??"";if(""===s)return void this.#e.push(e);if(ExtensionServer.canInspectURL(s)||this.disableExtensions(),!this.extensionsEnabled)return;const n=HostsPolicy.create(e.hostsPolicy);if(n){try{const i=new URL(t).origin,r=e.name||`Extension ${i}`,o=new RegisteredExtension(r,n,Boolean(e.allowFileAccess));if(!o.isAllowedOnTarget(s))return;if(!this.registeredExtensions.get(i)){const t=self.buildExtensionAPIInjectedScript(e,this.inspectedTabId,ThemeSupport.ThemeSupport.instance().themeName(),UI.ShortcutRegistry.ShortcutRegistry.instance().globalShortcutKeys(),ExtensionServer.instance().extensionAPITestHook);Host.InspectorFrontendHost.InspectorFrontendHostInstance.setInjectedScriptForOrigin(i,t),this.registeredExtensions.set(i,o)}this.addExtensionFrame(e)}catch(e){return console.error("Failed to initialize extension "+t+":"+e),!1}return!0}}registerExtension(e,t){this.registeredExtensions.has(e)?(extensionOrigins.set(t,e),t.addEventListener("message",this.onmessage.bind(this),!1),t.start()):e!==window.location.origin&&console.error("Ignoring unauthorized client request from "+e)}onWindowMessage=e=>{"registerExtension"===e.data&&this.registerExtension(e.origin,e.ports[0])};extensionEnabled(e){if(!this.extensionsEnabled)return!1;const t=extensionOrigins.get(e);if(!t)return!1;const s=this.registeredExtensions.get(t);return!!s&&s.isAllowedOnTarget()}async onmessage(e){const t=e.data;let s;const n=e.currentTarget,i=this.handlers.get(t.command);s=i?this.extensionEnabled(n)?await i(t,e.target):this.status.E_FAILED("Permission denied"):this.status.E_NOTSUPPORTED(t.command),s&&t.requestId&&this.dispatchCallback(t.requestId,e.target,s)}registerHandler(e,t){console.assert(Boolean(e)),this.handlers.set(e,t)}registerSubscriptionHandler(e,t,s){this.subscriptionStartHandlers.set(e,t),this.subscriptionStopHandlers.set(e,s)}registerAutosubscriptionHandler(e,t,s,n){this.registerSubscriptionHandler(e,(()=>t.addEventListener(s,n,this)),(()=>t.removeEventListener(s,n,this)))}registerAutosubscriptionTargetManagerHandler(e,t,s,n){this.registerSubscriptionHandler(e,(()=>SDK.TargetManager.TargetManager.instance().addModelListener(t,s,n,this)),(()=>SDK.TargetManager.TargetManager.instance().removeModelListener(t,s,n,this)))}registerResourceContentCommittedHandler(e){this.registerSubscriptionHandler("resource-content-committed",function(){Workspace.Workspace.WorkspaceImpl.instance().addEventListener(Workspace.Workspace.Events.WorkingCopyCommittedByUser,e,this),Workspace.Workspace.WorkspaceImpl.instance().setHasResourceContentTrackingExtensions(!0)}.bind(this),function(){Workspace.Workspace.WorkspaceImpl.instance().setHasResourceContentTrackingExtensions(!1),Workspace.Workspace.WorkspaceImpl.instance().removeEventListener(Workspace.Workspace.Events.WorkingCopyCommittedByUser,e,this)}.bind(this))}static expandResourcePath(e,t){const s=new URL(e).origin,n=new URL(Common.ParsedURL.normalizePath(t),s);if(n.origin===s)return n.href}evaluate(e,t,s,n,i,r){let o,a;if((n=n||{}).frameURL)a=function(e){let t=null;return SDK.ResourceTreeModel.ResourceTreeModel.frames().some((function(s){return t=s.url===e?s:null,t})),t}(n.frameURL);else{const e=SDK.TargetManager.TargetManager.instance().primaryPageTarget(),t=e&&e.model(SDK.ResourceTreeModel.ResourceTreeModel);a=t&&t.mainFrame}if(!a)return n.frameURL?console.warn("evaluate: there is no frame with URL "+n.frameURL):console.warn("evaluate: the main frame is not yet available"),this.status.E_NOTFOUND(n.frameURL||"<top>");const c=this.registeredExtensions.get(i);if(!c?.isAllowedOnTarget(a.url))return this.status.E_FAILED("Permission denied");let d;n.useContentScriptContext?d=i:n.scriptExecutionContext&&(d=n.scriptExecutionContext);const u=a.resourceTreeModel().target().model(SDK.RuntimeModel.RuntimeModel),l=u?u.executionContexts():[];if(d){for(let e=0;e<l.length;++e){const t=l[e];t.frameId!==a.id||t.origin!==d||t.isDefault||(o=t)}if(!o)return console.warn("The JavaScript context "+d+" was not found in the frame "+a.url),this.status.E_NOTFOUND(d)}else{for(let e=0;e<l.length;++e){const t=l[e];t.frameId===a.id&&t.isDefault&&(o=t)}if(!o)return this.status.E_FAILED(a.url+" has no execution context")}if(!c?.isAllowedOnTarget(o.origin))return this.status.E_FAILED("Permission denied");o.evaluate({expression:e,objectGroup:"extension",includeCommandLineAPI:t,silent:!0,returnByValue:s,generatePreview:!1},!1,!1).then((function(e){if("error"in e)return void r(e.error,null,!1);r(null,e.object||null,Boolean(e.exceptionDetails))}))}static canInspectURL(e){let t;try{t=new URL(e)}catch(e){return!1}return!!kAllowedOrigins.includes(t.origin)||"chrome:"!==t.protocol&&"devtools:"!==t.protocol&&"chrome-untrusted:"!==t.protocol&&((!t.protocol.startsWith("http")||"chrome.google.com"!==t.hostname||!t.pathname.startsWith("/webstore"))&&((!t.protocol.startsWith("http")||"chromewebstore.google.com"!==t.hostname)&&!(window.DevToolsAPI&&window.DevToolsAPI.getOriginsForbiddenForExtensions&&window.DevToolsAPI.getOriginsForbiddenForExtensions()||[]).includes(t.origin)))}disableExtensions(){this.extensionsEnabled=!1}}export var Events;!function(e){e.SidebarPaneAdded="SidebarPaneAdded",e.TraceProviderAdded="TraceProviderAdded"}(Events||(Events={}));class ExtensionServerPanelView extends UI.View.SimpleView{name;panel;constructor(e,t,s){super(t),this.name=e,this.panel=s}viewId(){return this.name}widget(){return Promise.resolve(this.panel)}}export class ExtensionStatus{OK;E_EXISTS;E_BADARG;E_BADARGTYPE;E_NOTFOUND;E_NOTSUPPORTED;E_PROTOCOLERROR;E_FAILED;constructor(){function e(e,t,...s){const n={code:e,description:t,details:s};return"OK"!==e&&(n.isError=!0,console.error("Extension server error: "+Platform.StringUtilities.sprintf(t,...s))),n}this.OK=e.bind(null,"OK","OK"),this.E_EXISTS=e.bind(null,"E_EXISTS","Object already exists: %s"),this.E_BADARG=e.bind(null,"E_BADARG","Invalid argument %s: %s"),this.E_BADARGTYPE=e.bind(null,"E_BADARGTYPE","Invalid type for argument %s: got %s, expected %s"),this.E_NOTFOUND=e.bind(null,"E_NOTFOUND","Object not found: %s"),this.E_NOTSUPPORTED=e.bind(null,"E_NOTSUPPORTED","Object does not support requested operation: %s"),this.E_PROTOCOLERROR=e.bind(null,"E_PROTOCOLERROR","Inspector protocol error: %s"),this.E_FAILED=e.bind(null,"E_FAILED","Operation failed: %s")}}