@react-native/debugger-frontend
Version:
Debugger frontend for React Native based on Chrome DevTools
1 lines • 248 kB
JavaScript
import*as e from"../../core/common/common.js";import*as t from"../../core/host/host.js";import*as i from"../../core/i18n/i18n.js";import*as s from"../../core/platform/platform.js";import{assertNotNullOrUndefined as r}from"../../core/platform/platform.js";import*as o from"../../core/sdk/sdk.js";import*as a from"../../models/issues_manager/issues_manager.js";import*as n from"../../ui/components/icon_button/icon_button.js";import*as d from"../../ui/components/legacy_wrapper/legacy_wrapper.js";import*as l from"../../ui/legacy/components/source_frame/source_frame.js";import*as c from"../../ui/legacy/legacy.js";import*as h from"../../ui/components/buttons/buttons.js";import*as g from"../../ui/legacy/components/inline_editor/inline_editor.js";import*as u from"../../ui/legacy/components/utils/utils.js";import*as p from"../../ui/visual_logging/visual_logging.js";import*as m from"./components/components.js";import{StorageMetadataView as v}from"./components/components.js";import*as w from"../../models/bindings/bindings.js";import*as S from"../../ui/legacy/components/data_grid/data_grid.js";import"../../ui/components/report_view/report_view.js";import*as b from"../../ui/legacy/components/object_ui/object_ui.js";import*as y from"../../ui/lit/lit.js";import{render as k,html as f,Directives as I,nothing as C}from"../../ui/lit/lit.js";import*as T from"./preloading/components/components.js";import*as x from"../../models/text_utils/text_utils.js";import*as E from"../network/components/components.js";import*as M from"../network/network.js";import*as R from"../../models/logs/logs.js";import*as L from"../network/forward/forward.js";import*as A from"../mobile_throttling/mobile_throttling.js";import*as B from"../../ui/legacy/components/perf_ui/perf_ui.js";import*as P from"../../ui/legacy/components/cookie_table/cookie_table.js";import*as D from"../../third_party/json5/json5.js";class F extends c.TreeOutline.TreeElement{resourcesPanel;constructor(e,t,i,s){super(t,i,s),this.resourcesPanel=e,c.ARIAUtils.setLabel(this.listItemElement,t),this.listItemElement.tabIndex=-1}deselect(){super.deselect(),this.listItemElement.tabIndex=-1}get itemURL(){throw new Error("Unimplemented Method")}onselect(e){if(!e)return!1;const t=[];for(let e=this;e;e=e.parent){const i=e instanceof F&&e.itemURL;if(!i)break;t.push(i)}return this.resourcesPanel.setLastSelectedItemPath(t),!1}showView(e){this.resourcesPanel.showView(e)}}class O extends F{expandedSetting;categoryName;categoryLink;emptyCategoryHeadline;categoryDescription;constructor(t,i,s,r,o,a=!1){super(t,i,!1,o),this.expandedSetting=e.Settings.Settings.instance().createSetting("resources-"+o+"-expanded",a),this.categoryName=i,this.categoryLink=null,this.emptyCategoryHeadline=s,this.categoryDescription=r}get itemURL(){return"category://"+this.categoryName}setLink(e){this.categoryLink=e}onselect(e){return super.onselect(e),this.updateCategoryView(),!1}updateCategoryView(){const e=0===this.childCount()?this.emptyCategoryHeadline:this.categoryName;this.resourcesPanel.showCategoryView(this.categoryName,e,this.categoryDescription,this.categoryLink)}appendChild(e,t){super.appendChild(e,t),this.selected&&1===this.childCount()&&this.updateCategoryView()}removeChild(e){super.removeChild(e),this.selected&&0===this.childCount()&&this.updateCategoryView()}onattach(){super.onattach(),this.expandedSetting.get()&&this.expand()}onexpand(){this.expandedSetting.set(!0)}oncollapse(){this.expandedSetting.set(!1)}}var V={cssText:`.report-field-name{flex-basis:152px}.manifest-view-header{min-width:600px;flex-shrink:0;flex-grow:0}.manifest-container{overflow:auto}.inline-icon{width:16px;height:16px;margin-inline:var(--sys-size-3);&[name="check-circle"]{color:var(--icon-checkmark-green)}}.multiline-value{padding-top:var(--sys-size-5);white-space:normal}select{margin:4px}.inline-button{vertical-align:sub}\n/*# sourceURL=${import.meta.resolve("./appManifestView.css")} */\n`};const U={errorsAndWarnings:"Errors and warnings",installability:"Installability",identity:"Identity",presentation:"Presentation",protocolHandlers:"Protocol Handlers",icons:"Icons",windowControlsOverlay:"Window Controls Overlay",name:"Name",shortName:"Short name",url:"URL",computedAppId:"Computed App ID",appIdExplainer:"This is used by the browser to know whether the manifest should be updating an existing application, or whether it refers to a new web app that can be installed.",learnMore:"Learn more",appIdNote:"Note: `id` is not specified in the manifest, `start_url` is used instead. To specify an App ID that matches the current identity, set the `id` field to {PH1} {PH2}.",copyToClipboard:"Copy suggested ID to clipboard",copiedToClipboard:"Copied suggested ID {PH1} to clipboard",description:"Description",startUrl:"Start URL",themeColor:"Theme color",backgroundColor:"Background color",orientation:"Orientation",display:"Display",newNoteUrl:"New note URL",descriptionMayBeTruncated:"Description may be truncated.",shortcutsMayBeNotAvailable:"The maximum number of shortcuts is platform dependent. Some shortcuts may be not available.",showOnlyTheMinimumSafeAreaFor:"Show only the minimum safe area for maskable icons",documentationOnMaskableIcons:"documentation on maskable icons",needHelpReadOurS:"Need help? Read the {PH1}.",shortcutS:"Shortcut #{PH1}",shortcutSShouldIncludeAXPixel:"Shortcut #{PH1} should include a 96×96 pixel icon",screenshotS:"Screenshot #{PH1}",pageIsNotLoadedInTheMainFrame:"Page is not loaded in the main frame",pageIsNotServedFromASecureOrigin:"Page is not served from a secure origin",pageHasNoManifestLinkUrl:"Page has no manifest <link> `URL`",manifestCouldNotBeFetchedIsEmpty:"Manifest could not be fetched, is empty, or could not be parsed",manifestStartUrlIsNotValid:"Manifest '`start_url`' is not valid",manifestDoesNotContainANameOr:"Manifest does not contain a '`name`' or '`short_name`' field",manifestDisplayPropertyMustBeOne:"Manifest '`display`' property must be one of '`standalone`', '`fullscreen`', or '`minimal-ui`'",manifestDoesNotContainASuitable:"Manifest does not contain a suitable icon—PNG, SVG, or WebP format of at least {PH1}px is required, the '`sizes`' attribute must be set, and the '`purpose`' attribute, if set, must include '`any`'.",avoidPurposeAnyAndMaskable:"Declaring an icon with '`purpose`' of '`any maskable`' is discouraged. It is likely to look incorrect on some platforms due to too much or too little padding.",noSuppliedIconIsAtLeastSpxSquare:"No supplied icon is at least {PH1} pixels square in `PNG`, `SVG`, or `WebP` format, with the purpose attribute unset or set to '`any`'.",couldNotDownloadARequiredIcon:"Could not download a required icon from the manifest",downloadedIconWasEmptyOr:"Downloaded icon was empty or corrupted",theSpecifiedApplicationPlatform:"The specified application platform is not supported on Android",noPlayStoreIdProvided:"No Play store ID provided",thePlayStoreAppUrlAndPlayStoreId:"The Play Store app URL and Play Store ID do not match",theAppIsAlreadyInstalled:"The app is already installed",aUrlInTheManifestContainsA:"A URL in the manifest contains a username, password, or port",pageIsLoadedInAnIncognitoWindow:"Page is loaded in an incognito window",pageDoesNotWorkOffline:"Page does not work offline",couldNotCheckServiceWorker:"Could not check `service worker` without a '`start_url`' field in the manifest",manifestSpecifies:"Manifest specifies '`prefer_related_applications`: true'",preferrelatedapplicationsIsOnly:"'`prefer_related_applications`' is only supported on `Chrome` Beta and Stable channels on `Android`.",manifestContainsDisplayoverride:"Manifest contains '`display_override`' field, and the first supported display mode must be one of '`standalone`', '`fullscreen`', or '`minimal-ui`'",pageDoesNotWorkOfflineThePage:"Page does not work offline. Starting in Chrome 93, the installability criteria are changing, and this site will not be installable. See {PH1} for more information.",imageFromS:"Image from {PH1}",screenshot:"Screenshot",formFactor:"Form factor",label:"Label",platform:"Platform",icon:"Icon",sSrcIsNotSet:"{PH1} '`src`' is not set",sUrlSFailedToParse:"{PH1} URL ''{PH2}'' failed to parse",sSFailedToLoad:"{PH1} {PH2} failed to load",sSDoesNotSpecifyItsSizeInThe:"{PH1} {PH2} does not specify its size in the manifest",sSShouldSpecifyItsSizeAs:"{PH1} {PH2} should specify its size as `[width]x[height]`",sSShouldHaveSquareIcon:"Most operating systems require square icons. Please include at least one square icon in the array.",actualSizeSspxOfSSDoesNotMatch:"Actual size ({PH1}×{PH2})px of {PH3} {PH4} does not match specified size ({PH5}×{PH6}px)",actualWidthSpxOfSSDoesNotMatch:"Actual width ({PH1}px) of {PH2} {PH3} does not match specified width ({PH4}px)",actualHeightSpxOfSSDoesNotMatch:"Actual height ({PH1}px) of {PH2} {PH3} does not match specified height ({PH4}px)",sSSizeShouldBeAtLeast320:"{PH1} {PH2} size should be at least 320×320",sSSizeShouldBeAtMost3840:"{PH1} {PH2} size should be at most 3840×3840",sSWidthDoesNotComplyWithRatioRequirement:"{PH1} {PH2} width can't be more than 2.3 times as long as the height",sSHeightDoesNotComplyWithRatioRequirement:"{PH1} {PH2} height can't be more than 2.3 times as long as the width",screenshotPixelSize:"Screenshot {url} should specify a pixel size `[width]x[height]` instead of `any` as first size.",noScreenshotsForRicherPWAInstallOnDesktop:"Richer PWA Install UI won’t be available on desktop. Please add at least one screenshot with the `form_factor` set to `wide`.",noScreenshotsForRicherPWAInstallOnMobile:"Richer PWA Install UI won’t be available on mobile. Please add at least one screenshot for which `form_factor` is not set or set to a value other than `wide`.",tooManyScreenshotsForDesktop:"No more than 8 screenshots will be displayed on desktop. The rest will be ignored.",tooManyScreenshotsForMobile:"No more than 5 screenshots will be displayed on mobile. The rest will be ignored.",screenshotsMustHaveSameAspectRatio:"All screenshots with the same `form_factor` must have the same aspect ratio as the first screenshot with that `form_factor`. Some screenshots will be ignored.",wcoFound:"Chrome has successfully found the {PH1} value for the {PH2} field in the {PH3}.",wcoNotFound:"Define {PH1} in the manifest to use the Window Controls Overlay API and customize your app's title bar.",customizePwaTitleBar:"Customize the window controls overlay of your PWA's title bar",wcoNeedHelpReadMore:"Need help? Read {PH1}.",selectWindowControlsOverlayEmulationOs:"Emulate the Window Controls Overlay on"},W=i.i18n.registerUIStrings("panels/application/AppManifestView.ts",U),N=i.i18n.getLocalizedString.bind(void 0,W);class j extends(e.ObjectWrapper.eventMixin(c.Widget.VBox)){emptyView;reportView;errorsSection;installabilitySection;identitySection;presentationSection;iconsSection;windowControlsSection;protocolHandlersSection;shortcutSections;screenshotsSections;nameField;shortNameField;descriptionField;startURLField;themeColorSwatch;backgroundColorSwatch;orientationField;displayField;newNoteUrlField;throttler;registeredListeners;target;resourceTreeModel;serviceWorkerManager;overlayModel;protocolHandlersView;constructor(e,t,i){super(!0),this.registerRequiredCSS(V),this.contentElement.classList.add("manifest-container"),this.contentElement.setAttribute("jslog",`${p.pane("manifest")}`),this.emptyView=e,this.emptyView.appendLink("https://web.dev/add-manifest/"),this.emptyView.show(this.contentElement),this.emptyView.hideWidget(),this.reportView=t,this.reportView.registerRequiredCSS(V),this.reportView.element.classList.add("manifest-view-header"),this.reportView.show(this.contentElement),this.reportView.hideWidget(),this.errorsSection=this.reportView.appendSection(N(U.errorsAndWarnings),void 0,"errors-and-warnings"),this.installabilitySection=this.reportView.appendSection(N(U.installability),void 0,"installability"),this.identitySection=this.reportView.appendSection(N(U.identity),"undefined,identity"),this.presentationSection=this.reportView.appendSection(N(U.presentation),"undefined,presentation"),this.protocolHandlersSection=this.reportView.appendSection(N(U.protocolHandlers),"undefined,protocol-handlers"),this.protocolHandlersView=new m.ProtocolHandlersView.ProtocolHandlersView,this.protocolHandlersSection.appendFieldWithCustomView(this.protocolHandlersView),this.iconsSection=this.reportView.appendSection(N(U.icons),"report-section-icons","icons"),this.windowControlsSection=this.reportView.appendSection(U.windowControlsOverlay,void 0,"window-controls-overlay"),this.shortcutSections=[],this.screenshotsSections=[],this.nameField=this.identitySection.appendField(N(U.name)),this.shortNameField=this.identitySection.appendField(N(U.shortName)),this.descriptionField=this.identitySection.appendFlexedField(N(U.description)),this.startURLField=this.presentationSection.appendField(N(U.startUrl)),c.ARIAUtils.setLabel(this.startURLField,N(U.startUrl));const s=this.presentationSection.appendField(N(U.themeColor));this.themeColorSwatch=new g.ColorSwatch.ColorSwatch,s.appendChild(this.themeColorSwatch);const r=this.presentationSection.appendField(N(U.backgroundColor));this.backgroundColorSwatch=new g.ColorSwatch.ColorSwatch,r.appendChild(this.backgroundColorSwatch),this.orientationField=this.presentationSection.appendField(N(U.orientation)),this.displayField=this.presentationSection.appendField(N(U.display)),this.newNoteUrlField=this.presentationSection.appendField(N(U.newNoteUrl)),this.throttler=i,o.TargetManager.TargetManager.instance().observeTargets(this),this.registeredListeners=[]}getStaticSections(){return[this.identitySection,this.presentationSection,this.protocolHandlersSection,this.iconsSection,this.windowControlsSection]}getManifestElement(){return this.reportView.getHeaderElement()}targetAdded(e){e===o.TargetManager.TargetManager.instance().primaryPageTarget()&&(this.target=e,this.resourceTreeModel=e.model(o.ResourceTreeModel.ResourceTreeModel),this.serviceWorkerManager=e.model(o.ServiceWorkerManager.ServiceWorkerManager),this.overlayModel=e.model(o.OverlayModel.OverlayModel),this.resourceTreeModel&&this.serviceWorkerManager&&this.overlayModel&&(this.updateManifest(!0),this.registeredListeners=[this.resourceTreeModel.addEventListener(o.ResourceTreeModel.Events.DOMContentLoaded,(()=>{this.updateManifest(!0)})),this.serviceWorkerManager.addEventListener("RegistrationUpdated",(()=>{this.updateManifest(!1)}))]))}targetRemoved(t){this.target===t&&this.resourceTreeModel&&this.serviceWorkerManager&&this.overlayModel&&(delete this.resourceTreeModel,delete this.serviceWorkerManager,delete this.overlayModel,e.EventTarget.removeEventListeners(this.registeredListeners))}async updateManifest(e){if(!this.resourceTreeModel)return;const[{url:t,data:i,errors:s},r,o]=await Promise.all([this.resourceTreeModel.fetchAppManifest(),this.resourceTreeModel.getInstallabilityErrors(),this.resourceTreeModel.getAppId()]);this.throttler.schedule((()=>this.renderManifest(t,i,s,r,o)),e?"AsSoonAsPossible":"Default")}async renderManifest(s,r,o,a,d){const l=d?.appId||null,g=d?.recommendedId||null;if(!(r&&"{}"!==r||o.length))return this.emptyView.showWidget(),this.reportView.hideWidget(),void this.dispatchEventToListeners("ManifestDetected",!1);this.emptyView.hideWidget(),this.reportView.showWidget(),this.dispatchEventToListeners("ManifestDetected",!0);const m=u.Linkifier.Linkifier.linkifyURL(s);m.tabIndex=0,this.reportView.setURL(m),this.errorsSection.clearContent(),this.errorsSection.element.classList.toggle("hidden",!o.length);for(const e of o){const t=c.UIUtils.createIconLabel({title:e.message,iconName:e.critical?"cross-circle-filled":"warning-filled",color:e.critical?"var(--icon-error)":"var(--icon-warning)"});this.errorsSection.appendRow().appendChild(t)}if(!r)return;65279===r.charCodeAt(0)&&(r=r.slice(1));const v=JSON.parse(r);this.nameField.textContent=_("name"),this.shortNameField.textContent=_("short_name");const w=[],S=_("description");this.descriptionField.textContent=S,S.length>300&&w.push(N(U.descriptionMayBeTruncated));const b=_("start_url");if(l&&g){const e=this.identitySection.appendField(N(U.computedAppId));c.ARIAUtils.setLabel(e,"App Id"),e.textContent=l;const s=n.Icon.create("help","inline-icon");s.title=N(U.appIdExplainer),s.setAttribute("jslog",`${p.action("help").track({hover:!0})}`),e.appendChild(s);const r=c.XLink.XLink.create("https://developer.chrome.com/blog/pwa-manifest-id/",N(U.learnMore),void 0,void 0,"learn-more");if(e.appendChild(r),!_("id")){const s=e.createChild("div","multiline-value"),r=document.createElement("code");r.textContent=g;const o=new h.Button.Button;o.data={variant:"icon",iconName:"copy",size:"SMALL",jslogContext:"manifest.copy-id",title:N(U.copyToClipboard)},o.className="inline-button",o.addEventListener("click",(()=>{c.ARIAUtils.alert(N(U.copiedToClipboard,{PH1:g})),t.InspectorFrontendHost.InspectorFrontendHostInstance.copyText(g)})),s.appendChild(i.i18n.getFormatLocalizedString(W,U.appIdNote,{PH1:r,PH2:o}))}}else this.identitySection.removeField(N(U.computedAppId));if(this.startURLField.removeChildren(),b){const t=e.ParsedURL.ParsedURL.completeURL(s,b);if(t){const e=u.Linkifier.Linkifier.linkifyURL(t,{text:b});e.tabIndex=0,e.setAttribute("jslog",`${p.link("start-url").track({click:!0})}`),this.startURLField.appendChild(e)}}this.themeColorSwatch.classList.toggle("hidden",!_("theme_color"));const y=e.Color.parse(_("theme_color")||"white")||e.Color.parse("white");y&&this.themeColorSwatch.renderColor(y),this.backgroundColorSwatch.classList.toggle("hidden",!_("background_color"));const k=e.Color.parse(_("background_color")||"white")||e.Color.parse("white");k&&this.backgroundColorSwatch.renderColor(k),this.orientationField.textContent=_("orientation");const f=_("display");this.displayField.textContent=f;const I=(v.note_taking||{}).new_note_url,C="string"==typeof I;if(this.newNoteUrlField.parentElement?.classList.toggle("hidden",!C),this.newNoteUrlField.removeChildren(),C){const t=e.ParsedURL.ParsedURL.completeURL(s,I),i=u.Linkifier.Linkifier.linkifyURL(t,{text:I});i.tabIndex=0,this.newNoteUrlField.appendChild(i)}const T=v.protocol_handlers||[];this.protocolHandlersView.data={protocolHandlers:T,manifestLink:s};const x=v.icons||[];this.iconsSection.clearContent();const E=v.shortcuts||[];for(const e of this.shortcutSections)e.detach(!0);const M=v.screenshots||[];for(const e of this.screenshotsSections)e.detach(!0);const R=[],L=c.UIUtils.CheckboxLabel.create(N(U.showOnlyTheMinimumSafeAreaFor));L.classList.add("mask-checkbox"),L.setAttribute("jslog",`${p.toggle("show-minimal-safe-area-for-maskable-icons").track({change:!0})}`),L.addEventListener("click",(()=>{this.iconsSection.setIconMasked(L.checkboxElement.checked)})),this.iconsSection.appendRow().appendChild(L);const A=c.XLink.XLink.create("https://web.dev/maskable-icon/",N(U.documentationOnMaskableIcons),void 0,void 0,"learn-more");this.iconsSection.appendRow().appendChild(i.i18n.getFormatLocalizedString(W,U.needHelpReadOurS,{PH1:A}));let B=!1;for(const e of x){const t=await this.appendImageResourceToSection(s,e,this.iconsSection,!1);R.push(...t.imageResourceErrors),B=t.squareSizedIconAvailable||B}B||R.push(N(U.sSShouldHaveSquareIcon)),E.length>4&&w.push(N(U.shortcutsMayBeNotAvailable));let P=1;for(const t of E){const i=this.reportView.appendSection(N(U.shortcutS,{PH1:P}));i.element.setAttribute("jslog",`${p.section("shortcuts")}`),this.shortcutSections.push(i),i.appendFlexedField(N(U.name),t.name),t.short_name&&i.appendFlexedField(N(U.shortName),t.short_name),t.description&&i.appendFlexedField(N(U.description),t.description);const r=i.appendFlexedField(N(U.url)),o=e.ParsedURL.ParsedURL.completeURL(s,t.url),a=u.Linkifier.Linkifier.linkifyURL(o,{text:t.url});a.setAttribute("jslog",`${p.link("shortcut").track({click:!0})}`),a.tabIndex=0,r.appendChild(a);const n=t.icons||[];let d=!1;for(const e of n){const{imageResourceErrors:t}=await this.appendImageResourceToSection(s,e,i,!1);if(R.push(...t),!d&&e.sizes){const t=e.sizes.match(/^(\d+)x(\d+)$/);t&&t[1]>=96&&t[2]>=96&&(d=!0)}}d||R.push(N(U.shortcutSShouldIncludeAXPixel,{PH1:P})),P++}let D=1;const F=new Map;let O=!1;for(const e of M){const t=this.reportView.appendSection(N(U.screenshotS,{PH1:D}));this.screenshotsSections.push(t),e.form_factor&&t.appendFlexedField(N(U.formFactor),e.form_factor),e.label&&t.appendFlexedField(N(U.label),e.label),e.platform&&t.appendFlexedField(N(U.platform),e.platform);const{imageResourceErrors:i,naturalWidth:r,naturalHeight:o}=await this.appendImageResourceToSection(s,e,t,!0);if(R.push(...i),e.form_factor&&r&&o){F.has(e.form_factor)||F.set(e.form_factor,{width:r,height:o});const t=F.get(e.form_factor);t&&(O=O||r*t.height!=o*t.width)}D++}O&&w.push(N(U.screenshotsMustHaveSameAspectRatio));const V=M.filter((e=>"wide"===e.form_factor)),j=M.filter((e=>"wide"!==e.form_factor));V.length<1&&w.push(N(U.noScreenshotsForRicherPWAInstallOnDesktop)),j.length<1&&w.push(N(U.noScreenshotsForRicherPWAInstallOnMobile)),V.length>8&&w.push(N(U.tooManyScreenshotsForDesktop)),j.length>5&&w.push(N(U.tooManyScreenshotsForMobile)),this.installabilitySection.clearContent(),this.installabilitySection.element.classList.toggle("hidden",!a.length);const H=this.getInstallabilityErrorMessages(a);for(const e of H){const t=document.createTextNode(e);this.installabilitySection.appendRow().appendChild(t)}this.errorsSection.element.classList.toggle("hidden",!o.length&&!R.length&&!w.length);for(const e of w){const t=document.createTextNode(e);this.errorsSection.appendRow().appendChild(t)}for(const e of R){const t=document.createTextNode(e);this.errorsSection.appendRow().appendChild(t)}function _(e){const t=v[e];return"string"!=typeof t?"":t}this.windowControlsSection.clearContent();const K=(v.display_override||[]).includes("window-controls-overlay"),q=c.XLink.XLink.create("https://developer.mozilla.org/en-US/docs/Web/Manifest/display_override","display-override",void 0,void 0,"display-override"),z=document.createElement("code");z.appendChild(q);const G=this.windowControlsSection.appendRow();if(K){const e=n.Icon.create("check-circle","inline-icon");G.appendChild(e);const t=document.createElement("code");t.classList.add("wco"),t.textContent="window-controls-overlay",G.appendChild(i.i18n.getFormatLocalizedString(W,U.wcoFound,{PH1:t,PH2:z,PH3:m})),this.overlayModel&&await this.appendWindowControlsToSection(this.overlayModel,s,_("theme_color"))}else{const e=n.Icon.create("info","inline-icon");G.appendChild(e),G.appendChild(i.i18n.getFormatLocalizedString(W,U.wcoNotFound,{PH1:z}))}const $=c.XLink.XLink.create("https://learn.microsoft.com/en-us/microsoft-edge/progressive-web-apps-chromium/how-to/window-controls-overlay",N(U.customizePwaTitleBar),void 0,void 0,"customize-pwa-tittle-bar");this.windowControlsSection.appendRow().appendChild(i.i18n.getFormatLocalizedString(W,U.wcoNeedHelpReadMore,{PH1:$})),this.dispatchEventToListeners("ManifestRendered")}getInstallabilityErrorMessages(e){const t=[];for(const i of e){let e;switch(i.errorId){case"not-in-main-frame":e=N(U.pageIsNotLoadedInTheMainFrame);break;case"not-from-secure-origin":e=N(U.pageIsNotServedFromASecureOrigin);break;case"no-manifest":e=N(U.pageHasNoManifestLinkUrl);break;case"manifest-empty":e=N(U.manifestCouldNotBeFetchedIsEmpty);break;case"start-url-not-valid":e=N(U.manifestStartUrlIsNotValid);break;case"manifest-missing-name-or-short-name":e=N(U.manifestDoesNotContainANameOr);break;case"manifest-display-not-supported":e=N(U.manifestDisplayPropertyMustBeOne);break;case"manifest-missing-suitable-icon":if(1!==i.errorArguments.length||"minimum-icon-size-in-pixels"!==i.errorArguments[0].name){console.error("Installability error does not have the correct errorArguments");break}e=N(U.manifestDoesNotContainASuitable,{PH1:i.errorArguments[0].value});break;case"no-acceptable-icon":if(1!==i.errorArguments.length||"minimum-icon-size-in-pixels"!==i.errorArguments[0].name){console.error("Installability error does not have the correct errorArguments");break}e=N(U.noSuppliedIconIsAtLeastSpxSquare,{PH1:i.errorArguments[0].value});break;case"cannot-download-icon":e=N(U.couldNotDownloadARequiredIcon);break;case"no-icon-available":e=N(U.downloadedIconWasEmptyOr);break;case"platform-not-supported-on-android":e=N(U.theSpecifiedApplicationPlatform);break;case"no-id-specified":e=N(U.noPlayStoreIdProvided);break;case"ids-do-not-match":e=N(U.thePlayStoreAppUrlAndPlayStoreId);break;case"already-installed":e=N(U.theAppIsAlreadyInstalled);break;case"url-not-supported-for-webapk":e=N(U.aUrlInTheManifestContainsA);break;case"in-incognito":e=N(U.pageIsLoadedInAnIncognitoWindow);break;case"not-offline-capable":e=N(U.pageDoesNotWorkOffline);break;case"no-url-for-service-worker":e=N(U.couldNotCheckServiceWorker);break;case"prefer-related-applications":e=N(U.manifestSpecifies);break;case"prefer-related-applications-only-beta-stable":e=N(U.preferrelatedapplicationsIsOnly);break;case"manifest-display-override-not-supported":e=N(U.manifestContainsDisplayoverride);break;case"warn-not-offline-capable":e=N(U.pageDoesNotWorkOfflineThePage,{PH1:"https://developer.chrome.com/blog/improved-pwa-offline-detection/"});break;default:console.error(`Installability error id '${i.errorId}' is not recognized`)}e&&t.push(e)}return t}async loadImage(e){const t=document.createElement("div");t.classList.add("image-wrapper");const i=document.createElement("img"),s=new Promise(((e,t)=>{i.onload=e,i.onerror=t}));i.src=e,i.alt=N(U.imageFromS,{PH1:e}),t.appendChild(i);try{return await s,{wrapper:t,image:i}}catch{}return null}parseSizes(e,t,i,s){const r=e?e.split(/\s+/):[],o=[];for(const e of r){if("any"===e){o.find((e=>"any"in e))||o.push({any:"any",formatted:"any"});continue}const r=e.match(/^(?<width>\d+)[xX](?<height>\d+)$/);if(r){const e=parseInt(r.groups?.width||"",10),t=parseInt(r.groups?.height||"",10),i=`${e}×${t}px`;o.push({width:e,height:t,formatted:i})}else s.push(N(U.sSShouldSpecifyItsSizeAs,{PH1:t,PH2:i}))}return o}checkSizeProblem(e,t,i,s,r){if("any"in e)return{hasSquareSize:i.naturalWidth===i.naturalHeight};const o=e.width===e.height;return i.naturalWidth!==e.width&&i.naturalHeight!==e.height?{error:N(U.actualSizeSspxOfSSDoesNotMatch,{PH1:i.naturalWidth,PH2:i.naturalHeight,PH3:s,PH4:r,PH5:e.width,PH6:e.height}),hasSquareSize:o}:i.naturalWidth!==e.width?{error:N(U.actualWidthSpxOfSSDoesNotMatch,{PH1:i.naturalWidth,PH2:s,PH3:r,PH4:e.width}),hasSquareSize:o}:i.naturalHeight!==e.height?{error:N(U.actualHeightSpxOfSSDoesNotMatch,{PH1:i.naturalHeight,PH2:s,PH3:r,PH4:e.height}),hasSquareSize:o}:{hasSquareSize:o}}async appendImageResourceToSection(t,i,s,r){const o=[],a=N(r?U.screenshot:U.icon);if(!i.src)return o.push(N(U.sSrcIsNotSet,{PH1:a})),{imageResourceErrors:o};const n=e.ParsedURL.ParsedURL.completeURL(t,i.src);if(!n)return o.push(N(U.sUrlSFailedToParse,{PH1:a,PH2:i.src})),{imageResourceErrors:o};const d=await this.loadImage(n);if(!d)return o.push(N(U.sSFailedToLoad,{PH1:a,PH2:n})),{imageResourceErrors:o};const{wrapper:l,image:c}=d,{naturalWidth:h,naturalHeight:g}=c,u=this.parseSizes(i.sizes,a,n,o),p=u.map((e=>e.formatted)).join(" ")+"\n"+(i.type||""),m=s.appendFlexedField(p);let v=!1;if(i.sizes){r&&u.length>0&&"any"in u[0]&&o.push(N(U.screenshotPixelSize,{url:n}));for(const e of u){const{error:t,hasSquareSize:s}=this.checkSizeProblem(e,i.type,c,a,n);if(v=v||s,t)o.push(t);else if(r){const t="any"in e?c.naturalWidth:e.width,i="any"in e?c.naturalHeight:e.height;t<320||i<320?o.push(N(U.sSSizeShouldBeAtLeast320,{PH1:a,PH2:n})):t>3840||i>3840?o.push(N(U.sSSizeShouldBeAtMost3840,{PH1:a,PH2:n})):t>2.3*i?o.push(N(U.sSWidthDoesNotComplyWithRatioRequirement,{PH1:a,PH2:n})):i>2.3*t&&o.push(N(U.sSHeightDoesNotComplyWithRatioRequirement,{PH1:a,PH2:n}))}}}else o.push(N(U.sSDoesNotSpecifyItsSizeInThe,{PH1:a,PH2:n}));c.width=c.naturalWidth;const w="string"==typeof i.purpose?i.purpose.toLowerCase():"";return w.includes("any")&&w.includes("maskable")&&o.push(N(U.avoidPurposeAnyAndMaskable)),m.appendChild(l),{imageResourceErrors:o,squareSizedIconAvailable:v,naturalWidth:h,naturalHeight:g}}async appendWindowControlsToSection(e,t,i){if(!await e.hasStyleSheetText(t))return;await e.toggleWindowControlsToolbar(!1);const s=c.UIUtils.CheckboxLabel.create(N(U.selectWindowControlsOverlayEmulationOs),!1);s.checkboxElement.addEventListener("click",(async()=>{await(this.overlayModel?.toggleWindowControlsToolbar(s.checkboxElement.checked))}));const r=s.createChild("select");r.appendChild(c.UIUtils.createOption("Windows","Windows","windows")),r.appendChild(c.UIUtils.createOption("macOS","Mac","macos")),r.appendChild(c.UIUtils.createOption("Linux","Linux","linux")),r.selectedIndex=0,this.overlayModel&&(r.value=this.overlayModel?.getWindowControlsConfig().selectedPlatform),r.addEventListener("change",(async()=>{const e=r.options[r.selectedIndex].value;this.overlayModel&&(this.overlayModel.setWindowControlsPlatform(e),await this.overlayModel.toggleWindowControlsToolbar(s.checkboxElement.checked))})),this.windowControlsSection.appendRow().appendChild(s),e.setWindowControlsThemeColor(i)}}var H=Object.freeze({__proto__:null,AppManifestView:j});const _={backForwardCache:"Back/forward cache"},K=i.i18n.registerUIStrings("panels/application/BackForwardCacheTreeElement.ts",_),q=i.i18n.getLocalizedString.bind(void 0,K);class z extends F{view;constructor(e){super(e,q(_.backForwardCache),!1,"bfcache");const t=n.Icon.create("database");this.setLeadingIcons([t])}get itemURL(){return"bfcache://"}onselect(e){return super.onselect(e),this.view||(this.view=d.LegacyWrapper.legacyWrapper(c.Widget.Widget,new m.BackForwardCacheView.BackForwardCacheView)),this.showView(this.view),t.userMetrics.panelShown("back-forward-cache"),!1}}class G extends o.SDKModel.SDKModel{backgroundServiceAgent;events;constructor(e){super(e),this.backgroundServiceAgent=e.backgroundServiceAgent(),e.registerBackgroundServiceDispatcher(this),this.events=new Map}enable(e){this.events.set(e,[]),this.backgroundServiceAgent.invoke_startObserving({service:e})}setRecording(e,t){this.backgroundServiceAgent.invoke_setRecording({shouldRecord:e,service:t})}clearEvents(e){this.events.set(e,[]),this.backgroundServiceAgent.invoke_clearEvents({service:e})}getEvents(e){return this.events.get(e)||[]}recordingStateChanged({isRecording:e,service:t}){this.dispatchEventToListeners($.RecordingStateChanged,{isRecording:e,serviceName:t})}backgroundServiceEventReceived({backgroundServiceEvent:e}){this.events.get(e.service).push(e),this.dispatchEventToListeners($.BackgroundServiceEventReceived,e)}}var $;o.SDKModel.SDKModel.register(G,{capabilities:1,autostart:!1}),function(e){e.RecordingStateChanged="RecordingStateChanged",e.BackgroundServiceEventReceived="BackgroundServiceEventReceived"}($||($={}));var X=Object.freeze({__proto__:null,BackgroundServiceModel:G,get Events(){return $}}),J={cssText:`.empty-view-scroller{overflow:auto}\n/*# sourceURL=${import.meta.resolve("./emptyWidget.css")} */\n`},Q={cssText:`.background-service-toolbar{background-color:var(--sys-color-cdt-base-container);border-bottom:var(--sys-size-1) solid var(--sys-color-divider)}.data-grid{flex:auto;border:none}[slot="insertion-point-main"]{overflow:auto}.background-service-preview{position:absolute;background-color:var(--sys-color-cdt-base-container);justify-content:center;align-items:center;overflow:auto;font-size:13px;color:var(--sys-color-on-surface-subtle)}.background-service-preview > div{max-width:450px;margin:10px;text-align:center}.background-service-preview > div > p{flex:none;white-space:pre-line}.background-service-shortcut{color:var(--sys-color-on-surface-subtle)}.background-service-metadata{padding-left:5px;padding-top:10px}.background-service-metadata-entry{padding-left:10px;padding-bottom:5px}.background-service-metadata-name{color:var(--sys-color-on-surface-subtle);display:inline-block;margin-right:0.25em;font-weight:bold}.background-service-metadata-value{display:inline;margin-right:1em;white-space:pre-wrap;word-break:break-all;user-select:text}.background-service-empty-value{color:var(--sys-color-state-disabled);font-style:italic}.background-service-record-inline-button{margin-bottom:6px}\n/*# sourceURL=${import.meta.resolve("./backgroundServiceView.css")} */\n`};const Y={backgroundFetch:"Background fetch",backgroundSync:"Background sync",pushMessaging:"Push messaging",notifications:"Notifications",paymentHandler:"Payment handler",periodicBackgroundSync:"Periodic background sync",clear:"Clear",saveEvents:"Save events",showEventsFromOtherDomains:"Show events from other domains",showEventsForOtherStorageKeys:"Show events from other storage partitions",stopRecordingEvents:"Stop recording events",startRecordingEvents:"Start recording events",timestamp:"Timestamp",event:"Event",origin:"Origin",storageKey:"Storage Key",swScope:"Service Worker Scope",instanceId:"Instance ID",backgroundServices:"Background services",noEventSelected:"No event selected",selectAnEventToViewMetadata:"Select an event to view its metadata",recordingSActivity:"Recording {PH1} activity...",noRecording:"No recording yet",devtoolsWillRecordAllSActivity:"DevTools will record all {PH1} activity for up to 3 days, even when closed.",startRecordingToDebug:'Start to debug background services by using the "{PH1}" button or by hitting {PH2}.',empty:"empty",noMetadataForThisEvent:"No metadata for this event"},Z=i.i18n.registerUIStrings("panels/application/BackgroundServiceView.ts",Y),ee=i.i18n.getLocalizedString.bind(void 0,Z);class te extends c.Widget.VBox{serviceName;model;serviceWorkerManager;securityOriginManager;storageKeyManager;recordAction;recordButton;originCheckbox;storageKeyCheckbox;saveButton;toolbar;splitWidget;dataGrid;previewPanel;selectedEventNode;preview;static getUIString(e){switch(e){case"backgroundFetch":return ee(Y.backgroundFetch);case"backgroundSync":return ee(Y.backgroundSync);case"pushMessaging":return ee(Y.pushMessaging);case"notifications":return ee(Y.notifications);case"paymentHandler":return ee(Y.paymentHandler);case"periodicBackgroundSync":return ee(Y.periodicBackgroundSync);default:return""}}constructor(e,t){super(!0),this.registerRequiredCSS(J,Q),this.serviceName=e;const i=s.StringUtilities.toKebabCase(e);if(this.element.setAttribute("jslog",`${p.pane().context(i)}`),this.model=t,this.model.addEventListener($.RecordingStateChanged,this.onRecordingStateChanged,this),this.model.addEventListener($.BackgroundServiceEventReceived,this.onEventReceived,this),this.model.enable(this.serviceName),this.serviceWorkerManager=this.model.target().model(o.ServiceWorkerManager.ServiceWorkerManager),this.securityOriginManager=this.model.target().model(o.SecurityOriginManager.SecurityOriginManager),!this.securityOriginManager)throw new Error("SecurityOriginManager instance is missing");if(this.securityOriginManager.addEventListener(o.SecurityOriginManager.Events.MainSecurityOriginChanged,(()=>this.onOriginChanged())),this.storageKeyManager=this.model.target().model(o.StorageKeyManager.StorageKeyManager),!this.storageKeyManager)throw new Error("StorageKeyManager instance is missing");this.storageKeyManager.addEventListener("MainStorageKeyChanged",(()=>this.onStorageKeyChanged())),this.recordAction=c.ActionRegistry.ActionRegistry.instance().getAction("background-service.toggle-recording"),this.toolbar=this.contentElement.createChild("devtools-toolbar","background-service-toolbar"),this.toolbar.setAttribute("jslog",`${p.toolbar()}`),this.setupToolbar(),this.splitWidget=new c.SplitWidget.SplitWidget(!1,!0),this.splitWidget.show(this.contentElement),this.dataGrid=this.createDataGrid(),this.previewPanel=new c.Widget.VBox,this.previewPanel.element.setAttribute("jslog",`${p.pane("preview").track({resize:!0})}`),this.selectedEventNode=null,this.preview=null,this.splitWidget.setMainWidget(this.dataGrid.asWidget()),this.splitWidget.setSidebarWidget(this.previewPanel),this.splitWidget.hideMain(),this.showPreview(null)}getDataGrid(){return this.dataGrid}async setupToolbar(){this.toolbar.wrappable=!0,this.recordButton=c.Toolbar.Toolbar.createActionButton(this.recordAction),this.recordButton.toggleOnClick(!1),this.toolbar.appendToolbarItem(this.recordButton);const e=new c.Toolbar.ToolbarButton(ee(Y.clear),"clear",void 0,"background-service.clear");e.addEventListener("Click",(()=>this.clearEvents())),this.toolbar.appendToolbarItem(e),this.toolbar.appendSeparator(),this.saveButton=new c.Toolbar.ToolbarButton(ee(Y.saveEvents),"download",void 0,"background-service.save-events"),this.saveButton.addEventListener("Click",(e=>{this.saveToFile()})),this.saveButton.setEnabled(!1),this.toolbar.appendToolbarItem(this.saveButton),this.toolbar.appendSeparator(),this.originCheckbox=new c.Toolbar.ToolbarCheckbox(ee(Y.showEventsFromOtherDomains),ee(Y.showEventsFromOtherDomains),(()=>this.refreshView()),"show-events-from-other-domains"),this.toolbar.appendToolbarItem(this.originCheckbox),this.storageKeyCheckbox=new c.Toolbar.ToolbarCheckbox(ee(Y.showEventsForOtherStorageKeys),ee(Y.showEventsForOtherStorageKeys),(()=>this.refreshView()),"show-events-from-other-partitions"),this.toolbar.appendToolbarItem(this.storageKeyCheckbox)}refreshView(){this.clearView();const e=this.model.getEvents(this.serviceName).filter((e=>this.acceptEvent(e)));for(const t of e)this.addEvent(t)}clearView(){this.selectedEventNode=null,this.dataGrid.rootNode().removeChildren(),this.splitWidget.hideMain(),this.saveButton.setEnabled(!1),this.showPreview(null)}toggleRecording(){this.model.setRecording(!this.recordButton.isToggled(),this.serviceName)}clearEvents(){this.model.clearEvents(this.serviceName),this.clearView()}onRecordingStateChanged({data:e}){e.serviceName===this.serviceName&&e.isRecording!==this.recordButton.isToggled()&&(this.recordButton.setToggled(e.isRecording),this.updateRecordButtonTooltip(),this.showPreview(this.selectedEventNode))}updateRecordButtonTooltip(){const e=this.recordButton.isToggled()?ee(Y.stopRecordingEvents):ee(Y.startRecordingEvents);this.recordButton.setTitle(e,"background-service.toggle-recording")}onEventReceived({data:e}){this.acceptEvent(e)&&this.addEvent(e)}onOriginChanged(){this.originCheckbox.checked()||this.refreshView()}onStorageKeyChanged(){this.storageKeyCheckbox.checked()||this.refreshView()}addEvent(e){const t=this.createEventData(e),i=new ie(t,e.eventMetadata);this.dataGrid.rootNode().appendChild(i),"Both"!==this.splitWidget.showMode()&&this.splitWidget.showBoth(),1===this.dataGrid.rootNode().children.length&&(this.saveButton.setEnabled(!0),this.showPreview(this.selectedEventNode))}createDataGrid(){const e=[{id:"id",title:"#",weight:1},{id:"timestamp",title:ee(Y.timestamp),weight:7},{id:"event-name",title:ee(Y.event),weight:8},{id:"origin",title:ee(Y.origin),weight:8},{id:"storage-key",title:ee(Y.storageKey),weight:8},{id:"sw-scope",title:ee(Y.swScope),weight:4},{id:"instance-id",title:ee(Y.instanceId),weight:8}],t=new S.DataGrid.DataGridImpl({displayName:ee(Y.backgroundServices),columns:e,refreshCallback:void 0,deleteCallback:void 0});return t.setStriped(!0),t.addEventListener("SelectedNode",(e=>this.showPreview(e.data))),t}createEventData(e){let t="";const i=this.serviceWorkerManager?this.serviceWorkerManager.registrations().get(e.serviceWorkerRegistrationId):void 0;return i&&(t=i.scopeURL.substr(i.securityOrigin.length)),{id:this.dataGrid.rootNode().children.length+1,timestamp:c.UIUtils.formatTimestamp(1e3*e.timestamp,!0),origin:e.origin,"storage-key":e.storageKey,"sw-scope":t,"event-name":e.eventName,"instance-id":e.instanceId}}acceptEvent(e){if(e.service!==this.serviceName)return!1;if(this.originCheckbox.checked()||this.storageKeyCheckbox.checked())return!0;const t=e.origin.substr(0,e.origin.length-1),i=e.storageKey;return this.securityOriginManager.securityOrigins().includes(t)||this.storageKeyManager.storageKeys().includes(i)}createLearnMoreLink(){let e="https://developer.chrome.com/docs/devtools/javascript/background-services/?utm_source=devtools";switch(this.serviceName){case"backgroundFetch":e+="#fetch";break;case"backgroundSync":e+="#sync";break;case"pushMessaging":e+="#push";break;case"notifications":e+="#notifications"}return e}showPreview(e){if(this.selectedEventNode&&this.selectedEventNode===e)return;if(this.selectedEventNode=e,this.preview&&this.preview.detach(),this.selectedEventNode)return this.preview=this.selectedEventNode.createPreview(),void this.preview.show(this.previewPanel.contentElement);const t=new c.EmptyWidget.EmptyWidget("","");if(this.dataGrid.rootNode().children.length)t.header=ee(Y.noEventSelected),t.text=ee(Y.selectAnEventToViewMetadata);else if(this.recordButton.isToggled()){const e=te.getUIString(this.serviceName).toLowerCase();t.header=ee(Y.recordingSActivity,{PH1:e}),t.text=ee(Y.devtoolsWillRecordAllSActivity,{PH1:e})}else{const e=c.ShortcutRegistry.ShortcutRegistry.instance().shortcutsForAction("background-service.toggle-recording")[0];t.header=ee(Y.noRecording),t.text=ee(Y.startRecordingToDebug,{PH1:ee(Y.startRecordingEvents),PH2:e.title()}),t.appendLink(this.createLearnMoreLink());const i=c.UIUtils.createTextButton(ee(Y.startRecordingEvents),(()=>this.toggleRecording()),{jslogContext:"start-recording",variant:"tonal"});t.contentElement.appendChild(i)}this.preview=t,this.preview.show(this.previewPanel.contentElement)}async saveToFile(){const e=`${this.serviceName}-${s.DateUtilities.toISO8601Compact(new Date)}.json`,t=new w.FileUtils.FileOutputStream;if(!await t.open(e))return;const i=this.model.getEvents(this.serviceName).filter((e=>this.acceptEvent(e)));await t.write(JSON.stringify(i,void 0,2)),t.close()}}class ie extends S.DataGrid.DataGridNode{eventMetadata;constructor(e,t){super(e),this.eventMetadata=t.sort(((e,t)=>s.StringUtilities.compare(e.key,t.key)))}createPreview(){const e=new c.Widget.VBox;e.element.classList.add("background-service-metadata"),e.element.setAttribute("jslog",`${p.section("metadata")}`);for(const t of this.eventMetadata){const i=document.createElement("div");i.classList.add("background-service-metadata-entry"),i.createChild("div","background-service-metadata-name").textContent=t.key+": ",t.value?i.createChild("div","background-service-metadata-value source-code").textContent=t.value:i.createChild("div","background-service-metadata-value background-service-empty-value").textContent=ee(Y.empty),e.element.appendChild(i)}if(!e.element.children.length){const t=document.createElement("div");t.classList.add("background-service-metadata-entry"),t.createChild("div","background-service-metadata-name background-service-empty-value").textContent=ee(Y.noMetadataForThisEvent),e.element.appendChild(t)}return e}}var se=Object.freeze({__proto__:null,ActionDelegate:class{handleAction(e,t){const i=e.flavor(te);if("background-service.toggle-recording"===t){if(!i)throw new Error("BackgroundServiceView instance is missing");return i.toggleRecording(),!0}return!1}},BackgroundServiceView:te,EventDataNode:ie});const re={bounceTrackingMitigations:"Bounce tracking mitigations"},oe=i.i18n.registerUIStrings("panels/application/BounceTrackingMitigationsTreeElement.ts",re),ae=i.i18n.getLocalizedString.bind(void 0,oe);class ne extends F{view;constructor(e){super(e,ae(re.bounceTrackingMitigations),!1,"bounce-tracking-mitigations");const t=n.Icon.create("database");this.setLeadingIcons([t])}get itemURL(){return"bounce-tracking-mitigations://"}onselect(e){return super.onselect(e),this.view||(this.view=d.LegacyWrapper.legacyWrapper(c.Widget.Widget,new m.BounceTrackingMitigationsView.BounceTrackingMitigationsView)),this.showView(this.view),t.userMetrics.panelShown("bounce-tracking-mitigations"),!1}}var de=Object.freeze({__proto__:null,BounceTrackingMitigationsTreeElement:ne,i18nString:ae});class le extends e.ObjectWrapper.ObjectWrapper{model;storageKeyInternal;isLocalStorageInternal;constructor(e,t,i){super(),this.model=e,this.storageKeyInternal=t,this.isLocalStorageInternal=i}static storageId(e,t){return{storageKey:e,isLocalStorage:t}}get id(){return le.storageId(this.storageKeyInternal,this.isLocalStorageInternal)}get storageKey(){return this.storageKeyInternal}get isLocalStorage(){return this.isLocalStorageInternal}getItems(){return this.model.agent.invoke_getDOMStorageItems({storageId:this.id}).then((({entries:e})=>e))}setItem(e,t){this.model.agent.invoke_setDOMStorageItem({storageId:this.id,key:e,value:t})}removeItem(e){this.model.agent.invoke_removeDOMStorageItem({storageId:this.id,key:e})}clear(){this.model.agent.invoke_clear({storageId:this.id})}}class ce extends o.SDKModel.SDKModel{storageKeyManagerInternal;storagesInternal;agent;enabled;constructor(e){super(e),this.storageKeyManagerInternal=e.model(o.StorageKeyManager.StorageKeyManager),this.storagesInternal={},this.agent=e.domstorageAgent()}enable(){if(!this.enabled){if(this.target().registerDOMStorageDispatcher(new he(this)),this.storageKeyManagerInternal){this.storageKeyManagerInternal.addEventListener("StorageKeyAdded",this.storageKeyAdded,this),this.storageKeyManagerInternal.addEventListener("StorageKeyRemoved",this.storageKeyRemoved,this);for(const e of this.storageKeyManagerInternal.storageKeys())this.addStorageKey(e)}this.agent.invoke_enable(),this.enabled=!0}}clearForStorageKey(e){if(this.enabled){for(const t of[!0,!1]){const i=this.storageKey(e,t),s=this.storagesInternal[i];if(!s)return;s.clear()}this.removeStorageKey(e),this.addStorageKey(e)}}storageKeyAdded(e){this.addStorageKey(e.data)}addStorageKey(e){for(const t of[!0,!1]){const i=this.storageKey(e,t);console.assert(!this.storagesInternal[i]);const s=new le(this,e,t);this.storagesInternal[i]=s,this.dispatchEventToListeners("DOMStorageAdded",s)}}storageKeyRemoved(e){this.removeStorageKey(e.data)}removeStorageKey(e){for(const t of[!0,!1]){const i=this.storageKey(e,t),s=this.storagesInternal[i];s&&(delete this.storagesInternal[i],this.dispatchEventToListeners("DOMStorageRemoved",s))}}storageKey(e,t){return JSON.stringify(le.storageId(e,t))}domStorageItemsCleared(e){const t=this.storageForId(e);t&&t.dispatchEventToListeners("DOMStorageItemsCleared")}domStorageItemRemoved(e,t){const i=this.storageForId(e);if(!i)return;const s={key:t};i.dispatchEventToListeners("DOMStorageItemRemoved",s)}domStorageItemAdded(e,t,i){const s=this.storageForId(e);if(!s)return;const r={key:t,value:i};s.dispatchEventToListeners("DOMStorageItemAdded",r)}domStorageItemUpdated(e,t,i,s){const r=this.storageForId(e);if(!r)return;const o={key:t,oldValue:i,value:s};r.dispatchEventToListeners("DOMStorageItemUpdated",o)}storageForId(e){return console.assert(Boolean(e.storageKey)),this.storagesInternal[this.storageKey(e.storageKey||"",e.isLocalStorage)]}storages(){const e=[];for(const t in this.storagesInternal)e.push(this.storagesInternal[t]);return e}}o.SDKModel.SDKModel.register(ce,{capabilities:2,autostart:!1});class he{model;constructor(e){this.model=e}domStorageItemsCleared({storageId:e}){this.model.domStorageItemsCleared(e)}domStorageItemRemoved({storageId:e,key:t}){this.model.domStorageItemRemoved(e,t)}domStorageItemAdded({storageId:e,key:t,newValue:i}){this.model.domStorageItemAdded(e,t,i)}domStorageItemUpdated({storageId:e,key:t,oldValue:i,newValue:s}){this.model.domStorageItemUpdated(e,t,i,s)}}var ge=Object.freeze({__proto__:null,DOMStorage:le,DOMStorageDispatcher:he,DOMStorageModel:ce});class ue extends e.ObjectWrapper.ObjectWrapper{#e;#t;#i;#s;constructor(e,t,i,s){super(),this.#e=e,this.#t=t,this.#i=i,this.#s=s}get model(){return this.#e}get extensionId(){return this.#t}get name(){return this.#i}get key(){return`${this.extensionId}-${this.storageArea}`}get storageArea(){return this.#s}async getItems(e){const t={id:this.#t,storageArea:this.#s};e&&(t.keys=e);const i=await this.#e.agent.invoke_getStorageItems(t);if(i.getError())throw new Error(i.getError());return i.data}async setItem(e,t){const i=await this.#e.agent.invoke_setStorageItems({id:this.#t,storageArea:this.#s,values:{[e]:t}});if(i.getError())throw new Error(i.getError())}async removeItem(e){const t=await this.#e.agent.invoke_removeStorageItems({id:this.#t,storageArea:this.#s,keys:[e]});if(t.getError())throw new Error(t.getError())}async clear(){const e=await this.#e.agent.invoke_clearStorageItems({id:this.#t,storageArea:this.#s});if(e.getError())throw new Error(e.getError())}matchesTarget(t){if(!t)return!1;const i=t.targetInfo()?.url,s=i?e.ParsedURL.ParsedURL.fromString(i):null;return"chrome-extension"===s?.scheme&&s?.host===this.extensionId}}class pe extends o.SDKModel.SDKModel{#r;#o;agent;#a;constructor(e){super(e),this.#r=e.model(o.RuntimeModel.RuntimeModel),this.#o=new Map,this.agent=e.extensionsAgent()}enable(){this.#a||(this.#r&&(this.#r.addEventListener(o.RuntimeModel.Events.ExecutionContextCreated,this.#n,this),this.#r.addEventListener(o.RuntimeModel.Events.ExecutionContextDestroyed,this.#d,this),this.#r.executionContexts().forEach(this.#l,this)),this.#a=!0)}#c(e){const t=this.#o.get(e);if(t)return t;const i=new Map;return this.#o.set(e,i),i}#h(e,t){for(const i of["session","local","sync","managed"]){const s=this.#c(e),r=new ue(this,e,t,i);console.assert(!s.get(i)),r.getItems([]).then((()=>{this.#o.get(e)===s&&(s.get(i)||(s.set(i,r),this.dispatchEventToListeners("ExtensionStorageAdded",r)))})).catch((()=>{}))}}#g(e){const t=this.#o.get(e);if(t){for(const[e,i]of t)t.delete(e),this.dispatchEventToListeners("ExtensionStorageRemoved",i);this.#o.delete(e)}}#l(e){const t=this.#u(e);t&&this.#h(t,e.name)}#n(e){this.#l(e.data)}#u(t){const i=e.ParsedURL.ParsedURL.fromString(t.origin);return i&&"chrome-extension"===i.scheme?i.host:void 0}#p(e){const t=this.#u(e);if(t){if(this.#r?.executionContexts().some((e=>this.#u(e)===t)))return;this.#g(t)}}#d(e){this.#p(e.data)}storageForIdAndArea(e,t){return this.#o.get(e)?.get(t)}storages(){const e=[];for(const t of this.#o.values())e.push(...t.values());return e}}o.SDKModel.SDKModel.register(pe,{capabilities:4,autostart:!1});var me=Object.freeze({__proto__:null,ExtensionStorage:ue,ExtensionStorageModel:pe});const ve="";class we extends o.SDKModel.SDKModel{storageBucketModel;indexedDBAgent;storageAgent;databasesInternal;dat