No Referrer

Disable HTTP referer by adding rel="noreferrer". This prevents the destination site from receiving what URL the user came from. Press Command + Shift + F to toggle Referrer Policy.

  1. // ==UserScript==
  2. // @name No Referrer
  3. // @description Disable HTTP referer by adding rel="noreferrer". This prevents the destination site from receiving what URL the user came from. Press Command + Shift + F to toggle Referrer Policy.
  4. // @author Schimon Jehudah, Adv.
  5. // @namespace i2p.schimon.noreferrer
  6. // @homepageURL https://greasyfork.org/en/scripts/465950-no-referrer
  7. // @supportURL https://greasyfork.org/en/scripts/465950-no-referrer/feedback
  8. // @copyright 2023 - 2024, Schimon Jehudah (http://schimon.i2p)
  9. // @license MIT; https://opensource.org/licenses/MIT
  10. // @match file:///*
  11. // @match *://*/*
  12. // @exclude devtools://*
  13. // @version 24.04
  14. // @run-at document-end
  15. // @icon data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjRtbSIgaGVpZ2h0PSI2NG1tIiB2aWV3Qm94PSIwIDAgNjQgNjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHRleHQgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgc3R5bGU9ImZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTkycHg7bGluZS1oZWlnaHQ6MDt0ZXh0LWluZGVudDowO3RleHQtYWxpZ246c3RhcnQ7dGV4dC1kZWNvcmF0aW9uLXN0eWxlOnNvbGlkO3RleHQtZGVjb3JhdGlvbi1jb2xvcjojMDAwO3dyaXRpbmctbW9kZTpsci10YjtkaXJlY3Rpb246bHRyO3RleHQtb3JpZW50YXRpb246bWl4ZWQ7ZG9taW5hbnQtYmFzZWxpbmU6YXV0bztiYXNlbGluZS1zaGlmdDpiYXNlbGluZTt0ZXh0LWFuY2hvcjpzdGFydDtzaGFwZS1wYWRkaW5nOjA7c2hhcGUtbWFyZ2luOjA7aW5saW5lLXNpemU6MDtvcGFjaXR5OjE7ZmlsbDojMDAwO2ZpbGwtb3BhY2l0eToxO3N0cm9rZS13aWR0aDoxLjI3OTgyO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO3N0b3AtY29sb3I6IzAwMDtzdG9wLW9wYWNpdHk6MSIgeD0iMTcuMDA1MjQ1IiB5PSIzMS42NTg0MDUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00LjQzNjg1NjQgNDAuODk0OTQpIHNjYWxlKC4yNjQ1OCkiPjx0c3BhbiB4PSIxNy4wMDUyNDUiIHk9IjMxLjY1ODQwNSIgc3R5bGU9ImZvbnQtc2l6ZToxOTJweCI+8J+kqzwvdHNwYW4+PC90ZXh0Pjwvc3ZnPgo=
  16. // ==/UserScript==
  17.  
  18. var namespace = 'i2p-schimon-noreferrer';
  19. document.addEventListener('keyup', hotkey, false);
  20.  
  21. function hotkey(e) {
  22. // set hotkey Ctrl + Shift + 5
  23. //if (e.ctrlKey && e.shiftKey && e.which == 53) {
  24. // set hotkey Command + Shift + R
  25. //if (e.metaKey && e.shiftKey && e.which == 82) {
  26. // set hotkey Command + Shift + F
  27. if (e.metaKey && e.shiftKey && e.which == 70) {
  28. toggleNoReferrer();
  29. }
  30. }
  31.  
  32. function toggleNoReferrer() {
  33. if (document.querySelector(namespace)) {
  34. appendNoReferrer();
  35. document.querySelector(namespace).remove();
  36. } else {
  37. removeNoReferrer();
  38. warningBar();
  39. }
  40. }
  41.  
  42. function appendNoReferrer() {
  43. let elements = ['area', 'form'];
  44. for (let i = 0; i < elements.length; i++) {
  45. for (const element of document.querySelectorAll(elements[i])) {
  46. element.rel = 'nofollow noopener noreferrer';
  47. }
  48. }
  49. for (const element of document.querySelectorAll('link')) {
  50. element.referrerPolicy = 'no-referrer';
  51. }
  52. // TODO
  53. // Do we need array "elements"?
  54. // Probably not, because we handle 'a[href]' which isn't related to array "elements".
  55. // I think this for loop should not be here
  56. for (let i = 0; i < elements.length; i++) {
  57. for (const element of document.querySelectorAll('a[href]')) {
  58. // TODO CSS Selector to select a[href] which does
  59. // not start with hash, instead of "if" statement
  60. if (!element.href.startsWith(element.baseURI + '#')) {
  61. element.rel = 'nofollow noopener noreferrer';
  62. }
  63. }
  64. }
  65. // Event delegation works and requires JS enabled
  66. document.body.addEventListener ("click", function(e) {
  67. if (e.target && e.target.nodeName == "A" && e.target.href) {
  68. if (!e.target.href.startsWith(e.baseURI + '#') ||
  69. !document.querySelector(namespace)) { // TODO Test
  70. e.target.rel = 'nofollow noopener noreferrer';
  71. }
  72. }
  73. });
  74. }
  75.  
  76. function removeNoReferrer() {
  77. for (const element of document.querySelectorAll('[rel="noreferrer"]')) {
  78. element.removeAttribute('rel');
  79. }
  80. for (const element of document.querySelectorAll('[referrerpolicy="no-referrer"]')) {
  81. element.removeAttribute('referrerpolicy');
  82. }
  83. }
  84.  
  85. function warningBar() {
  86. let bar = document.createElement(namespace);
  87. document.body.append(bar);
  88. bar.innerHTML = '<b>WARNING! Referrer Policy has been <u>temporarily</u> enabled;<!-- br --> Reload page or click <code style="color: navajowhite;background: black;border-radius: 1em;padding: 3px;font-family: monospace;font-size: smaller;">Command</code> + <code style="color: navajowhite;background: black;border-radius: 1em;padding: 3px;font-family: monospace;font-size: smaller;">Shift</code> + <code style="color: navajowhite;background: black;border-radius: 1em;padding: 3px;font-family: monospace;font-size: smaller;">F</code> to restore privacy mode. (i.e. no-referrer)</b>'; // 🫵
  89. bar.title = 'Click to reload';
  90. //bar.title = 'Restore privacy mode by 𝐂𝐨𝐦𝐦𝐚𝐧𝐝 + 𝐒𝐡𝐢𝐟𝐭 + 𝐑 or click this bar to reload page.';
  91. bar.id = namespace;
  92. bar.style.backgroundColor = 'red'; // #2c3e50 coral indianred
  93. bar.style.color = 'white'; // #eee navajowhite
  94. bar.style.fontFamily = 'system-ui';
  95. bar.style.right = 0;
  96. bar.style.left = 0;
  97. bar.style.top = 0;
  98. bar.style.zIndex = 10000000000;
  99. bar.style.padding = '6px'; //13px //15px //11px //9px //3px //1px
  100. bar.style.position = 'fixed';
  101. bar.style.textAlign = 'center'; // justify
  102. bar.style.direction = 'ltr';
  103. // set bar behaviour
  104. bar.onclick = () => {
  105. bar.style.display = 'none';
  106. location.reload();
  107. };
  108. }
  109.  
  110. (function appendNoReferrerToLink() {
  111. // Add element <link/> with rel="noreferrer".
  112. // Some consider <link rel="noreferrer"/> as invalid.
  113. let link = document.createElement('link');
  114. document.head.append(link);
  115. link.referrerPolicy = 'no-referrer';
  116. link.rel = 'nofollow noopener noreferrer';
  117. })();
  118.  
  119. appendNoReferrer();