Skip to content

Commit aa670df

Browse files
committed
[Fix] jsx-no-target-blank: improve error messages
Show different error messages depending on whether referrer is allowed; clarify about `noreferrer` only being necessary in older browsers. Closes #3044.
1 parent 8785c16 commit aa670df

File tree

2 files changed

+8
-5
lines changed

2 files changed

+8
-5
lines changed

lib/rules/jsx-no-target-blank.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,8 @@ function hasSecureRel(node, allowReferrer, warnOnSpreadAttributes, spreadAttribu
9797
}
9898

9999
const messages = {
100-
noTargetBlank: 'Using target="_blank" without rel="noreferrer" is a security risk: see https://html.spec.whatwg.org/multipage/links.html#link-type-noopener'
100+
noTargetBlankWithoutNoreferrer: 'Using target="_blank" without rel="noreferrer" is a security risk in older browsers: see https://mathiasbynens.github.io/rel-noopener/#recommendations',
101+
noTargetBlankWithoutNoopener: 'Using target="_blank" without rel="noopener" is a security risk: see https://mathiasbynens.github.io/rel-noopener/#recommendations'
101102
};
102103

103104
module.exports = {
@@ -173,7 +174,8 @@ module.exports = {
173174
const hasDangerousLink = hasExternalLink(node, linkAttribute, warnOnSpreadAttributes, spreadAttributeIndex)
174175
|| (enforceDynamicLinks === 'always' && hasDynamicLink(node, linkAttribute));
175176
if (hasDangerousLink && !hasSecureRel(node, allowReferrer, warnOnSpreadAttributes, spreadAttributeIndex)) {
176-
report(context, messages.noTargetBlank, 'noTargetBlank', {
177+
const messageId = allowReferrer ? 'noTargetBlankWithoutNoopener' : 'noTargetBlankWithoutNoreferrer';
178+
report(context, messages[messageId], messageId, {
177179
node,
178180
fix(fixer) {
179181
// eslint 5 uses `node.attributes`; eslint 6+ uses `node.parent.attributes`
@@ -244,7 +246,8 @@ module.exports = {
244246
hasExternalLink(node, formAttribute)
245247
|| (enforceDynamicLinks === 'always' && hasDynamicLink(node, formAttribute))
246248
) {
247-
report(context, messages.noTargetBlank, 'noTargetBlank', {
249+
const messageId = allowReferrer ? 'noTargetBlankWithoutNoopener' : 'noTargetBlankWithoutNoreferrer';
250+
report(context, messages[messageId], messageId, {
248251
node
249252
});
250253
}

tests/lib/rules/jsx-no-target-blank.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ const parserOptions = {
2525
// ------------------------------------------------------------------------------
2626

2727
const ruleTester = new RuleTester({parserOptions});
28-
const defaultErrors = [{messageId: 'noTargetBlank'}];
28+
const defaultErrors = [{messageId: 'noTargetBlankWithoutNoreferrer'}];
2929

3030
ruleTester.run('jsx-no-target-blank', rule, {
3131
valid: [
@@ -249,7 +249,7 @@ ruleTester.run('jsx-no-target-blank', rule, {
249249
code: '<a href="http://example.com/20" target="_blank"></a>',
250250
output: '<a href="http://example.com/20" target="_blank" rel="noreferrer"></a>',
251251
options: [{allowReferrer: true}],
252-
errors: defaultErrors
252+
errors: [{messageId: 'noTargetBlankWithoutNoopener'}]
253253
},
254254
{
255255
code: '<a target="_blank" href={ dynamicLink }></a>',

0 commit comments

Comments
 (0)