@yuebai008/cli
Version:
Command line interface for rapid qg-minigame development
1 lines • 15.7 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 SDK from"../../core/sdk/sdk.js";import*as EmulationModel from"../../models/emulation/emulation.js";import*as Emulation from"../emulation/emulation.js";const UIStrings={canOnlyAuditHttphttpsPages:"Can only audit pages on HTTP or HTTPS. Navigate to a different page.",thereMayBeStoredDataAffectingSingular:"There may be stored data affecting loading performance in this location: {PH1}. Audit this page in an incognito window to prevent those resources from affecting your scores.",thereMayBeStoredDataAffectingLoadingPlural:"There may be stored data affecting loading performance in these locations: {PH1}. Audit this page in an incognito window to prevent those resources from affecting your scores.",multipleTabsAreBeingControlledBy:"Multiple tabs are being controlled by the same `service worker`. Close your other tabs on the same origin to audit this page.",atLeastOneCategoryMustBeSelected:"At least one category must be selected.",localStorage:"Local storage",indexeddb:"IndexedDB",webSql:"Web SQL",performance:"Performance",howLongDoesThisAppTakeToShow:"How long does this app take to show content and become usable",progressiveWebApp:"Progressive Web App",doesThisPageMeetTheStandardOfA:"Does this page meet the standard of a Progressive Web App",bestPractices:"Best practices",doesThisPageFollowBestPractices:"Does this page follow best practices for modern web development",accessibility:"Accessibility",isThisPageUsableByPeopleWith:"Is this page usable by people with disabilities or impairments",seo:"SEO",isThisPageOptimizedForSearch:"Is this page optimized for search engine results ranking",publisherAds:"Publisher Ads",isThisPageOptimizedForAdSpeedAnd:"Is this page optimized for ad speed and quality",applyMobileEmulation:"Apply mobile emulation",applyMobileEmulationDuring:"Apply mobile emulation during auditing",lighthouseMode:"Lighthouse mode",runLighthouseInMode:"Run Lighthouse in navigation, timespan, or snapshot mode",navigation:"Navigation (Default)",navigationTooltip:"Navigation mode analyzes a page load, exactly like the original Lighthouse reports.",timespan:"Timespan",timespanTooltip:"Timespan mode analyzes an arbitrary period of time, typically containing user interactions.",snapshot:"Snapshot",snapshotTooltip:"Snapshot mode analyzes the page in a particular state, typically after user interactions.",mobile:"Mobile",desktop:"Desktop",throttlingMethod:"Throttling method",simulatedThrottling:"Simulated throttling (default)",devtoolsThrottling:"DevTools throttling (advanced)",simulateASlowerPageLoadBasedOn:"Simulated throttling simulates a slower page load based on data from an initial unthrottled load. DevTools throttling actually slows down the page.",clearStorage:"Clear storage",resetStorageLocalstorage:"Reset storage (`cache`, `service workers`, etc) before auditing. (Good for performance & `PWA` testing)",javaScriptDisabled:"JavaScript is disabled. You need to enable JavaScript to audit this page. Open the Command Menu and run the Enable JavaScript command to enable JavaScript."},str_=i18n.i18n.registerUIStrings("panels/lighthouse/LighthouseController.ts",UIStrings),i18nString=i18n.i18n.getLocalizedString.bind(void 0,str_),i18nLazyString=i18n.i18n.getLazilyComputedLocalizedString.bind(void 0,str_);export class LighthouseController extends Common.ObjectWrapper.ObjectWrapper{protocolService;manager;serviceWorkerListeners;inspectedURL;currentLighthouseRun;emulationStateBefore;constructor(e){super(),this.protocolService=e,e.registerStatusCallback((e=>this.dispatchEventToListeners(Events.AuditProgressChanged,{message:e})));for(const e of Presets)e.setting.addChangeListener(this.recomputePageAuditability.bind(this));for(const e of RuntimeSettings)e.setting.addChangeListener(this.recomputePageAuditability.bind(this));Common.Settings.Settings.instance().moduleSetting("javaScriptDisabled").addChangeListener(this.recomputePageAuditability.bind(this)),SDK.TargetManager.TargetManager.instance().observeModels(SDK.ServiceWorkerManager.ServiceWorkerManager,this),SDK.TargetManager.TargetManager.instance().addEventListener(SDK.TargetManager.Events.InspectedURLChanged,this.recomputePageAuditability,this)}modelAdded(e){e.target()===SDK.TargetManager.TargetManager.instance().primaryPageTarget()&&(this.manager=e,this.serviceWorkerListeners=[this.manager.addEventListener(SDK.ServiceWorkerManager.Events.RegistrationUpdated,this.recomputePageAuditability,this),this.manager.addEventListener(SDK.ServiceWorkerManager.Events.RegistrationDeleted,this.recomputePageAuditability,this)],this.recomputePageAuditability())}modelRemoved(e){this.manager===e&&(this.serviceWorkerListeners&&Common.EventTarget.removeEventListeners(this.serviceWorkerListeners),this.manager=null,this.recomputePageAuditability())}hasActiveServiceWorker(){if(!this.manager)return!1;const e=this.manager.target();if(!e)return!1;const t=Common.ParsedURL.ParsedURL.fromString(e.inspectedURL()),i=t&&t.securityOrigin();for(const e of this.manager.registrations().values())if(e.securityOrigin===i)for(const t of e.versions.values())if(t.controlledClients.length>1)return!0;return!1}hasAtLeastOneCategory(){return Presets.some((e=>e.setting.get()))}unauditablePageMessage(){if(!this.manager)return null;const e=this.manager.target(),t=e&&e.inspectedURL();if(!t?.startsWith("http"))return i18nString(UIStrings.canOnlyAuditHttphttpsPages);try{if(new URL(t).pathname.endsWith(".pdf"))return i18nString(UIStrings.canOnlyAuditHttphttpsPages)}catch(e){return i18nString(UIStrings.canOnlyAuditHttphttpsPages)}return null}javaScriptDisabled(){return Common.Settings.Settings.instance().moduleSetting("javaScriptDisabled").get()}async hasImportantResourcesNotCleared(){const e=RuntimeSettings.find((e=>"lighthouse.clear_storage"===e.setting.name));if(e&&!e.setting.get())return"";if(!this.manager)return"";const t=this.manager.target(),i=t.inspectedURL();if(!i)return"";const n=await t.storageAgent().invoke_getUsageAndQuota({origin:i});if(n.getError())return"";const o=n.usageBreakdown.filter((e=>e.usage)).map((e=>STORAGE_TYPE_NAMES.get(e.storageType))).map((e=>e?e():void 0)).filter(Boolean);return 1===o.length?i18nString(UIStrings.thereMayBeStoredDataAffectingSingular,{PH1:String(o[0])}):o.length>1?i18nString(UIStrings.thereMayBeStoredDataAffectingLoadingPlural,{PH1:o.join(", ")}):""}async evaluateInspectedURL(){if(!this.manager)return Platform.DevToolsPath.EmptyUrlString;const e=this.manager.target(),t=e.inspectedURL(),i=e.model(SDK.ResourceTreeModel.ResourceTreeModel),n=i&&await i.navigationHistory();if(!i||!n)return t;const{currentIndex:o,entries:s}=n;return s[o].url}getCurrentRun(){return this.currentLighthouseRun}getFlags(){const e={};for(const t of RuntimeSettings)t.setFlags(e,t.setting.get());return e}getCategoryIDs(){const e=[];for(const t of Presets)t.setting.get()&&e.push(t.configID);return e}async getInspectedURL(e){return(e&&e.force||!this.inspectedURL)&&(this.inspectedURL=await this.evaluateInspectedURL()),this.inspectedURL}recomputePageAuditability(){const e=this.hasActiveServiceWorker(),t=this.hasAtLeastOneCategory(),i=this.unauditablePageMessage(),n=this.javaScriptDisabled();let o="";e?o=i18nString(UIStrings.multipleTabsAreBeingControlledBy):t?i?o=i:n&&(o=i18nString(UIStrings.javaScriptDisabled)):o=i18nString(UIStrings.atLeastOneCategoryMustBeSelected),this.dispatchEventToListeners(Events.PageAuditabilityChanged,{helpText:o}),this.hasImportantResourcesNotCleared().then((e=>{"navigation"!==this.getFlags().mode&&(e=""),this.dispatchEventToListeners(Events.PageWarningsChanged,{warning:e})}))}recordMetrics(e){switch(Host.userMetrics.actionTaken(Host.UserMetrics.Action.LighthouseStarted),e.mode){case"navigation":Host.userMetrics.lighthouseModeRun(Host.UserMetrics.LighthouseModeRun.Navigation);break;case"timespan":Host.userMetrics.lighthouseModeRun(Host.UserMetrics.LighthouseModeRun.Timespan);break;case"snapshot":Host.userMetrics.lighthouseModeRun(Host.UserMetrics.LighthouseModeRun.Snapshot)}}async startLighthouse(){try{const e=await this.getInspectedURL({force:!0}),t=this.getCategoryIDs(),i=this.getFlags();this.recordMetrics(i),this.currentLighthouseRun={inspectedURL:e,categoryIDs:t,flags:i},await this.setupEmulationAndProtocolConnection(),"timespan"===i.mode&&await this.protocolService.startTimespan(this.currentLighthouseRun)}catch(e){throw await this.restoreEmulationAndProtocolConnection(),e}}async collectLighthouseResults(){try{if(!this.currentLighthouseRun)throw new Error("Lighthouse is not started");const e=await this.protocolService.collectLighthouseResults(this.currentLighthouseRun);if(!e)throw new Error("Auditing failed to produce a result");if(e.fatal){const t=new Error(e.message);throw t.stack=e.stack,t}return Host.userMetrics.actionTaken(Host.UserMetrics.Action.LighthouseFinished),await this.restoreEmulationAndProtocolConnection(),e}catch(e){throw await this.restoreEmulationAndProtocolConnection(),e}finally{this.currentLighthouseRun=void 0}}async cancelLighthouse(){await this.restoreEmulationAndProtocolConnection(),this.currentLighthouseRun=void 0}async setupEmulationAndProtocolConnection(){const e=this.getFlags(),t=EmulationModel.DeviceModeModel.DeviceModeModel.instance();if(this.emulationStateBefore={emulation:{type:t.type(),enabled:t.enabledSetting().get(),outlineEnabled:t.deviceOutlineSetting().get(),toolbarControlsEnabled:t.toolbarControlsEnabledSetting().get(),scale:t.scaleSetting().get(),device:t.device(),mode:t.mode()},network:{conditions:SDK.NetworkManager.MultitargetNetworkManager.instance().networkConditions()}},t.toolbarControlsEnabledSetting().set(!1),"formFactor"in e&&"desktop"===e.formFactor)t.enabledSetting().set(!1),t.emulate(EmulationModel.DeviceModeModel.Type.None,null,null);else if("mobile"===e.formFactor){t.enabledSetting().set(!0),t.deviceOutlineSetting().set(!0);for(const e of EmulationModel.EmulatedDevices.EmulatedDevicesList.instance().standard())"Moto G Power"===e.title&&t.emulate(EmulationModel.DeviceModeModel.Type.Device,e,e.modes[0],1)}await this.protocolService.attach()}async restoreEmulationAndProtocolConnection(){if(!this.currentLighthouseRun)return;if(await this.protocolService.detach(),this.emulationStateBefore){const e=EmulationModel.DeviceModeModel.DeviceModeModel.instance();e.emulate(EmulationModel.DeviceModeModel.Type.None,null,null);const{type:t,enabled:i,outlineEnabled:n,toolbarControlsEnabled:o,scale:s,device:a,mode:r}=this.emulationStateBefore.emulation;e.enabledSetting().set(i),e.deviceOutlineSetting().set(n),e.toolbarControlsEnabledSetting().set(o),t===EmulationModel.DeviceModeModel.Type.Responsive&&e.scaleSetting().set(s),e.emulate(t,a,r,s),SDK.NetworkManager.MultitargetNetworkManager.instance().setNetworkConditions(this.emulationStateBefore.network.conditions),delete this.emulationStateBefore}Emulation.InspectedPagePlaceholder.InspectedPagePlaceholder.instance().update(!0);const e=SDK.TargetManager.TargetManager.instance().primaryPageTarget();if(!e)return;const t=e.model(SDK.ResourceTreeModel.ResourceTreeModel);if(!t)return;if("navigation"===this.currentLighthouseRun.flags.mode){const e=await this.getInspectedURL();await t.navigate(e)}}}const STORAGE_TYPE_NAMES=new Map([["local_storage",i18nLazyString(UIStrings.localStorage)],["indexeddb",i18nLazyString(UIStrings.indexeddb)],["websql",i18nLazyString(UIStrings.webSql)]]);export const Presets=[{setting:Common.Settings.Settings.instance().createSetting("lighthouse.cat_perf",!0,Common.Settings.SettingStorageType.Synced),configID:"performance",title:i18nLazyString(UIStrings.performance),description:i18nLazyString(UIStrings.howLongDoesThisAppTakeToShow),plugin:!1,supportedModes:["navigation","timespan","snapshot"]},{setting:Common.Settings.Settings.instance().createSetting("lighthouse.cat_a11y",!0,Common.Settings.SettingStorageType.Synced),configID:"accessibility",title:i18nLazyString(UIStrings.accessibility),description:i18nLazyString(UIStrings.isThisPageUsableByPeopleWith),plugin:!1,supportedModes:["navigation","snapshot"]},{setting:Common.Settings.Settings.instance().createSetting("lighthouse.cat_best_practices",!0,Common.Settings.SettingStorageType.Synced),configID:"best-practices",title:i18nLazyString(UIStrings.bestPractices),description:i18nLazyString(UIStrings.doesThisPageFollowBestPractices),plugin:!1,supportedModes:["navigation","timespan","snapshot"]},{setting:Common.Settings.Settings.instance().createSetting("lighthouse.cat_seo",!0,Common.Settings.SettingStorageType.Synced),configID:"seo",title:i18nLazyString(UIStrings.seo),description:i18nLazyString(UIStrings.isThisPageOptimizedForSearch),plugin:!1,supportedModes:["navigation","snapshot"]},{setting:Common.Settings.Settings.instance().createSetting("lighthouse.cat_pwa",!0,Common.Settings.SettingStorageType.Synced),configID:"pwa",title:i18nLazyString(UIStrings.progressiveWebApp),description:i18nLazyString(UIStrings.doesThisPageMeetTheStandardOfA),plugin:!1,supportedModes:["navigation"]},{setting:Common.Settings.Settings.instance().createSetting("lighthouse.cat_pubads",!1,Common.Settings.SettingStorageType.Synced),plugin:!0,configID:"lighthouse-plugin-publisher-ads",title:i18nLazyString(UIStrings.publisherAds),description:i18nLazyString(UIStrings.isThisPageOptimizedForAdSpeedAnd),supportedModes:["navigation"]}];export const RuntimeSettings=[{setting:Common.Settings.Settings.instance().createSetting("lighthouse.device_type","mobile",Common.Settings.SettingStorageType.Synced),title:i18nLazyString(UIStrings.applyMobileEmulation),description:i18nLazyString(UIStrings.applyMobileEmulationDuring),setFlags:(e,t)=>{e.formFactor=t},options:[{label:i18nLazyString(UIStrings.mobile),value:"mobile"},{label:i18nLazyString(UIStrings.desktop),value:"desktop"}],learnMore:void 0},{setting:Common.Settings.Settings.instance().createSetting("lighthouse.mode","navigation",Common.Settings.SettingStorageType.Synced),title:i18nLazyString(UIStrings.lighthouseMode),description:i18nLazyString(UIStrings.runLighthouseInMode),setFlags:(e,t)=>{e.mode=t},options:[{label:i18nLazyString(UIStrings.navigation),tooltip:i18nLazyString(UIStrings.navigationTooltip),value:"navigation"},{label:i18nLazyString(UIStrings.timespan),tooltip:i18nLazyString(UIStrings.timespanTooltip),value:"timespan"},{label:i18nLazyString(UIStrings.snapshot),tooltip:i18nLazyString(UIStrings.snapshotTooltip),value:"snapshot"}],learnMore:"https://github.com/GoogleChrome/lighthouse/blob/HEAD/docs/user-flows.md"},{setting:Common.Settings.Settings.instance().createSetting("lighthouse.throttling","simulate",Common.Settings.SettingStorageType.Synced),title:i18nLazyString(UIStrings.throttlingMethod),learnMore:"https://github.com/GoogleChrome/lighthouse/blob/master/docs/throttling.md#devtools-lighthouse-panel-throttling",description:i18nLazyString(UIStrings.simulateASlowerPageLoadBasedOn),setFlags:(e,t)=>{e.throttlingMethod="string"==typeof t?t:t?"simulate":"devtools"},options:[{label:i18nLazyString(UIStrings.simulatedThrottling),value:"simulate"},{label:i18nLazyString(UIStrings.devtoolsThrottling),value:"devtools"}]},{setting:Common.Settings.Settings.instance().createSetting("lighthouse.clear_storage",!0,Common.Settings.SettingStorageType.Synced),title:i18nLazyString(UIStrings.clearStorage),description:i18nLazyString(UIStrings.resetStorageLocalstorage),setFlags:(e,t)=>{e.disableStorageReset=!t},options:void 0,learnMore:void 0}];export var Events;!function(e){e.PageAuditabilityChanged="PageAuditabilityChanged",e.PageWarningsChanged="PageWarningsChanged",e.AuditProgressChanged="AuditProgressChanged"}(Events||(Events={}));