Skip to content

Commit 34ae6aa

Browse files
fix: make noreferrer warning less zealous (#8230)
Co-authored-by: Yuichiro Yamashita <[email protected]>
1 parent eb90a15 commit 34ae6aa

File tree

6 files changed

+46
-8
lines changed

6 files changed

+46
-8
lines changed

src/compiler/compile/nodes/Element.ts

+9-8
Original file line numberDiff line numberDiff line change
@@ -621,22 +621,23 @@ export default class Element extends Node {
621621
const name_attribute = attribute_map.get('name');
622622
const target_attribute = attribute_map.get('target');
623623

624-
if (target_attribute && target_attribute.get_static_value() === '_blank' && href_attribute) {
624+
// links with target="_blank" should have noopener or noreferrer: https://developer.chrome.com/docs/lighthouse/best-practices/external-anchors-use-rel-noopener/
625+
// modern browsers add noopener by default, so we only need to check legacy browsers
626+
// legacy browsers don't support noopener so we only check for noreferrer there
627+
if (component.compile_options.legacy && target_attribute && target_attribute.get_static_value() === '_blank' && href_attribute) {
625628
const href_static_value = href_attribute.get_static_value() ? href_attribute.get_static_value().toLowerCase() : null;
626629

627630
if (href_static_value === null || href_static_value.match(/^(https?:)?\/\//i)) {
628631
const rel = attribute_map.get('rel');
629632
if (rel == null || rel.is_static) {
630633
const rel_values = rel ? rel.get_static_value().split(regex_any_repeated_whitespaces) : [];
631-
const expected_values = ['noreferrer'];
632-
expected_values.forEach(expected_value => {
633-
if (!rel || rel && rel_values.indexOf(expected_value) < 0) {
634+
if (!rel || !rel_values.includes('noreferrer')) {
634635
component.warn(this, {
635-
code: `security-anchor-rel-${expected_value}`,
636-
message: `Security: Anchor with "target=_blank" should have rel attribute containing the value "${expected_value}"`
636+
code: 'security-anchor-rel-noreferrer',
637+
message:
638+
'Security: Anchor with "target=_blank" should have rel attribute containing the value "noreferrer"'
637639
});
638-
}
639-
});
640+
}
640641
}
641642
}
642643
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export default {
2+
legacy: true
3+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<a href="https://svelte.dev" target="_blank">svelte website (invalid)</a>
2+
<a href="https://svelte.dev" target="_blank" rel="">svelte website (invalid)</a>
3+
<a href="https://svelte.dev" target="_blank" rel="noopener">svelte website (invalid)</a>
4+
<a href={'https://svelte.dev'} target="_blank">svelte website (invalid)</a>
5+
<a href={'https://svelte.dev'} target="_blank" rel="">svelte website (invalid)</a>
6+
<a href={'https://svelte.dev'} target="_blank" rel="noopener">svelte website (invalid)</a>
7+
<a href="//svelte.dev" target="_blank">svelte website (invalid)</a>
8+
<a href="//svelte.dev" target="_blank" rel="">svelte website (invalid)</a>
9+
<a href="//svelte.dev" target="_blank" rel="noopener">svelte website (invalid)</a>
10+
<a href="http://svelte.dev" target="_blank">svelte website (invalid)</a>
11+
<a href="http://svelte.dev" target="_blank" rel="">svelte website (invalid)</a>
12+
<a href="http://svelte.dev" target="_blank" rel="noopener">svelte website (invalid)</a>
13+
<a href="HTTP://svelte.dev" target="_blank">svelte website (invalid)</a>
14+
<a href="HTTP://svelte.dev" target="_blank" rel="">svelte website (invalid)</a>
15+
<a href="HTTP://svelte.dev" target="_blank" rel="noopener">svelte website (invalid)</a>
16+
<a href={'HTTPS://svelte.dev'} target="_blank">svelte website (invalid)</a>
17+
<a href={'HTTPS://svelte.dev'} target="_blank" rel="">svelte website (invalid)</a>
18+
<a href={'HTTPS://svelte.dev'} target="_blank" rel="noopener">svelte website (invalid)</a>
19+
<a href="same-host" target="_blank">Same host (valid)</a>
20+
<a href="same-host" target="_blank" rel="">Same host (valid)</a>
21+
<a href="same-host" target="_blank" rel="noopener">Same host (valid)</a>
22+
<a href="http://svelte.dev" target="_blank" rel="noreferrer">svelte website (valid)</a>
23+
<a href="http://svelte.dev" target="_blank" rel="noreferrer noopener">svelte website (valid)</a>
24+
<a href="HTTP://svelte.dev" target="_blank" rel="noreferrer">svelte website (valid)</a>
25+
<a href="HTTP://svelte.dev" target="_blank" rel="noreferrer noopener">svelte website (valid)</a>
26+
<a href="https://svelte.dev" target="_blank" rel="noreferrer">svelte website (valid)</a>
27+
<a href="https://svelte.dev" target="_blank" rel="noreferrer noopener">svelte website (valid)</a>
28+
<a href="HTTPS://svelte.dev" target="_blank" rel="noreferrer">svelte website (valid)</a>
29+
<a href="HTTPS://svelte.dev" target="_blank" rel="noreferrer noopener">svelte website (valid)</a>
30+
<a href="//svelte.dev" target="_blank" rel="noreferrer">svelte website (valid)</a>
31+
<a href="//svelte.dev" target="_blank" rel="noreferrer noopener">svelte website (valid)</a>
32+
<!-- dynamic rel value should not warn-->
33+
<a href="//svelte.dev" target="_blank" rel={`${Math.random()}`}>svelte website (valid)</a>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[]

0 commit comments

Comments
 (0)