chrome-devtools-frontend 1.0.1660788 → 1.0.1662289

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 (177) hide show
  1. package/.agents/skills/evaluate-ai-css-completion/SKILL.md +143 -0
  2. package/.agents/skills/evaluate-ai-css-completion/scripts/evaluate.js +104 -0
  3. package/.agents/skills/migrate-chromium-test/SKILL.md +7 -2
  4. package/.agents/skills/ui-eng-vision-local-lit-renderer/SKILL.md +7 -1
  5. package/docs/ui_engineering.md +75 -42
  6. package/eslint.config.mjs +7 -0
  7. package/extension-api/ExtensionAPI.d.ts +88 -0
  8. package/front_end/core/common/SettingRegistration.ts +0 -5
  9. package/front_end/core/host/InspectorFrontendHost.ts +1 -0
  10. package/front_end/core/host/InspectorFrontendHostStub.ts +2 -0
  11. package/front_end/core/platform/ArrayUtilities.ts +10 -0
  12. package/front_end/core/platform/StringUtilities.ts +20 -4
  13. package/front_end/core/sdk/CPUThrottlingManager.ts +2 -0
  14. package/front_end/core/sdk/DOMDebuggerModel.ts +2 -0
  15. package/front_end/core/sdk/DOMModel.ts +1 -0
  16. package/front_end/core/sdk/DebuggerModel.ts +4 -4
  17. package/front_end/core/sdk/EventBreakpointsModel.ts +2 -0
  18. package/front_end/core/sdk/FrameManager.ts +1 -0
  19. package/front_end/core/sdk/IsolateManager.ts +1 -0
  20. package/front_end/core/sdk/NetworkManager.ts +2 -0
  21. package/front_end/core/sdk/NetworkRequest.ts +1 -0
  22. package/front_end/core/sdk/PageResourceLoader.ts +2 -0
  23. package/front_end/core/sdk/SourceMap.ts +5 -5
  24. package/front_end/core/sdk/SourceMapManager.ts +3 -2
  25. package/front_end/core/sdk/TargetManager.ts +4 -0
  26. package/front_end/entrypoints/main/MainImpl.ts +2 -1
  27. package/front_end/foundation/README.md +86 -0
  28. package/front_end/generated/InspectorBackendCommands.ts +4 -5
  29. package/front_end/generated/protocol.ts +20 -38
  30. package/front_end/models/bindings/CompilerScriptMapping.ts +5 -5
  31. package/front_end/models/bindings/ContentProviderBasedProject.ts +2 -3
  32. package/front_end/models/bindings/DebuggerLanguagePlugins.ts +3 -3
  33. package/front_end/models/bindings/DefaultScriptMapping.ts +3 -3
  34. package/front_end/models/bindings/ResourceMapping.ts +3 -3
  35. package/front_end/models/bindings/ResourceScriptMapping.ts +2 -2
  36. package/front_end/models/bindings/SASSSourceMapping.ts +3 -3
  37. package/front_end/models/bindings/TempFile.ts +8 -3
  38. package/front_end/models/extensions/ExtensionAPI.ts +110 -46
  39. package/front_end/models/extensions/RecorderExtensionEndpoint.ts +7 -5
  40. package/front_end/models/formatter/ScriptFormatter.ts +8 -11
  41. package/front_end/models/heap_snapshot/HeapSnapshotProxy.ts +14 -5
  42. package/front_end/models/issues_manager/CheckFormsIssuesTrigger.ts +8 -9
  43. package/front_end/models/issues_manager/CookieIssue.ts +21 -9
  44. package/front_end/models/issues_manager/Issue.ts +3 -4
  45. package/front_end/models/issues_manager/IssueAggregator.ts +0 -9
  46. package/front_end/models/issues_manager/IssueResolver.ts +2 -2
  47. package/front_end/models/issues_manager/IssuesManager.ts +136 -137
  48. package/front_end/models/issues_manager/RelatedIssue.ts +10 -8
  49. package/front_end/models/issues_manager/issues_manager.ts +0 -2
  50. package/front_end/models/javascript_metadata/NativeFunctions.js +1 -1
  51. package/front_end/models/logs/RequestResolver.ts +2 -2
  52. package/front_end/models/source_map_scopes/FunctionCodeResolver.ts +12 -9
  53. package/front_end/models/trace/handlers/FramesHandler.ts +4 -7
  54. package/front_end/models/trace/handlers/ModelHandlers.ts +0 -1
  55. package/front_end/models/trace/handlers/RendererHandler.ts +2 -15
  56. package/front_end/models/trace/handlers/Threads.ts +4 -11
  57. package/front_end/models/trace/insights/DOMSize.ts +1 -1
  58. package/front_end/models/workspace_diff/WorkspaceDiff.ts +10 -4
  59. package/front_end/panels/ai_assistance/components/ChatMessage.ts +2 -1
  60. package/front_end/panels/application/ApplicationPanelSidebar.ts +0 -44
  61. package/front_end/panels/application/CookieItemsView.ts +1 -1
  62. package/front_end/panels/application/ServiceWorkersView.ts +494 -411
  63. package/front_end/panels/application/WebMCPView.ts +38 -43
  64. package/front_end/panels/application/application.ts +0 -6
  65. package/front_end/panels/application/components/AdsView.ts +201 -30
  66. package/front_end/panels/application/components/adsView.css +25 -0
  67. package/front_end/panels/application/components/components.ts +0 -2
  68. package/front_end/panels/application/preloading/components/PreloadingDetailsReportView.ts +1 -1
  69. package/front_end/panels/application/preloading/components/RuleSetDetailsView.ts +2 -2
  70. package/front_end/panels/application/serviceWorkersView.css +40 -4
  71. package/front_end/panels/browser_debugger/XHRBreakpointsSidebarPane.ts +147 -123
  72. package/front_end/panels/common/ExtensionServer.ts +3 -3
  73. package/front_end/panels/console/ConsoleView.ts +3 -2
  74. package/front_end/panels/console/PromptBuilder.ts +2 -1
  75. package/front_end/panels/emulation/DeviceModeView.ts +164 -113
  76. package/front_end/panels/issues/AffectedResourcesView.ts +1 -1
  77. package/front_end/panels/issues/IssueView.ts +0 -2
  78. package/front_end/panels/issues/IssuesPane.ts +1 -8
  79. package/front_end/panels/js_timeline/js_timeline-meta.ts +3 -2
  80. package/front_end/panels/lighthouse/LighthouseProtocolService.ts +53 -12
  81. package/front_end/panels/linear_memory_inspector/LinearMemoryInspectorController.ts +3 -3
  82. package/front_end/panels/linear_memory_inspector/LinearMemoryInspectorPane.ts +5 -5
  83. package/front_end/panels/linear_memory_inspector/components/LinearMemoryHighlightChipList.ts +4 -4
  84. package/front_end/panels/linear_memory_inspector/components/LinearMemoryInspector.ts +2 -2
  85. package/front_end/panels/linear_memory_inspector/components/LinearMemoryNavigator.ts +6 -6
  86. package/front_end/panels/linear_memory_inspector/components/LinearMemoryValueInterpreter.ts +3 -3
  87. package/front_end/panels/linear_memory_inspector/components/ValueInterpreterDisplay.ts +8 -9
  88. package/front_end/panels/linear_memory_inspector/components/ValueInterpreterDisplayUtils.ts +2 -2
  89. package/front_end/panels/linear_memory_inspector/components/ValueInterpreterSettings.ts +1 -1
  90. package/front_end/panels/linear_memory_inspector/linear_memory_inspector-meta.ts +2 -2
  91. package/front_end/panels/network/RequestPayloadView.ts +92 -52
  92. package/front_end/panels/network/RequestTimingView.ts +95 -127
  93. package/front_end/panels/network/components/ResponseHeaderSection.ts +5 -3
  94. package/front_end/panels/profiler/HeapSnapshotView.ts +3 -3
  95. package/front_end/panels/profiler/WritableProfileHeader.ts +2 -2
  96. package/front_end/panels/recorder/{components/ControlButton.ts → ControlButton.ts} +9 -10
  97. package/front_end/panels/recorder/{components/CreateRecordingView.ts → CreateRecordingView.ts} +48 -47
  98. package/front_end/panels/recorder/{components/ExtensionView.ts → ExtensionView.ts} +8 -8
  99. package/front_end/panels/recorder/RecorderController.ts +302 -127
  100. package/front_end/panels/recorder/RecorderPanel.ts +1 -1
  101. package/front_end/panels/recorder/{components/RecordingListView.ts → RecordingListView.ts} +19 -20
  102. package/front_end/panels/recorder/{components/RecordingView.ts → RecordingView.ts} +88 -88
  103. package/front_end/panels/recorder/{components/ReplaySection.ts → ReplaySection.ts} +11 -11
  104. package/front_end/panels/recorder/{components/SelectorPicker.ts → SelectorPicker.ts} +13 -13
  105. package/front_end/panels/recorder/{components/StepEditor.ts → StepEditor.ts} +15 -15
  106. package/front_end/panels/recorder/{components/StepView.ts → StepView.ts} +10 -10
  107. package/front_end/panels/recorder/{components/TimelineSection.ts → TimelineSection.ts} +2 -2
  108. package/front_end/panels/recorder/recorder.ts +23 -1
  109. package/front_end/panels/recorder/util/util.ts +113 -0
  110. package/front_end/panels/sources/SourcesView.ts +0 -17
  111. package/front_end/panels/sources/TabbedEditorContainer.ts +1 -1
  112. package/front_end/panels/sources/UISourceCodeFrame.ts +42 -0
  113. package/front_end/panels/sources/sources.ts +0 -2
  114. package/front_end/panels/timeline/CompatibilityTracksAppender.ts +0 -17
  115. package/front_end/panels/timeline/IsolateSelector.ts +10 -8
  116. package/front_end/panels/timeline/ThreadAppender.ts +0 -106
  117. package/front_end/panels/timeline/TimelinePanel.ts +18 -7
  118. package/front_end/panels/timeline/TimelineUIUtils.ts +144 -129
  119. package/front_end/panels/timeline/timeline-meta.ts +3 -2
  120. package/front_end/third_party/chromium/README.chromium +1 -1
  121. package/front_end/ui/components/report_view/ReportView.ts +11 -5
  122. package/front_end/ui/components/report_view/report.css +4 -1
  123. package/front_end/ui/legacy/TextPrompt.ts +49 -1
  124. package/front_end/ui/legacy/Treeoutline.ts +3 -0
  125. package/front_end/ui/legacy/UIUtils.ts +11 -1
  126. package/front_end/ui/legacy/Widget.ts +14 -15
  127. package/front_end/ui/legacy/components/cookie_table/CookiesTable.ts +2 -2
  128. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +11 -7
  129. package/front_end/ui/legacy/components/source_frame/SourceFrame.ts +2 -1
  130. package/front_end/ui/legacy/components/utils/JSPresentationUtils.ts +10 -1
  131. package/front_end/ui/legacy/textPrompt.css +10 -0
  132. package/front_end/ui/visual_logging/KnownContextValues.ts +1 -0
  133. package/package.json +1 -1
  134. package/front_end/models/issues_manager/AttributionReportingIssue.ts +0 -247
  135. package/front_end/models/issues_manager/descriptions/arInsecureContext.md +0 -7
  136. package/front_end/models/issues_manager/descriptions/arInvalidInfoHeader.md +0 -5
  137. package/front_end/models/issues_manager/descriptions/arInvalidRegisterOsSourceHeader.md +0 -5
  138. package/front_end/models/issues_manager/descriptions/arInvalidRegisterOsTriggerHeader.md +0 -5
  139. package/front_end/models/issues_manager/descriptions/arInvalidRegisterSourceHeader.md +0 -5
  140. package/front_end/models/issues_manager/descriptions/arInvalidRegisterTriggerHeader.md +0 -5
  141. package/front_end/models/issues_manager/descriptions/arNavigationRegistrationUniqueScopeAlreadySet.md +0 -5
  142. package/front_end/models/issues_manager/descriptions/arNavigationRegistrationWithoutTransientUserActivation.md +0 -6
  143. package/front_end/models/issues_manager/descriptions/arNoRegisterOsSourceHeader.md +0 -5
  144. package/front_end/models/issues_manager/descriptions/arNoRegisterOsTriggerHeader.md +0 -5
  145. package/front_end/models/issues_manager/descriptions/arNoRegisterSourceHeader.md +0 -5
  146. package/front_end/models/issues_manager/descriptions/arNoRegisterTriggerHeader.md +0 -5
  147. package/front_end/models/issues_manager/descriptions/arNoWebOrOsSupport.md +0 -4
  148. package/front_end/models/issues_manager/descriptions/arOsSourceIgnored.md +0 -18
  149. package/front_end/models/issues_manager/descriptions/arOsTriggerIgnored.md +0 -19
  150. package/front_end/models/issues_manager/descriptions/arPermissionPolicyDisabled.md +0 -8
  151. package/front_end/models/issues_manager/descriptions/arSourceAndTriggerHeaders.md +0 -9
  152. package/front_end/models/issues_manager/descriptions/arSourceIgnored.md +0 -13
  153. package/front_end/models/issues_manager/descriptions/arTriggerIgnored.md +0 -12
  154. package/front_end/models/issues_manager/descriptions/arUntrustworthyReportingOrigin.md +0 -10
  155. package/front_end/models/issues_manager/descriptions/arWebAndOsHeaders.md +0 -11
  156. package/front_end/models/trace/handlers/AuctionWorkletsHandler.ts +0 -183
  157. package/front_end/panels/application/InterestGroupStorageModel.ts +0 -81
  158. package/front_end/panels/application/InterestGroupStorageView.ts +0 -151
  159. package/front_end/panels/application/InterestGroupTreeElement.ts +0 -65
  160. package/front_end/panels/application/components/InterestGroupAccessGrid.ts +0 -135
  161. package/front_end/panels/application/components/interestGroupAccessGrid.css +0 -27
  162. package/front_end/panels/application/interestGroupStorageView.css +0 -9
  163. package/front_end/panels/issues/AttributionReportingIssueDetailsView.ts +0 -182
  164. package/front_end/panels/recorder/components/components.ts +0 -25
  165. package/front_end/panels/recorder/components/util.ts +0 -116
  166. package/front_end/panels/sources/InplaceFormatterEditorAction.ts +0 -149
  167. /package/front_end/panels/recorder/{components/controlButton.css → controlButton.css} +0 -0
  168. /package/front_end/panels/recorder/{components/createRecordingView.css → createRecordingView.css} +0 -0
  169. /package/front_end/panels/recorder/{components/extensionView.css → extensionView.css} +0 -0
  170. /package/front_end/panels/recorder/{components/recordingListView.css → recordingListView.css} +0 -0
  171. /package/front_end/panels/recorder/{components/recordingView.css → recordingView.css} +0 -0
  172. /package/front_end/panels/recorder/{components/replaySection.css → replaySection.css} +0 -0
  173. /package/front_end/panels/recorder/{components/selectorPicker.css → selectorPicker.css} +0 -0
  174. /package/front_end/panels/recorder/{components/startView.css → startView.css} +0 -0
  175. /package/front_end/panels/recorder/{components/stepEditor.css → stepEditor.css} +0 -0
  176. /package/front_end/panels/recorder/{components/stepView.css → stepView.css} +0 -0
  177. /package/front_end/panels/recorder/{components/timelineSection.css → timelineSection.css} +0 -0
