Cookie and website data cleaner

Clears cookies and other website data when you go to websites if it isn't allowed to store website data. Edit the code to include websites that can store data.

// ==UserScript==
// @name         Cookie and website data cleaner
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  Clears cookies and other website data when you go to websites if it isn't allowed to store website data. Edit the code to include websites that can store data.
// @author       https://greasyfork.org/en/users/85040-dan-wl-danwl
// @license      MIT
// @match        *://*/*
// @run-at       document-start
// @grant        none
// ==/UserScript==

// MIT License

// Copyright(c) 2024 DanWL

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files(the "Software"), to deal
// 	in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// 	FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// 	OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.

(function() {
	// clearing website storage may prevent certain features from working correctly
	// such as remembering which websites you are logged into, which items are in your basket when shopping etc.

	// start config

	// clearWebsiteDataEveryXMilliseconds takes any number
	var clearWebsiteDataEveryXMilliseconds = 200;

	// runs on websites unless listed here
	// made using regular expressions - flags are ignored
	// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions
	// https://regex101.com

	var websitesToNotRunOn = [
		// cookies required for websites to work


		// anything requiring google account:
		// /^https:\/\/accounts\.google\.com/,
		// google docs:
		// /^https:\/\/docs\.google\.com/,
		// /^https:\/\/contacts\.google\.com/,
		// stay signed into youtube:
		// /^https:\/\/accounts\.youtube\.com/,
		// /^https:\/\/(www|m)\.youtube\.com/,

		// stay signed into soundcloud account
		// /^https:\/\/secure\.soundcloud\.com/,
		// /^https:\/\/soundcloud\.com/,

		// reddit requires cookies to work even without account
		// /^https:\/\/www\.reddit\.com/,


		// cookies that are needed to remember preferences
		// /^https:\/\/search\.brave\.com/,
		// /^https:\/\/([a-z]+\.)?wikipedia\.org/
	];

	// end config

	var websitesToNotRunOnStr = '';

	websitesToNotRunOn.forEach(function(re, index, arr) {
		websitesToNotRunOnStr += '(' + re.source + ')';

		if ((index + 1 ) < arr.length) {
			websitesToNotRunOnStr += '|';
		}
	});

	if (location.origin.match(websitesToNotRunOnStr)) {
		return;
	}

	function joinArray(array, seperator, start, end) {
		var joined = '';

		for (var i = start; i < end; i++) {
			joined += array[i] + seperator;
		}

		return joined;
	}

	function clearCookie(cookieName) {
		// https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie
		// https://stackoverflow.com/questions/5688491/unable-to-delete-cookie-from-javascript
		// can only delete cookie if same domain and path are used as what's already been set

		var pathParts = location.pathname.split(/\//g);
		var expires = new Date(0).toUTCString();

		[location.hostname, location.host].forEach(function(domain) {
			while (domain) {
				for (var i = 0; i < pathParts.length; i++) {
					var path = joinArray(pathParts, '/', 0, i);
					var cookie = cookieName + '=; expires=' + expires + '; domain=' + domain + '; path=' + path + ';';

					if (location.protocol == 'https:') {
						cookie += ' SameSite=strict; Secure';
					}

					document.cookie = cookie;
				}

				domain = domain.replace(/^\.?[^.]+/, '');

				if (!domain.match(/[^.]+\.[^.]+$/)) {
					// prevent cookie rejection warning based on invalid domain
					break;
				}
			}
		});
	}

	function clearCookies() {
		var cookieRe = /([^=]+)=[^;]*(?:;\s+|$)/;

		document.cookie.match(new RegExp(cookieRe, 'g') || []).forEach(function(cookie) {
			var cookieName = cookie.match(cookieRe)[1];

			clearCookie(cookieName);
		});
	}

	function resetWebsiteData() {
		try {
			clearCookies();

			['localStorage', 'sessionStorage'].forEach(function(storage) {
				window[storage].clear();
			});
		}
		catch(err) {
			// page may not have loaded yet or browser doesnt support localStorage or sessionStorage
		}
	}

	setInterval(resetWebsiteData, clearWebsiteDataEveryXMilliseconds);
	resetWebsiteData();
})();