@mcp-b/chrome-devtools-mcp 2.0.2 → 2.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/README.md +120 -10
  2. package/build/src/McpContext.js +69 -5
  3. package/build/src/browser.js +157 -51
  4. package/build/src/cli.js +11 -5
  5. package/build/src/formatters/IssueFormatter.js +190 -0
  6. package/build/src/main.js +83 -2
  7. package/build/src/telemetry/clearcut-logger.js +102 -0
  8. package/build/src/telemetry/flag-utils.js +45 -0
  9. package/build/src/telemetry/metric-utils.js +14 -0
  10. package/build/src/telemetry/persistence.js +53 -0
  11. package/build/src/telemetry/types.js +33 -0
  12. package/build/src/telemetry/watchdog/clearcut-sender.js +201 -0
  13. package/build/src/telemetry/watchdog/main.js +127 -0
  14. package/build/src/telemetry/watchdog-client.js +60 -0
  15. package/build/src/third_party/devtools-formatter-worker.js +7 -0
  16. package/build/src/third_party/index.js +1 -1
  17. package/build/src/tools/browser.js +92 -0
  18. package/build/src/tools/extension.js +31 -0
  19. package/build/src/tools/extensions.js +79 -0
  20. package/build/src/tools/input.js +6 -1
  21. package/build/src/tools/pages.js +7 -1
  22. package/build/src/tools/script.js +31 -4
  23. package/build/src/tools/tools.js +4 -0
  24. package/build/src/transports/CDPClientTransport.js +184 -0
  25. package/build/src/transports/WebMCPBridgeScript.js +11 -2
  26. package/build/src/utils/ExtensionRegistry.js +35 -0
  27. package/build/src/utils/string.js +36 -0
  28. package/build/vendor/chrome-devtools-frontend/front_end/core/common/Base64.js +20 -2
  29. package/build/vendor/chrome-devtools-frontend/front_end/core/common/Debouncer.js +8 -1
  30. package/build/vendor/chrome-devtools-frontend/front_end/core/common/Gzip.js +11 -0
  31. package/build/vendor/chrome-devtools-frontend/front_end/core/common/Object.js +6 -1
  32. package/build/vendor/chrome-devtools-frontend/front_end/core/common/ParsedURL.js +3 -0
  33. package/build/vendor/chrome-devtools-frontend/front_end/core/common/ResourceType.js +6 -0
  34. package/build/vendor/chrome-devtools-frontend/front_end/core/common/Revealer.js +0 -5
  35. package/build/vendor/chrome-devtools-frontend/front_end/core/common/Settings.js +18 -8
  36. package/build/vendor/chrome-devtools-frontend/front_end/core/host/AidaClient.js +24 -0
  37. package/build/vendor/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHostStub.js +11 -3
  38. package/build/vendor/chrome-devtools-frontend/front_end/core/host/ResourceLoader.js +1 -1
  39. package/build/vendor/chrome-devtools-frontend/front_end/core/host/UserMetrics.js +27 -20
  40. package/build/vendor/chrome-devtools-frontend/front_end/core/i18n/collect-ui-strings.js +7 -8
  41. package/build/vendor/chrome-devtools-frontend/front_end/core/i18n/generate-locales-js.js +4 -5
  42. package/build/vendor/chrome-devtools-frontend/front_end/core/platform/ArrayUtilities.js +10 -0
  43. package/build/vendor/chrome-devtools-frontend/front_end/core/platform/StringUtilities.js +63 -12
  44. package/build/vendor/chrome-devtools-frontend/front_end/core/protocol_client/CDPConnection.js +1 -0
  45. package/build/vendor/chrome-devtools-frontend/front_end/core/protocol_client/InspectorBackend.js +4 -1
  46. package/build/vendor/chrome-devtools-frontend/front_end/core/root/ExperimentNames.js +30 -0
  47. package/build/vendor/chrome-devtools-frontend/front_end/core/root/root.js +2 -1
  48. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/AnimationModel.js +0 -4
  49. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CSSMatchedStyles.js +69 -9
  50. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CSSMetadata.js +6 -6
  51. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CSSModel.js +28 -13
  52. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CSSProperty.js +1 -1
  53. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CSSPropertyParserMatchers.js +6 -0
  54. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/ConsoleModel.js +0 -2
  55. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/CookieModel.js +1 -1
  56. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/DOMModel.js +170 -13
  57. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/DebuggerModel.js +5 -39
  58. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/HeapProfilerModel.js +8 -1
  59. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/NetworkManager.js +20 -5
  60. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/NetworkRequest.js +12 -21
  61. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/OverlayModel.js +19 -6
  62. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/RehydratingConnection.js +5 -1
  63. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/ResourceTreeModel.js +8 -5
  64. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/SourceMap.js +15 -10
  65. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/SourceMapManager.js +1 -1
  66. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/SourceMapScopesInfo.js +13 -27
  67. package/build/vendor/chrome-devtools-frontend/front_end/core/sdk/Target.js +3 -1
  68. package/build/vendor/chrome-devtools-frontend/front_end/generated/ARIAProperties.js +1 -7
  69. package/build/vendor/chrome-devtools-frontend/front_end/generated/Deprecation.js +1 -16
  70. package/build/vendor/chrome-devtools-frontend/front_end/generated/InspectorBackendCommands.js +82 -22
  71. package/build/vendor/chrome-devtools-frontend/front_end/generated/SupportedCSSProperties.js +265 -123
  72. package/build/vendor/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.js +2 -1
  73. package/build/vendor/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceInsightFormatter.js +10 -16
  74. package/build/vendor/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.js +97 -26
  75. package/build/vendor/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AICallTree.js +35 -0
  76. package/build/vendor/chrome-devtools-frontend/front_end/models/annotations/AnnotationRepository.js +163 -0
  77. package/build/vendor/chrome-devtools-frontend/front_end/models/annotations/AnnotationType.js +10 -0
  78. package/build/vendor/chrome-devtools-frontend/front_end/models/annotations/annotations.js +5 -0
  79. package/build/vendor/chrome-devtools-frontend/front_end/models/bindings/CompilerScriptMapping.js +5 -3
  80. package/build/vendor/chrome-devtools-frontend/front_end/models/bindings/DebuggerLanguagePlugins.js +29 -58
  81. package/build/vendor/chrome-devtools-frontend/front_end/models/bindings/DebuggerWorkspaceBinding.js +7 -45
  82. package/build/vendor/chrome-devtools-frontend/front_end/models/emulation/DeviceModeModel.js +1 -1
  83. package/build/vendor/chrome-devtools-frontend/front_end/models/emulation/EmulatedDevices.js +14 -0
  84. package/build/vendor/chrome-devtools-frontend/front_end/models/formatter/FormatterWorkerPool.js +8 -5
  85. package/build/vendor/chrome-devtools-frontend/front_end/models/greendev/Prototypes.js +33 -0
  86. package/build/vendor/chrome-devtools-frontend/front_end/models/greendev/greendev.js +4 -0
  87. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/ContrastCheckTrigger.js +2 -2
  88. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/CookieIssue.js +0 -21
  89. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/CorsIssue.js +1 -38
  90. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/IssueAggregator.js +8 -0
  91. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/IssuesManager.js +6 -12
  92. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/PermissionElementIssue.js +243 -0
  93. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementActivationDisabled.md +7 -0
  94. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementActivationDisabledWithOccluder.md +9 -0
  95. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementActivationDisabledWithOccluderParent.md +9 -0
  96. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementCspFrameAncestorsMissing.md +5 -0
  97. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementFencedFrameDisallowed.md +5 -0
  98. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementFontSizeTooLarge.md +5 -0
  99. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementFontSizeTooSmall.md +5 -0
  100. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementGeolocationDeprecated.md +5 -0
  101. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementInsetBoxShadowUnsupported.md +5 -0
  102. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementInvalidDisplayStyle.md +5 -0
  103. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementInvalidSizeValue.md +5 -0
  104. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementInvalidType.md +5 -0
  105. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementInvalidTypeActivation.md +5 -0
  106. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementLowContrast.md +5 -0
  107. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementNonOpaqueColor.md +5 -0
  108. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementPaddingBottomUnsupported.md +6 -0
  109. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementPaddingRightUnsupported.md +6 -0
  110. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementPermissionsPolicyBlocked.md +5 -0
  111. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementRegistrationFailed.md +5 -0
  112. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementRequestInProgress.md +5 -0
  113. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementSecurityChecksFailed.md +5 -0
  114. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementTypeNotSupported.md +5 -0
  115. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/permissionElementUntrustedEvent.md +7 -0
  116. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/issues_manager.js +2 -1
  117. package/build/vendor/chrome-devtools-frontend/front_end/models/logs/NetworkLog.js +0 -8
  118. package/build/vendor/chrome-devtools-frontend/front_end/models/source_map_scopes/NamesResolver.js +4 -8
  119. package/build/vendor/chrome-devtools-frontend/front_end/models/stack_trace/StackTrace.js +30 -1
  120. package/build/vendor/chrome-devtools-frontend/front_end/models/stack_trace/StackTraceImpl.js +70 -1
  121. package/build/vendor/chrome-devtools-frontend/front_end/models/stack_trace/StackTraceModel.js +82 -30
  122. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/EventsSerializer.js +10 -2
  123. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/LanternComputationData.js +2 -2
  124. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/ModelImpl.js +0 -3
  125. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/Processor.js +18 -19
  126. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/Styles.js +12 -4
  127. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/extras/Initiators.js +46 -0
  128. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/extras/TraceTree.js +4 -3
  129. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/extras/extras.js +1 -0
  130. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/handlers/LargestImagePaintHandler.js +2 -2
  131. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/handlers/LayoutShiftsHandler.js +1 -1
  132. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/handlers/MetaHandler.js +6 -0
  133. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/handlers/NetworkRequestsHandler.js +10 -1
  134. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/handlers/PageLoadMetricsHandler.js +44 -27
  135. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/helpers/Timing.js +9 -2
  136. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/insights/Common.js +1 -6
  137. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/insights/LCPBreakdown.js +2 -2
  138. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/insights/LCPDiscovery.js +2 -4
  139. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/insights/NetworkDependencyTree.js +3 -2
  140. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/insights/RenderBlocking.js +1 -1
  141. package/build/vendor/chrome-devtools-frontend/front_end/models/trace/types/TraceEvents.js +33 -11
  142. package/build/vendor/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/decode/decode.js +51 -18
  143. package/build/vendor/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/encode/encoder.js +1 -1
  144. package/build/vendor/chrome-devtools-frontend/front_end/third_party/source-map-scopes-codec/package/src/scopes.js +4 -0
  145. package/build/vendor/chrome-devtools-frontend/mcp/HostBindings.js +4 -0
  146. package/build/vendor/chrome-devtools-frontend/mcp/mcp.js +4 -0
  147. package/package.json +28 -21
  148. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/SameSiteInvalidSameParty.md +0 -8
  149. package/build/vendor/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/SameSiteSamePartyCrossPartyContextSet.md +0 -10
