@react-native/debugger-frontend
Version:
Debugger frontend for React Native based on Chrome DevTools
49 lines (48 loc) • 29.5 kB
JavaScript
import*as e from"../../core/sdk/sdk.js";import*as t from"../../core/common/common.js";import*as n from"../../core/host/host.js";import*as o from"../../core/i18n/i18n.js";import*as i from"../../core/platform/platform.js";import*as s from"../../core/protocol_client/protocol_client.js";import*as r from"../../core/rn_experiments/rn_experiments.js";import*as a from"../../core/root/root.js";import*as c from"../../models/autofill_manager/autofill_manager.js";import*as l from"../../models/bindings/bindings.js";import*as d from"../../models/breakpoints/breakpoints.js";import*as g from"../../models/crux-manager/crux-manager.js";import*as m from"../../models/extensions/extensions.js";import*as p from"../../models/issues_manager/issues_manager.js";import*as u from"../../models/live-metrics/live-metrics.js";import*as h from"../../models/logs/logs.js";import*as f from"../../models/persistence/persistence.js";import*as w from"../../models/project_settings/project_settings.js";import*as v from"../../models/workspace/workspace.js";import*as x from"../../panels/snippets/snippets.js";import"../../ui/components/buttons/buttons.js";import*as b from"../../ui/components/icon_button/icon_button.js";import*as I from"../../ui/legacy/components/utils/utils.js";import*as S from"../../ui/legacy/legacy.js";import*as M from"../../ui/legacy/theme_support/theme_support.js";import{render as k,html as C}from"../../ui/lit/lit.js";import*as T from"../../ui/visual_logging/visual_logging.js";class R{#e;#t;#n;#o;constructor(t,n){n.addFlavorChangeListener(e.RuntimeModel.ExecutionContext,this.#i,this),n.addFlavorChangeListener(e.Target.Target,this.#s,this),t.addModelListener(e.RuntimeModel.RuntimeModel,e.RuntimeModel.Events.ExecutionContextCreated,this.#r,this),t.addModelListener(e.RuntimeModel.RuntimeModel,e.RuntimeModel.Events.ExecutionContextDestroyed,this.#a,this),t.addModelListener(e.RuntimeModel.RuntimeModel,e.RuntimeModel.Events.ExecutionContextOrderChanged,this.#c,this),this.#e=t,this.#t=n,t.observeModels(e.RuntimeModel.RuntimeModel,this)}modelAdded(t){queueMicrotask(function(){this.#t.flavor(e.Target.Target)||this.#t.setFlavor(e.Target.Target,t.target())}.bind(this))}modelRemoved(t){const n=this.#t.flavor(e.RuntimeModel.ExecutionContext);n&&n.runtimeModel===t&&this.#l();const o=this.#e.models(e.RuntimeModel.RuntimeModel);this.#t.flavor(e.Target.Target)===t.target()&&o.length&&this.#t.setFlavor(e.Target.Target,o[0].target())}#i({data:t}){t&&(this.#t.setFlavor(e.Target.Target,t.target()),this.#o||(this.#n=this.#d(t)))}#d(e){return e.isDefault?e.target().name()+":"+e.frameId:""}#s({data:t}){const n=this.#t.flavor(e.RuntimeModel.ExecutionContext);if(!t||n&&n.target()===t)return;const o=t.model(e.RuntimeModel.RuntimeModel),i=o?o.executionContexts():[];if(!i.length)return;let s=null;for(let e=0;e<i.length&&!s;++e)this.#g(i[e])&&(s=i[e]);for(let e=0;e<i.length&&!s;++e)this.#m(i[e])&&(s=i[e]);this.#o=!0,this.#t.setFlavor(e.RuntimeModel.ExecutionContext,s||i[0]),this.#o=!1}#g(e){return!e.target().targetInfo()?.subtype&&(!(!this.#n||this.#n!==this.#d(e))||!this.#n&&this.#m(e))}#m(t){if(!t.isDefault||!t.frameId)return!1;if(t.target().parentTarget()?.type()===e.Target.Type.FRAME)return!1;const n=t.target().model(e.ResourceTreeModel.ResourceTreeModel),o=n?.frameForId(t.frameId);return Boolean(o?.isOutermostFrame())}#r(t){if(void 0!==this.#n)switch(t.data.target().type()){case e.Target.Type.AUCTION_WORKLET:case e.Target.Type.SHARED_STORAGE_WORKLET:case e.Target.Type.SHARED_WORKER:case e.Target.Type.ServiceWorker:case e.Target.Type.WORKLET:case e.Target.Type.Worker:return;case e.Target.Type.BROWSER:case e.Target.Type.FRAME:case e.Target.Type.NODE:case e.Target.Type.TAB:this.#p(t.data)}else this.#p(t.data)}#a(t){const n=t.data;this.#t.flavor(e.RuntimeModel.ExecutionContext)===n&&this.#l()}#c(e){const t=e.data.executionContexts();for(let e=0;e<t.length&&!this.#p(t[e]);e++);}#p(t){return!(this.#t.flavor(e.RuntimeModel.ExecutionContext)&&!this.#g(t))&&(this.#o=!0,this.#t.setFlavor(e.RuntimeModel.ExecutionContext,t),this.#o=!1,!0)}#l(){const t=this.#e.models(e.RuntimeModel.RuntimeModel);let n=null;for(let e=0;e<t.length&&!n;++e){const o=t[e].executionContexts();for(const e of o)if(this.#m(e)){n=e;break}}if(!n)for(let e=0;e<t.length&&!n;++e){const o=t[e].executionContexts();if(o.length){n=o[0];break}}this.#o=!0,this.#t.setFlavor(e.RuntimeModel.ExecutionContext,n),this.#o=!1}}var y=Object.freeze({__proto__:null,ExecutionContextSelector:R});const E={customizeAndControlDevtools:"Customize and control DevTools",dockSide:"Dock side",placementOfDevtoolsRelativeToThe:"Placement of DevTools relative to the page. ({PH1} to restore last position)",undockIntoSeparateWindow:"Undock into separate window",dockToBottom:"Dock to bottom",dockToRight:"Dock to right",dockToLeft:"Dock to left",focusDebuggee:"Focus page",hideConsoleDrawer:"Hide console drawer",showConsoleDrawer:"Show console drawer",moreTools:"More tools",help:"Help",dockSideNaviation:"Use left and right arrow keys to navigate the options"},F=o.i18n.registerUIStrings("entrypoints/main/MainImpl.ts",E),P=o.i18n.getLocalizedString.bind(void 0,F);class A{#u=Promise.withResolvers();constructor(){A.instanceForTest=this,this.#h()}static time(e){n.InspectorFrontendHost.isUnderTest()||console.time(e)}static timeEnd(e){n.InspectorFrontendHost.isUnderTest()||console.timeEnd(e)}async#h(){console.timeStamp("Main._loaded"),a.Runtime.Runtime.setPlatform(n.Platform.platform());const[e,o]=await Promise.all([new Promise((e=>{n.InspectorFrontendHost.InspectorFrontendHostInstance.getHostConfig(e)})),new Promise((e=>n.InspectorFrontendHost.InspectorFrontendHostInstance.getPreferences(e)))]);console.timeStamp("Main._gotPreferences"),this.#f(),Object.assign(a.Runtime.hostConfig,e),this.createSettings(o),await this.requestAndRegisterLocaleData(),n.userMetrics.syncSetting(t.Settings.Settings.instance().moduleSetting("sync-preferences").get());const i=e.devToolsVeLogging;if(i?.enabled)if(i?.testing){T.setVeDebugLoggingEnabled(!0,"Test");const e={processingThrottler:new t.Throttler.Throttler(0),keyboardLogThrottler:new t.Throttler.Throttler(10),hoverLogThrottler:new t.Throttler.Throttler(50),dragLogThrottler:new t.Throttler.Throttler(50),clickLogThrottler:new t.Throttler.Throttler(10),resizeLogThrottler:new t.Throttler.Throttler(10)};T.startLogging(e)}else T.startLogging();this.#w()}#f(){self.Extensions||={},self.Host||={},self.Host.userMetrics||=n.userMetrics,self.Host.UserMetrics||=n.UserMetrics,self.ProtocolClient||={},self.ProtocolClient.test||=s.InspectorBackend.test}async requestAndRegisterLocaleData(){const e=t.Settings.Settings.instance().moduleSetting("language").get(),i=o.DevToolsLocale.DevToolsLocale.instance({create:!0,data:{navigatorLanguage:navigator.language,settingLanguage:e,lookupClosestDevToolsLocale:o.i18n.lookupClosestSupportedDevToolsLocale}});n.userMetrics.language(i.locale),"en-US"!==i.locale&&await o.i18n.fetchAndRegisterLocaleData("en-US");try{await o.i18n.fetchAndRegisterLocaleData(i.locale)}catch(e){console.warn(`Unable to fetch & register locale data for '${i.locale}', falling back to 'en-US'. Cause: `,e),i.forceFallbackLocale()}}createSettings(e){this.#v();let o,i="";if(n.Platform.isCustomDevtoolsFrontend()?i="__custom__":a.Runtime.Runtime.queryParam("can_dock")||!Boolean(a.Runtime.Runtime.queryParam("debugFrontend"))||n.InspectorFrontendHost.isUnderTest()||(i="__bundled__"),!n.InspectorFrontendHost.isUnderTest()&&window.localStorage){const e={...t.Settings.NOOP_STORAGE,clear:()=>window.localStorage.clear()};o=new t.Settings.SettingsStorage(window.localStorage,e,i)}else o=new t.Settings.SettingsStorage({},t.Settings.NOOP_STORAGE,i);const s={register:e=>n.InspectorFrontendHost.InspectorFrontendHostInstance.registerPreference(e,{synced:!1}),set:n.InspectorFrontendHost.InspectorFrontendHostInstance.setPreference,get:e=>new Promise((t=>{n.InspectorFrontendHost.InspectorFrontendHostInstance.getPreference(e,t)})),remove:n.InspectorFrontendHost.InspectorFrontendHostInstance.removePreference,clear:n.InspectorFrontendHost.InspectorFrontendHostInstance.clearPreferences},r={...s,register:e=>n.InspectorFrontendHost.InspectorFrontendHostInstance.registerPreference(e,{synced:!0})},c=new t.Settings.SettingsStorage(e,r,i),l=new t.Settings.SettingsStorage(e,s,i);t.Settings.Settings.instance({forceNew:!0,syncedStorage:c,globalStorage:l,localStorage:o,logSettingAccess:T.logSettingAccess}),n.InspectorFrontendHost.isUnderTest()||(new t.Settings.VersionController).updateVersion()}#v(){a.Runtime.experiments.register("capture-node-creation-stacks","Capture node creation stacks"),a.Runtime.experiments.register("live-heap-profile","Live heap profile",!0),a.Runtime.experiments.register("protocol-monitor","Protocol Monitor",void 0,"https://developer.chrome.com/blog/new-in-devtools-92/#protocol-monitor"),a.Runtime.experiments.register("sampling-heap-profiler-timeline","Sampling heap profiler timeline",!0),a.Runtime.experiments.register("show-option-tp-expose-internals-in-heap-snapshot","Show option to expose internals in heap snapshots"),a.Runtime.experiments.register("timeline-invalidation-tracking","Performance panel: invalidation tracking",!0),a.Runtime.experiments.register("timeline-show-all-events","Performance panel: show all events",!0),a.Runtime.experiments.register("timeline-v8-runtime-call-stats","Performance panel: V8 runtime call stats",!0),a.Runtime.experiments.register("timeline-enhanced-traces","Performance panel: Enable collecting enhanced traces",!0),a.Runtime.experiments.register("timeline-compiled-sources","Performance panel: Enable collecting source text for compiled script",!0),a.Runtime.experiments.register("timeline-debug-mode","Performance panel: Enable debug mode (trace event details, etc)",!0),a.Runtime.experiments.register("instrumentation-breakpoints","Enable instrumentation breakpoints",!0),a.Runtime.experiments.register("use-source-map-scopes","Use scope information from source maps",!0),a.Runtime.experiments.register("apca","Enable new Advanced Perceptual Contrast Algorithm (APCA) replacing previous contrast ratio and AA/AAA guidelines",void 0,"https://developer.chrome.com/blog/new-in-devtools-89/#apca"),a.Runtime.experiments.register("full-accessibility-tree","Enable full accessibility tree view in the Elements panel",void 0,"https://developer.chrome.com/blog/new-in-devtools-90/#accesibility-tree","https://g.co/devtools/a11y-tree-feedback"),a.Runtime.experiments.register("font-editor","Enable new font editor within the Styles tab",void 0,"https://developer.chrome.com/blog/new-in-devtools-89/#font"),a.Runtime.experiments.register("contrast-issues","Enable automatic contrast issue reporting via the Issues panel",void 0,"https://developer.chrome.com/blog/new-in-devtools-90/#low-contrast"),a.Runtime.experiments.register("experimental-cookie-features","Enable experimental cookie features"),a.Runtime.experiments.register("highlight-errors-elements-panel","Highlights a violating node or attribute in the Elements panel DOM tree"),a.Runtime.experiments.register("authored-deployed-grouping","Group sources into authored and deployed trees",void 0,"https://goo.gle/authored-deployed","https://goo.gle/authored-deployed-feedback"),a.Runtime.experiments.register("just-my-code","Hide ignore-listed code in Sources tree view"),a.Runtime.experiments.register("network-panel-filter-bar-redesign","Redesign of the filter bar in the Network panel",!1,"https://goo.gle/devtools-network-filter-redesign","https://crbug.com/1500573"),a.Runtime.experiments.register("timeline-show-postmessage-events","Performance panel: show postMessage dispatch and handling flows"),a.Runtime.experiments.register("timeline-experimental-insights","Performance panel: enable experimental performance insights"),a.Runtime.experiments.register("timeline-dim-unrelated-events","Performance panel: enable dimming unrelated events in performance insights and search results"),a.Runtime.experiments.register("timeline-alternative-navigation","Performance panel: enable a switch to an alternative timeline navigation option"),r.RNExperimentsImpl.Instance.copyInto(a.Runtime.experiments,"[React Native] "),a.Runtime.experiments.enableExperimentsByDefault(["network-panel-filter-bar-redesign","timeline-alternative-navigation","timeline-dim-unrelated-events","full-accessibility-tree",...a.Runtime.Runtime.queryParam("isChromeForTesting")?["protocol-monitor"]:[]]),a.Runtime.experiments.cleanUpStaleExperiments();const e=a.Runtime.Runtime.queryParam("enabledExperiments");if(e&&a.Runtime.experiments.setServerEnabledExperiments(e.split(";")),a.Runtime.experiments.enableExperimentsTransiently([]),n.InspectorFrontendHost.isUnderTest()){const e=a.Runtime.Runtime.queryParam("test");e?.includes("live-line-level-heap-profile.js")&&a.Runtime.experiments.enableForTest("live-heap-profile")}for(const e of a.Runtime.experiments.allConfigurableExperiments())e.isEnabled()?n.userMetrics.experimentEnabledAtLaunch(e.name):n.userMetrics.experimentDisabledAtLaunch(e.name)}async#w(){A.time("Main._createAppUI"),f.IsolatedFileSystemManager.IsolatedFileSystemManager.instance();const o=t.Settings.Settings.instance().createSetting("ui-theme","systemPreferred");S.UIUtils.initializeUIUtils(document),M.ThemeSupport.hasInstance()||M.ThemeSupport.instance({forceNew:!0,setting:o}),S.UIUtils.addPlatformClass(document.documentElement),S.UIUtils.installComponentRootStyles(document.body),this.#x(document);const i=Boolean(a.Runtime.Runtime.queryParam("can_dock"));S.ZoomManager.ZoomManager.instance({forceNew:!0,win:window,frontendHost:n.InspectorFrontendHost.InspectorFrontendHostInstance}),S.ContextMenu.ContextMenu.initialize(),S.ContextMenu.ContextMenu.installHandler(document),h.NetworkLog.NetworkLog.instance(),e.FrameManager.FrameManager.instance(),h.LogManager.LogManager.instance(),p.IssuesManager.IssuesManager.instance({forceNew:!0,ensureFirst:!0,showThirdPartyIssuesSetting:p.Issue.getShowThirdPartyIssuesSetting(),hideIssueSetting:p.IssuesManager.getHideIssueByCodeSetting()}),p.ContrastCheckTrigger.ContrastCheckTrigger.instance(),S.DockController.DockController.instance({forceNew:!0,canDock:i}),e.NetworkManager.MultitargetNetworkManager.instance({forceNew:!0}),e.DOMDebuggerModel.DOMDebuggerManager.instance({forceNew:!0});const s=e.TargetManager.TargetManager.instance();s.addEventListener("SuspendStateChanged",this.#b.bind(this)),v.FileManager.FileManager.instance({forceNew:!0}),v.Workspace.WorkspaceImpl.instance(),l.NetworkProject.NetworkProjectManager.instance();const r=new l.ResourceMapping.ResourceMapping(s,v.Workspace.WorkspaceImpl.instance());new l.PresentationConsoleMessageHelper.PresentationConsoleMessageManager,l.CSSWorkspaceBinding.CSSWorkspaceBinding.instance({forceNew:!0,resourceMapping:r,targetManager:s}),l.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding.instance({forceNew:!0,resourceMapping:r,targetManager:s}),s.setScopeTarget(s.primaryPageTarget()),S.Context.Context.instance().addFlavorChangeListener(e.Target.Target,(({data:e})=>{const t=e?.outermostTarget();s.setScopeTarget(t)})),d.BreakpointManager.BreakpointManager.instance({forceNew:!0,workspace:v.Workspace.WorkspaceImpl.instance(),targetManager:s,debuggerWorkspaceBinding:l.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding.instance()}),self.Extensions.extensionServer=m.ExtensionServer.ExtensionServer.instance({forceNew:!0}),new f.FileSystemWorkspaceBinding.FileSystemWorkspaceBinding(f.IsolatedFileSystemManager.IsolatedFileSystemManager.instance(),v.Workspace.WorkspaceImpl.instance()),f.IsolatedFileSystemManager.IsolatedFileSystemManager.instance().addPlatformFileSystem("snippet://",new x.ScriptSnippetFileSystem.SnippetFileSystem),f.Persistence.PersistenceImpl.instance({forceNew:!0,workspace:v.Workspace.WorkspaceImpl.instance(),breakpointManager:d.BreakpointManager.BreakpointManager.instance()}),f.NetworkPersistenceManager.NetworkPersistenceManager.instance({forceNew:!0,workspace:v.Workspace.WorkspaceImpl.instance()}),new R(s,S.Context.Context.instance()),l.IgnoreListManager.IgnoreListManager.instance({forceNew:!0,debuggerWorkspaceBinding:l.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding.instance()});const b=w.ProjectSettingsModel.ProjectSettingsModel.instance({forceNew:!0,hostConfig:a.Runtime.hostConfig,pageResourceLoader:e.PageResourceLoader.PageResourceLoader.instance(),targetManager:s});f.AutomaticFileSystemManager.AutomaticFileSystemManager.instance({forceNew:!0,hostConfig:a.Runtime.hostConfig,inspectorFrontendHost:n.InspectorFrontendHost.InspectorFrontendHostInstance,projectSettingsModel:b}),c.AutofillManager.AutofillManager.instance(),u.LiveMetrics.instance(),g.CrUXManager.instance(),new N;const I=S.ActionRegistry.ActionRegistry.instance({forceNew:!0});S.ShortcutRegistry.ShortcutRegistry.instance({forceNew:!0,actionRegistry:I}),this.#I(),A.timeEnd("Main._createAppUI");const k=t.AppProvider.getRegisteredAppProviders()[0];if(!k)throw new Error("Unable to boot DevTools, as the appprovider is missing");await this.#S(await k.loadAppProvider())}async#S(e){A.time("Main._showAppUI");const t=e.createApp();if(S.DockController.DockController.instance().initialize(),M.ThemeSupport.instance().fetchColorsAndApplyHostTheme(),t.presentUI(document),S.ActionRegistry.ActionRegistry.instance().hasAction("elements.toggle-element-search")){const e=S.ActionRegistry.ActionRegistry.instance().getAction("elements.toggle-element-search");n.InspectorFrontendHost.InspectorFrontendHostInstance.events.addEventListener(n.InspectorFrontendHostAPI.Events.EnterInspectElementMode,(()=>{e.execute()}),this)}n.InspectorFrontendHost.InspectorFrontendHostInstance.events.addEventListener(n.InspectorFrontendHostAPI.Events.RevealSourceLine,this.#M,this),await S.InspectorView.InspectorView.instance().createToolbars(),n.InspectorFrontendHost.InspectorFrontendHostInstance.loadCompleted();const o=a.Runtime.Runtime.queryParam("loadTimelineFromURL");if(null!==o){(await import("../../panels/timeline/timeline.js")).TimelinePanel.LoadTimelineHandler.instance().handleQueryParam(o)}else{"timeline"===a.Runtime.Runtime.queryParam("panel")&&await import("../../panels/timeline/timeline.js")}S.ARIAUtils.getOrCreateAlertElements(),S.DockController.DockController.instance().announceDockLocation(),window.setTimeout(this.#k.bind(this),0),A.timeEnd("Main._showAppUI")}async#k(){A.time("Main._initializeTarget");for(const e of t.Runnable.earlyInitializationRunnables())await e().run();n.InspectorFrontendHost.InspectorFrontendHostInstance.readyForTest(),this.#u.resolve(),window.setTimeout(this.#C.bind(this),100),await this.#T(),A.timeEnd("Main._initializeTarget")}async#T(){const n=e.TargetManager.TargetManager.instance().primaryPageTarget(),o=n?.targetInfo()?.url,i=o?t.ParsedURL.ParsedURL.extractOrigin(o):void 0,s="__devtools_ve_inspection_binding__";if(n&&await T.isUnderInspection(i)){const t=n.model(e.RuntimeModel.RuntimeModel);await(t?.addBinding({name:s})),t?.addEventListener(e.RuntimeModel.Events.BindingCalled,(e=>{e.data.name===s&&T.setVeDebuggingEnabled("true"===e.data.payload,(e=>{T.setVeDebuggingEnabled(!1),t?.defaultExecutionContext()?.evaluate({expression:`window.inspect(${JSON.stringify(e)})`,includeCommandLineAPI:!1,silent:!0,returnByValue:!1,generatePreview:!1},!1,!1)}))}))}}async#C(){A.time("Main._lateInitialization"),m.ExtensionServer.ExtensionServer.instance().initializeExtensions();const e=t.Runnable.lateInitializationRunnables().map((async e=>{const t=await e();return await t.run()}));if(a.Runtime.experiments.isEnabled("live-heap-profile")){const n=await import("../../ui/legacy/components/perf_ui/perf_ui.js"),o="memory-live-heap-profile";if(t.Settings.Settings.instance().moduleSetting(o).get())e.push(n.LiveHeapProfile.LiveHeapProfile.instance().run());else{const e=async i=>{i.data&&(t.Settings.Settings.instance().moduleSetting(o).removeChangeListener(e),n.LiveHeapProfile.LiveHeapProfile.instance().run())};t.Settings.Settings.instance().moduleSetting(o).addChangeListener(e)}}A.timeEnd("Main._lateInitialization")}readyForTest(){return this.#u.promise}#I(){t.Console.Console.instance().addEventListener("messageAdded",(function({data:e}){e.show&&t.Console.Console.instance().show()}))}#M(e){const{url:n,lineNumber:o,columnNumber:i}=e.data,s=v.Workspace.WorkspaceImpl.instance().uiSourceCodeForURL(n);s?t.Revealer.reveal(s.uiLocation(o,i)):v.Workspace.WorkspaceImpl.instance().addEventListener(v.Workspace.Events.UISourceCodeAdded,(function e(s){const r=s.data;r.url()===n&&(t.Revealer.reveal(r.uiLocation(o,i)),v.Workspace.WorkspaceImpl.instance().removeEventListener(v.Workspace.Events.UISourceCodeAdded,e))}))}#R(e){e.handled||S.ShortcutRegistry.ShortcutRegistry.instance().handleShortcut(e)}#y(e){const t=new CustomEvent("clipboard-"+e.type,{bubbles:!0});t.original=e;const n=e.target&&e.target.ownerDocument,o=n?i.DOMUtilities.deepActiveElement(n):null;o&&o.dispatchEvent(t),t.handled&&e.preventDefault()}#E(e){(e.handled||e.target.classList.contains("popup-glasspane"))&&e.preventDefault()}#x(e){e.addEventListener("keydown",this.#R.bind(this),!1),e.addEventListener("beforecopy",this.#y.bind(this),!0),e.addEventListener("copy",this.#y.bind(this),!1),e.addEventListener("cut",this.#y.bind(this),!1),e.addEventListener("paste",this.#y.bind(this),!1),e.addEventListener("contextmenu",this.#E.bind(this),!0)}#b(){const t=e.TargetManager.TargetManager.instance().allTargetsSuspended();S.InspectorView.InspectorView.instance().onSuspendStateChanged(t)}static instanceForTest=null}globalThis.Main=globalThis.Main||{},globalThis.Main.Main=A;let L,D;class H{#F;constructor(){this.#F=new S.Toolbar.ToolbarMenuButton(this.#P.bind(this),!0,!0,"main-menu","dots-vertical"),this.#F.element.classList.add("main-menu"),this.#F.setTitle(P(E.customizeAndControlDevtools))}static instance(e={forceNew:null}){const{forceNew:t}=e;return L&&!t||(L=new H),L}item(){return this.#F}#P(t){const o=S.DockController.DockController.instance();if(o.canDock()){const e=document.createElement("div");e.classList.add("flex-auto","flex-centered","location-menu"),e.setAttribute("jslog",`${T.item("dock-side").track({keydown:"ArrowDown|ArrowLeft|ArrowRight"})}`),e.tabIndex=-1,S.ARIAUtils.setLabel(e,E.dockSide+E.dockSideNaviation);const[n]=S.ShortcutRegistry.ShortcutRegistry.instance().shortcutsForAction("main.toggle-dock");k(C`
<span class="dockside-title"
title=${P(E.placementOfDevtoolsRelativeToThe,{PH1:n.title()})}>
${P(E.dockSide)}
</span>
<devtools-toolbar =${e=>e.consume()}>
<devtools-button class="toolbar-button"
jslog=${T.toggle().track({click:!0}).context("current-dock-state-undock")}
title=${P(E.undockIntoSeparateWindow)}
aria-label=${P(E.undockIntoSeparateWindow)}
.iconName=${"dock-window"}
.toggled=${"undocked"===o.dockSide()}
.toggledIconName=${"dock-window"}
.toggleType=${"primary-toggle"}
.variant=${"icon_toggle"}
=${r.bind(null,"undocked")}></devtools-button>
<devtools-button class="toolbar-button"
jslog=${T.toggle().track({click:!0}).context("current-dock-state-left")}
title=${P(E.dockToLeft)}
aria-label=${P(E.dockToLeft)}
.iconName=${"dock-left"}
.toggled=${"left"===o.dockSide()}
.toggledIconName=${"dock-left"}
.toggleType=${"primary-toggle"}
.variant=${"icon_toggle"}
=${r.bind(null,"left")}></devtools-button>
<devtools-button class="toolbar-button"
jslog=${T.toggle().track({click:!0}).context("current-dock-state-bottom")}
title=${P(E.dockToBottom)}
aria-label=${P(E.dockToBottom)}
.iconName=${"dock-bottom"}
.toggled=${"bottom"===o.dockSide()}
.toggledIconName=${"dock-bottom"}
.toggleType=${"primary-toggle"}
.variant=${"icon_toggle"}
=${r.bind(null,"bottom")}></devtools-button>
<devtools-button class="toolbar-button"
jslog=${T.toggle().track({click:!0}).context("current-dock-state-right")}
title=${P(E.dockToRight)}
aria-label=${P(E.dockToRight)}
.iconName=${"dock-right"}
.toggled=${"right"===o.dockSide()}
.toggledIconName=${"dock-right"}
.toggleType=${"primary-toggle"}
.variant=${"icon_toggle"}
=${r.bind(null,"right")}></devtools-button>
</devtools-toolbar>
`,e,{host:this}),e.addEventListener("keydown",(t=>{let n=0;if("ArrowLeft"===t.key)n=-1;else{if("ArrowRight"!==t.key){if("ArrowDown"===t.key){const t=e.closest(".soft-context-menu");return void t?.dispatchEvent(new KeyboardEvent("keydown",{key:"ArrowDown"}))}return}n=1}const o=Array.from(e.querySelectorAll("devtools-button"));let s=o.findIndex((e=>e.hasFocus()));s=i.NumberUtilities.clamp(s+n,0,o.length-1),o[s].focus(),t.consume(!0)})),t.headerSection().appendCustomItem(e,"dock-side")}const s=this.#F.element;function r(e){o.once("AfterDockSideChanged").then((()=>s.focus())),o.setDockSide(e),t.discard()}if("undocked"===o.dockSide()){const n=e.TargetManager.TargetManager.instance().primaryPageTarget();n&&n.type()===e.Target.Type.FRAME&&t.defaultSection().appendAction("inspector-main.focus-debuggee",P(E.focusDebuggee))}t.defaultSection().appendAction("main.toggle-drawer",S.InspectorView.InspectorView.instance().drawerVisible()?P(E.hideConsoleDrawer):P(E.showConsoleDrawer)),t.appendItemsAtLocation("mainMenu");const a=t.defaultSection().appendSubMenuItem(P(E.moreTools),!1,"more-tools"),c=S.ViewManager.getRegisteredViewExtensions();c.sort(((e,t)=>{const n=e.title(),o=t.title();return n.localeCompare(o)}));for(const e of c){const t=e.location(),o=e.persistence(),i=e.title(),s=e.viewId();if("issues-pane"!==s){if("closeable"===o&&("drawer-view"===t||"panel"===t))if(e.isPreviewFeature()){const e=b.Icon.create("experiment");a.defaultSection().appendItem(i,(()=>{S.ViewManager.ViewManager.instance().showView(s,!0,!1)}),{disabled:!1,additionalElement:e,jslogContext:s})}else a.defaultSection().appendItem(i,(()=>{S.ViewManager.ViewManager.instance().showView(s,!0,!1)}),{jslogContext:s})}else a.defaultSection().appendItem(i,(()=>{n.userMetrics.issuesPanelOpenedFrom(3),S.ViewManager.ViewManager.instance().showView("issues-pane",!0)}),{jslogContext:s})}t.footerSection().appendSubMenuItem(P(E.help),!1,"help").appendItemsAtLocation("mainMenuHelp")}}class _{#A;constructor(){this.#A=S.Toolbar.Toolbar.createActionButton("settings.show")}static instance(e={forceNew:null}){const{forceNew:t}=e;return D&&!t||(D=new _),D}item(){return this.#A}}class N{constructor(){e.TargetManager.TargetManager.instance().addModelListener(e.DebuggerModel.DebuggerModel,e.DebuggerModel.Events.DebuggerPaused,this.#L,this)}#L(n){e.TargetManager.TargetManager.instance().removeModelListener(e.DebuggerModel.DebuggerModel,e.DebuggerModel.Events.DebuggerPaused,this.#L,this);const o=n.data,i=o.debuggerPausedDetails();S.Context.Context.instance().setFlavor(e.Target.Target,o.target()),t.Revealer.reveal(i)}}var j=Object.freeze({__proto__:null,MainImpl:A,MainMenuItem:H,PauseListener:N,ReloadActionDelegate:class{handleAction(e,t){return"main.debug-reload"===t&&(I.Reload.reload(),!0)}},SearchActionDelegate:class{handleAction(e,t){let n=S.SearchableView.SearchableView.fromElement(i.DOMUtilities.deepActiveElement(document));if(!n){const e=S.InspectorView.InspectorView.instance().currentPanelDeprecated();if(e?.searchableView&&(n=e.searchableView()),!n)return!1}switch(t){case"main.search-in-panel.find":return n.handleFindShortcut();case"main.search-in-panel.cancel":return n.handleCancelSearchShortcut();case"main.search-in-panel.find-next":return n.handleFindNextShortcut();case"main.search-in-panel.find-previous":return n.handleFindPreviousShortcut()}return!1}},SettingsButtonProvider:_,ZoomActionDelegate:class{handleAction(e,t){if(n.InspectorFrontendHost.InspectorFrontendHostInstance.isHostedMode())return!1;switch(t){case"main.zoom-in":return n.InspectorFrontendHost.InspectorFrontendHostInstance.zoomIn(),!0;case"main.zoom-out":return n.InspectorFrontendHost.InspectorFrontendHostInstance.zoomOut(),!0;case"main.zoom-reset":return n.InspectorFrontendHost.InspectorFrontendHostInstance.resetZoom(),!0}return!1}},sendOverProtocol:function(e,t){return new Promise(((n,o)=>{const i=s.InspectorBackend.test.sendRawMessage;if(!i)return o("Unable to send message to test client");i(e,t,((e,...t)=>e?o(e):n(t)))}))}});class U{presentUI(e){const t=new S.RootView.RootView;S.InspectorView.InspectorView.instance().show(t.element),t.attachToDocument(e),t.focus()}}let W;class ${static instance(e={forceNew:null}){const{forceNew:t}=e;return W&&!t||(W=new $),W}createApp(){return new U}}var B=Object.freeze({__proto__:null,SimpleApp:U,SimpleAppProvider:$});export{y as ExecutionContextSelector,j as MainImpl,B as SimpleApp};