[object Object]

← back to Dw Domain Fleet

TK-11538: guard gridControls() localStorage with try/catch (Safari private mode) + clamp saved density to range bounds

8be45e24a05424ebd9e8fbf2de58600e6c3ff7ce · 2026-09-12 07:39:44 -0700 · Steve Abrams

Files touched

Diff

commit 8be45e24a05424ebd9e8fbf2de58600e6c3ff7ce
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Sat Sep 12 07:39:44 2026 -0700

    TK-11538: guard gridControls() localStorage with try/catch (Safari private mode) + clamp saved density to range bounds
---
 shared/render.js | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/shared/render.js b/shared/render.js
index 73b4a49..20a028b 100644
--- a/shared/render.js
+++ b/shared/render.js
@@ -692,11 +692,14 @@ function gridControls(cfg){
   var dk='${cfg.slug}_density',sk='${cfg.slug}_sort';
   var g=document.getElementById('grid'),d=document.getElementById('densSel'),s=document.getElementById('sortSel');
   if(!g||!d||!s)return;
+  // TK-11538: localStorage ACCESS itself throws in Safari private mode / blocked site data — guard it (matches catalogPage read()/save())
+  function read(k){try{return localStorage.getItem(k);}catch(e){return null;}}
+  function save(k,v){try{localStorage.setItem(k,v);}catch(e){}}
   var cards=Array.prototype.slice.call(g.children);
   cards.forEach(function(c,i){c.__i=i;}); // original "Featured" order
-  var sv=localStorage.getItem(dk);if(sv)d.value=sv;
+  var sv=read(dk);if(sv!=null){d.value=sv;if(d.max!==''&&+sv>+d.max)d.value=d.max;if(d.min!==''&&+sv<+d.min)d.value=d.min;} // clamp saved density to the range's bounds
   function applyD(){g.style.setProperty('--cols',d.value);}
-  d.addEventListener('input',function(){applyD();localStorage.setItem(dk,d.value);});
+  d.addEventListener('input',function(){applyD();save(dk,d.value);});
   applyD();
   function hl(hex){var m=/([0-9a-f]{6})/i.exec(hex||'');if(!m)return[999,999];
     var n=parseInt(m[1],16),r=(n>>16&255)/255,gg=(n>>8&255)/255,b=(n&255)/255;
@@ -722,9 +725,9 @@ function gridControls(cfg){
     });
     arr.forEach(function(c){g.appendChild(c);});
   }
-  var saved=localStorage.getItem(sk);
+  var saved=read(sk);
   if(saved){var ok=Array.prototype.some.call(s.options,function(o){return o.value===saved;});if(ok){s.value=saved;sortBy(saved);}}
-  s.addEventListener('change',function(){localStorage.setItem(sk,s.value);sortBy(s.value);});
+  s.addEventListener('change',function(){save(sk,s.value);sortBy(s.value);});
 })();
 </script>`;
 }

← cbc272c chore: v1.0.2 (TK-11470 session close)  ·  back to Dw Domain Fleet  ·  TK-11537: declare scriptSrcAttr 'none' explicitly so read==s d20f426 →