Skip to content

Commit a821a4b

Browse files
author
Your Name
committed
fix(link): isolate per-link target overrides
1 parent d823dbe commit a821a4b

3 files changed

Lines changed: 19 additions & 6 deletions

File tree

‎src/core/render/compiler.js‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ export class Compiler {
160160

161161
_initRenderer() {
162162
const renderer = new marked.Renderer();
163-
const { linkTarget, linkRel, router, contentBase } = this;
163+
const { linkTarget, router, contentBase } = this;
164164
// Supports mermaid
165165
const origin = {};
166166

@@ -179,7 +179,6 @@ export class Compiler {
179179
renderer,
180180
router,
181181
linkTarget,
182-
linkRel,
183182
compiler: this,
184183
});
185184
origin.paragraph = paragraphCompiler({ renderer });

‎src/core/render/compiler/link.js‎

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ import { isAbsolutePath } from '../../router/util.js';
44
export const linkCompiler = ({
55
renderer,
66
router,
7-
linkTarget,
8-
linkRel,
7+
linkTarget: defaultLinkTarget,
98
compiler,
109
}) =>
1110
(renderer.link = function ({ href, title = '', tokens }) {
@@ -16,8 +15,8 @@ export const linkCompiler = ({
1615
const isNotCompilable = compiler._matchNotCompileLink(href);
1716
const isMailto = href.startsWith('mailto:');
1817

19-
linkTarget = config.target || linkTarget;
20-
linkRel =
18+
const linkTarget = config.target || defaultLinkTarget;
19+
const linkRel =
2120
linkTarget === '_blank'
2221
? compiler.config.externalLinkRel || 'noopener'
2322
: '';

‎test/integration/render.test.js‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,21 @@ Text</p></div>"
352352
);
353353
});
354354

355+
test.each([
356+
'https://example.org/first',
357+
'/first',
358+
'mailto:first@example.org',
359+
])('does not leak a target override from %s into later links', href => {
360+
const container = document.createElement('div');
361+
container.innerHTML = window.marked(
362+
`[First](${href} ':target=_self')\n\n[Second](https://example.org/second)`,
363+
);
364+
365+
const secondLink = container.querySelectorAll('a')[1];
366+
expect(secondLink.target).toBe('_blank');
367+
expect(secondLink.rel).toBe('noopener');
368+
});
369+
355370
test('target for relative path', async function () {
356371
const output = window.marked("[alt text](/url ':target=_blank')");
357372

0 commit comments

Comments
 (0)