jsx-no-target-blank.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /**
  2. * @fileoverview Forbid target='_blank' attribute
  3. * @author Kevin Miller
  4. */
  5. 'use strict';
  6. // ------------------------------------------------------------------------------
  7. // Requirements
  8. // ------------------------------------------------------------------------------
  9. const rule = require('../../../lib/rules/jsx-no-target-blank');
  10. const RuleTester = require('eslint').RuleTester;
  11. const parserOptions = {
  12. ecmaVersion: 2018,
  13. sourceType: 'module',
  14. ecmaFeatures: {
  15. jsx: true
  16. }
  17. };
  18. // ------------------------------------------------------------------------------
  19. // Tests
  20. // ------------------------------------------------------------------------------
  21. const ruleTester = new RuleTester({parserOptions});
  22. const defaultErrors = [{
  23. message: 'Using target="_blank" without rel="noopener noreferrer" is a security risk:' +
  24. ' see https://mathiasbynens.github.io/rel-noopener'
  25. }];
  26. ruleTester.run('jsx-no-target-blank', rule, {
  27. valid: [
  28. {code: '<a href="foobar"></a>'},
  29. {code: '<a randomTag></a>'},
  30. {code: '<a href="foobar" target="_blank" rel="noopener noreferrer"></a>'},
  31. {code: '<a target="_blank" {...spreadProps} rel="noopener noreferrer"></a>'},
  32. {code: '<a {...spreadProps} target="_blank" rel="noopener noreferrer" href="http://example.com">s</a>'},
  33. {code: '<a target="_blank" rel="noopener noreferrer" {...spreadProps}></a>'},
  34. {code: '<p target="_blank"></p>'},
  35. {code: '<a href="foobar" target="_BLANK" rel="NOOPENER noreferrer"></a>'},
  36. {code: '<a target="_blank" rel={relValue}></a>'},
  37. {code: '<a target={targetValue} rel="noopener noreferrer"></a>'},
  38. {code: '<a target={targetValue} href="relative/path"></a>'},
  39. {code: '<a target={targetValue} href="/absolute/path"></a>'},
  40. {
  41. code: '<a target="_blank" href={ dynamicLink }></a>',
  42. options: [{enforceDynamicLinks: 'never'}]
  43. }
  44. ],
  45. invalid: [{
  46. code: '<a target="_blank" href="http://example.com"></a>',
  47. errors: defaultErrors
  48. }, {
  49. code: '<a target="_blank" rel="" href="http://example.com"></a>',
  50. errors: defaultErrors
  51. }, {
  52. code: '<a target="_blank" rel="noopenernoreferrer" href="http://example.com"></a>',
  53. errors: defaultErrors
  54. }, {
  55. code: '<a target="_BLANK" href="http://example.com"></a>',
  56. errors: defaultErrors
  57. }, {
  58. code: '<a target="_blank" href="//example.com"></a>',
  59. errors: defaultErrors
  60. }, {
  61. code: '<a target="_blank" href="//example.com" rel={true}></a>',
  62. errors: defaultErrors
  63. }, {
  64. code: '<a target="_blank" href="//example.com" rel={3}></a>',
  65. errors: defaultErrors
  66. }, {
  67. code: '<a target="_blank" href="//example.com" rel={null}></a>',
  68. errors: defaultErrors
  69. }, {
  70. code: '<a target="_blank" href="//example.com" rel></a>',
  71. errors: defaultErrors
  72. }, {
  73. code: '<a target="_blank" href={ dynamicLink }></a>',
  74. errors: defaultErrors
  75. }, {
  76. code: '<a target="_blank" href={ dynamicLink }></a>',
  77. options: [{enforceDynamicLinks: 'always'}],
  78. errors: defaultErrors
  79. }]
  80. });