@@ -14,27 +14,27 @@ import linearMemoryNavigatorStyles from './linearMemoryNavigator.css.js';
14
14
 
15
15
  const UIStrings = {
16
16
  /**
17
- * @description Tooltip text that appears when hovering over a valid memory address (e.g. 0x0) in the address line in the Linear memory inspector.
17
+ * @description Tooltip text that appears when hovering over a valid memory address (for example, 0x0) in the address line in the Memory inspector panel.
18
18
  */
19
19
  enterAddress: 'Enter address',
20
20
  /**
21
- * @description Tooltip text that appears when hovering over the button to go back in history in the Linear Memory Navigator
21
+ * @description Tooltip text that appears when hovering over the button to go back in history in the Memory inspector panel.
22
22
  */
23
23
  goBackInAddressHistory: 'Go back in address history',
24
24
  /**
25
- * @description Tooltip text that appears when hovering over the button to go forward in history in the Linear Memory Navigator
25
+ * @description Tooltip text that appears when hovering over the button to go forward in history in the Memory inspector panel.
26
26
  */
27
27
  goForwardInAddressHistory: 'Go forward in address history',
28
28
  /**
29
- * @description Tooltip text that appears when hovering over the page back icon in the Linear Memory Navigator
29
+ * @description Tooltip text that appears when hovering over the page back icon in the Memory inspector panel.
30
30
  */
31
31
  previousPage: 'Previous page',
32
32
  /**
33
- * @description Tooltip text that appears when hovering over the next page icon in the Linear Memory Navigator
33
+ * @description Tooltip text that appears when hovering over the next page icon in the Memory inspector panel.
34
34
  */
35
35
  nextPage: 'Next page',
36
36
  /**
37
- * @description Text to refresh the page
37
+ * @description Tooltip text that appears when hovering over the refresh button in the Memory inspector panel.
38
38
  */
39
39
  refresh: 'Refresh',
40
40
  } as const;
