Skip to content

Commit e2b9072

Browse files
Kateryna Prokopenkodevtools-frontend-scoped@luci-project-accounts.iam.gserviceaccount.com
authored andcommitted
Create new text area on copy to coding agent tab switch
Bug: 502891600 Change-Id: Ie24f3ccd2543c96fcdcbf9c90f23568e74958d16 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/7758780 Auto-Submit: Kateryna Prokopenko <kprokopenko@chromium.org> Reviewed-by: Jack Franklin <jacktfranklin@chromium.org> Commit-Queue: Kateryna Prokopenko <kprokopenko@chromium.org>
1 parent 9ae74b6 commit e2b9072

File tree

2 files changed

+46
-4
lines changed

2 files changed

+46
-4
lines changed

front_end/panels/ai_assistance/components/ExportForAgentsDialog.test.ts

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ describe('ExportForAgentsDialog', () => {
5959
assert.strictEqual(promptRadioButton.getAttribute('aria-label'), 'As prompt');
6060
assert.strictEqual(markdownRadioButton.getAttribute('aria-label'), 'As markdown');
6161
assert.strictEqual(textarea.value, promptText);
62+
assert.isTrue(textarea.classList.contains('prompt'));
6263
assert.strictEqual(primaryButton.textContent?.trim(), 'Copy to clipboard');
6364
assert.strictEqual(primaryButton?.getAttribute('accessibleLabel'), 'Copy to clipboard');
6465
});
@@ -135,8 +136,11 @@ describe('ExportForAgentsDialog', () => {
135136
// spinner should be hidden, textarea should show markdown text.
136137
assert.isNull(
137138
component.contentElement.querySelector('devtools-spinner'), 'Spinner should be hidden in markdown view');
139+
140+
const textareaAfterSwitch =
141+
querySelectorErrorOnMissing<HTMLTextAreaElement>(component.contentElement, 'textarea');
138142
assert.strictEqual(
139-
textarea.value, markdownText,
143+
textareaAfterSwitch.value, markdownText,
140144
'Textarea should show markdown text in markdown view even if prompt is still loading');
141145

142146
// Clean up.
@@ -187,7 +191,6 @@ describe('ExportForAgentsDialog', () => {
187191

188192
const markdownRadioButton =
189193
querySelectorErrorOnMissing<HTMLInputElement>(component.contentElement, 'input[value="conversation"]');
190-
const textarea = querySelectorErrorOnMissing<HTMLTextAreaElement>(component.contentElement, 'textarea');
191194
const primaryButton =
192195
querySelectorErrorOnMissing<Buttons.Button.Button>(component.contentElement, 'devtools-button');
193196

@@ -196,7 +199,9 @@ describe('ExportForAgentsDialog', () => {
196199
await component.updateComplete;
197200

198201
assert.isTrue(markdownRadioButton?.checked);
199-
assert.strictEqual(textarea?.value, markdownText);
202+
const textareaAfterSwitch = querySelectorErrorOnMissing<HTMLTextAreaElement>(component.contentElement, 'textarea');
203+
assert.strictEqual(textareaAfterSwitch.value, markdownText);
204+
assert.isTrue(textareaAfterSwitch.classList.contains('conversation'));
200205
assert.strictEqual(primaryButton?.textContent?.trim(), 'Save as…');
201206
assert.strictEqual(primaryButton.getAttribute('accessibleLabel'), 'Save as…');
202207
assert.strictEqual(primaryButton.jslogContext, 'ai-export-for-agents.save-as-markdown');
@@ -292,4 +297,38 @@ describe('ExportForAgentsDialog', () => {
292297
assert.isTrue(markdownRadioButton2.checked);
293298
assert.isFalse(promptRadioButton2.checked);
294299
});
300+
301+
it('resets scroll position of textarea when switching tabs', async () => {
302+
const component = new AiAssistance.ExportForAgentsDialog.ExportForAgentsDialog({
303+
dialog,
304+
promptText,
305+
markdownText,
306+
onConversationSaveAs: noop,
307+
});
308+
renderElementIntoDOM(component);
309+
await component.updateComplete;
310+
311+
const markdownRadioButton =
312+
querySelectorErrorOnMissing<HTMLInputElement>(component.contentElement, 'input[value="conversation"]');
313+
const promptRadioButton =
314+
querySelectorErrorOnMissing<HTMLInputElement>(component.contentElement, 'input[value="prompt"]');
315+
316+
const textarea1 = querySelectorErrorOnMissing<HTMLTextAreaElement>(component.contentElement, 'textarea');
317+
textarea1.scrollTop = 100;
318+
319+
markdownRadioButton.click();
320+
await component.updateComplete;
321+
322+
const textarea2 = querySelectorErrorOnMissing<HTMLTextAreaElement>(component.contentElement, 'textarea');
323+
assert.notStrictEqual(textarea1, textarea2, 'Textarea should be recreated on tab switch');
324+
assert.strictEqual(textarea2.scrollTop, 0, 'Scroll position should be reset');
325+
326+
textarea2.scrollTop = 50;
327+
promptRadioButton.click();
328+
await component.updateComplete;
329+
330+
const textarea3 = querySelectorErrorOnMissing<HTMLTextAreaElement>(component.contentElement, 'textarea');
331+
assert.notStrictEqual(textarea2, textarea3, 'Textarea should be recreated on tab switch back');
332+
assert.strictEqual(textarea3.scrollTop, 0, 'Scroll position should be reset');
333+
});
295334
});

front_end/panels/ai_assistance/components/ExportForAgentsDialog.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,10 @@ export const DEFAULT_VIEW: View = (input, _output, target): void => {
123123
${i18nString(UIStrings.generatingSummary)}
124124
</span>
125125
` : Lit.nothing}
126-
<textarea readonly .value=${isPrompt && input.state.isPromptLoading ? '' : exportText}></textarea>
126+
${isPrompt ?
127+
html`<textarea class="prompt" readonly .value=${input.state.isPromptLoading ? '' : exportText}></textarea>` :
128+
html`<textarea class="conversation" readonly .value=${exportText}></textarea>`
129+
}
127130
</main>
128131
<div class="disclaimer">${i18nString(UIStrings.disclaimer)}</div>
129132
<footer>

0 commit comments

Comments
 (0)