In Safari private browsing, localStorage and sessionStorage may be unavailable.Detection and handling:
function isStorageAvailable(): boolean { try { const test = "__storage_test__"; localStorage.setItem(test, test); localStorage.removeItem(test); return true; } catch { return false; }}if (!isStorageAvailable()) { // Use in-memory storage fallback showWarning("Some features may not work in private browsing mode");}
Browsers throttle background tabs to save battery.Impact:
Timers may be delayed
Real-time updates may pause
Position updates may lag
Handling:
// Listen for visibility changesdocument.addEventListener("visibilitychange", () => { if (document.visibilityState === "visible") { // Refresh state when returning to tab client.refresh(); }});
function BrowserUpgradeMessage({ issues }: { issues: string[] }) { return ( <div className="browser-upgrade"> <h2>Please upgrade your browser</h2> <p> Your browser doesn't support some features needed for this experience. Please upgrade to a modern browser like Chrome, Firefox, or Safari. </p> <ul> {issues.map((issue) => ( <li key={issue}>{issue}</li> ))} </ul> </div> );}
// polyfills.tsimport "core-js/stable";import "regenerator-runtime/runtime";// Or use a polyfill service// <script src="https://polyfill.io/v3/polyfill.min.js?features=fetch,Promise,Array.from"></script>
Issue: Extensions blocking requestsSolution: Test in incognito mode or disable extensions
// Detect if request was blockedfetch(url).catch((error) => { if (error.message.includes("blocked")) { showMessage("Browser extension may be blocking requests"); }});
Issue: Enhanced Tracking ProtectionSolution: Ensure your domain is not on tracking listsIssue: Container tabs isolationSolution: Sessions may not share between containers by design
// Detect mobile for testingconst isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);// Or use media queryconst isMobile = window.matchMedia("(max-width: 768px)").matches;