UNPKG

@yuebai008/cli

Version:

Command line interface for rapid qg-minigame development

120 lines 13.4 kB
import*as i18n from"../../../core/i18n/i18n.js";import*as Buttons from"../../../ui/components/buttons/buttons.js";import*as SDK from"../../../core/sdk/sdk.js";import*as LitHtml from"../../../ui/lit-html/lit-html.js";import*as Root from"../../../core/root/root.js";import*as ReportView from"../../../ui/components/report_view/report_view.js";import*as LegacyWrapper from"../../../ui/components/legacy_wrapper/legacy_wrapper.js";import*as IconButton from"../../../ui/components/icon_button/icon_button.js";import*as ComponentHelpers from"../../../ui/components/helpers/helpers.js";import*as Coordinator from"../../../ui/components/render_coordinator/render_coordinator.js";import*as ChromeLink from"../../../ui/components/chrome_link/chrome_link.js";import*as ExpandableList from"../../../ui/components/expandable_list/expandable_list.js";import*as TreeOutline from"../../../ui/components/tree_outline/tree_outline.js";import{NotRestoredReasonDescription}from"./BackForwardCacheStrings.js";import backForwardCacheViewStyles from"./backForwardCacheView.css.js";const UIStrings={mainFrame:"Main Frame",backForwardCacheTitle:"Back/forward cache",unavailable:"unavailable",url:"URL:",unknown:"Unknown Status",normalNavigation:"Not served from back/forward cache: to trigger back/forward cache, use Chrome's back/forward buttons, or use the test button below to automatically navigate away and back.",restoredFromBFCache:"Successfully served from back/forward cache.",pageSupportNeeded:"Actionable",pageSupportNeededExplanation:"These reasons are actionable i.e. they can be cleaned up to make the page eligible for back/forward cache.",circumstantial:"Not Actionable",circumstantialExplanation:"These reasons are not actionable i.e. caching was prevented by something outside of the direct control of the page.",supportPending:"Pending Support",runTest:"Test back/forward cache",runningTest:"Running test",learnMore:"Learn more: back/forward cache eligibility",neverUseUnload:"Learn more: Never use unload handler",supportPendingExplanation:"Chrome support for these reasons is pending i.e. they will not prevent the page from being eligible for back/forward cache in a future version of Chrome.",blockingExtensionId:"Extension id: ",framesTitle:"Frames",issuesInSingleFrame:"{n, plural, =1 {# issue found in 1 frame.} other {# issues found in 1 frame.}}",issuesInMultipleFrames:"{n, plural, =1 {# issue found in {m} frames.} other {# issues found in {m} frames.}}",framesPerIssue:"{n, plural, =1 {# frame} other {# frames}}",blankURLTitle:"Blank URL [{PH1}]"},str_=i18n.i18n.registerUIStrings("panels/application/components/BackForwardCacheView.ts",UIStrings),i18nString=i18n.i18n.getLocalizedString.bind(void 0,str_),coordinator=Coordinator.RenderCoordinator.RenderCoordinator.instance();export class BackForwardCacheView extends LegacyWrapper.LegacyWrapper.WrappableComponent{static litTagName=LitHtml.literal`devtools-resources-back-forward-cache-view`;#e=this.attachShadow({mode:"open"});#t="Result";#r=0;#n=0;constructor(){super(),this.#a()?.addEventListener(SDK.ResourceTreeModel.Events.PrimaryPageChanged,this.render,this),this.#a()?.addEventListener(SDK.ResourceTreeModel.Events.BackForwardCacheDetailsUpdated,this.render,this)}#a(){const e=SDK.TargetManager.TargetManager.instance().primaryPageTarget();return e?.model(SDK.ResourceTreeModel.ResourceTreeModel)||null}#i(){return this.#a()?.mainFrame||null}connectedCallback(){this.parentElement?.classList.add("overflow-auto"),this.#e.adoptedStyleSheets=[backForwardCacheViewStyles]}async render(){await coordinator.write("BackForwardCacheView render",(()=>{LitHtml.render(LitHtml.html` <${ReportView.ReportView.Report.litTagName} .data=${{reportTitle:i18nString(UIStrings.backForwardCacheTitle)}}> ${this.#o()} </${ReportView.ReportView.Report.litTagName}> `,this.#e,{host:this})}))}#s(){SDK.TargetManager.TargetManager.instance().removeModelListener(SDK.ResourceTreeModel.ResourceTreeModel,SDK.ResourceTreeModel.Events.FrameNavigated,this.#s,this),this.#t="Result",this.render()}async#l(){SDK.TargetManager.TargetManager.instance().removeModelListener(SDK.ResourceTreeModel.ResourceTreeModel,SDK.ResourceTreeModel.Events.FrameNavigated,this.#l,this),await this.#c(50)}async#c(e){const t=SDK.TargetManager.TargetManager.instance().primaryPageTarget(),r=t?.model(SDK.ResourceTreeModel.ResourceTreeModel),n=await(r?.navigationHistory());r&&n&&(n.currentIndex===this.#n?window.setTimeout(this.#c.bind(this,2*e),e):(SDK.TargetManager.TargetManager.instance().addModelListener(SDK.ResourceTreeModel.ResourceTreeModel,SDK.ResourceTreeModel.Events.FrameNavigated,this.#s,this),r.navigateToHistoryEntry(n.entries[n.currentIndex-1])))}async#d(){const e=SDK.TargetManager.TargetManager.instance().primaryPageTarget(),t=e?.model(SDK.ResourceTreeModel.ResourceTreeModel),r=await(t?.navigationHistory());t&&r&&(this.#n=r.currentIndex,this.#t="Running",this.render(),SDK.TargetManager.TargetManager.instance().addModelListener(SDK.ResourceTreeModel.ResourceTreeModel,SDK.ResourceTreeModel.Events.FrameNavigated,this.#l,this),t.navigate("chrome://terms"))}#o(){const e=this.#i();if(!e)return LitHtml.html` <${ReportView.ReportView.ReportKey.litTagName}> ${i18nString(UIStrings.mainFrame)} </${ReportView.ReportView.ReportKey.litTagName}> <${ReportView.ReportView.ReportValue.litTagName}> ${i18nString(UIStrings.unavailable)} </${ReportView.ReportView.ReportValue.litTagName}> `;const t="Running"===this.#t,r=e.url.startsWith("devtools://");return LitHtml.html` ${this.#m(e.backForwardCacheDetails.restoredFromCache)} <div class="report-line"> <div class="report-key"> ${i18nString(UIStrings.url)} </div> <div class="report-value" title=${e.url}> ${e.url} </div> </div> ${this.#p(e.backForwardCacheDetails.explanationsTree)} <${ReportView.ReportView.ReportSection.litTagName}> <${Buttons.Button.Button.litTagName} aria-label=${i18nString(UIStrings.runTest)} .disabled=${t||r} .spinner=${t} .variant=${"primary"} @click=${this.#d}> ${t?LitHtml.html` ${i18nString(UIStrings.runningTest)}`:`\n ${i18nString(UIStrings.runTest)}\n `} </${Buttons.Button.Button.litTagName}> </${ReportView.ReportView.ReportSection.litTagName}> <${ReportView.ReportView.ReportSectionDivider.litTagName}> </${ReportView.ReportView.ReportSectionDivider.litTagName}> ${this.#u(e.backForwardCacheDetails.explanations,e.backForwardCacheDetails.explanationsTree)} <${ReportView.ReportView.ReportSection.litTagName}> <x-link href="https://web.dev/bfcache/" class="link"> ${i18nString(UIStrings.learnMore)} </x-link> </${ReportView.ReportView.ReportSection.litTagName}> `}#p(e){if(!e||0===e.explanations.length&&0===e.children.length||!Root.Runtime.experiments.isEnabled("bfcacheDisplayTree"))return LitHtml.nothing;const t=this.#g(e,{blankCount:1});t.node.treeNodeData.iconName="frame";let r="";r=1===t.frameCount?i18nString(UIStrings.issuesInSingleFrame,{n:t.issueCount}):i18nString(UIStrings.issuesInMultipleFrames,{n:t.issueCount,m:t.frameCount});const n={treeNodeData:{text:r},id:"root",children:()=>Promise.resolve([t.node])};return LitHtml.html` <div class="report-line"> <div class="report-key"> ${i18nString(UIStrings.framesTitle)} </div> <div class="report-value"> <${TreeOutline.TreeOutline.TreeOutline.litTagName} .data=${{tree:[n],defaultRenderer:function(e){return LitHtml.html` <div class="text-ellipsis"> ${e.treeNodeData.iconName?LitHtml.html` <${IconButton.Icon.Icon.litTagName} class="inline-icon" style="margin-bottom: -3px;" .data=${{iconName:e.treeNodeData.iconName,color:"var(--icon-default)",width:"20px",height:"20px"}}> </${IconButton.Icon.Icon.litTagName}> `:LitHtml.nothing} ${e.treeNodeData.text} </div> `},compact:!0}}> </${TreeOutline.TreeOutline.TreeOutline.litTagName}> </div> </div> `}#g(e,t){let r=1,n=0;const a=[];let i="";e.url.length?i=e.url:(i=i18nString(UIStrings.blankURLTitle,{PH1:t.blankCount}),t.blankCount+=1);for(const t of e.explanations){const e={treeNodeData:{text:t.reason},id:String(this.#r++)};n+=1,a.push(e)}for(const i of e.children){const e=this.#g(i,t);e.issueCount>0&&(a.push(e.node),n+=e.issueCount,r+=e.frameCount)}let o={treeNodeData:{text:`(${n}) ${i}`},id:String(this.#r++)};return a.length?(o={...o,children:()=>Promise.resolve(a)},o.treeNodeData.iconName="iframe"):e.url.length||(t.blankCount-=1),{node:o,frameCount:r,issueCount:n}}#m(e){switch(e){case!0:return LitHtml.html` <${ReportView.ReportView.ReportSection.litTagName}> <div class="status"> <${IconButton.Icon.Icon.litTagName} class="inline-icon" .data=${{iconName:"check-circle",color:"var(--icon-checkmark-green)",width:"20px",height:"20px"}}> </${IconButton.Icon.Icon.litTagName}> </div> ${i18nString(UIStrings.restoredFromBFCache)} </${ReportView.ReportView.ReportSection.litTagName}> `;case!1:return LitHtml.html` <${ReportView.ReportView.ReportSection.litTagName}> <div class="status"> <${IconButton.Icon.Icon.litTagName} class="inline-icon" .data=${{iconName:"clear",color:"var(--icon-default)",width:"20px",height:"20px"}}> </${IconButton.Icon.Icon.litTagName}> </div> ${i18nString(UIStrings.normalNavigation)} </${ReportView.ReportView.ReportSection.litTagName}> `}return LitHtml.html` <${ReportView.ReportView.ReportSection.litTagName}> ${i18nString(UIStrings.unknown)} </${ReportView.ReportView.ReportSection.litTagName}> `}#h(e,t,r){let n=e.url;0===n.length&&(n=i18nString(UIStrings.blankURLTitle,{PH1:t.blankCount}),t.blankCount+=1),e.explanations.forEach((e=>{let t=r.get(e.reason);void 0===t?(t=[n],r.set(e.reason,t)):t.push(n)})),e.children.map((e=>{this.#h(e,t,r)}))}#u(e,t){if(0===e.length)return LitHtml.nothing;const r=e.filter((e=>"PageSupportNeeded"===e.type)),n=e.filter((e=>"SupportPending"===e.type)),a=e.filter((e=>"Circumstantial"===e.type)),i=new Map;return t&&this.#h(t,{blankCount:1},i),LitHtml.html` ${this.#R(i18nString(UIStrings.pageSupportNeeded),i18nString(UIStrings.pageSupportNeededExplanation),r,i)} ${this.#R(i18nString(UIStrings.supportPending),i18nString(UIStrings.supportPendingExplanation),n,i)} ${this.#R(i18nString(UIStrings.circumstantial),i18nString(UIStrings.circumstantialExplanation),a,i)} `}#R(e,t,r,n){return LitHtml.html` ${r.length>0?LitHtml.html` <${ReportView.ReportView.ReportSectionHeader.litTagName}> ${e} <div class="help-outline-icon"> <${IconButton.Icon.Icon.litTagName} class="inline-icon" .data=${{iconName:"help",color:"var(--icon-default)",width:"16px",height:"16px"}} title=${t}> </${IconButton.Icon.Icon.litTagName}> </div> </${ReportView.ReportView.ReportSectionHeader.litTagName}> ${r.map((e=>this.#w(e,n.get(e.reason))))} `:LitHtml.nothing} `}#T(e){if("EmbedderExtensionSentMessageToCachedFrame"===e.reason&&e.context){const t="chrome://extensions/?id="+e.context;return LitHtml.html`${i18nString(UIStrings.blockingExtensionId)} <${ChromeLink.ChromeLink.ChromeLink.litTagName} .href=${t}>${e.context}</${ChromeLink.ChromeLink.ChromeLink.litTagName}>`}return LitHtml.nothing}#S(e){if(void 0===e||0===e.length||!Root.Runtime.experiments.isEnabled("bfcacheDisplayTree"))return LitHtml.nothing;const t=[LitHtml.html`<div>${i18nString(UIStrings.framesPerIssue,{n:e.length})}</div>`];return t.push(...e.map((e=>LitHtml.html`<div class="text-ellipsis" title=${e}>${e}</div>`))),LitHtml.html` <div class="explanation-frames"> <${ExpandableList.ExpandableList.ExpandableList.litTagName} .data=${{rows:t}}></${ExpandableList.ExpandableList.ExpandableList.litTagName}> </div> `}#v(e){return"UnloadHandlerExistsInMainFrame"===e.reason||"UnloadHandlerExistsInSubFrame"===e.reason?LitHtml.html` <x-link href="https://web.dev/bfcache/#never-use-the-unload-event" class="link"> ${i18nString(UIStrings.neverUseUnload)} </x-link>`:LitHtml.nothing}#w(e,t){return LitHtml.html` <${ReportView.ReportView.ReportSection.litTagName}> ${e.reason in NotRestoredReasonDescription?LitHtml.html` <div class="circled-exclamation-icon"> <${IconButton.Icon.Icon.litTagName} class="inline-icon" .data=${{iconName:"warning",color:"var(--icon-warning)",width:"16px",height:"16px"}}> </${IconButton.Icon.Icon.litTagName}> </div> <div> ${NotRestoredReasonDescription[e.reason].name()} ${this.#v(e)} ${this.#T(e)} </div>`:LitHtml.nothing} </${ReportView.ReportView.ReportSection.litTagName}> <div class="gray-text"> ${e.reason} </div> ${this.#S(t)} `}}ComponentHelpers.CustomElements.defineComponent("devtools-resources-back-forward-cache-view",BackForwardCacheView);