chrome-devtools-mcp 0.10.2 → 0.11.0

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 (121) hide show
  1. package/README.md +67 -9
  2. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/common.js +1 -3
  3. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/AidaClient.js +1 -1
  4. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHost.js +31 -449
  5. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/InspectorFrontendHostStub.js +430 -0
  6. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/ResourceLoader.js +10 -22
  7. package/build/node_modules/chrome-devtools-frontend/front_end/core/host/UserMetrics.js +2 -5
  8. package/build/node_modules/chrome-devtools-frontend/front_end/core/i18n/collect-ui-strings.js +1 -1
  9. package/build/node_modules/chrome-devtools-frontend/front_end/core/i18n/generate-locales-js.js +1 -1
  10. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/HostRuntime.js +19 -0
  11. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/StringUtilities.js +1 -1
  12. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/api/HostRuntime.js +4 -0
  13. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/api/api.js +5 -0
  14. package/build/node_modules/chrome-devtools-frontend/front_end/core/{common/Worker.js → platform/browser/HostRuntime.js} +18 -7
  15. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/browser/browser.js +5 -0
  16. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/node/HostRuntime.js +72 -0
  17. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/node/node.js +5 -0
  18. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/platform.js +2 -2
  19. package/build/node_modules/chrome-devtools-frontend/front_end/core/root/DevToolsContext.js +4 -0
  20. package/build/node_modules/chrome-devtools-frontend/front_end/core/root/Runtime.js +7 -0
  21. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/AnimationModel.js +1 -1
  22. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMatchedStyles.js +2 -2
  23. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSMetadata.js +17 -5
  24. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSModel.js +3 -3
  25. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSProperty.js +1 -1
  26. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/CSSPropertyParserMatchers.js +10 -10
  27. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ConsoleModel.js +1 -1
  28. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Cookie.js +1 -1
  29. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DOMModel.js +5 -2
  30. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/DebuggerModel.js +1 -1
  31. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/NetworkManager.js +46 -34
  32. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/NetworkRequest.js +3 -0
  33. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PageResourceLoader.js +43 -33
  34. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/PreloadingModel.js +1 -1
  35. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/RemoteObject.js +1 -1
  36. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/ResourceTreeModel.js +1 -1
  37. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Script.js +26 -1
  38. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMap.js +4 -0
  39. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapCache.js +16 -0
  40. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapManager.js +11 -5
  41. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/SourceMapScopesInfo.js +129 -20
  42. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/Target.js +4 -13
  43. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/TargetManager.js +35 -4
  44. package/build/node_modules/chrome-devtools-frontend/front_end/core/sdk/sdk-meta.js +72 -0
  45. package/build/node_modules/chrome-devtools-frontend/front_end/foundation/Universe.js +5 -1
  46. package/build/node_modules/chrome-devtools-frontend/front_end/generated/Deprecation.js +48 -4
  47. package/build/node_modules/chrome-devtools-frontend/front_end/generated/InspectorBackendCommands.js +45 -42
  48. package/build/node_modules/chrome-devtools-frontend/front_end/generated/SupportedCSSProperties.js +56 -77
  49. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.js +21 -6
  50. package/build/node_modules/chrome-devtools-frontend/front_end/models/ai_assistance/performance/AICallTree.js +9 -3
  51. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/CSSWorkspaceBinding.js +4 -3
  52. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/CompilerScriptMapping.js +34 -0
  53. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/DebuggerWorkspaceBinding.js +15 -0
  54. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/ResourceMapping.js +59 -0
  55. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/ResourceScriptMapping.js +38 -0
  56. package/build/node_modules/chrome-devtools-frontend/front_end/models/bindings/SASSSourceMapping.js +5 -4
  57. package/build/node_modules/chrome-devtools-frontend/front_end/models/cpu_profile/CPUProfileDataModel.js +9 -7
  58. package/build/node_modules/chrome-devtools-frontend/front_end/models/crux-manager/CrUXManager.js +5 -3
  59. package/build/node_modules/chrome-devtools-frontend/front_end/models/formatter/FormatterWorkerPool.js +2 -2
  60. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/AttributionReportingIssue.js +5 -6
  61. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/BounceTrackingIssue.js +3 -11
  62. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/ClientHintIssue.js +4 -9
  63. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/ContentSecurityPolicyIssue.js +4 -9
  64. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/ContrastCheckTrigger.js +1 -1
  65. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/CookieDeprecationMetadataIssue.js +5 -11
  66. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/CookieIssue.js +26 -25
  67. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/CorsIssue.js +7 -14
  68. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/CrossOriginEmbedderPolicyIssue.js +4 -6
  69. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/DeprecationIssue.js +6 -11
  70. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/ElementAccessibilityIssue.js +6 -11
  71. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/FederatedAuthRequestIssue.js +3 -8
  72. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/FederatedAuthUserInfoRequestIssue.js +3 -8
  73. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/GenericIssue.js +36 -21
  74. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/HeavyAdIssue.js +3 -8
  75. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/Issue.js +6 -1
  76. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/IssueAggregator.js +6 -1
  77. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/LowTextContrastIssue.js +2 -7
  78. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/MixedContentIssue.js +6 -10
  79. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/PartitioningBlobURLIssue.js +3 -8
  80. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/PropertyRuleIssue.js +5 -10
  81. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/QuirksModeIssue.js +2 -7
  82. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/SRIMessageSignatureIssue.js +6 -10
  83. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/SharedArrayBufferIssue.js +3 -8
  84. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/SharedDictionaryIssue.js +5 -10
  85. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/StylesheetLoadingIssue.js +7 -11
  86. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/UnencodedDigestIssue.js +1 -6
  87. package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/genericNavigationEntryMarkedSkippable.md +7 -0
  88. package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/FunctionCodeResolver.js +192 -0
  89. package/build/node_modules/chrome-devtools-frontend/front_end/models/source_map_scopes/source_map_scopes.js +2 -1
  90. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/handlers/SamplesHandler.js +3 -0
  91. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace/helpers/Trace.js +10 -0
  92. package/build/node_modules/chrome-devtools-frontend/front_end/models/trace_source_maps_resolver/SourceMapsResolver.js +23 -0
  93. package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/IgnoreListManager.js +1 -1
  94. package/build/node_modules/chrome-devtools-frontend/front_end/models/workspace/UISourceCode.js +38 -0
  95. package/build/node_modules/chrome-devtools-frontend/mcp/HostBindings.js +222 -0
  96. package/build/node_modules/chrome-devtools-frontend/mcp/mcp.js +15 -1
  97. package/build/src/DevToolsConnectionAdapter.js +56 -19
  98. package/build/src/DevtoolsUtils.js +143 -1
  99. package/build/src/McpContext.js +33 -11
  100. package/build/src/McpResponse.js +18 -26
  101. package/build/src/PageCollector.js +4 -11
  102. package/build/src/browser.js +4 -0
  103. package/build/src/cli.js +11 -3
  104. package/build/src/formatters/consoleFormatter.js +81 -3
  105. package/build/src/formatters/snapshotFormatter.js +18 -4
  106. package/build/src/issue-descriptions.js +4 -0
  107. package/build/src/main.js +20 -49
  108. package/build/src/third_party/THIRD_PARTY_NOTICES +1973 -27
  109. package/build/src/third_party/index.js +58356 -18839
  110. package/build/src/tools/console.js +0 -4
  111. package/build/src/tools/emulation.js +29 -6
  112. package/build/src/tools/screenshot.js +4 -2
  113. package/build/src/tools/snapshot.js +1 -1
  114. package/build/src/tools/tools.js +29 -0
  115. package/build/src/utils/keyboard.js +5 -0
  116. package/package.json +7 -7
  117. package/build/node_modules/chrome-devtools-frontend/front_end/core/common/Linkifier.js +0 -34
  118. package/build/node_modules/chrome-devtools-frontend/front_end/core/platform/DOMUtilities.js +0 -122
  119. package/build/src/features.js +0 -14
  120. /package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/{genericFormAriaLabelledByToNonExistingId.md → genericFormAriaLabelledByToNonExistingIdError.md} +0 -0
  121. /package/build/node_modules/chrome-devtools-frontend/front_end/models/issues_manager/descriptions/{genericFormLabelHasNeitherForNorNestedInput.md → genericFormLabelHasNeitherForNorNestedInputError.md} +0 -0
