From 607bba6eafd2d61919e3f1df9e40802d410b49c9 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 20 Oct 2023 21:38:54 -0400 Subject: [PATCH] Add `dontOverwrite` vararg to `(trusted-)set-cookie` scriptlet When the vararg `, dontOverwrite, 1` is present, the scriptlet will not modify the cookie if it already exists. Related discussion: https://github.com/uBlockOrigin/uAssets/issues/19976#issuecomment-1773466740 --- assets/resources/scriptlets.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/assets/resources/scriptlets.js b/assets/resources/scriptlets.js index d8cad2e71..2e91549b5 100644 --- a/assets/resources/scriptlets.js +++ b/assets/resources/scriptlets.js @@ -748,17 +748,18 @@ function setCookieHelper( path = '', options = {}, ) { - const cookieExists = (name, value) => { - return document.cookie.split(/\s*;\s*/).some(s => { + const getCookieValue = name => { + for ( const s of document.cookie.split(/\s*;\s*/) ) { const pos = s.indexOf('='); - if ( pos === -1 ) { return false; } - if ( s.slice(0, pos) !== name ) { return false; } - if ( s.slice(pos+1) !== value ) { return false; } - return true; - }); + if ( pos === -1 ) { continue; } + if ( s.slice(0, pos) !== name ) { continue; } + return s.slice(pos+1); + } }; - if ( options.reload && cookieExists(name, value) ) { return; } + const cookieBefore = getCookieValue(name); + if ( cookieBefore !== undefined && options.dontOverwrite ) { return; } + if ( cookieBefore === value && options.reload ) { return; } const cookieParts = [ name, '=', value ]; if ( expires !== '' ) { @@ -773,7 +774,7 @@ function setCookieHelper( } document.cookie = cookieParts.join(''); - if ( options.reload && cookieExists(name, value) ) { + if ( options.reload && getCookieValue(name) === value ) { window.location.reload(); } }