chrome-devtools-frontend 1.0.1668390 → 1.0.1669021

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 (192) hide show
  1. package/.agents/skills/devtools-ci/SKILL.md +65 -0
  2. package/.agents/skills/gerrit-cli/SKILL.md +59 -0
  3. package/.agents/skills/gerrit-cli/references/commands.md +93 -0
  4. package/.agents/skills/gerrit-cli/references/workflows.md +56 -0
  5. package/.agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py +47 -0
  6. package/.agents/skills/gerrit-cli/scripts/import_upstream.py +230 -0
  7. package/docs/contributing/infrastructure.md +7 -1
  8. package/front_end/core/host/AidaClient.ts +66 -47
  9. package/front_end/core/host/GcaClient.ts +4 -6
  10. package/front_end/core/host/ResourceLoader.ts +4 -2
  11. package/front_end/core/root/Runtime.ts +0 -5
  12. package/front_end/core/sdk/ConsoleModel.ts +3 -2
  13. package/front_end/core/sdk/DebuggerModel.ts +14 -6
  14. package/front_end/core/sdk/SDKSettings.ts +19 -0
  15. package/front_end/core/sdk/sdk-meta.ts +0 -58
  16. package/front_end/generated/InspectorBackendCommands.ts +2 -2
  17. package/front_end/generated/protocol.ts +11 -3
  18. package/front_end/models/ai_assistance/AiUtils.ts +67 -4
  19. package/front_end/models/ai_assistance/StorageItem.ts +26 -5
  20. package/front_end/models/ai_code_completion/AiCodeCompletion.ts +2 -19
  21. package/front_end/models/ai_code_generation/AiCodeGeneration.ts +2 -3
  22. package/front_end/models/trace/handlers/RendererHandler.ts +20 -4
  23. package/front_end/models/trace/types/File.ts +1 -0
  24. package/front_end/models/workspace/UISourceCode.ts +0 -10
  25. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +61 -182
  26. package/front_end/panels/ai_assistance/components/ChatInput.ts +25 -8
  27. package/front_end/panels/ai_assistance/components/ChatMessage.ts +13 -69
  28. package/front_end/panels/ai_assistance/components/ChatView.ts +14 -8
  29. package/front_end/panels/ai_assistance/components/chatMessage.css +2 -20
  30. package/front_end/panels/application/ApplicationPanelSidebar.ts +2 -2
  31. package/front_end/panels/application/ApplicationPanelTreeElement.ts +41 -3
  32. package/front_end/panels/application/ServiceWorkerUpdateCycleView.ts +116 -79
  33. package/front_end/panels/application/ServiceWorkersView.ts +8 -8
  34. package/front_end/panels/application/application.ts +2 -0
  35. package/front_end/panels/application/components/AdsView.ts +10 -6
  36. package/front_end/panels/application/preloading/PreloadingView.ts +53 -45
  37. package/front_end/panels/application/preloading/components/PreloadingDetailsReportView.ts +111 -119
  38. package/front_end/panels/application/preloading/components/preloadingDetailsReportView.css +21 -23
  39. package/front_end/panels/application/serviceWorkerUpdateCycleView.css +105 -102
  40. package/front_end/panels/common/AiCodeCompletionDisclaimer.ts +107 -96
  41. package/front_end/panels/common/AiCodeCompletionSummaryToolbar.ts +17 -19
  42. package/front_end/panels/common/AiCodeCompletionTeaser.ts +6 -6
  43. package/front_end/panels/common/AiCodeGenerationTeaser.ts +28 -26
  44. package/front_end/panels/common/common.ts +1 -1
  45. package/front_end/panels/console/ConsoleInsightTeaser.ts +3 -6
  46. package/front_end/panels/console/ConsoleView.ts +6 -4
  47. package/front_end/panels/console/ConsoleViewMessage.ts +1 -1
  48. package/front_end/panels/console/console-meta.ts +28 -0
  49. package/front_end/panels/elements/StylesAiCodeCompletionProvider.ts +1 -1
  50. package/front_end/panels/elements/StylesSidebarPane.ts +3 -2
  51. package/front_end/panels/emulation/DeviceModeWrapper.ts +18 -4
  52. package/front_end/panels/explain/components/ConsoleInsight.ts +4 -6
  53. package/front_end/panels/explain/explain-meta.ts +7 -49
  54. package/front_end/panels/network/NetworkDataGridNode.ts +1 -1
  55. package/front_end/panels/network/NetworkLogView.ts +1 -0
  56. package/front_end/panels/network/OriginalResourceChunkView.ts +340 -0
  57. package/front_end/panels/network/ResourceChunkView.ts +72 -46
  58. package/front_end/panels/network/ResourceDirectSocketChunkView.ts +3 -2
  59. package/front_end/panels/network/ResourceWebSocketFrameView.ts +3 -3
  60. package/front_end/panels/network/originalResourceChunkView.css +49 -0
  61. package/front_end/panels/screencast/ScreencastView.ts +401 -260
  62. package/front_end/panels/screencast/screencastView.css +113 -100
  63. package/front_end/panels/sensors/LocationsSettingsTab.ts +106 -122
  64. package/front_end/panels/sensors/locationsSettingsTab.css +4 -4
  65. package/front_end/panels/settings/AISettingsTab.ts +17 -100
  66. package/front_end/panels/snippets/ScriptSnippetFileSystem.ts +2 -2
  67. package/front_end/panels/snippets/SnippetsQuickOpen.ts +4 -4
  68. package/front_end/panels/sources/AddSourceMapURLDialog.ts +3 -3
  69. package/front_end/panels/sources/AiCodeCompletionPlugin.ts +4 -3
  70. package/front_end/panels/sources/BreakpointEditDialog.ts +14 -14
  71. package/front_end/panels/sources/BreakpointsView.ts +14 -14
  72. package/front_end/panels/sources/CallStackSidebarPane.ts +6 -6
  73. package/front_end/panels/sources/CategorizedBreakpointL10n.ts +18 -18
  74. package/front_end/panels/sources/CoveragePlugin.ts +7 -7
  75. package/front_end/panels/sources/DebuggerPausedMessage.ts +23 -23
  76. package/front_end/panels/sources/DebuggerPlugin.ts +29 -29
  77. package/front_end/panels/sources/FilteredUISourceCodeListProvider.ts +2 -2
  78. package/front_end/panels/sources/GoToLineQuickOpen.ts +10 -10
  79. package/front_end/panels/sources/NavigatorView.ts +34 -27
  80. package/front_end/panels/sources/OutlineQuickOpen.ts +3 -3
  81. package/front_end/panels/sources/PersistenceActions.ts +9 -9
  82. package/front_end/panels/sources/ProfilePlugin.ts +1 -1
  83. package/front_end/panels/sources/ScopeChainSidebarPane.ts +5 -5
  84. package/front_end/panels/sources/SnippetsPlugin.ts +2 -2
  85. package/front_end/panels/sources/SourcesNavigator.ts +20 -18
  86. package/front_end/panels/sources/SourcesPanel.ts +26 -25
  87. package/front_end/panels/sources/SourcesView.ts +5 -6
  88. package/front_end/panels/sources/TabbedEditorContainer.ts +3 -3
  89. package/front_end/panels/sources/ThreadsSidebarPane.ts +1 -1
  90. package/front_end/panels/sources/UISourceCodeFrame.ts +0 -2
  91. package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +7 -7
  92. package/front_end/panels/sources/components/HeadersView.ts +2 -2
  93. package/front_end/panels/sources/sources-meta.ts +109 -71
  94. package/front_end/panels/sources/sources.ts +0 -2
  95. package/front_end/panels/timeline/TimelineHistoryManager.ts +14 -3
  96. package/front_end/panels/timeline/TimelineLoader.ts +72 -42
  97. package/front_end/panels/timeline/TimelinePanel.ts +29 -4
  98. package/front_end/panels/timeline/timelineHistoryManager.css +4 -0
  99. package/front_end/third_party/chromium/README.chromium +1 -1
  100. package/front_end/third_party/puppeteer/README.chromium +2 -2
  101. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.d.ts +187 -1
  102. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +91 -38
  103. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.d.ts +145 -2
  104. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.d.ts.map +1 -1
  105. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.js +0 -2
  106. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Browser.js.map +1 -1
  107. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.d.ts +0 -2
  108. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.d.ts.map +1 -1
  109. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.js +0 -2
  110. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/BrowserContext.js.map +1 -1
  111. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Dialog.d.ts +3 -2
  112. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Dialog.d.ts.map +1 -1
  113. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Dialog.js +8 -2
  114. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Dialog.js.map +1 -1
  115. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.d.ts +0 -2
  116. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.d.ts.map +1 -1
  117. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.js +0 -2
  118. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/JSHandle.js.map +1 -1
  119. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts +1 -3
  120. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.d.ts.map +1 -1
  121. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js +0 -2
  122. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Page.js.map +1 -1
  123. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.d.ts +0 -1
  124. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.d.ts.map +1 -1
  125. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.js +0 -1
  126. package/front_end/third_party/puppeteer/package/lib/puppeteer/api/Realm.js.map +1 -1
  127. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BidiOverCdp.d.ts.map +1 -1
  128. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BidiOverCdp.js +2 -2
  129. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/BidiOverCdp.js.map +1 -1
  130. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Browser.d.ts +5 -1
  131. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Browser.d.ts.map +1 -1
  132. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Browser.js +12 -0
  133. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/Browser.js.map +1 -1
  134. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.d.ts.map +1 -1
  135. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.js +4 -1
  136. package/front_end/third_party/puppeteer/package/lib/puppeteer/bidi/HTTPResponse.js.map +1 -1
  137. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.d.ts +5 -1
  138. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.d.ts.map +1 -1
  139. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.js +49 -0
  140. package/front_end/third_party/puppeteer/package/lib/puppeteer/cdp/Browser.js.map +1 -1
  141. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/EventEmitter.d.ts +0 -6
  142. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/EventEmitter.d.ts.map +1 -1
  143. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/EventEmitter.js +0 -6
  144. package/front_end/third_party/puppeteer/package/lib/puppeteer/common/EventEmitter.js.map +1 -1
  145. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.d.ts +1 -1
  146. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.d.ts.map +1 -1
  147. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.js +1 -1
  148. package/front_end/third_party/puppeteer/package/lib/puppeteer/generated/injected.js.map +1 -1
  149. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/util.d.ts.map +1 -1
  150. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/util.js +3 -0
  151. package/front_end/third_party/puppeteer/package/lib/puppeteer/injected/util.js.map +1 -1
  152. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.d.ts +0 -3
  153. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.d.ts.map +1 -1
  154. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.js +0 -3
  155. package/front_end/third_party/puppeteer/package/lib/puppeteer/node/ScreenRecorder.js.map +1 -1
  156. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.d.ts +3 -3
  157. package/front_end/third_party/puppeteer/package/lib/puppeteer/revisions.js +3 -3
  158. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/disposable.d.ts +2 -2
  159. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/disposable.js +2 -2
  160. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.d.ts +1 -1
  161. package/front_end/third_party/puppeteer/package/lib/puppeteer/util/version.js +1 -1
  162. package/front_end/third_party/puppeteer/package/lib/types.d.ts +187 -1
  163. package/front_end/third_party/puppeteer/package/package.json +5 -5
  164. package/front_end/third_party/puppeteer/package/src/api/Browser.ts +155 -2
  165. package/front_end/third_party/puppeteer/package/src/api/BrowserContext.ts +0 -2
  166. package/front_end/third_party/puppeteer/package/src/api/Dialog.ts +10 -2
  167. package/front_end/third_party/puppeteer/package/src/api/JSHandle.ts +0 -2
  168. package/front_end/third_party/puppeteer/package/src/api/Page.ts +1 -3
  169. package/front_end/third_party/puppeteer/package/src/api/Realm.ts +0 -1
  170. package/front_end/third_party/puppeteer/package/src/bidi/BidiOverCdp.ts +4 -2
  171. package/front_end/third_party/puppeteer/package/src/bidi/Browser.ts +17 -0
  172. package/front_end/third_party/puppeteer/package/src/bidi/HTTPResponse.ts +5 -4
  173. package/front_end/third_party/puppeteer/package/src/cdp/Browser.ts +66 -0
  174. package/front_end/third_party/puppeteer/package/src/common/EventEmitter.ts +0 -6
  175. package/front_end/third_party/puppeteer/package/src/generated/injected.ts +1 -1
  176. package/front_end/third_party/puppeteer/package/src/injected/util.ts +4 -1
  177. package/front_end/third_party/puppeteer/package/src/node/ScreenRecorder.ts +0 -3
  178. package/front_end/third_party/puppeteer/package/src/revisions.ts +3 -3
  179. package/front_end/third_party/puppeteer/package/src/util/disposable.ts +2 -2
  180. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  181. package/front_end/ui/components/text_editor/AiCodeCompletionProvider.ts +9 -7
  182. package/front_end/ui/components/text_editor/AiCodeGenerationProvider.ts +7 -8
  183. package/front_end/ui/legacy/Dialog.ts +12 -2
  184. package/front_end/ui/legacy/TabbedPane.ts +7 -2
  185. package/front_end/ui/legacy/components/cookie_table/CookiesTable.ts +40 -24
  186. package/front_end/ui/legacy/components/data_grid/DataGrid.ts +1 -0
  187. package/front_end/ui/legacy/components/data_grid/DataGridElement.ts +8 -4
  188. package/front_end/ui/legacy/components/perf_ui/FlameChart.ts +14 -7
  189. package/front_end/ui/legacy/components/quick_open/CommandMenu.ts +11 -1
  190. package/front_end/ui/visual_logging/KnownContextValues.ts +2 -0
  191. package/package.json +1 -1
  192. package/front_end/panels/sources/AiWarningInfobarPlugin.ts +0 -78
