loading up the forgejo repo on tangled to test page performance
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request 'Improve textarea paste (part of gitea#31948)' (#5269) from algernon/forgejo:gitea/port/31948-partial into forgejo

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/5269
Reviewed-by: Otto <otto@codeberg.org>
Reviewed-by: Michael Kriese <michael.kriese@gmx.de>

Otto c98996f0 acfa3e31

+64 -32
-31
tests/e2e/edit-comment.test.e2e.js
··· 1 - // @ts-check 2 - import {expect} from '@playwright/test'; 3 - import {test, login_user, load_logged_in_context} from './utils_e2e.js'; 4 - 5 - test.beforeAll(async ({browser}, workerInfo) => { 6 - await login_user(browser, workerInfo, 'user2'); 7 - }); 8 - 9 - test('Always focus edit tab first on edit', async ({browser}, workerInfo) => { 10 - const context = await load_logged_in_context(browser, workerInfo, 'user2'); 11 - const page = await context.newPage(); 12 - const response = await page.goto('/user2/repo1/issues/1'); 13 - await expect(response?.status()).toBe(200); 14 - 15 - // Switch to preview tab and save 16 - await page.click('#issue-1 .comment-container .context-menu'); 17 - await page.click('#issue-1 .comment-container .menu>.edit-content'); 18 - await page.locator('#issue-1 .comment-container a[data-tab-for=markdown-previewer]').click(); 19 - await page.click('#issue-1 .comment-container .save'); 20 - 21 - await page.waitForLoadState('networkidle'); 22 - 23 - // Edit again and assert that edit tab should be active (and not preview tab) 24 - await page.click('#issue-1 .comment-container .context-menu'); 25 - await page.click('#issue-1 .comment-container .menu>.edit-content'); 26 - const editTab = page.locator('#issue-1 .comment-container a[data-tab-for=markdown-writer]'); 27 - const previewTab = page.locator('#issue-1 .comment-container a[data-tab-for=markdown-previewer]'); 28 - 29 - await expect(editTab).toHaveClass(/active/); 30 - await expect(previewTab).not.toHaveClass(/active/); 31 - });
+63
tests/e2e/issue-comment.test.e2e.js
··· 1 + // @ts-check 2 + import {expect} from '@playwright/test'; 3 + import {test, login_user, login} from './utils_e2e.js'; 4 + 5 + test.beforeAll(async ({browser}, workerInfo) => { 6 + await login_user(browser, workerInfo, 'user2'); 7 + }); 8 + 9 + test('Hyperlink paste behaviour', async ({browser}, workerInfo) => { 10 + test.skip(['Mobile Safari', 'Mobile Chrome', 'webkit'].includes(workerInfo.project.name), 'Mobile clients seem to have very weird behaviour with this test, which I cannot confirm with real usage'); 11 + const page = await login({browser}, workerInfo); 12 + await page.goto('/user2/repo1/issues/new'); 13 + await page.locator('textarea').click(); 14 + // same URL 15 + await page.locator('textarea').fill('https://codeberg.org/forgejo/forgejo#some-anchor'); 16 + await page.locator('textarea').press('Shift+Home'); 17 + await page.locator('textarea').press('ControlOrMeta+c'); 18 + await page.locator('textarea').press('ControlOrMeta+v'); 19 + await expect(page.locator('textarea')).toHaveValue('https://codeberg.org/forgejo/forgejo#some-anchor'); 20 + // other text 21 + await page.locator('textarea').fill('Some other text'); 22 + await page.locator('textarea').press('ControlOrMeta+a'); 23 + await page.locator('textarea').press('ControlOrMeta+v'); 24 + await expect(page.locator('textarea')).toHaveValue('[Some other text](https://codeberg.org/forgejo/forgejo#some-anchor)'); 25 + // subset of URL 26 + await page.locator('textarea').fill('https://codeberg.org/forgejo/forgejo#some'); 27 + await page.locator('textarea').press('ControlOrMeta+a'); 28 + await page.locator('textarea').press('ControlOrMeta+v'); 29 + await expect(page.locator('textarea')).toHaveValue('https://codeberg.org/forgejo/forgejo#some-anchor'); 30 + // superset of URL 31 + await page.locator('textarea').fill('https://codeberg.org/forgejo/forgejo#some-anchor-on-the-page'); 32 + await page.locator('textarea').press('ControlOrMeta+a'); 33 + await page.locator('textarea').press('ControlOrMeta+v'); 34 + await expect(page.locator('textarea')).toHaveValue('https://codeberg.org/forgejo/forgejo#some-anchor'); 35 + // completely separate URL 36 + await page.locator('textarea').fill('http://example.com'); 37 + await page.locator('textarea').press('ControlOrMeta+a'); 38 + await page.locator('textarea').press('ControlOrMeta+v'); 39 + await expect(page.locator('textarea')).toHaveValue('https://codeberg.org/forgejo/forgejo#some-anchor'); 40 + }); 41 + 42 + test('Always focus edit tab first on edit', async ({browser}, workerInfo) => { 43 + const page = await login({browser}, workerInfo); 44 + const response = await page.goto('/user2/repo1/issues/1'); 45 + await expect(response?.status()).toBe(200); 46 + 47 + // Switch to preview tab and save 48 + await page.click('#issue-1 .comment-container .context-menu'); 49 + await page.click('#issue-1 .comment-container .menu>.edit-content'); 50 + await page.locator('#issue-1 .comment-container a[data-tab-for=markdown-previewer]').click(); 51 + await page.click('#issue-1 .comment-container .save'); 52 + 53 + await page.waitForLoadState('networkidle'); 54 + 55 + // Edit again and assert that edit tab should be active (and not preview tab) 56 + await page.click('#issue-1 .comment-container .context-menu'); 57 + await page.click('#issue-1 .comment-container .menu>.edit-content'); 58 + const editTab = page.locator('#issue-1 .comment-container a[data-tab-for=markdown-writer]'); 59 + const previewTab = page.locator('#issue-1 .comment-container a[data-tab-for=markdown-previewer]'); 60 + 61 + await expect(editTab).toHaveClass(/active/); 62 + await expect(previewTab).not.toHaveClass(/active/); 63 + });
+1 -1
web_src/js/features/comp/Paste.js
··· 116 116 if (_shiftDown) return; 117 117 const selectedText = value.substring(selectionStart, selectionEnd); 118 118 const trimmedText = text.trim(); 119 - if (selectedText && isUrl(trimmedText)) { 119 + if (selectedText && isUrl(trimmedText) && !isUrl(selectedText)) { 120 120 e.stopPropagation(); 121 121 e.preventDefault(); 122 122 replaceTextareaSelection(textarea, `[${selectedText}](${trimmedText})`);