@@ -50,16 +50,6 @@ const UIStrings = {
50
50
  * @example {File not found} PH3
51
51
  */
52
52
  failedToLoadDebugSymbolsFor: '[{PH1}] Failed to load debug symbols for {PH2} ({PH3})',
53
- /**
54
- * @description Error message that is displayed in UI debugging information cannot be found for a call frame
55
- * @example {main} PH1
56
- */
57
- failedToLoadDebugSymbolsForFunction: 'No debug information for function "{PH1}"',
58
- /**
59
- * @description Error message that is displayed in UI when a file needed for debugging information for a call frame is missing
60
- * @example {mainp.debug.wasm.dwp} PH1
61
- */
62
- debugSymbolsIncomplete: 'The debug information for function {PH1} is incomplete',
63
53
  };
64
54
  const str_ = i18n.i18n.registerUIStrings('models/bindings/DebuggerLanguagePlugins.ts', UIStrings);
65
55
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
@@ -402,44 +392,18 @@ export class DebuggerLanguagePluginManager {
402
392
  callFrameForStopId(stopId) {
403
393
  return this.callFrameByStopId.get(stopId);
404
394
  }
405
- expandCallFrames(callFrames) {
406
- return Promise
407
- .all(callFrames.map(async (callFrame) => {
408
- const functionInfo = await this.getFunctionInfo(callFrame.script, callFrame.location());
409
- if (functionInfo) {
410
- if ('frames' in functionInfo && functionInfo.frames.length) {
411
- return functionInfo.frames.map(({ name }, index) => callFrame.createVirtualCallFrame(index, name));
412
- }
413
- if ('missingSymbolFiles' in functionInfo && functionInfo.missingSymbolFiles.length) {
414
- const resources = functionInfo.missingSymbolFiles;
415
- const details = i18nString(UIStrings.debugSymbolsIncomplete, { PH1: callFrame.functionName });
416
- callFrame.missingDebugInfoDetails = { details, resources };
417
- }
418
- else {
419
- callFrame.missingDebugInfoDetails = {
420
- details: i18nString(UIStrings.failedToLoadDebugSymbolsForFunction, { PH1: callFrame.functionName }),
421
- resources: [],
422
- };
423
- }
424
- }
425
- return callFrame;
426
- }))
427
- .then(callFrames => callFrames.flat());
428
- }
429
395
  modelAdded(debuggerModel) {
430
396
  this.#debuggerModelToData.set(debuggerModel, new ModelData(debuggerModel, this.#workspace));
431
397
  debuggerModel.addEventListener(SDK.DebuggerModel.Events.GlobalObjectCleared, this.globalObjectCleared, this);
432
398
  debuggerModel.addEventListener(SDK.DebuggerModel.Events.ParsedScriptSource, this.parsedScriptSource, this);
433
399
  debuggerModel.addEventListener(SDK.DebuggerModel.Events.DebuggerResumed, this.debuggerResumed, this);
434
400
  debuggerModel.setEvaluateOnCallFrameCallback(this.evaluateOnCallFrame.bind(this));
435
- debuggerModel.setExpandCallFramesCallback(this.expandCallFrames.bind(this));
436
401
  }
437
402
  modelRemoved(debuggerModel) {
438
403
  debuggerModel.removeEventListener(SDK.DebuggerModel.Events.GlobalObjectCleared, this.globalObjectCleared, this);
439
404
  debuggerModel.removeEventListener(SDK.DebuggerModel.Events.ParsedScriptSource, this.parsedScriptSource, this);
440
405
  debuggerModel.removeEventListener(SDK.DebuggerModel.Events.DebuggerResumed, this.debuggerResumed, this);
441
406
  debuggerModel.setEvaluateOnCallFrameCallback(null);
442
- debuggerModel.setExpandCallFramesCallback(null);
443
407
  const modelData = this.#debuggerModelToData.get(debuggerModel);
444
408
  if (modelData) {
445
409
  modelData.dispose();
@@ -641,24 +605,15 @@ export class DebuggerLanguagePluginManager {
641
605
  const framePromises = functionInfo.frames.map(async ({ name }, index) => {
642
606
  const rawLocation = new SDK.DebuggerModel.Location(script.debuggerModel, script.scriptId, frame.lineNumber, frame.columnNumber, index);
643
607
  const uiLocation = await this.rawLocationToUILocation(rawLocation);
644
- return {
645
- uiSourceCode: uiLocation?.uiSourceCode,
646
- url: uiLocation ? undefined : frame.url,
647
- name,
648
- line: uiLocation?.lineNumber ?? frame.lineNumber,
649
- column: uiLocation?.columnNumber ?? frame.columnNumber,
650
- };
608
+ return translatedFromUILocation(uiLocation, name, frame);
651
609
  });
652
610
  translatedFrames.push(await Promise.all(framePromises));
653
611
  return true;
654
612
  }
655
- // Identity map the frame, then add the missing debug info details.
656
- const mappedFrame = {
657
- url: frame.url,
658
- name: frame.functionName,
659
- line: frame.lineNumber,
660
- column: frame.columnNumber,
661
- };
613
+ // Translate the location only. We go through via "DebuggerWorkspaceBinding". It'll still try the plugin
614
+ // first, but this way, we'll get a UISourceCode for the raw script if the plugin fails to translate.
615
+ const uiLocation = await this.#debuggerWorkspaceBinding.rawLocationToUILocation(new SDK.DebuggerModel.Location(script.debuggerModel, script.scriptId, frame.lineNumber, frame.columnNumber));
616
+ const mappedFrame = translatedFromUILocation(uiLocation, frame.functionName, frame);
662
617
  if ('missingSymbolFiles' in functionInfo && functionInfo.missingSymbolFiles.length) {
663
618
  translatedFrames.push([{
664
619
  ...mappedFrame,
@@ -677,6 +632,24 @@ export class DebuggerLanguagePluginManager {
677
632
  }]);
678
633
  }
679
634
  return true;
635
+ function translatedFromUILocation(uiLocation, name, fallback) {
636
+ if (uiLocation) {
637
+ return {
638
+ uiSourceCode: uiLocation.uiSourceCode,
639
+ url: undefined,
640
+ name,
641
+ line: uiLocation.lineNumber,
642
+ column: uiLocation.columnNumber ?? -1,
643
+ };
644
+ }
645
+ return {
646
+ uiSourceCode: undefined,
647
+ url: fallback.url,
648
+ name: fallback.functionName,
649
+ line: fallback.lineNumber,
650
+ column: fallback.columnNumber,
651
+ };
652
+ }
680
653
  }
681
654
  scriptsForUISourceCode(uiSourceCode) {
682
655
  for (const modelData of this.#debuggerModelToData.values()) {
@@ -762,15 +735,13 @@ export class DebuggerLanguagePluginManager {
762
735
  // for the DebuggerModel again, which may disappear
763
736
  // in the meantime...
764
737
  void rawModuleHandle.addRawModulePromise.then(sourceFileURLs => {
765
- if (!('missingSymbolFiles' in sourceFileURLs)) {
766
- // The script might have disappeared meanwhile...
767
- if (script.debuggerModel.scriptForId(script.scriptId) === script) {
768
- const modelData = this.#debuggerModelToData.get(script.debuggerModel);
769
- if (modelData) { // The DebuggerModel could have disappeared meanwhile...
770
- modelData.addSourceFiles(script, sourceFileURLs);
771
- void this.#debuggerWorkspaceBinding.updateLocations(script);
772
- }
738
+ // The script might have disappeared meanwhile...
739
+ if (script.debuggerModel.scriptForId(script.scriptId) === script) {
740
+ const modelData = this.#debuggerModelToData.get(script.debuggerModel);
741
+ if (modelData && Array.isArray(sourceFileURLs)) { // The DebuggerModel could have disappeared meanwhile...
742
+ modelData.addSourceFiles(script, sourceFileURLs);
773
743
  }
744
+ void this.#debuggerWorkspaceBinding.updateLocations(script);
774
745
  }
775
746
  });
776
747
  return;
@@ -27,8 +27,6 @@ export class DebuggerWorkspaceBinding {
27
27
  this.ignoreListManager = ignoreListManager;
28
28
  this.workspace = workspace;
29
29
  this.#debuggerModelToData = new Map();
30
- targetManager.addModelListener(SDK.DebuggerModel.DebuggerModel, SDK.DebuggerModel.Events.GlobalObjectCleared, this.globalObjectCleared, this);
31
- targetManager.addModelListener(SDK.DebuggerModel.DebuggerModel, SDK.DebuggerModel.Events.DebuggerResumed, this.debuggerResumed, this);
32
30
  targetManager.observeModels(SDK.DebuggerModel.DebuggerModel, this);
33
31
  this.ignoreListManager.addEventListener("IGNORED_SCRIPT_RANGES_UPDATED" /* Workspace.IgnoreListManager.Events.IGNORED_SCRIPT_RANGES_UPDATED */, event => this.updateLocations(event.data));
34
32
  this.#liveLocationPromises = new Set();
@@ -141,6 +139,10 @@ export class DebuggerWorkspaceBinding {
141
139
  const model = target.model(StackTraceImpl.StackTraceModel.StackTraceModel);
142
140
  return await model.createFromProtocolRuntime(stackTrace, this.#translateRawFrames.bind(this));
143
141
  }
142
+ async createStackTraceFromDebuggerPaused(pausedDetails, target) {
143
+ const model = target.model(StackTraceImpl.StackTraceModel.StackTraceModel);
144
+ return await model.createFromDebuggerPaused(pausedDetails, this.#translateRawFrames.bind(this));
145
+ }
144
146
  async createLiveLocation(rawLocation, updateDelegate, locationPool) {
145
147
  const modelData = this.#debuggerModelToData.get(rawLocation.debuggerModel);
146
148
  if (!modelData) {
@@ -156,21 +158,6 @@ export class DebuggerWorkspaceBinding {
156
158
  this.recordLiveLocationChange(locationPromise);
157
159
  return await locationPromise;
158
160
  }
159
- async createCallFrameLiveLocation(location, updateDelegate, locationPool) {
160
- const script = location.script();
161
- if (!script) {
162
- return null;
163
- }
164
- const debuggerModel = location.debuggerModel;
165
- const liveLocationPromise = this.createLiveLocation(location, updateDelegate, locationPool);
166
- this.recordLiveLocationChange(liveLocationPromise);
167
- const liveLocation = await liveLocationPromise;
168
- if (!liveLocation) {
169
- return null;
170
- }
171
- this.registerCallFrameLiveLocation(debuggerModel, liveLocation);
172
- return liveLocation;
173
- }
174
161
  async rawLocationToUILocation(rawLocation) {
175
162
  const uiLocation = await this.pluginManager.rawLocationToUILocation(rawLocation);
176
163
  if (uiLocation) {
@@ -312,19 +299,6 @@ export class DebuggerWorkspaceBinding {
312
299
  const scripts = this.pluginManager.scriptsForUISourceCode(uiSourceCode);
313
300
  return scripts.every(script => script.isJavaScript());
314
301
  }
315
- globalObjectCleared(event) {
316
- this.reset(event.data);
317
- }
318
- reset(debuggerModel) {
319
- const modelData = this.#debuggerModelToData.get(debuggerModel);
320
- if (!modelData) {
321
- return;
322
- }
323
- for (const location of modelData.callFrameLocations.values()) {
324
- this.removeLiveLocation(location);
325
- }
326
- modelData.callFrameLocations.clear();
327
- }
328
302
  resetForTest(target) {
329
303
  const debuggerModel = target.model(SDK.DebuggerModel.DebuggerModel);
330
304
  const modelData = this.#debuggerModelToData.get(debuggerModel);
@@ -332,22 +306,12 @@ export class DebuggerWorkspaceBinding {
332
306
  modelData.getResourceScriptMapping().resetForTest();
333
307
  }
334
308
  }
335
- registerCallFrameLiveLocation(debuggerModel, location) {
336
- const modelData = this.#debuggerModelToData.get(debuggerModel);
337
- if (modelData) {
338
- const locations = modelData.callFrameLocations;
339
- locations.add(location);
340
- }
341
- }
342
309
  removeLiveLocation(location) {
343
310
  const modelData = this.#debuggerModelToData.get(location.rawLocation.debuggerModel);
344
311
  if (modelData) {
345
312
  modelData.disposeLocation(location);
346
313
  }
347
314
  }
348
- debuggerResumed(event) {
349
- this.reset(event.data);
350
- }
351
315
  async shouldPause(debuggerPausedDetails, autoSteppingContext) {
352
316
  // This function returns false if the debugger should continue stepping
353
317
  const { callFrames: [frame] } = debuggerPausedDetails;
@@ -382,7 +346,7 @@ export class DebuggerWorkspaceBinding {
382
346
  }
383
347
  const modelData = this.#debuggerModelToData.get(target.model(SDK.DebuggerModel.DebuggerModel));
384
348
  if (modelData) {
385
- modelData.translateRawFramesStep(rawFrames, translatedFrames);
349
+ await modelData.translateRawFramesStep(rawFrames, translatedFrames);
386
350
  return;
387
351
  }
388
352
  const frame = rawFrames.shift();
@@ -393,7 +357,6 @@ export class DebuggerWorkspaceBinding {
393
357
  class ModelData {
394
358
  #debuggerModel;
395
359
  #debuggerWorkspaceBinding;
396
- callFrameLocations;
397
360
  #defaultMapping;
398
361
  #resourceMapping;
399
362
  #resourceScriptMapping;
@@ -402,7 +365,6 @@ class ModelData {
402
365
  constructor(debuggerModel, debuggerWorkspaceBinding) {
403
366
  this.#debuggerModel = debuggerModel;
404
367
  this.#debuggerWorkspaceBinding = debuggerWorkspaceBinding;
405
- this.callFrameLocations = new Set();
406
368
  const { workspace } = debuggerWorkspaceBinding.resourceMapping;
407
369
  this.#defaultMapping = new DefaultScriptMapping(debuggerModel, workspace, debuggerWorkspaceBinding);
408
370
  this.#resourceMapping = debuggerWorkspaceBinding.resourceMapping;
@@ -473,8 +435,8 @@ class ModelData {
473
435
  scope = scope || await this.#resourceMapping.functionBoundsAtRawLocation(rawLocation);
474
436
  return scope;
475
437
  }
476
- translateRawFramesStep(rawFrames, translatedFrames) {
477
- if (!this.compilerMapping.translateRawFramesStep(rawFrames, translatedFrames)) {
438
+ async translateRawFramesStep(rawFrames, translatedFrames) {
439
+ if (!await this.compilerMapping.translateRawFramesStep(rawFrames, translatedFrames)) {
478
440
  this.#defaultTranslateRawFramesStep(rawFrames, translatedFrames);
479
441
  }
480
442
  }
@@ -107,7 +107,7 @@ export class DeviceModeModel extends Common.ObjectWrapper.ObjectWrapper {
107
107
  this.#preferredSize = new Geometry.Size(1, 1);
108
108
  this.#initialized = false;
109
109
  this.#appliedDeviceSize = new Geometry.Size(1, 1);
110
- this.#appliedDeviceScaleFactor = window.devicePixelRatio;
110
+ this.#appliedDeviceScaleFactor = globalThis.devicePixelRatio;
111
111
  this.#appliedUserAgentType = "Desktop" /* UA.DESKTOP */;
112
112
  this.#scaleSetting = Common.Settings.Settings.instance().createSetting('emulation.device-scale', 1);
113
113
  // We've used to allow zero before.
@@ -550,6 +550,7 @@ const emulatedDevices = [
550
550
  },
551
551
  'capabilities': ['touch', 'mobile'],
552
552
  'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1',
553
+ 'user-agent-metadata': { 'platform': 'iOS', 'platformVersion': '18.5', 'architecture': '', 'model': 'iPhone', 'mobile': true },
553
554
  'type': 'phone',
554
555
  },
555
556
  {
@@ -569,6 +570,7 @@ const emulatedDevices = [
569
570
  },
570
571
  'capabilities': ['touch', 'mobile'],
571
572
  'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1',
573
+ 'user-agent-metadata': { 'platform': 'iOS', 'platformVersion': '18.5', 'architecture': '', 'model': 'iPhone', 'mobile': true },
572
574
  'type': 'phone',
573
575
  },
574
576
  {
@@ -588,6 +590,7 @@ const emulatedDevices = [
588
590
  },
589
591
  'capabilities': ['touch', 'mobile'],
590
592
  'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1',
593
+ 'user-agent-metadata': { 'platform': 'iOS', 'platformVersion': '18.5', 'architecture': '', 'model': 'iPhone', 'mobile': true },
591
594
  'type': 'phone',
592
595
  },
593
596
  {
@@ -607,6 +610,7 @@ const emulatedDevices = [
607
610
  },
608
611
  'capabilities': ['touch', 'mobile'],
609
612
  'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1',
613
+ 'user-agent-metadata': { 'platform': 'iOS', 'platformVersion': '18.5', 'architecture': '', 'model': 'iPhone', 'mobile': true },
610
614
  'type': 'phone',
611
615
  },
612
616
  {
@@ -706,6 +710,7 @@ const emulatedDevices = [
706
710
  },
707
711
  'capabilities': ['touch', 'mobile'],
708
712
  'user-agent': 'Mozilla/5.0 (iPad; CPU OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1',
713
+ 'user-agent-metadata': { 'platform': 'iOS', 'platformVersion': '18.5', 'architecture': '', 'model': 'iPad', 'mobile': true },
709
714
  'type': 'tablet',
710
715
  },
711
716
  {
@@ -725,6 +730,7 @@ const emulatedDevices = [
725
730
  },
726
731
  'capabilities': ['touch', 'mobile'],
727
732
  'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Safari/605.1.15',
733
+ 'user-agent-metadata': { 'platform': 'iOS', 'platformVersion': '18.5', 'architecture': '', 'model': 'iPad', 'mobile': true },
728
734
  'type': 'tablet',
729
735
  },
730
736
  {
@@ -744,6 +750,7 @@ const emulatedDevices = [
744
750
  },
745
751
  'capabilities': ['touch', 'mobile'],
746
752
  'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Safari/605.1.15',
753
+ 'user-agent-metadata': { 'platform': 'iOS', 'platformVersion': '18.5', 'architecture': '', 'model': 'iPad', 'mobile': true },
747
754
  'type': 'tablet',
748
755
  },
749
756
  {
@@ -982,6 +989,7 @@ const emulatedDevices = [
982
989
  },
983
990
  'capabilities': ['touch', 'mobile'],
984
991
  'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53',
992
+ 'user-agent-metadata': { 'platform': 'iOS', 'platformVersion': '7.1.2', 'architecture': '', 'model': 'iPhone', 'mobile': true },
985
993
  'type': 'phone',
986
994
  },
987
995
  {
@@ -1009,6 +1017,7 @@ const emulatedDevices = [
1009
1017
  },
1010
1018
  'capabilities': ['touch', 'mobile'],
1011
1019
  'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1',
1020
+ 'user-agent-metadata': { 'platform': 'iOS', 'platformVersion': '10.3.1', 'architecture': '', 'model': 'iPhone', 'mobile': true },
1012
1021
  'type': 'phone',
1013
1022
  },
1014
1023
  {
@@ -1036,6 +1045,7 @@ const emulatedDevices = [
1036
1045
  },
1037
1046
  'capabilities': ['touch', 'mobile'],
1038
1047
  'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1',
1048
+ 'user-agent-metadata': { 'platform': 'iOS', 'platformVersion': '13.2.3', 'architecture': '', 'model': 'iPhone', 'mobile': true },
1039
1049
  'type': 'phone',
1040
1050
  },
1041
1051
  {
@@ -1063,6 +1073,7 @@ const emulatedDevices = [
1063
1073
  },
1064
1074
  'capabilities': ['touch', 'mobile'],
1065
1075
  'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1',
1076
+ 'user-agent-metadata': { 'platform': 'iOS', 'platformVersion': '13.2.3', 'architecture': '', 'model': 'iPhone', 'mobile': true },
1066
1077
  'type': 'phone',
1067
1078
  },
1068
1079
  {
@@ -1076,6 +1087,7 @@ const emulatedDevices = [
1076
1087
  },
1077
1088
  'capabilities': ['touch', 'mobile'],
1078
1089
  'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1',
1090
+ 'user-agent-metadata': { 'platform': 'iOS', 'platformVersion': '13.2.3', 'architecture': '', 'model': 'iPhone', 'mobile': true },
1079
1091
  'type': 'phone',
1080
1092
  },
1081
1093
  {
@@ -1499,6 +1511,7 @@ const emulatedDevices = [
1499
1511
  },
1500
1512
  'capabilities': ['touch', 'mobile'],
1501
1513
  'user-agent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1',
1514
+ 'user-agent-metadata': { 'platform': 'iOS', 'platformVersion': '11.0', 'architecture': '', 'model': 'iPad', 'mobile': true },
1502
1515
  'type': 'tablet',
1503
1516
  },
1504
1517
  {
@@ -1512,6 +1525,7 @@ const emulatedDevices = [
1512
1525
  },
1513
1526
  'capabilities': ['touch', 'mobile'],
1514
1527
  'user-agent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1',
1528
+ 'user-agent-metadata': { 'platform': 'iOS', 'platformVersion': '11.0', 'architecture': '', 'model': 'iPad', 'mobile': true },
1515
1529
  'type': 'tablet',
1516
1530
  },
1517
1531
  {
@@ -6,13 +6,16 @@ let formatterWorkerPoolInstance;
6
6
  export class FormatterWorkerPool {
7
7
  taskQueue;
8
8
  workerTasks;
9
- constructor() {
9
+ entrypointURL;
10
+ constructor(entrypointURL) {
10
11
  this.taskQueue = [];
11
12
  this.workerTasks = new Map();
13
+ this.entrypointURL =
14
+ entrypointURL ?? import.meta.resolve('../../entrypoints/formatter_worker/formatter_worker-entrypoint.js');
12
15
  }
13
- static instance() {
14
- if (!formatterWorkerPoolInstance) {
15
- formatterWorkerPoolInstance = new FormatterWorkerPool();
16
+ static instance(opts) {
17
+ if (!formatterWorkerPoolInstance || opts?.forceNew) {
18
+ formatterWorkerPoolInstance = new FormatterWorkerPool(opts?.entrypointURL);
16
19
  }
17
20
  return formatterWorkerPoolInstance;
18
21
  }
@@ -31,7 +34,7 @@ export class FormatterWorkerPool {
31
34
  formatterWorkerPoolInstance = undefined;
32
35
  }
33
36
  createWorker() {
34
- const worker = Platform.HostRuntime.HOST_RUNTIME.createWorker(new URL('../../entrypoints/formatter_worker/formatter_worker-entrypoint.js', import.meta.url).toString());
37
+ const worker = Platform.HostRuntime.HOST_RUNTIME.createWorker(this.entrypointURL);
35
38
  worker.onmessage = this.onWorkerMessage.bind(this, worker);
36
39
  worker.onerror = this.onWorkerError.bind(this, worker);
37
40
  return worker;
@@ -0,0 +1,33 @@
1
+ // Copyright 2025 The Chromium Authors
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file.
4
+ import * as Common from '../../core/common/common.js';
5
+ import * as Root from '../../core/root/root.js';
6
+ let instance = null;
7
+ export class Prototypes {
8
+ constructor() {
9
+ }
10
+ static instance() {
11
+ if (instance) {
12
+ return instance;
13
+ }
14
+ instance = new Prototypes();
15
+ return instance;
16
+ }
17
+ /**
18
+ * Returns true if the specific setting is turned on AND the GreenDev flag is enabled
19
+ */
20
+ isEnabled(setting) {
21
+ const greendevFlagEnabled = Boolean(Root.Runtime.hostConfig.devToolsGreenDevUi?.enabled);
22
+ return greendevFlagEnabled && this.settings()[setting].get();
23
+ }
24
+ settings() {
25
+ const settings = Common.Settings.Settings.instance();
26
+ const inDevToolsFloaty = settings.createSetting('greendev-in-devtools-floaty-enabled', false, "Local" /* Common.Settings.SettingStorageType.LOCAL */);
27
+ const inlineWidgets = settings.createSetting('greendev-inline-widgets-enabled', false, "Local" /* Common.Settings.SettingStorageType.LOCAL */);
28
+ const aiAnnotations = settings.createSetting('greendev-ai-annotations-enabled', false, "Local" /* Common.Settings.SettingStorageType.LOCAL */);
29
+ const artifactViewer = settings.createSetting('greendev-artifact-viewer-enabled', false, "Local" /* Common.Settings.SettingStorageType.LOCAL */);
30
+ const copyToGemini = settings.createSetting('greendev-copy-to-gemini-enabled', false, "Local" /* Common.Settings.SettingStorageType.LOCAL */);
31
+ return { inDevToolsFloaty, inlineWidgets, aiAnnotations, artifactViewer, copyToGemini };
32
+ }
33
+ }
@@ -0,0 +1,4 @@
1
+ // Copyright 2025 The Chromium Authors
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file.
4
+ export * from './Prototypes.js';
@@ -32,7 +32,7 @@ export class ContrastCheckTrigger {
32
32
  }
33
33
  }
34
34
  #checkContrast(resourceTreeModel) {
35
- if (!Root.Runtime.experiments.isEnabled('contrast-issues')) {
35
+ if (!Root.Runtime.experiments.isEnabled(Root.ExperimentNames.ExperimentName.CONTRAST_ISSUES)) {
36
36
  return;
37
37
  }
38
38
  void resourceTreeModel.target().auditsAgent().invoke_checkContrast({});
@@ -42,7 +42,7 @@ export class ContrastCheckTrigger {
42
42
  this.#checkContrast(resourceTreeModel);
43
43
  }
44
44
  async #frameAdded(event) {
45
- if (!Root.Runtime.experiments.isEnabled('contrast-issues')) {
45
+ if (!Root.Runtime.experiments.isEnabled(Root.ExperimentNames.ExperimentName.CONTRAST_ISSUES)) {
46
46
  return;
47
47
  }
48
48
  const frame = event.data;
@@ -16,10 +16,6 @@ const UIStrings = {
16
16
  * @description Label for the link for Schemeful Same-Site Issues
17
17
  */
18
18
  howSchemefulSamesiteWorks: 'How Schemeful Same-Site Works',
19
- /**
20
- * @description Label for a link for SameParty Issues. 'Attribute' refers to a cookie attribute.
21
- */
22
- firstPartySetsExplained: '`First-Party Sets` and the `SameParty` attribute',
23
19
  /**
24
20
  * @description Label for a link for cross-site redirect Issues.
25
21
  */
@@ -245,7 +241,6 @@ export class CookieIssue extends Issue {
245
241
  return new SDK.ConsoleModel.ConsoleMessage(issuesModel.target().model(SDK.RuntimeModel.RuntimeModel), Common.Console.FrontendMessageSource.ISSUE_PANEL, "warning" /* Protocol.Log.LogEntryLevel.Warning */, UIStrings.consoleTpcdErrorMessage, {
246
242
  url: this.details().request?.url,
247
243
  affectedResources: { requestId: this.details().request?.requestId, issueId: this.issueId },
248
- isCookieReportIssue: true
249
244
  });
250
245
  }
251
246
  return;
@@ -407,20 +402,6 @@ function sameSiteExcludeContextDowngradeSet(isSecure) {
407
402
  links: schemefulSameSiteArticles,
408
403
  };
409
404
  }
410
- const sameSiteInvalidSameParty = {
411
- file: 'SameSiteInvalidSameParty.md',
412
- links: [{
413
- link: 'https://developer.chrome.com/blog/first-party-sets-sameparty/',
414
- linkTitle: i18nLazyString(UIStrings.firstPartySetsExplained),
415
- }],
416
- };
417
- const samePartyCrossPartyContextSet = {
418
- file: 'SameSiteSamePartyCrossPartyContextSet.md',
419
- links: [{
420
- link: 'https://developer.chrome.com/blog/first-party-sets-sameparty/',
421
- linkTitle: i18nLazyString(UIStrings.firstPartySetsExplained),
422
- }],
423
- };
424
405
  const attributeValueExceedsMaxSize = {
425
406
  file: 'CookieAttributeValueExceedsMaxSize.md',
426
407
  links: [],
@@ -484,8 +465,6 @@ const issueDescriptions = new Map([
484
465
  ['CookieIssue::ExcludeContextDowngrade::ReadCookie::Insecure', sameSiteExcludeContextDowngradeRead(false)],
485
466
  ['CookieIssue::ExcludeContextDowngrade::SetCookie::Secure', sameSiteExcludeContextDowngradeSet(true)],
486
467
  ['CookieIssue::ExcludeContextDowngrade::SetCookie::Insecure', sameSiteExcludeContextDowngradeSet(false)],
487
- ['CookieIssue::ExcludeInvalidSameParty::SetCookie', sameSiteInvalidSameParty],
488
- ['CookieIssue::ExcludeSamePartyCrossPartyContext::SetCookie', samePartyCrossPartyContextSet],
489
468
  ['CookieIssue::WarnAttributeValueExceedsMaxSize::ReadCookie', attributeValueExceedsMaxSize],
490
469
  ['CookieIssue::WarnAttributeValueExceedsMaxSize::SetCookie', attributeValueExceedsMaxSize],
491
470
  ['CookieIssue::WarnDomainNonASCII::ReadCookie', warnDomainNonAscii],
@@ -63,19 +63,6 @@ function getIssueCode(details) {
63
63
  return "CorsIssue::NoCorsRedirectModeNotFollow" /* IssueCode.NO_CORS_REDIRECT_MODE_NOT_FOLLOW */;
64
64
  case "InvalidPrivateNetworkAccess" /* Protocol.Network.CorsError.InvalidPrivateNetworkAccess */:
65
65
  return "CorsIssue::InvalidPrivateNetworkAccess" /* IssueCode.INVALID_PRIVATE_NETWORK_ACCESS */;
66
- case "UnexpectedPrivateNetworkAccess" /* Protocol.Network.CorsError.UnexpectedPrivateNetworkAccess */:
67
- return "CorsIssue::UnexpectedPrivateNetworkAccess" /* IssueCode.UNEXPECTED_PRIVATE_NETWORK_ACCESS */;
68
- case "PreflightMissingAllowPrivateNetwork" /* Protocol.Network.CorsError.PreflightMissingAllowPrivateNetwork */:
69
- case "PreflightInvalidAllowPrivateNetwork" /* Protocol.Network.CorsError.PreflightInvalidAllowPrivateNetwork */:
70
- return "CorsIssue::PreflightAllowPrivateNetworkError" /* IssueCode.PREFLIGHT_ALLOW_PRIVATE_NETWORK_ERROR */;
71
- case "PreflightMissingPrivateNetworkAccessId" /* Protocol.Network.CorsError.PreflightMissingPrivateNetworkAccessId */:
72
- return "CorsIssue::PreflightMissingPrivateNetworkAccessId" /* IssueCode.PREFLIGHT_MISSING_PRIVATE_NETWORK_ACCESS_ID */;
73
- case "PreflightMissingPrivateNetworkAccessName" /* Protocol.Network.CorsError.PreflightMissingPrivateNetworkAccessName */:
74
- return "CorsIssue::PreflightMissingPrivateNetworkAccessName" /* IssueCode.PREFLIGHT_MISSING_PRIVATE_NETWORK_ACCESS_NAME */;
75
- case "PrivateNetworkAccessPermissionUnavailable" /* Protocol.Network.CorsError.PrivateNetworkAccessPermissionUnavailable */:
76
- return "CorsIssue::PrivateNetworkAccessPermissionUnavailable" /* IssueCode.PRIVATE_NETWORK_ACCESS_PERMISSION_UNAVAILABLE */;
77
- case "PrivateNetworkAccessPermissionDenied" /* Protocol.Network.CorsError.PrivateNetworkAccessPermissionDenied */:
78
- return "CorsIssue::PrivateNetworkAccessPermissionDenied" /* IssueCode.PRIVATE_NETWORK_ACCESS_PERMISSION_DENIED */;
79
66
  case "LocalNetworkAccessPermissionDenied" /* Protocol.Network.CorsError.LocalNetworkAccessPermissionDenied */:
80
67
  return "CorsIssue::LocalNetworkAccessPermissionDenied" /* IssueCode.LOCAL_NETWORK_ACCESS_PERMISSION_DENIED */;
81
68
  }
@@ -97,14 +84,6 @@ export class CorsIssue extends Issue {
97
84
  linkTitle: i18nString(UIStrings.corsPrivateNetworkAccess),
98
85
  }],
99
86
  };
100
- case "CorsIssue::PreflightAllowPrivateNetworkError" /* IssueCode.PREFLIGHT_ALLOW_PRIVATE_NETWORK_ERROR */:
101
- return {
102
- file: 'corsPreflightAllowPrivateNetworkError.md',
103
- links: [{
104
- link: 'https://developer.chrome.com/blog/private-network-access-update',
105
- linkTitle: i18nString(UIStrings.corsPrivateNetworkAccess),
106
- }],
107
- };
108
87
  case "CorsIssue::InvalidHeaders" /* IssueCode.INVALID_HEADER_VALUES */:
109
88
  return {
110
89
  file: 'corsInvalidHeaderValues.md',
@@ -193,17 +172,6 @@ export class CorsIssue extends Issue {
193
172
  linkTitle: i18nString(UIStrings.CORS),
194
173
  }],
195
174
  };
196
- // TODO(1462857): Change the link after we have a blog post for PNA
197
- // permission prompt.
198
- case "CorsIssue::PreflightMissingPrivateNetworkAccessId" /* IssueCode.PREFLIGHT_MISSING_PRIVATE_NETWORK_ACCESS_ID */:
199
- case "CorsIssue::PreflightMissingPrivateNetworkAccessName" /* IssueCode.PREFLIGHT_MISSING_PRIVATE_NETWORK_ACCESS_NAME */:
200
- return {
201
- file: 'corsPrivateNetworkPermissionDenied.md',
202
- links: [{
203
- link: 'https://developer.chrome.com/blog/private-network-access-update',
204
- linkTitle: i18nString(UIStrings.corsPrivateNetworkAccess),
205
- }],
206
- };
207
175
  case "CorsIssue::LocalNetworkAccessPermissionDenied" /* IssueCode.LOCAL_NETWORK_ACCESS_PERMISSION_DENIED */:
208
176
  return {
209
177
  file: 'corsLocalNetworkAccessPermissionDenied.md',
@@ -215,9 +183,6 @@ export class CorsIssue extends Issue {
215
183
  case "CorsIssue::PreflightMissingAllowExternal" /* IssueCode.PREFLIGHT_MISSING_ALLOW_EXTERNAL */:
216
184
  case "CorsIssue::PreflightInvalidAllowExternal" /* IssueCode.PREFLIGHT_INVALID_ALLOW_EXTERNAL */:
217
185
  case "CorsIssue::InvalidPrivateNetworkAccess" /* IssueCode.INVALID_PRIVATE_NETWORK_ACCESS */:
218
- case "CorsIssue::UnexpectedPrivateNetworkAccess" /* IssueCode.UNEXPECTED_PRIVATE_NETWORK_ACCESS */:
219
- case "CorsIssue::PrivateNetworkAccessPermissionUnavailable" /* IssueCode.PRIVATE_NETWORK_ACCESS_PERMISSION_UNAVAILABLE */:
220
- case "CorsIssue::PrivateNetworkAccessPermissionDenied" /* IssueCode.PRIVATE_NETWORK_ACCESS_PERMISSION_DENIED */:
221
186
  return null;
222
187
  }
223
188
  }
@@ -226,9 +191,7 @@ export class CorsIssue extends Issue {
226
191
  }
227
192
  getKind() {
228
193
  if (this.details().isWarning &&
229
- (this.details().corsErrorStatus.corsError === "InsecurePrivateNetwork" /* Protocol.Network.CorsError.InsecurePrivateNetwork */ ||
230
- this.details().corsErrorStatus.corsError === "PreflightMissingAllowPrivateNetwork" /* Protocol.Network.CorsError.PreflightMissingAllowPrivateNetwork */ ||
231
- this.details().corsErrorStatus.corsError === "PreflightInvalidAllowPrivateNetwork" /* Protocol.Network.CorsError.PreflightInvalidAllowPrivateNetwork */)) {
194
+ this.details().corsErrorStatus.corsError === "InsecurePrivateNetwork" /* Protocol.Network.CorsError.InsecurePrivateNetwork */) {
232
195
  return "BreakingChange" /* IssueKind.BREAKING_CHANGE */;
233
196
  }
234
197
  return "PageError" /* IssueKind.PAGE_ERROR */;
@@ -15,6 +15,7 @@ import { Issue, unionIssueKind } from './Issue.js';
15
15
  import { LowTextContrastIssue } from './LowTextContrastIssue.js';
16
16
  import { MixedContentIssue } from './MixedContentIssue.js';
17
17
  import { PartitioningBlobURLIssue } from './PartitioningBlobURLIssue.js';
18
+ import { PermissionElementIssue } from './PermissionElementIssue.js';
18
19
  import { QuirksModeIssue } from './QuirksModeIssue.js';
19
20
  import { SharedArrayBufferIssue } from './SharedArrayBufferIssue.js';
20
21
  /**
@@ -40,6 +41,7 @@ export class AggregatedIssue extends Issue {
40
41
  #cookieDeprecationMetadataIssues = new Set();
41
42
  #mixedContentIssues = new Set();
42
43
  #partitioningBlobURLIssues = new Set();
44
+ #permissionElementIssues = new Set();
43
45
  #sharedArrayBufferIssues = new Set();
44
46
  #quirksModeIssues = new Set();
45
47
  #attributionReportingIssues = new Set();
@@ -133,6 +135,9 @@ export class AggregatedIssue extends Issue {
133
135
  getPartitioningBlobURLIssues() {
134
136
  return this.#partitioningBlobURLIssues;
135
137
  }
138
+ getPermissionElementIssues() {
139
+ return this.#permissionElementIssues;
140
+ }
136
141
  /**
137
142
  * Produces a primary key for a cookie. Use this instead of `JSON.stringify` in
138
143
  * case new fields are added to `AffectedCookie`.
@@ -225,6 +230,9 @@ export class AggregatedIssue extends Issue {
225
230
  if (issue instanceof PartitioningBlobURLIssue) {
226
231
  this.#partitioningBlobURLIssues.add(issue);
227
232
  }
233
+ if (issue instanceof PermissionElementIssue) {
234
+ this.#permissionElementIssues.add(issue);
235
+ }
228
236
  }
229
237
  getKind() {
230
238
  return this.#issueKind;