@@ -158,9 +158,8 @@ export class AiCodeGeneration {
158
158
  Host.userMetrics.actionTaken(Host.UserMetrics.Action.AiCodeGenerationSuggestionAccepted);
159
159
  }
160
160
 
161
- async generateCode(
162
- prompt: string, preamble: string, inferenceLanguage?: Host.AidaClient.AidaInferenceLanguage,
163
- options?: {signal?: AbortSignal}): Promise<Host.AidaClient.GenerateCodeResponse|null> {
161
+ async generateCode(prompt: string, preamble: string, inferenceLanguage?: Host.AidaClient.AidaInferenceLanguage,
162
+ options?: {signal?: AbortSignal}): Promise<Host.AidaClient.GenerateCodeResponse> {
164
163
  const request = this.#buildRequest(prompt, preamble, inferenceLanguage);
165
164
  const response = await this.#aidaClient.generateCode(request, options);
166
165
 
@@ -305,13 +305,23 @@ export function sanitizeThreads(processes: Map<Types.Events.ProcessID, RendererP
305
305
  export function buildHierarchy(
306
306
  processes: Map<Types.Events.ProcessID, RendererProcess>,
307
307
  options?: {filter: {has: (name: Types.Events.Name) => boolean}}): void {
308
+ // Ensure threads that only contain V8 CPU profiler samples (such as WebAssembly
309
+ // background execution threads) are registered in their process before we iterate.
310
+ // These threads do not receive standard renderer trace events, so their RendererThread
311
+ // objects must be initialized here so SamplesIntegrator can inject profile calls.
308
312
  const samplesData = samplesHandlerData();
313
+ for (const [pid, profilesByThread] of samplesData.profilesInProcess) {
314
+ const process = processes.get(pid);
315
+ if (!process) {
316
+ continue;
317
+ }
318
+ for (const [tid] of profilesByThread) {
319
+ getOrCreateRendererThread(process, tid);
320
+ }
321
+ }
322
+
309
323
  for (const [pid, process] of processes) {
310
324
  for (const [tid, thread] of process.threads) {
311
- if (!thread.entries.length) {
312
- thread.tree = Helpers.TreeHelpers.makeEmptyTraceEntryTree();
313
- continue;
314
- }
315
325
  // Step 1. Massage the data.
316
326
  Helpers.Trace.sortTraceEventsInPlace(thread.entries);
317
327
  // Step 2. Inject profile calls from samples
@@ -333,6 +343,12 @@ export function buildHierarchy(
333
343
  }
334
344
  }
335
345
  }
346
+
347
+ if (!thread.entries.length) {
348
+ thread.tree = Helpers.TreeHelpers.makeEmptyTraceEntryTree();
349
+ continue;
350
+ }
351
+
336
352
  // Step 3. Build the tree.
337
353
  const treeData = Helpers.TreeHelpers.treify(thread.entries, options);
338
354
  thread.tree = treeData.tree;
@@ -211,6 +211,7 @@ export interface PersistedTraceVisualConfig {
211
211
  * on load.
212
212
  */
213
213
  export interface MetaData {
214
+ title?: string;
214
215
  source?: 'DevTools';
215
216
  startTime?: string;
216
217
  emulatedDeviceTitle?: string;
@@ -47,7 +47,6 @@ export class UISourceCode extends Common.ObjectWrapper.ObjectWrapper<EventTypes>
47
47
  #contentEncoded: boolean|undefined;
48
48
  #isKnownThirdParty = false;
49
49
  #isUnconditionallyIgnoreListed = false;
50
- #containsAiChanges = false;
51
50
 
52
51
  constructor(project: Project, url: Platform.DevToolsPath.UrlString, contentType: Common.ResourceType.ResourceType) {
53
52
  super();
@@ -343,7 +342,6 @@ export class UISourceCode extends Common.ObjectWrapper.ObjectWrapper<EventTypes>
343
342
  #resetWorkingCopy(): void {
344
343
  this.#workingCopy = null;
345
344
  this.#workingCopyGetter = null;
346
- this.setContainsAiChanges(false);
347
345
  }
348
346
 
349
347
  setWorkingCopy(newWorkingCopy: string): void {
@@ -352,14 +350,6 @@ export class UISourceCode extends Common.ObjectWrapper.ObjectWrapper<EventTypes>
352
350
  this.#workingCopyChanged();
353
351
  }
354
352
 
355
- setContainsAiChanges(containsAiChanges: boolean): void {
356
- this.#containsAiChanges = containsAiChanges;
357
- }
358
-
359
- containsAiChanges(): boolean {
360
- return this.#containsAiChanges;
361
- }
362
-
363
353
  setContent(content: string, isBase64: boolean): void {
364
354
  this.#contentEncoded = isBase64;
365
355
  if (this.#project.canSetFileContent()) {
@@ -100,10 +100,6 @@ const UIStrings = {
100
100
  * @description AI assistance UI text for deleting all local history entries.
101
101
  */
102
102
  clearChatHistory: 'Clear local chats',
103
- /**
104
- * @description AI assistance UI text for the export conversation button.
105
- */
106
- exportConversation: 'Export conversation',
107
103
  /**
108
104
  * @description AI assistance UI text explaining that the user has no past conversations.
109
105
  */
@@ -190,56 +186,6 @@ const UIStringsNotTranslate = {
190
186
  * @description Placeholder text for the chat UI input when AIAgent2 is enabled.
191
187
  */
192
188
  inputPlaceholderForV2: 'Ask a question (AIAgent2 enabled)',
193
- /**
194
- * @description Disclaimer text right after the chat input.
195
- */
196
- inputDisclaimerForStyling:
197
- 'Chat messages and any data the inspected page can access via Web APIs are sent to Google and may be seen by human reviewers to improve this feature. This is an experimental AI feature and won’t always get it right.',
198
- /**
199
- * @description Disclaimer text right after the chat input.
200
- */
201
- inputDisclaimerForStylingEnterpriseNoLogging:
202
- 'Chat messages and any data the inspected page can access via Web APIs are sent to Google. The content you submit and that is generated by this feature will not be used to improve Google’s AI models. This is an experimental AI feature and won’t always get it right.',
203
- /**
204
- * @description Disclaimer text right after the chat input.
205
- */
206
- inputDisclaimerForNetwork:
207
- 'Chat messages and the selected network request are sent to Google and may be seen by human reviewers to improve this feature. This is an experimental AI feature and won’t always get it right.',
208
- /**
209
- * @description Disclaimer text right after the chat input.
210
- */
211
- inputDisclaimerForNetworkEnterpriseNoLogging:
212
- 'Chat messages and the selected network request are sent to Google. The content you submit and that is generated by this feature will not be used to improve Google’s AI models. This is an experimental AI feature and won’t always get it right.',
213
- /**
214
- * @description Disclaimer text right after the chat input.
215
- */
216
- inputDisclaimerForFile:
217
- 'Chat messages and the selected file are sent to Google and may be seen by human reviewers to improve this feature. This is an experimental AI feature and won’t always get it right.',
218
- /**
219
- * @description Disclaimer text right after the chat input.
220
- */
221
- inputDisclaimerForFileEnterpriseNoLogging:
222
- 'Chat messages and the selected file are sent to Google. The content you submit and that is generated by this feature will not be used to improve Google’s AI models. This is an experimental AI feature and won’t always get it right.',
223
- /**
224
- * @description Disclaimer text right after the chat input.
225
- */
226
- inputDisclaimerForPerformance:
227
- 'Chat messages and trace data from your performance trace are sent to Google and may be seen by human reviewers to improve this feature. This is an experimental AI feature and won’t always get it right.',
228
- /**
229
- * @description Disclaimer text right after the chat input.
230
- */
231
- inputDisclaimerForPerformanceEnterpriseNoLogging:
232
- 'Chat messages and data from your performance trace are sent to Google. The content you submit and that is generated by this feature will not be used to improve Google’s AI models. This is an experimental AI feature and won’t always get it right.',
233
- /**
234
- * @description Disclaimer text right after the chat input.
235
- */
236
- inputDisclaimerForNoContext:
237
- 'Chat messages, any data the inspected page can see using Web APIs, and the items you select such as files, network requests, and performance traces are sent to Google and may be seen by human reviewers to improve this feature. This is an experimental AI feature and won’t always get it right.',
238
- /**
239
- * @description Disclaimer text right after the chat input.
240
- */
241
- inputDisclaimerForNoContextEnterpriseNoLogging:
242
- 'Chat messages, any data the inspected page can see using Web APIs, and the items you select such as files, network requests, and performance traces are sent to Google. This data will not be used to improve Google’s AI models. This is an experimental AI feature and won’t always get it right.',
243
189
  /**
244
190
  * @description Placeholder text for the chat UI input.
245
191
  */
@@ -251,22 +197,12 @@ const UIStringsNotTranslate = {
251
197
  /**
252
198
  * @description Disclaimer text right after the chat input.
253
199
  */
254
- inputDisclaimerForAccessibility:
255
- 'Chat messages and the selected Lighthouse report are sent to Google and may be seen by human reviewers to improve this feature. This is an experimental AI feature and won’t always get it right.',
256
- /**
257
- * @description Disclaimer text right after the chat input.
258
- */
259
- inputDisclaimerForAccessibilityEnterpriseNoLogging:
260
- 'Chat messages and the selected Lighthouse report are sent to Google. The content you submit and that is generated by this feature will not be used to improve Google’s AI models. This is an experimental AI feature and won’t always get it right.',
261
- /**
262
- * @description Disclaimer text right after the chat input when V2 is enabled.
263
- */
264
- inputDisclaimerV2:
200
+ inputDisclaimer:
265
201
  'Chat messages, data accessible for this site via DevTools panels and Web APIs, and items you select such as network requests, files, and performance traces are sent to Google and may be seen by human reviewers to improve this feature. This is an experimental AI feature and won’t always get it right.',
266
202
  /**
267
- * @description Disclaimer text right after the chat input when V2 is enabled and enterprise logging is off.
203
+ * @description Disclaimer text right after the chat input when enterprise logging is off.
268
204
  */
269
- inputDisclaimerEnterpriseNoLoggingV2:
205
+ inputDisclaimerEnterpriseNoLogging:
270
206
  'Chat messages, data accessible for this site via DevTools panels and Web APIs, and items you select such as network requests, files, and performance traces are sent to Google. The content submitted to and generated by this feature will not be used to improve Google’s AI models. This is an experimental AI feature and won’t always get it right.',
271
207
  } as const;
272
208
 
@@ -442,7 +378,6 @@ export interface PanelViewOutput {
442
378
  type View = (input: ViewInput, output: PanelViewOutput, target: HTMLElement) => void;
443
379
 
444
380
  function toolbarView(input: ToolbarViewInput): Lit.LitTemplate {
445
- const hasAiV2 = Boolean(Root.Runtime.hostConfig.devToolsAiAssistanceV2?.enabled);
446
381
  // clang-format off
447
382
  return html`
448
383
  <div class="toolbar-container" role="toolbar" jslog=${VisualLogging.toolbar()}>
@@ -472,19 +407,7 @@ function toolbarView(input: ToolbarViewInput): Lit.LitTemplate {
472
407
  .jslogContext=${'freestyler.delete'}
473
408
  .variant=${Buttons.Button.Variant.TOOLBAR}
474
409
  @click=${input.onDeleteClick}>
475
- </devtools-button>
476
- ${hasAiV2 ? Lit.nothing : html`
477
- <devtools-button
478
- title=${i18nString(UIStrings.exportConversation)}
479
- aria-label=${i18nString(UIStrings.exportConversation)}
480
- .iconName=${'download'}
481
- .disabled=${input.isLoading}
482
- .jslogContext=${'export-ai-conversation'}
483
- .variant=${Buttons.Button.Variant.TOOLBAR}
484
- @click=${input.onExportConversationClick}>
485
- </devtools-button>
486
- `
487
- }` : Lit.nothing}
410
+ </devtools-button>` : Lit.nothing}
488
411
  </devtools-toolbar>
489
412
  <devtools-toolbar class="freestyler-right-toolbar" role="presentation">
490
413
  <devtools-link
@@ -540,51 +463,43 @@ function defaultView(input: ViewInput, output: PanelViewOutput, target: HTMLElem
540
463
  }
541
464
  }
542
465
 
543
- if (Root.Runtime.hostConfig.devToolsAiAssistanceV2?.enabled) {
544
-
545
- const shouldShowWalkthrough = input.state === ViewState.CHAT_VIEW && input.props.walkthrough.isExpanded;
546
- /**
547
- * We want to mark the walkthrough as loading only if it's showing the last
548
- * message. Otherwise, a previous walkthrough will show as loading if we
549
- * rely only on the isLoading flag.
550
- */
551
- let walkthroughIsForLastMessage = false;
552
- if(input.state === ViewState.CHAT_VIEW) {
553
- const lastMessage = input.props.messages.at(-1);
554
- if(lastMessage && input.props.walkthrough.activeSidebarMessage?.id === lastMessage.id) {
555
- walkthroughIsForLastMessage = true;
556
- }
466
+ const shouldShowWalkthrough = input.state === ViewState.CHAT_VIEW && input.props.walkthrough.isExpanded;
467
+ /**
468
+ * We want to mark the walkthrough as loading only if it's showing the last
469
+ * message. Otherwise, a previous walkthrough will show as loading if we
470
+ * rely only on the isLoading flag.
471
+ */
472
+ let walkthroughIsForLastMessage = false;
473
+ if(input.state === ViewState.CHAT_VIEW) {
474
+ const lastMessage = input.props.messages.at(-1);
475
+ if(lastMessage && input.props.walkthrough.activeSidebarMessage?.id === lastMessage.id) {
476
+ walkthroughIsForLastMessage = true;
557
477
  }
558
-
559
- Lit.render(html`
560
- ${toolbarView(input)}
561
- <div class="ai-assistance-view-container">
562
- <devtools-split-view
563
- name="ai-assistance-split-view-state"
564
- direction="column"
565
- sidebar-position="second"
566
- sidebar-visibility=${shouldShowWalkthrough && !input.props.walkthrough.isInlined ? 'visible' : 'hidden'}
567
- sidebar-initial-size=${WALKTHROUGH_SIDEBAR_INITIAL_WIDTH}
568
- >
569
- <div slot="main" class="main-view">
570
- ${renderState()}
571
- </div>
572
- ${shouldShowWalkthrough ? html`
573
- <devtools-widget slot="sidebar" ${widget(WalkthroughView, {
574
- message: input.props.walkthrough.activeSidebarMessage,
575
- isLoading: input.props.isLoading && walkthroughIsForLastMessage,
576
- markdownRenderer: input.props.markdownRenderer,
577
- onToggle: input.props.walkthrough.onToggle,
578
- })}></devtools-widget>` : Lit.nothing}
579
- </devtools-split-view>
580
- </div>
581
- `, target);
582
- } else {
583
- Lit.render(html`
584
- ${toolbarView(input)}
585
- <div class="ai-assistance-view-container">${renderState()}</div>
586
- `, target);
587
478
  }
479
+
480
+ Lit.render(html`
481
+ ${toolbarView(input)}
482
+ <div class="ai-assistance-view-container">
483
+ <devtools-split-view
484
+ name="ai-assistance-split-view-state"
485
+ direction="column"
486
+ sidebar-position="second"
487
+ sidebar-visibility=${shouldShowWalkthrough && !input.props.walkthrough.isInlined ? 'visible' : 'hidden'}
488
+ sidebar-initial-size=${WALKTHROUGH_SIDEBAR_INITIAL_WIDTH}
489
+ >
490
+ <div slot="main" class="main-view">
491
+ ${renderState()}
492
+ </div>
493
+ ${shouldShowWalkthrough ? html`
494
+ <devtools-widget slot="sidebar" ${widget(WalkthroughView, {
495
+ message: input.props.walkthrough.activeSidebarMessage,
496
+ isLoading: input.props.isLoading && walkthroughIsForLastMessage,
497
+ markdownRenderer: input.props.markdownRenderer,
498
+ onToggle: input.props.walkthrough.onToggle,
499
+ })}></devtools-widget>` : Lit.nothing}
500
+ </devtools-split-view>
501
+ </div>
502
+ `, target);
588
503
  // clang-format on
589
504
  }
590
505
 
@@ -709,6 +624,7 @@ export class AiAssistancePanel extends UI.Panel.Panel {
709
624
  activeSidebarMessage: null,
710
625
  inlineExpandedMessages: [],
711
626
  };
627
+ #textInputValue = '';
712
628
 
713
629
  constructor(private view: View = defaultView, {aidaClient, aidaAvailability}: {
714
630
  aidaClient: Host.AidaClient.AidaClient,
@@ -725,8 +641,6 @@ export class AiAssistancePanel extends UI.Panel.Panel {
725
641
  this.#toggleSearchElementAction =
726
642
  UI.ActionRegistry.ActionRegistry.instance().getAction('elements.toggle-element-search');
727
643
  }
728
- AiAssistanceModel.AiHistoryStorage.AiHistoryStorage.instance().addEventListener(
729
- AiAssistanceModel.AiHistoryStorage.Events.HISTORY_DELETED, this.#onHistoryDeleted, this);
730
644
  }
731
645
 
732
646
  #getToolbarInput(): ToolbarViewInput {
@@ -795,6 +709,10 @@ export class AiAssistancePanel extends UI.Panel.Panel {
795
709
  emptyStateSuggestions,
796
710
  inputPlaceholder: this.#getChatInputPlaceholder(),
797
711
  disclaimerText: this.#getDisclaimerText(),
712
+ textInputValue: this.#textInputValue,
713
+ onTextChange: (text: string) => {
714
+ this.#textInputValue = text;
715
+ },
798
716
  onExportConversation: this.#onExportConversationClick.bind(this),
799
717
  uploadImageInputEnabled: isAiAssistanceMultimodalUploadInputEnabled() &&
800
718
  this.#conversation.type === AiAssistanceModel.AiHistoryStorage.ConversationType.STYLING,
@@ -816,10 +734,9 @@ export class AiAssistancePanel extends UI.Panel.Panel {
816
734
  void this.#startConversation(text, imageInput, multimodalInputType);
817
735
  };
818
736
 
819
- const isAIV2Enabled = Root.Runtime.hostConfig.devToolsAiAssistanceV2?.enabled;
820
737
  const seenSetting =
821
738
  Common.Settings.Settings.instance().moduleSetting('ai-assistance-v2-opt-in-change-dialog-seen');
822
- if (isAIV2Enabled && !seenSetting.get()) {
739
+ if (!seenSetting.get()) {
823
740
  OptInChangeDialog.show({
824
741
  onGotIt: () => {
825
742
  seenSetting.set(true);
@@ -864,9 +781,7 @@ export class AiAssistancePanel extends UI.Panel.Panel {
864
781
  // Responsive logic for Walkthrough
865
782
  override onResize(): void {
866
783
  super.onResize();
867
- if (Root.Runtime.hostConfig.devToolsAiAssistanceV2?.enabled) {
868
- this.#updateWalkthroughResponsiveness();
869
- }
784
+ this.#updateWalkthroughResponsiveness();
870
785
  }
871
786
 
872
787
  #updateWalkthroughResponsiveness(): void {
@@ -1144,6 +1059,8 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1144
1059
  createStorageContext(UI.Context.Context.instance().flavor(AiAssistanceModel.StorageItem.StorageItem));
1145
1060
  this.#updateConversationState(this.#conversation);
1146
1061
 
1062
+ AiAssistanceModel.AiHistoryStorage.AiHistoryStorage.instance().addEventListener(
1063
+ AiAssistanceModel.AiHistoryStorage.Events.HISTORY_DELETED, this.#onHistoryDeleted, this);
1147
1064
  this.#aiAssistanceEnabledSetting?.addChangeListener(this.requestUpdate, this);
1148
1065
  Host.AidaClient.HostConfigTracker.instance().addEventListener(
1149
1066
  Host.AidaClient.Events.AIDA_AVAILABILITY_CHANGED, this.#handleAidaAvailabilityChange);
@@ -1188,6 +1105,8 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1188
1105
 
1189
1106
  override willHide(): void {
1190
1107
  super.willHide();
1108
+ AiAssistanceModel.AiHistoryStorage.AiHistoryStorage.instance().removeEventListener(
1109
+ AiAssistanceModel.AiHistoryStorage.Events.HISTORY_DELETED, this.#onHistoryDeleted, this);
1191
1110
  this.#aiAssistanceEnabledSetting?.removeChangeListener(this.requestUpdate, this);
1192
1111
  Host.AidaClient.HostConfigTracker.instance().removeEventListener(
1193
1112
  Host.AidaClient.Events.AIDA_AVAILABILITY_CHANGED, this.#handleAidaAvailabilityChange);
@@ -1271,12 +1190,12 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1271
1190
  };
1272
1191
 
1273
1192
  #handleNetworkRequestFlavorChange =
1274
- (ev: Common.EventTarget.EventTargetEvent<SDK.NetworkRequest.NetworkRequest>): void => {
1193
+ (ev: Common.EventTarget.EventTargetEvent<SDK.NetworkRequest.NetworkRequest|null>): void => {
1275
1194
  if (this.#selectedRequest?.getItem() === ev.data) {
1276
1195
  return;
1277
1196
  }
1278
1197
 
1279
- if (Boolean(ev.data)) {
1198
+ if (ev.data) {
1280
1199
  const calculator = NetworkPanel.NetworkPanel.NetworkPanel.instance().networkLogView.timeCalculator();
1281
1200
  this.#selectedRequest = new AiAssistanceModel.RequestContext.RequestContext(ev.data, calculator);
1282
1201
  } else {
@@ -1379,14 +1298,14 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1379
1298
  return i18nString(UIStrings.followTheSteps);
1380
1299
  }
1381
1300
 
1382
- if (Root.Runtime.hostConfig.devToolsAiV2Architecture?.enabled) {
1383
- return lockedString(UIStringsNotTranslate.inputPlaceholderForV2);
1384
- }
1385
-
1386
1301
  if (this.#conversation && this.#conversation.isBlockedByOrigin) {
1387
1302
  return lockedString(UIStringsNotTranslate.crossOriginError);
1388
1303
  }
1389
1304
 
1305
+ if (Root.Runtime.hostConfig.devToolsAiV2Architecture?.enabled) {
1306
+ return lockedString(UIStringsNotTranslate.inputPlaceholderForV2);
1307
+ }
1308
+
1390
1309
  switch (this.#conversation.type) {
1391
1310
  case AiAssistanceModel.AiHistoryStorage.ConversationType.STYLING:
1392
1311
  return this.#conversation.selectedContext ?
@@ -1434,51 +1353,10 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1434
1353
  const loggingEnabled = Root.Runtime.hostConfig.aidaAvailability?.enterprisePolicyValue !==
1435
1354
  Root.Runtime.GenAiEnterprisePolicyValue.ALLOW_WITHOUT_LOGGING;
1436
1355
 
1437
- if (Root.Runtime.hostConfig.devToolsAiAssistanceV2?.enabled) {
1438
- if (loggingEnabled) {
1439
- return lockedString(UIStringsNotTranslate.inputDisclaimerV2);
1440
- }
1441
- return lockedString(UIStringsNotTranslate.inputDisclaimerEnterpriseNoLoggingV2);
1442
- }
1443
-
1444
- switch (this.#conversation.type) {
1445
- case AiAssistanceModel.AiHistoryStorage.ConversationType.STYLING:
1446
- if (loggingEnabled) {
1447
- return lockedString(UIStringsNotTranslate.inputDisclaimerForStyling);
1448
- }
1449
- return lockedString(UIStringsNotTranslate.inputDisclaimerForStylingEnterpriseNoLogging);
1450
- case AiAssistanceModel.AiHistoryStorage.ConversationType.FILE:
1451
- if (loggingEnabled) {
1452
- return lockedString(UIStringsNotTranslate.inputDisclaimerForFile);
1453
- }
1454
- return lockedString(UIStringsNotTranslate.inputDisclaimerForFileEnterpriseNoLogging);
1455
- case AiAssistanceModel.AiHistoryStorage.ConversationType.NETWORK:
1456
- if (loggingEnabled) {
1457
- return lockedString(UIStringsNotTranslate.inputDisclaimerForNetwork);
1458
- }
1459
- return lockedString(UIStringsNotTranslate.inputDisclaimerForNetworkEnterpriseNoLogging);
1460
-
1461
- // It is deliberate that both Performance agents use the same disclaimer
1462
- // text and this has been approved by Privacy.
1463
- case AiAssistanceModel.AiHistoryStorage.ConversationType.PERFORMANCE:
1464
- if (loggingEnabled) {
1465
- return lockedString(UIStringsNotTranslate.inputDisclaimerForPerformance);
1466
- }
1467
- return lockedString(UIStringsNotTranslate.inputDisclaimerForPerformanceEnterpriseNoLogging);
1468
-
1469
- case AiAssistanceModel.AiHistoryStorage.ConversationType.ACCESSIBILITY:
1470
- if (loggingEnabled) {
1471
- return lockedString(UIStringsNotTranslate.inputDisclaimerForAccessibility);
1472
- }
1473
- return lockedString(UIStringsNotTranslate.inputDisclaimerForAccessibilityEnterpriseNoLogging);
1474
-
1475
- case AiAssistanceModel.AiHistoryStorage.ConversationType.STORAGE:
1476
- case AiAssistanceModel.AiHistoryStorage.ConversationType.NONE:
1477
- if (loggingEnabled) {
1478
- return lockedString(UIStringsNotTranslate.inputDisclaimerForNoContext);
1479
- }
1480
- return lockedString(UIStringsNotTranslate.inputDisclaimerForNoContextEnterpriseNoLogging);
1356
+ if (loggingEnabled) {
1357
+ return lockedString(UIStringsNotTranslate.inputDisclaimer);
1481
1358
  }
1359
+ return lockedString(UIStringsNotTranslate.inputDisclaimerEnterpriseNoLogging);
1482
1360
  }
1483
1361
 
1484
1362
  #handleFeedbackSubmit(rpcId: Host.AidaClient.RpcGlobalId, rating: Host.AidaClient.Rating, feedback?: string): void {
@@ -1713,6 +1591,7 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1713
1591
  }
1714
1592
 
1715
1593
  #handleNewChatRequest(): void {
1594
+ this.#textInputValue = '';
1716
1595
  this.#updateConversationState();
1717
1596
  this.#resetWalkthrough();
1718
1597
  UI.ARIAUtils.LiveAnnouncer.alert(i18nString(UIStrings.newChatCreated));
@@ -2000,7 +1879,7 @@ export class AiAssistancePanel extends UI.Panel.Panel {
2000
1879
  systemMessage.parts.push(newPart);
2001
1880
  }
2002
1881
 
2003
- if (data.widgets && Root.Runtime.hostConfig.devToolsAiAssistanceV2?.enabled) {
1882
+ if (data.widgets) {
2004
1883
  systemMessage.parts.push({
2005
1884
  type: 'widget',
2006
1885
  widgets: data.widgets,
@@ -158,6 +158,7 @@ export interface ViewInput {
158
158
  imageInput?: ImageInputData;
159
159
  uploadImageInputEnabled: boolean;
160
160
  isReadOnly: boolean;
161
+ textInputValue: string;
161
162
  textAreaRef: Lit.Directives.Ref<HTMLTextAreaElement>;
162
163
 
163
164
  onContextClick: () => void;
@@ -302,6 +303,7 @@ export const DEFAULT_VIEW = (input: ViewInput, _output: ViewOutput, target: HTML
302
303
  .disabled=${input.isTextInputDisabled}
303
304
  wrap="hard"
304
305
  maxlength="10000"
306
+ .value=${input.textInputValue}
305
307
  @keydown=${input.onTextAreaKeyDown}
306
308
  @paste=${input.onImagePaste}
307
309
  @dragover=${input.onImageDragOver}
@@ -523,6 +525,7 @@ export class ChatInput extends UI.Widget.Widget implements SDK.TargetManager.Obs
523
525
  multimodalInputEnabled = false;
524
526
  uploadImageInputEnabled = false;
525
527
  isReadOnly = false;
528
+ textInputValue = '';
526
529
 
527
530
  #textAreaRef = createRef<HTMLTextAreaElement>();
528
531
  #imageInput?: ImageInputData;
@@ -542,21 +545,30 @@ export class ChatInput extends UI.Widget.Widget implements SDK.TargetManager.Obs
542
545
  setInputValue(text: string): void {
543
546
  if (this.#textAreaRef.value) {
544
547
  const maxLength = this.#textAreaRef.value.maxLength;
545
- const truncatedText = (maxLength >= 0) ? text.substring(0, maxLength) : text;
548
+ const truncatedText = maxLength >= 0 ? text.substring(0, maxLength) : text;
546
549
  this.#textAreaRef.value.value = truncatedText;
547
550
  // Place the cursor at the end of the new value.
548
- this.#textAreaRef.value.setSelectionRange(truncatedText.length, truncatedText.length);
551
+ this.#textAreaRef.value.setSelectionRange(
552
+ truncatedText.length,
553
+ truncatedText.length,
554
+ );
555
+ this.textInputValue = truncatedText;
556
+ this.onTextChange(truncatedText);
549
557
  }
550
558
  this.performUpdate();
551
559
  }
552
560
 
553
561
  #isTextInputEmpty(): boolean {
554
- return !this.#textAreaRef.value?.value?.trim();
562
+ const text = this.#textAreaRef?.value?.value ?? this.textInputValue;
563
+ return !text.trim();
555
564
  }
556
565
 
557
- onTextSubmit:
558
- (text: string, imageInput?: Host.AidaClient.Part,
559
- multimodalInputType?: AiAssistanceModel.AiAgent.MultimodalInputType) => void = () => {};
566
+ onTextSubmit: (
567
+ text: string,
568
+ imageInput?: Host.AidaClient.Part,
569
+ multimodalInputType?: AiAssistanceModel.AiAgent.MultimodalInputType,
570
+ ) => void = () => {};
571
+ onTextChange: (text: string) => void = () => {};
560
572
  onContextClick = (): void => {};
561
573
  onInspectElementClick = (): void => {};
562
574
  onCancelClick = (): void => {};
@@ -751,12 +763,15 @@ export class ChatInput extends UI.Widget.Widget implements SDK.TargetManager.Obs
751
763
  imageInput: this.#imageInput,
752
764
  uploadImageInputEnabled: this.uploadImageInputEnabled,
753
765
  isReadOnly: this.isReadOnly,
766
+ textInputValue: this.textInputValue,
754
767
  textAreaRef: this.#textAreaRef,
755
768
  onContextClick: this.onContextClick,
756
769
  onInspectElementClick: this.onInspectElementClick,
757
770
  onImagePaste: this.#handleImagePaste,
758
771
  onNewConversation: this.onNewConversation,
759
- onTextInputChange: () => {
772
+ onTextInputChange: (text: string) => {
773
+ this.textInputValue = text;
774
+ this.onTextChange(text);
760
775
  this.requestUpdate();
761
776
  },
762
777
  onTakeScreenshot: this.#handleTakeScreenshot.bind(this),
@@ -770,7 +785,9 @@ export class ChatInput extends UI.Widget.Widget implements SDK.TargetManager.Obs
770
785
  onContextRemoved: this.onContextRemoved,
771
786
  onContextAdd: this.onContextAdd,
772
787
  },
773
- undefined, this.contentElement);
788
+ undefined,
789
+ this.contentElement,
790
+ );
774
791
  }
775
792
 
776
793
  focusTextInput(): void {