diff --git a/frontend/src/lib/shared/discussion/MentionDropdown.svelte b/frontend/src/lib/shared/discussion/MentionDropdown.svelte index 5e6c2157..921d9e6f 100644 --- a/frontend/src/lib/shared/discussion/MentionDropdown.svelte +++ b/frontend/src/lib/shared/discussion/MentionDropdown.svelte @@ -188,7 +188,7 @@ function selectItem(item: Person) { e.preventDefault()} > diff --git a/frontend/src/lib/shared/discussion/MentionDropdown.svelte.spec.ts b/frontend/src/lib/shared/discussion/MentionDropdown.svelte.spec.ts index cf2205b8..71a7ad61 100644 --- a/frontend/src/lib/shared/discussion/MentionDropdown.svelte.spec.ts +++ b/frontend/src/lib/shared/discussion/MentionDropdown.svelte.spec.ts @@ -77,6 +77,19 @@ describe('MentionDropdown — search input', () => { await expect.element(page.getByText(m.person_mention_search_prompt())).not.toBeInTheDocument(); }); + it('"create new person" link has rel="noopener noreferrer" (CWE-116)', async () => { + render(MentionDropdown, { + model: makeModel([]), + editorQuery: 'unknown', // non-empty so the empty-state link renders + onSearch: () => {} + }); + + const link = document.querySelector('a[href="/persons/new"]') as HTMLAnchorElement; + expect(link).not.toBeNull(); + expect(link.getAttribute('rel')).toContain('noopener'); + expect(link.getAttribute('rel')).toContain('noreferrer'); + }); + it('search input wrapper meets the 44px touch target (WCAG 2.2 AA)', async () => { render(MentionDropdown, { model: makeModel(),