@@ -25,22 +25,25 @@ const UIStrings = {
25
25
  * @description title for CORB explainer.
26
26
  */
27
27
  corbExplainerPageTitle: 'CORB explainer',
28
+ /**
29
+ * @description title for history intervention documentation page.
30
+ */
31
+ historyManipulationInterventionPageTitle: 'History manipulation intervention explainer'
28
32
  };
29
33
  const str_ = i18n.i18n.registerUIStrings('models/issues_manager/GenericIssue.ts', UIStrings);
30
34
  const i18nLazyString = i18n.i18n.getLazilyComputedLocalizedString.bind(undefined, str_);
31
35
  export class GenericIssue extends Issue {
32
- #issueDetails;
33
36
  constructor(issueDetails, issuesModel, issueId) {
34
37
  const issueCode = [
35
38
  "GenericIssue" /* Protocol.Audits.InspectorIssueCode.GenericIssue */,
36
39
  issueDetails.errorType,
37
40
  ].join('::');
38
- super(issueCode, issuesModel, issueId);
39
- this.#issueDetails = issueDetails;
41
+ super(issueCode, issueDetails, issuesModel, issueId);
40
42
  }
41
43
  requests() {
42
- if (this.#issueDetails.request) {
43
- return [this.#issueDetails.request];
44
+ const details = this.details();
45
+ if (details.request) {
46
+ return [details.request];
44
47
  }
45
48
  return [];
46
49
  }
@@ -48,21 +51,19 @@ export class GenericIssue extends Issue {
48
51
  return "Generic" /* IssueCategory.GENERIC */;
49
52
  }
50
53
  primaryKey() {
51
- const requestId = this.#issueDetails.request ? this.#issueDetails.request.requestId : 'no-request';
52
- return `${this.code()}-(${this.#issueDetails.frameId})-(${this.#issueDetails.violatingNodeId})-(${this.#issueDetails.violatingNodeAttribute})-(${requestId})`;
54
+ const details = this.details();
55
+ const requestId = details.request ? details.request.requestId : 'no-request';
56
+ return `${this.code()}-(${details.frameId})-(${details.violatingNodeId})-(${details.violatingNodeAttribute})-(${requestId})`;
53
57
  }
54
58
  getDescription() {
55
- const description = issueDescriptions.get(this.#issueDetails.errorType);
59
+ const description = issueDescriptions.get(this.details().errorType);
56
60
  if (!description) {
57
61
  return null;
58
62
  }
59
63
  return resolveLazyDescription(description);
60
64
  }
61
- details() {
62
- return this.#issueDetails;
63
- }
64
65
  getKind() {
65
- return issueTypes.get(this.#issueDetails.errorType) || "Improvement" /* IssueKind.IMPROVEMENT */;
66
+ return issueTypes.get(this.details().errorType) || "Improvement" /* IssueKind.IMPROVEMENT */;
66
67
  }
67
68
  static fromInspectorIssue(issuesModel, inspectorIssue) {
68
69
  const genericDetails = inspectorIssue.details.genericIssueDetails;
@@ -97,8 +98,8 @@ export const genericFormDuplicateIdForInputError = {
97
98
  linkTitle: i18nLazyString(UIStrings.howDoesAutofillWorkPageTitle),
98
99
  }],
99
100
  };
100
- export const genericFormAriaLabelledByToNonExistingId = {
101
- file: 'genericFormAriaLabelledByToNonExistingId.md',
101
+ export const genericFormAriaLabelledByToNonExistingIdError = {
102
+ file: 'genericFormAriaLabelledByToNonExistingIdError.md',
102
103
  links: [{
103
104
  link: 'https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label',
104
105
  linkTitle: i18nLazyString(UIStrings.labelFormlementsPageTitle),
@@ -132,8 +133,8 @@ export const genericFormLabelForMatchesNonExistingIdError = {
132
133
  linkTitle: i18nLazyString(UIStrings.labelFormlementsPageTitle),
133
134
  }],
134
135
  };
135
- export const genericFormLabelHasNeitherForNorNestedInput = {
136
- file: 'genericFormLabelHasNeitherForNorNestedInput.md',
136
+ export const genericFormLabelHasNeitherForNorNestedInputError = {
137
+ file: 'genericFormLabelHasNeitherForNorNestedInputError.md',
137
138
  links: [{
138
139
  link: 'https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label',
139
140
  linkTitle: i18nLazyString(UIStrings.labelFormlementsPageTitle),
@@ -146,6 +147,13 @@ export const genericResponseWasBlockedbyORB = {
146
147
  linkTitle: i18nLazyString(UIStrings.corbExplainerPageTitle),
147
148
  }],
148
149
  };
150
+ export const genericNavigationEntryMarkedSkippable = {
151
+ file: 'genericNavigationEntryMarkedSkippable.md',
152
+ links: [{
153
+ link: 'https://chromium.googlesource.com/chromium/src/+/main/docs/history_manipulation_intervention.md',
154
+ linkTitle: i18nLazyString(UIStrings.historyManipulationInterventionPageTitle),
155
+ }],
156
+ };
149
157
  const issueDescriptions = new Map([
150
158
  ["FormLabelForNameError" /* Protocol.Audits.GenericIssueErrorType.FormLabelForNameError */, genericFormLabelForNameError],
151
159
  ["FormInputWithNoLabelError" /* Protocol.Audits.GenericIssueErrorType.FormInputWithNoLabelError */, genericFormInputWithNoLabelError],
@@ -154,7 +162,10 @@ const issueDescriptions = new Map([
154
162
  genericFormAutocompleteAttributeEmptyError,
155
163
  ],
156
164
  ["FormDuplicateIdForInputError" /* Protocol.Audits.GenericIssueErrorType.FormDuplicateIdForInputError */, genericFormDuplicateIdForInputError],
157
- ["FormAriaLabelledByToNonExistingId" /* Protocol.Audits.GenericIssueErrorType.FormAriaLabelledByToNonExistingId */, genericFormAriaLabelledByToNonExistingId],
165
+ [
166
+ "FormAriaLabelledByToNonExistingIdError" /* Protocol.Audits.GenericIssueErrorType.FormAriaLabelledByToNonExistingIdError */,
167
+ genericFormAriaLabelledByToNonExistingIdError
168
+ ],
158
169
  [
159
170
  "FormEmptyIdAndNameAttributesForInputError" /* Protocol.Audits.GenericIssueErrorType.FormEmptyIdAndNameAttributesForInputError */,
160
171
  genericFormEmptyIdAndNameAttributesForInputError,
@@ -168,8 +179,8 @@ const issueDescriptions = new Map([
168
179
  genericFormLabelForMatchesNonExistingIdError,
169
180
  ],
170
181
  [
171
- "FormLabelHasNeitherForNorNestedInput" /* Protocol.Audits.GenericIssueErrorType.FormLabelHasNeitherForNorNestedInput */,
172
- genericFormLabelHasNeitherForNorNestedInput,
182
+ "FormLabelHasNeitherForNorNestedInputError" /* Protocol.Audits.GenericIssueErrorType.FormLabelHasNeitherForNorNestedInputError */,
183
+ genericFormLabelHasNeitherForNorNestedInputError,
173
184
  ],
174
185
  [
175
186
  "FormInputHasWrongButWellIntendedAutocompleteValueError" /* Protocol.Audits.GenericIssueErrorType.FormInputHasWrongButWellIntendedAutocompleteValueError */,
@@ -179,19 +190,23 @@ const issueDescriptions = new Map([
179
190
  "ResponseWasBlockedByORB" /* Protocol.Audits.GenericIssueErrorType.ResponseWasBlockedByORB */,
180
191
  genericResponseWasBlockedbyORB,
181
192
  ],
193
+ [
194
+ "NavigationEntryMarkedSkippable" /* Protocol.Audits.GenericIssueErrorType.NavigationEntryMarkedSkippable */,
195
+ genericNavigationEntryMarkedSkippable,
196
+ ],
182
197
  ]);
183
198
  const issueTypes = new Map([
184
199
  ["FormLabelForNameError" /* Protocol.Audits.GenericIssueErrorType.FormLabelForNameError */, "PageError" /* IssueKind.PAGE_ERROR */],
185
200
  ["FormInputWithNoLabelError" /* Protocol.Audits.GenericIssueErrorType.FormInputWithNoLabelError */, "Improvement" /* IssueKind.IMPROVEMENT */],
186
201
  ["FormAutocompleteAttributeEmptyError" /* Protocol.Audits.GenericIssueErrorType.FormAutocompleteAttributeEmptyError */, "PageError" /* IssueKind.PAGE_ERROR */],
187
202
  ["FormDuplicateIdForInputError" /* Protocol.Audits.GenericIssueErrorType.FormDuplicateIdForInputError */, "PageError" /* IssueKind.PAGE_ERROR */],
188
- ["FormAriaLabelledByToNonExistingId" /* Protocol.Audits.GenericIssueErrorType.FormAriaLabelledByToNonExistingId */, "Improvement" /* IssueKind.IMPROVEMENT */],
203
+ ["FormAriaLabelledByToNonExistingIdError" /* Protocol.Audits.GenericIssueErrorType.FormAriaLabelledByToNonExistingIdError */, "Improvement" /* IssueKind.IMPROVEMENT */],
189
204
  ["FormEmptyIdAndNameAttributesForInputError" /* Protocol.Audits.GenericIssueErrorType.FormEmptyIdAndNameAttributesForInputError */, "Improvement" /* IssueKind.IMPROVEMENT */],
190
205
  [
191
206
  "FormInputAssignedAutocompleteValueToIdOrNameAttributeError" /* Protocol.Audits.GenericIssueErrorType.FormInputAssignedAutocompleteValueToIdOrNameAttributeError */,
192
207
  "Improvement" /* IssueKind.IMPROVEMENT */,
193
208
  ],
194
209
  ["FormLabelForMatchesNonExistingIdError" /* Protocol.Audits.GenericIssueErrorType.FormLabelForMatchesNonExistingIdError */, "PageError" /* IssueKind.PAGE_ERROR */],
195
- ["FormLabelHasNeitherForNorNestedInput" /* Protocol.Audits.GenericIssueErrorType.FormLabelHasNeitherForNorNestedInput */, "Improvement" /* IssueKind.IMPROVEMENT */],
210
+ ["FormLabelHasNeitherForNorNestedInputError" /* Protocol.Audits.GenericIssueErrorType.FormLabelHasNeitherForNorNestedInputError */, "Improvement" /* IssueKind.IMPROVEMENT */],
196
211
  ["FormInputHasWrongButWellIntendedAutocompleteValueError" /* Protocol.Audits.GenericIssueErrorType.FormInputHasWrongButWellIntendedAutocompleteValueError */, "Improvement" /* IssueKind.IMPROVEMENT */],
197
212
  ]);
@@ -12,17 +12,12 @@ const UIStrings = {
12
12
  const str_ = i18n.i18n.registerUIStrings('models/issues_manager/HeavyAdIssue.ts', UIStrings);
13
13
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
14
14
  export class HeavyAdIssue extends Issue {
15
- #issueDetails;
16
15
  constructor(issueDetails, issuesModel) {
17
16
  const umaCode = ["HeavyAdIssue" /* Protocol.Audits.InspectorIssueCode.HeavyAdIssue */, issueDetails.reason].join('::');
18
- super({ code: "HeavyAdIssue" /* Protocol.Audits.InspectorIssueCode.HeavyAdIssue */, umaCode }, issuesModel);
19
- this.#issueDetails = issueDetails;
20
- }
21
- details() {
22
- return this.#issueDetails;
17
+ super({ code: "HeavyAdIssue" /* Protocol.Audits.InspectorIssueCode.HeavyAdIssue */, umaCode }, issueDetails, issuesModel);
23
18
  }
24
19
  primaryKey() {
25
- return `${"HeavyAdIssue" /* Protocol.Audits.InspectorIssueCode.HeavyAdIssue */}-${JSON.stringify(this.#issueDetails)}`;
20
+ return `${"HeavyAdIssue" /* Protocol.Audits.InspectorIssueCode.HeavyAdIssue */}-${JSON.stringify(this.details())}`;
26
21
  }
27
22
  getDescription() {
28
23
  return {
@@ -39,7 +34,7 @@ export class HeavyAdIssue extends Issue {
39
34
  return "HeavyAd" /* IssueCategory.HEAVY_AD */;
40
35
  }
41
36
  getKind() {
42
- switch (this.#issueDetails.resolution) {
37
+ switch (this.details().resolution) {
43
38
  case "HeavyAdBlocked" /* Protocol.Audits.HeavyAdResolutionStatus.HeavyAdBlocked */:
44
39
  return "PageError" /* IssueKind.PAGE_ERROR */;
45
40
  case "HeavyAdWarning" /* Protocol.Audits.HeavyAdResolutionStatus.HeavyAdWarning */:
@@ -72,9 +72,11 @@ export class Issue {
72
72
  #issueCode;
73
73
  #issuesModel;
74
74
  issueId = undefined;
75
+ #issueDetails;
75
76
  #hidden;
76
- constructor(code, issuesModel = null, issueId) {
77
+ constructor(code, issueDetails, issuesModel = null, issueId) {
77
78
  this.#issueCode = typeof code === 'object' ? code.code : code;
79
+ this.#issueDetails = issueDetails;
78
80
  this.#issuesModel = issuesModel;
79
81
  this.issueId = issueId;
80
82
  Host.userMetrics.issueCreated(typeof code === 'string' ? code : code.umaCode);
@@ -83,6 +85,9 @@ export class Issue {
83
85
  code() {
84
86
  return this.#issueCode;
85
87
  }
88
+ details() {
89
+ return this.#issueDetails;
90
+ }
86
91
  getBlockedByResponseDetails() {
87
92
  return [];
88
93
  }
@@ -23,6 +23,7 @@ import { SharedArrayBufferIssue } from './SharedArrayBufferIssue.js';
23
23
  * of all resources that are affected by the aggregated issues.
24
24
  */
25
25
  export class AggregatedIssue extends Issue {
26
+ #allIssues = new Set();
26
27
  #affectedCookies = new Map();
27
28
  #affectedRawCookieLines = new Map();
28
29
  #affectedRequests = [];
@@ -48,7 +49,7 @@ export class AggregatedIssue extends Issue {
48
49
  #aggregatedIssuesCount = 0;
49
50
  #key;
50
51
  constructor(code, aggregationKey) {
51
- super(code);
52
+ super(code, null);
52
53
  this.#key = aggregationKey;
53
54
  }
54
55
  primaryKey() {
@@ -145,6 +146,7 @@ export class AggregatedIssue extends Issue {
145
146
  if (!this.#representative) {
146
147
  this.#representative = issue;
147
148
  }
149
+ this.#allIssues.add(issue);
148
150
  this.#issueKind = unionIssueKind(this.#issueKind, issue.getKind());
149
151
  let hasRequest = false;
150
152
  for (const request of issue.requests()) {
@@ -227,6 +229,9 @@ export class AggregatedIssue extends Issue {
227
229
  getKind() {
228
230
  return this.#issueKind;
229
231
  }
232
+ getAllIssues() {
233
+ return Array.from(this.#allIssues);
234
+ }
230
235
  isHidden() {
231
236
  return this.#representative?.isHidden() || false;
232
237
  }
@@ -12,22 +12,17 @@ const UIStrings = {
12
12
  const str_ = i18n.i18n.registerUIStrings('models/issues_manager/LowTextContrastIssue.ts', UIStrings);
13
13
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
14
14
  export class LowTextContrastIssue extends Issue {
15
- #issueDetails;
16
15
  constructor(issueDetails, issuesModel) {
17
- super('LowTextContrastIssue', issuesModel);
18
- this.#issueDetails = issueDetails;
16
+ super('LowTextContrastIssue', issueDetails, issuesModel);
19
17
  }
20
18
  primaryKey() {
21
19
  // We intend to keep only one issue per element so other issues for the element will be discarded even
22
20
  // if the issue content is slightly different.
23
- return `${this.code()}-(${this.#issueDetails.violatingNodeId})`;
21
+ return `${this.code()}-(${this.details().violatingNodeId})`;
24
22
  }
25
23
  getCategory() {
26
24
  return "LowTextContrast" /* IssueCategory.LOW_TEXT_CONTRAST */;
27
25
  }
28
- details() {
29
- return this.#issueDetails;
30
- }
31
26
  getDescription() {
32
27
  return {
33
28
  file: 'LowTextContrast.md',
@@ -12,20 +12,16 @@ const UIStrings = {
12
12
  const str_ = i18n.i18n.registerUIStrings('models/issues_manager/MixedContentIssue.ts', UIStrings);
13
13
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
14
14
  export class MixedContentIssue extends Issue {
15
- #issueDetails;
16
15
  constructor(issueDetails, issuesModel) {
17
- super("MixedContentIssue" /* Protocol.Audits.InspectorIssueCode.MixedContentIssue */, issuesModel);
18
- this.#issueDetails = issueDetails;
16
+ super("MixedContentIssue" /* Protocol.Audits.InspectorIssueCode.MixedContentIssue */, issueDetails, issuesModel);
19
17
  }
20
18
  requests() {
21
- if (this.#issueDetails.request) {
22
- return [this.#issueDetails.request];
19
+ const details = this.details();
20
+ if (details.request) {
21
+ return [details.request];
23
22
  }
24
23
  return [];
25
24
  }
26
- getDetails() {
27
- return this.#issueDetails;
28
- }
29
25
  getCategory() {
30
26
  return "MixedContent" /* IssueCategory.MIXED_CONTENT */;
31
27
  }
@@ -36,10 +32,10 @@ export class MixedContentIssue extends Issue {
36
32
  };
37
33
  }
38
34
  primaryKey() {
39
- return JSON.stringify(this.#issueDetails);
35
+ return JSON.stringify(this.details());
40
36
  }
41
37
  getKind() {
42
- switch (this.#issueDetails.resolutionStatus) {
38
+ switch (this.details().resolutionStatus) {
43
39
  case "MixedContentAutomaticallyUpgraded" /* Protocol.Audits.MixedContentResolutionStatus.MixedContentAutomaticallyUpgraded */:
44
40
  return "Improvement" /* IssueKind.IMPROVEMENT */;
45
41
  case "MixedContentBlocked" /* Protocol.Audits.MixedContentResolutionStatus.MixedContentBlocked */:
@@ -16,16 +16,14 @@ const UIStrings = {
16
16
  const str_ = i18n.i18n.registerUIStrings('models/issues_manager/PartitioningBlobURLIssue.ts', UIStrings);
17
17
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
18
18
  export class PartitioningBlobURLIssue extends Issue {
19
- #issueDetails;
20
19
  constructor(issueDetails, issuesModel) {
21
- super("PartitioningBlobURLIssue" /* Protocol.Audits.InspectorIssueCode.PartitioningBlobURLIssue */, issuesModel);
22
- this.#issueDetails = issueDetails;
20
+ super("PartitioningBlobURLIssue" /* Protocol.Audits.InspectorIssueCode.PartitioningBlobURLIssue */, issueDetails, issuesModel);
23
21
  }
24
22
  getCategory() {
25
23
  return "Other" /* IssueCategory.OTHER */;
26
24
  }
27
25
  getDescription() {
28
- const fileName = this.#issueDetails.partitioningBlobURLInfo ===
26
+ const fileName = this.details().partitioningBlobURLInfo ===
29
27
  "BlockedCrossPartitionFetching" /* Protocol.Audits.PartitioningBlobURLInfo.BlockedCrossPartitionFetching */ ?
30
28
  'fetchingPartitionedBlobURL.md' :
31
29
  'navigatingPartitionedBlobURL.md';
@@ -43,14 +41,11 @@ export class PartitioningBlobURLIssue extends Issue {
43
41
  ],
44
42
  };
45
43
  }
46
- details() {
47
- return this.#issueDetails;
48
- }
49
44
  getKind() {
50
45
  return "BreakingChange" /* IssueKind.BREAKING_CHANGE */;
51
46
  }
52
47
  primaryKey() {
53
- return JSON.stringify(this.#issueDetails);
48
+ return JSON.stringify(this.details());
54
49
  }
55
50
  static fromInspectorIssue(issuesModel, inspectorIssue) {
56
51
  const details = inspectorIssue.details.partitioningBlobURLIssueDetails;
@@ -3,25 +3,20 @@
3
3
  // found in the LICENSE file.
4
4
  import { Issue } from './Issue.js';
5
5
  export class PropertyRuleIssue extends Issue {
6
- #issueDetails;
7
6
  #primaryKey;
8
7
  constructor(issueDetails, issuesModel) {
9
8
  const code = JSON.stringify(issueDetails);
10
- super(code, issuesModel);
9
+ super(code, issueDetails, issuesModel);
11
10
  this.#primaryKey = code;
12
- this.#issueDetails = issueDetails;
13
11
  }
14
12
  sources() {
15
- return [this.#issueDetails.sourceCodeLocation];
16
- }
17
- details() {
18
- return this.#issueDetails;
13
+ return [this.details().sourceCodeLocation];
19
14
  }
20
15
  primaryKey() {
21
16
  return this.#primaryKey;
22
17
  }
23
18
  getPropertyName() {
24
- switch (this.#issueDetails.propertyRuleIssueReason) {
19
+ switch (this.details().propertyRuleIssueReason) {
25
20
  case "InvalidInherits" /* Protocol.Audits.PropertyRuleIssueReason.InvalidInherits */:
26
21
  return 'inherits';
27
22
  case "InvalidInitialValue" /* Protocol.Audits.PropertyRuleIssueReason.InvalidInitialValue */:
@@ -32,13 +27,13 @@ export class PropertyRuleIssue extends Issue {
32
27
  return '';
33
28
  }
34
29
  getDescription() {
35
- if (this.#issueDetails.propertyRuleIssueReason === "InvalidName" /* Protocol.Audits.PropertyRuleIssueReason.InvalidName */) {
30
+ if (this.details().propertyRuleIssueReason === "InvalidName" /* Protocol.Audits.PropertyRuleIssueReason.InvalidName */) {
36
31
  return {
37
32
  file: 'propertyRuleInvalidNameIssue.md',
38
33
  links: [],
39
34
  };
40
35
  }
41
- const value = this.#issueDetails.propertyValue ? `: ${this.#issueDetails.propertyValue}` : '';
36
+ const value = this.details().propertyValue ? `: ${this.details().propertyValue}` : '';
42
37
  const property = `${this.getPropertyName()}${value}`;
43
38
  return {
44
39
  file: 'propertyRuleIssue.md',
@@ -12,22 +12,17 @@ const UIStrings = {
12
12
  const str_ = i18n.i18n.registerUIStrings('models/issues_manager/QuirksModeIssue.ts', UIStrings);
13
13
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
14
14
  export class QuirksModeIssue extends Issue {
15
- #issueDetails;
16
15
  constructor(issueDetails, issuesModel) {
17
16
  const mode = issueDetails.isLimitedQuirksMode ? 'LimitedQuirksMode' : 'QuirksMode';
18
17
  const umaCode = ["QuirksModeIssue" /* Protocol.Audits.InspectorIssueCode.QuirksModeIssue */, mode].join('::');
19
- super({ code: "QuirksModeIssue" /* Protocol.Audits.InspectorIssueCode.QuirksModeIssue */, umaCode }, issuesModel);
20
- this.#issueDetails = issueDetails;
18
+ super({ code: "QuirksModeIssue" /* Protocol.Audits.InspectorIssueCode.QuirksModeIssue */, umaCode }, issueDetails, issuesModel);
21
19
  }
22
20
  primaryKey() {
23
- return `${this.code()}-(${this.#issueDetails.documentNodeId})-(${this.#issueDetails.url})`;
21
+ return `${this.code()}-(${this.details().documentNodeId})-(${this.details().url})`;
24
22
  }
25
23
  getCategory() {
26
24
  return "QuirksMode" /* IssueCategory.QUIRKS_MODE */;
27
25
  }
28
- details() {
29
- return this.#issueDetails;
30
- }
31
26
  getDescription() {
32
27
  return {
33
28
  file: 'CompatibilityModeQuirks.md',
@@ -30,24 +30,20 @@ function generateGroupingIssueCode(details) {
30
30
  return issueCode;
31
31
  }
32
32
  export class SRIMessageSignatureIssue extends Issue {
33
- #issueDetails;
34
33
  constructor(issueDetails, issuesModel) {
35
34
  super({
36
35
  code: generateGroupingIssueCode(issueDetails),
37
36
  umaCode: `${"SRIMessageSignatureIssue" /* Protocol.Audits.InspectorIssueCode.SRIMessageSignatureIssue */}::${issueDetails.error}`,
38
- }, issuesModel);
39
- this.#issueDetails = issueDetails;
40
- }
41
- details() {
42
- return this.#issueDetails;
37
+ }, issueDetails, issuesModel);
43
38
  }
44
39
  // Overriding `Issue<String>`:
45
40
  primaryKey() {
46
41
  return JSON.stringify(this.details());
47
42
  }
48
43
  getDescription() {
44
+ const details = this.details();
49
45
  const description = {
50
- file: `sri${this.details().error}.md`,
46
+ file: `sri${details.error}.md`,
51
47
  links: [
52
48
  {
53
49
  link: 'https://www.rfc-editor.org/rfc/rfc9421.html',
@@ -60,10 +56,10 @@ export class SRIMessageSignatureIssue extends Issue {
60
56
  ],
61
57
  substitutions: new Map()
62
58
  };
63
- if (this.#issueDetails.error === "ValidationFailedSignatureMismatch" /* Protocol.Audits.SRIMessageSignatureError.ValidationFailedSignatureMismatch */) {
64
- description.substitutions?.set('PLACEHOLDER_signatureBase', () => this.#issueDetails.signatureBase);
59
+ if (details.error === "ValidationFailedSignatureMismatch" /* Protocol.Audits.SRIMessageSignatureError.ValidationFailedSignatureMismatch */) {
60
+ description.substitutions?.set('PLACEHOLDER_signatureBase', () => details.signatureBase);
65
61
  }
66
- if (this.#issueDetails.error === "ValidationFailedIntegrityMismatch" /* Protocol.Audits.SRIMessageSignatureError.ValidationFailedIntegrityMismatch */) {
62
+ if (details.error === "ValidationFailedIntegrityMismatch" /* Protocol.Audits.SRIMessageSignatureError.ValidationFailedIntegrityMismatch */) {
67
63
  description.substitutions?.set('PLACEHOLDER_integrityAssertions', () => {
68
64
  const prefix = '\n* ';
69
65
  return prefix + this.details().integrityAssertions.join(prefix);
@@ -13,18 +13,13 @@ const UIStrings = {
13
13
  const str_ = i18n.i18n.registerUIStrings('models/issues_manager/SharedArrayBufferIssue.ts', UIStrings);
14
14
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
15
15
  export class SharedArrayBufferIssue extends Issue {
16
- #issueDetails;
17
16
  constructor(issueDetails, issuesModel) {
18
17
  const umaCode = ["SharedArrayBufferIssue" /* Protocol.Audits.InspectorIssueCode.SharedArrayBufferIssue */, issueDetails.type].join('::');
19
- super({ code: "SharedArrayBufferIssue" /* Protocol.Audits.InspectorIssueCode.SharedArrayBufferIssue */, umaCode }, issuesModel);
20
- this.#issueDetails = issueDetails;
18
+ super({ code: "SharedArrayBufferIssue" /* Protocol.Audits.InspectorIssueCode.SharedArrayBufferIssue */, umaCode }, issueDetails, issuesModel);
21
19
  }
22
20
  getCategory() {
23
21
  return "Other" /* IssueCategory.OTHER */;
24
22
  }
25
- details() {
26
- return this.#issueDetails;
27
- }
28
23
  getDescription() {
29
24
  return {
30
25
  file: 'sharedArrayBuffer.md',
@@ -35,10 +30,10 @@ export class SharedArrayBufferIssue extends Issue {
35
30
  };
36
31
  }
37
32
  primaryKey() {
38
- return JSON.stringify(this.#issueDetails);
33
+ return JSON.stringify(this.details());
39
34
  }
40
35
  getKind() {
41
- if (this.#issueDetails.isWarning) {
36
+ if (this.details().isWarning) {
42
37
  return "BreakingChange" /* IssueKind.BREAKING_CHANGE */;
43
38
  }
44
39
  return "PageError" /* IssueKind.PAGE_ERROR */;
@@ -69,7 +69,6 @@ function getIssueCode(details) {
69
69
  }
70
70
  }
71
71
  export class SharedDictionaryIssue extends Issue {
72
- #issueDetails;
73
72
  constructor(issueDetails, issuesModel) {
74
73
  super({
75
74
  code: getIssueCode(issueDetails),
@@ -77,30 +76,26 @@ export class SharedDictionaryIssue extends Issue {
77
76
  "SharedDictionaryIssue" /* Protocol.Audits.InspectorIssueCode.SharedDictionaryIssue */,
78
77
  issueDetails.sharedDictionaryError,
79
78
  ].join('::'),
80
- }, issuesModel);
81
- this.#issueDetails = issueDetails;
79
+ }, issueDetails, issuesModel);
82
80
  }
83
81
  requests() {
84
- if (this.#issueDetails.request) {
85
- return [this.#issueDetails.request];
82
+ if (this.details().request) {
83
+ return [this.details().request];
86
84
  }
87
85
  return [];
88
86
  }
89
87
  getCategory() {
90
88
  return "Other" /* IssueCategory.OTHER */;
91
89
  }
92
- details() {
93
- return this.#issueDetails;
94
- }
95
90
  getDescription() {
96
- const description = issueDescriptions.get(this.#issueDetails.sharedDictionaryError);
91
+ const description = issueDescriptions.get(this.details().sharedDictionaryError);
97
92
  if (!description) {
98
93
  return null;
99
94
  }
100
95
  return resolveLazyDescription(description);
101
96
  }
102
97
  primaryKey() {
103
- return JSON.stringify(this.#issueDetails);
98
+ return JSON.stringify(this.details());
104
99
  }
105
100
  getKind() {
106
101
  return "PageError" /* IssueKind.PAGE_ERROR */;
@@ -7,33 +7,29 @@ export const lateImportStylesheetLoadingCode = [
7
7
  "LateImportRule" /* Protocol.Audits.StyleSheetLoadingIssueReason.LateImportRule */,
8
8
  ].join('::');
9
9
  export class StylesheetLoadingIssue extends Issue {
10
- #issueDetails;
11
10
  constructor(issueDetails, issuesModel) {
12
11
  const code = `${"StylesheetLoadingIssue" /* Protocol.Audits.InspectorIssueCode.StylesheetLoadingIssue */}::${issueDetails.styleSheetLoadingIssueReason}`;
13
- super(code, issuesModel);
14
- this.#issueDetails = issueDetails;
12
+ super(code, issueDetails, issuesModel);
15
13
  }
16
14
  sources() {
17
- return [this.#issueDetails.sourceCodeLocation];
15
+ return [this.details().sourceCodeLocation];
18
16
  }
19
17
  requests() {
20
- if (!this.#issueDetails.failedRequestInfo) {
18
+ const details = this.details();
19
+ if (!details.failedRequestInfo) {
21
20
  return [];
22
21
  }
23
- const { url, requestId } = this.#issueDetails.failedRequestInfo;
22
+ const { url, requestId } = details.failedRequestInfo;
24
23
  if (!requestId) {
25
24
  return [];
26
25
  }
27
26
  return [{ url, requestId }];
28
27
  }
29
- details() {
30
- return this.#issueDetails;
31
- }
32
28
  primaryKey() {
33
- return JSON.stringify(this.#issueDetails);
29
+ return JSON.stringify(this.details());
34
30
  }
35
31
  getDescription() {
36
- switch (this.#issueDetails.styleSheetLoadingIssueReason) {
32
+ switch (this.details().styleSheetLoadingIssueReason) {
37
33
  case "LateImportRule" /* Protocol.Audits.StyleSheetLoadingIssueReason.LateImportRule */:
38
34
  return {
39
35
  file: 'stylesheetLateImport.md',
@@ -17,16 +17,11 @@ const UIStrings = {
17
17
  const str_ = i18n.i18n.registerUIStrings('models/issues_manager/UnencodedDigestIssue.ts', UIStrings);
18
18
  const i18nLazyString = i18n.i18n.getLazilyComputedLocalizedString.bind(undefined, str_);
19
19
  export class UnencodedDigestIssue extends Issue {
20
- #issueDetails;
21
20
  constructor(issueDetails, issuesModel) {
22
21
  super({
23
22
  code: `${"UnencodedDigestIssue" /* Protocol.Audits.InspectorIssueCode.UnencodedDigestIssue */}::${issueDetails.error}`,
24
23
  umaCode: `${"UnencodedDigestIssue" /* Protocol.Audits.InspectorIssueCode.UnencodedDigestIssue */}::${issueDetails.error}`,
25
- }, issuesModel);
26
- this.#issueDetails = issueDetails;
27
- }
28
- details() {
29
- return this.#issueDetails;
24
+ }, issueDetails, issuesModel);
30
25
  }
31
26
  primaryKey() {
32
27
  return JSON.stringify(this.details());
@@ -0,0 +1,7 @@
1
+ # Session History Item Has Been Marked Skippable
2
+
3
+ A session history item was added by this document without any interaction from the
4
+ user. As a result, this document's history items will be skipped if the user goes
5
+ back or forward via the browser's UI (e.g., back/forward buttons), to prevent pages
6
+ from trapping a user. If the user interacts with the page, the history items
7
+ will no longer be skipped.