@@ -18,14 +18,14 @@ import {ValueInterpreterSettings} from './ValueInterpreterSettings.js';
18
18
 
19
19
  const UIStrings = {
20
20
  /**
21
- * @description Tooltip text that appears when hovering over the gear button to open and close settings in the Linear memory inspector. These settings
21
+ * @description Tooltip text that appears when hovering over the gear button to open and close settings in the Memory inspector panel. These settings
22
22
  * allow the user to change the value type to view, such as 32-bit Integer, or 32-bit Float.
23
23
  */
24
24
  toggleValueTypeSettings: 'Toggle value type settings',
25
25
  /**
26
- * @description Tooltip text that appears when hovering over the 'Little Endian' or 'Big Endian' setting in the Linear memory inspector.
26
+ * @description Tooltip text that appears when hovering over the Little Endian or Big Endian setting in the Memory inspector panel.
27
27
  */
28
- changeEndianness: 'Change `Endianness`',
28
+ changeEndianness: 'Change endianness',
29
29
  } as const;
30
30
  const str_ =
31
31
  i18n.i18n.registerUIStrings('panels/linear_memory_inspector/components/LinearMemoryValueInterpreter.ts', UIStrings);
@@ -26,27 +26,26 @@ import {
26
26
 
27
27
  const UIStrings = {
28
28
  /**
29
- * @description Tooltip text that appears when hovering over an unsigned interpretation of the memory under the Value Interpreter
29
+ * @description Tooltip text that appears when hovering over an unsigned interpretation of the memory in the value interpreter in the Memory inspector panel.
30
30
  */
31
- unsignedValue: '`Unsigned` value',
31
+ unsignedValue: 'Unsigned value',
32
32
  /**
33
- * @description Tooltip text that appears when hovering over the element to change value type modes of under the Value Interpreter. Value type modes
34
- * are different ways of viewing a certain value, e.g.: 10 (decimal) can be 0xa in hexadecimal mode, or 12 in octal mode.
33
+ * @description Tooltip text that appears when hovering over the element to change value type modes in the value interpreter in the Memory inspector panel. Value type modes
34
+ * are different ways of viewing a certain value, for example: 10 (decimal) can be 0xa in hexadecimal mode, or 12 in octal mode.
35
35
  */
36
36
  changeValueTypeMode: 'Change mode',
37
37
  /**
38
- * @description Tooltip text that appears when hovering over a signed interpretation of the memory under the Value Interpreter
38
+ * @description Tooltip text that appears when hovering over a signed interpretation of the memory in the value interpreter in the Memory inspector panel.
39
39
  */
40
- signedValue: '`Signed` value',
40
+ signedValue: 'Signed value',
41
41
  /**
42
- * @description Tooltip text that appears when hovering over a 'jump-to-address' button that is next to a pointer (32-bit or 64-bit) under the Value Interpreter
42
+ * @description Tooltip text that appears when hovering over a jump-to-address button that is next to a pointer (32-bit or 64-bit) in the value interpreter in the Memory inspector panel.
43
43
  */
44
44
  jumpToPointer: 'Jump to address',
45
45
  /**
46
- * @description Tooltip text that appears when hovering over a 'jump-to-address' button that is next to a pointer (32-bit or 64-bit) with an invalid address under the Value Interpreter.
46
+ * @description Tooltip text that appears when hovering over a jump-to-address button that is next to a pointer (32-bit or 64-bit) with an invalid address in the value interpreter in the Memory inspector panel.
47
47
  */
48
48
  addressOutOfRange: 'Address out of memory range',
49
-
50
49
  } as const;
51
50
  const str_ =
52
51
  i18n.i18n.registerUIStrings('panels/linear_memory_inspector/components/ValueInterpreterDisplay.ts', UIStrings);
@@ -7,8 +7,8 @@ import * as Platform from '../../../core/platform/platform.js';
7
7
 
8
8
  const UIStrings = {
9
9
  /**
10
- * @description Text that is shown in the LinearMemoryInspector if a value could not be correctly formatted
11
- * for the requested mode (e.g. we do not floats to be represented as hexadecimal numbers).
10
+ * @description Text that is shown in the Memory inspector panel if a value cannot be correctly formatted
11
+ * for the requested mode (for example, when a float cannot be represented as a hexadecimal number).
12
12
  * Abbreviation stands for 'not applicable'.
13
13
  */
14
14
  notApplicable: 'N/A',
@@ -15,7 +15,7 @@ const {render, html} = Lit;
15
15
 
16
16
  const UIStrings = {
17
17
  /**
18
- * @description Name of a group of selectable value types that do not fall under integer and floating point value types, e.g. Pointer32. The group appears name appears under the Value Interpreter Settings.
18
+ * @description Name of a group of selectable value types that do not fall under integer and floating point value types (for example, Pointer32). The group name appears in the value interpreter settings in the Memory inspector panel.
19
19
  */
20
20
  otherGroup: 'Other',
21
21
  } as const;
@@ -12,11 +12,11 @@ import type * as LinearMemoryInspector from './linear_memory_inspector.js';
12
12
 
13
13
  const UIStrings = {
14
14
  /**
15
- * @description Title of the Linear Memory inspector tool
15
+ * @description Title of the Memory inspector panel.
16
16
  */
17
17
  memoryInspector: 'Memory inspector',
18
18
  /**
19
- * @description Command for showing the 'Memory inspector' tool
19
+ * @description Command for showing the Memory inspector panel.
20
20
  */
21
21
  showMemoryInspector: 'Show Memory inspector',
22
22
  } as const;
@@ -109,8 +109,10 @@ const str_ = i18n.i18n.registerUIStrings('panels/network/RequestPayloadView.ts',
109
109
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
110
110
 
111
111
  interface ViewInput {
112
- decodeRequestParameters: boolean;
113
- setURLDecoding(value: boolean): void;
112
+ decodeQueryParameters: boolean;
113
+ setDecodeQueryParameters(value: boolean): void;
114
+ decodeFormParameters: boolean;
115
+ setDecodeFormParameters(value: boolean): void;
114
116
  viewQueryParamSource: boolean;
115
117
  setViewQueryParamSource(value: boolean): void;
116
118
  viewFormParamSource: boolean;
@@ -157,15 +159,28 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
157
159
  </devtools-widget>
158
160
  </li>`;
159
161
 
160
- const createParsedParams = (params: SDK.NetworkRequest.NameValue[]): TemplateResult[] => params.map(
161
- param => html`<li role=treeitem @contextmenu=${
162
- copyValueContextmenu(i18nString(UIStrings.copyValue), () => decodeURIComponent(param.value), 'copy-value')}>${
163
- param.name !== '' ?
164
- html`${RequestPayloadView.formatParameter(param.name, 'payload-name', input.decodeRequestParameters)}${
165
- RequestPayloadView.formatParameter(
166
- param.value, 'payload-value source-code', input.decodeRequestParameters)}` :
167
- RequestPayloadView.formatParameter(
168
- i18nString(UIStrings.empty), 'empty-request-payload', input.decodeRequestParameters)}</li>`);
162
+ const createParsedParams = (params: SDK.NetworkRequest.NameValue[],
163
+ decodeParameters: boolean): TemplateResult[] => params.map(param => {
164
+ // clang-format off
165
+ return html`
166
+ <li role=treeitem
167
+ @contextmenu=${copyValueContextmenu(
168
+ i18nString(UIStrings.copyValue),
169
+ () => decodeURIComponent(param.value),
170
+ 'copy-value'
171
+ )}>
172
+ ${param.name !== '' ? html`
173
+ ${RequestPayloadView.formatParameter(param.name, 'payload-name', decodeParameters)}
174
+ ${RequestPayloadView.formatParameter(param.value, 'payload-value source-code', decodeParameters)}
175
+ ` : RequestPayloadView.formatParameter(
176
+ i18nString(UIStrings.empty),
177
+ 'empty-request-payload',
178
+ decodeParameters
179
+ )}
180
+ </li>
181
+ `;
182
+ // clang-format on
183
+ });
169
184
 
170
185
  const parsedFormData = (() => {
171
186
  if (input.formData && !input.formParameters) {
@@ -173,23 +188,25 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
173
188
  return JSON.parse(input.formData);
174
189
  } catch {
175
190
  }
176
- return undefined;
177
191
  }
192
+ return undefined;
178
193
  })();
179
194
 
180
- const createPayload = (parsedFormData: unknown): TemplateResult => {
195
+ const createPayload = (parsedFormData: unknown): LitTemplate => {
196
+ if (!parsedFormData) {
197
+ return nothing;
198
+ }
181
199
  const object = new SDK.RemoteObject.LocalJSONObject(parsedFormData);
182
- const section =
183
- new ObjectUI.ObjectPropertiesSection.RootElement(new ObjectUI.ObjectPropertiesSection.ObjectTree(object, {
184
- readOnly: true,
185
- propertiesMode: ObjectUI.ObjectPropertiesSection.ObjectPropertiesMode.OWN_AND_INTERNAL_AND_INHERITED,
186
- }));
187
- section.title = document.createTextNode(object.description);
188
- section.listItemElement.classList.add('source-code', 'object-properties-section');
189
- section.childrenListElement.classList.add('source-code', 'object-properties-section');
190
- section.expand();
191
- return html`<devtools-tree-wrapper
192
- .treeElement=${section}></devtools-tree-wrapper>`;
200
+ const objectTree = new ObjectUI.ObjectPropertiesSection.ObjectTree(object, {
201
+ readOnly: true,
202
+ propertiesMode: ObjectUI.ObjectPropertiesSection.ObjectPropertiesMode.OWN_AND_INTERNAL_AND_INHERITED,
203
+ });
204
+ return html`
205
+ <li role=treeitem class="source-code object-properties-section-root-element object-properties-section" open>
206
+ ${object.description}
207
+ ${object.hasChildren ? ObjectUI.ObjectPropertiesSection.renderObjectTree(objectTree) : nothing}
208
+ </li>
209
+ `;
193
210
  };
194
211
 
195
212
  const queryStringExpandedSetting =
@@ -199,24 +216,23 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
199
216
  const requestPayloadExpandedSetting =
200
217
  Common.Settings.Settings.instance().createSetting('request-info-request-payload-category-expanded', true);
201
218
 
202
- const toggleURLDecoding = (e: Event): void => {
203
- e.consume();
204
- input.setURLDecoding(!input.decodeRequestParameters);
205
- };
206
-
207
- const onContextMenu = (viewSource: boolean, callback: (value: boolean) => void, includeURLDecodingOption = true) => (
208
- event: Event): void => {
219
+ const onContextMenu = (
220
+ viewSource: boolean,
221
+ setViewSource: (value: boolean) => void,
222
+ decoding?: {decode: boolean, toggleDecode: () => void},
223
+ ) => (event: Event): void => {
209
224
  const contextMenu = new UI.ContextMenu.ContextMenu(event);
210
225
  const section = contextMenu.newSection();
211
226
  if (viewSource) {
212
- section.appendItem(i18nString(UIStrings.viewParsed), () => callback(!viewSource), {jslogContext: 'view-parsed'});
227
+ section.appendItem(i18nString(UIStrings.viewParsed), () => setViewSource(!viewSource),
228
+ {jslogContext: 'view-parsed'});
213
229
  } else {
214
- section.appendItem(i18nString(UIStrings.viewSource), () => callback(!viewSource), {jslogContext: 'view-source'});
215
- if (includeURLDecodingOption) {
230
+ section.appendItem(i18nString(UIStrings.viewSource), () => setViewSource(!viewSource),
231
+ {jslogContext: 'view-source'});
232
+ if (decoding) {
216
233
  const viewURLEncodedText =
217
- input.decodeRequestParameters ? i18nString(UIStrings.viewUrlEncoded) : i18nString(UIStrings.viewDecoded);
218
- section.appendItem(
219
- viewURLEncodedText, toggleURLDecoding.bind(this, event), {jslogContext: 'toggle-url-decoding'});
234
+ decoding.decode ? i18nString(UIStrings.viewUrlEncoded) : i18nString(UIStrings.viewDecoded);
235
+ section.appendItem(viewURLEncodedText, () => decoding.toggleDecode(), {jslogContext: 'toggle-url-decoding'});
220
236
  }
221
237
  }
222
238
  void contextMenu.show();
@@ -233,7 +249,14 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
233
249
  role=treeitem
234
250
  ?hidden=${!input.queryParameters}
235
251
  jslog=${VisualLogging.section().context('query-string')}
236
- @contextmenu=${onContextMenu(input.viewQueryParamSource, input.setViewQueryParamSource)}
252
+ @contextmenu=${onContextMenu(
253
+ input.viewQueryParamSource,
254
+ input.setViewQueryParamSource,
255
+ {
256
+ decode: input.decodeQueryParameters,
257
+ toggleDecode: () => input.setDecodeQueryParameters(!input.decodeQueryParameters),
258
+ }
259
+ )}
237
260
  @expanded=${(e: UI.TreeOutline.TreeViewElement.ExpandEvent) =>
238
261
  queryStringExpandedSetting.set(e.detail.expanded)}
239
262
  ?open=${queryStringExpandedSetting.get()}
@@ -246,19 +269,26 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
246
269
  ?hidden=${input.viewQueryParamSource}
247
270
  jslog=${VisualLogging.action().track({click: true}).context('decode-encode')}
248
271
  .variant=${Buttons.Button.Variant.OUTLINED}
249
- @click=${toggleURLDecoding}>
250
- ${input.decodeRequestParameters ? i18nString(UIStrings.viewUrlEncoded) : i18nString(UIStrings.viewDecoded)}
272
+ @click=${(e: Event) => { e.consume(); input.setDecodeQueryParameters(!input.decodeQueryParameters); }}>
273
+ ${input.decodeQueryParameters ? i18nString(UIStrings.viewUrlEncoded) : i18nString(UIStrings.viewDecoded)}
251
274
  </devtools-button>
252
275
  <ul role=group>
253
276
  ${ifExpanded(input.viewQueryParamSource ? createSourceText(input.queryString ?? '')
254
- : createParsedParams(input.queryParameters ?? []))}
277
+ : createParsedParams(input.queryParameters ?? [], input.decodeQueryParameters))}
255
278
  </ul>
256
279
  </li>
257
280
  <li
258
281
  role=treeitem
259
282
  ?hidden=${!input.formData || !input.formParameters}
260
283
  jslog=${VisualLogging.section().context('form-data')}
261
- @contextmenu=${onContextMenu(input.viewFormParamSource, input.setViewFormParamSource)}
284
+ @contextmenu=${onContextMenu(
285
+ input.viewFormParamSource,
286
+ input.setViewFormParamSource,
287
+ {
288
+ decode: input.decodeFormParameters,
289
+ toggleDecode: () => input.setDecodeFormParameters(!input.decodeFormParameters),
290
+ }
291
+ )}
262
292
  @expanded=${(e: UI.TreeOutline.TreeViewElement.ExpandEvent) => formDataExpandedSetting.set(e.detail.expanded)}
263
293
  ?open=${formDataExpandedSetting.get()}
264
294
  >
@@ -270,20 +300,22 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
270
300
  ?hidden=${input.viewFormParamSource}
271
301
  jslog=${VisualLogging.action().track({click: true}).context('decode-encode')}
272
302
  .variant=${Buttons.Button.Variant.OUTLINED}
273
- @click=${toggleURLDecoding}>
274
- ${input.decodeRequestParameters ? i18nString(UIStrings.viewUrlEncoded) : i18nString(UIStrings.viewDecoded)}
303
+ @click=${(e: Event) => { e.consume(); input.setDecodeFormParameters(!input.decodeFormParameters); }}>
304
+ ${input.decodeFormParameters ? i18nString(UIStrings.viewUrlEncoded) : i18nString(UIStrings.viewDecoded)}
275
305
  </devtools-button>
276
306
  <ul role=group>
277
307
  ${ifExpanded(input.viewFormParamSource ? createSourceText(input.formData ?? '')
278
- : createParsedParams(input.formParameters ?? []))}
308
+ : createParsedParams(input.formParameters ?? [], input.decodeFormParameters))}
279
309
  </ul>
280
310
  </li>
281
311
  <li
282
312
  role=treeitem
283
313
  ?hidden=${!input.formData || Boolean(input.formParameters) || Boolean(input.binaryPayloadContentData)}
284
314
  jslog=${VisualLogging.section().context('request-payload')}
285
- @contextmenu=${onContextMenu(input.viewJSONPayloadSource, input.setViewJSONPayloadSource,
286
- /* includeURLDecodingOption*/ false)}
315
+ @contextmenu=${onContextMenu(
316
+ input.viewJSONPayloadSource,
317
+ input.setViewJSONPayloadSource,
318
+ )}
287
319
  @expanded=${(e: UI.TreeOutline.TreeViewElement.ExpandEvent) =>
288
320
  requestPayloadExpandedSetting.set(e.detail.expanded)}
289
321
  ?open=${requestPayloadExpandedSetting.get()}
@@ -322,7 +354,8 @@ export const DEFAULT_VIEW: View = (input, output, target) => {
322
354
 
323
355
  export class RequestPayloadView extends UI.Widget.VBox {
324
356
  #request?: SDK.NetworkRequest.NetworkRequest;
325
- #decodeRequestParameters = true;
357
+ #decodeQueryParameters = true;
358
+ #decodeFormParameters = true;
326
359
  #formData?: string;
327
360
  #formParameters?: SDK.NetworkRequest.NameValue[];
328
361
  #binaryPayloadContentData: TextUtils.ContentData.ContentData|null = null;
@@ -343,9 +376,11 @@ export class RequestPayloadView extends UI.Widget.VBox {
343
376
  }
344
377
  this.#request = request;
345
378
 
379
+ this.#decodeQueryParameters = true;
380
+ this.#decodeFormParameters = true;
346
381
  const contentType = request.requestContentType();
347
382
  if (contentType) {
348
- this.#decodeRequestParameters = Boolean(contentType.match(/^application\/x-www-form-urlencoded\s*(;.*)?$/i));
383
+ this.#decodeFormParameters = Boolean(contentType.match(/^application\/x-www-form-urlencoded\s*(;.*)?$/i));
349
384
  }
350
385
 
351
386
  if (this.isShowing()) {
@@ -400,9 +435,14 @@ export class RequestPayloadView extends UI.Widget.VBox {
400
435
  queryParameters: this.request.queryParameters,
401
436
  formData: this.#formData,
402
437
  formParameters: this.#formParameters,
403
- decodeRequestParameters: this.#decodeRequestParameters,
404
- setURLDecoding: (value: boolean): void => {
405
- this.#decodeRequestParameters = value;
438
+ decodeQueryParameters: this.#decodeQueryParameters,
439
+ setDecodeQueryParameters: (value: boolean): void => {
440
+ this.#decodeQueryParameters = value;
441
+ this.requestUpdate();
442
+ },
443
+ decodeFormParameters: this.#decodeFormParameters,
444
+ setDecodeFormParameters: (value: boolean): void => {
445
+ this.#decodeFormParameters = value;
406
446
  this.requestUpdate();
407
447
  },
408
448
  viewQueryParamSource: this.#viewQueryParamSource,