9eda30d162c7f983aa2b288fc4a5a31c2b8f3307
max
  Mon Jun 12 02:56:17 2023 -0700
adding localStorage reset to cartReset, refs #31503

diff --git src/hg/cartReset/cartReset.c src/hg/cartReset/cartReset.c
index 6e682e8..f5bd151 100644
--- src/hg/cartReset/cartReset.c
+++ src/hg/cartReset/cartReset.c
@@ -1,67 +1,77 @@
 /* cartReset - Reset cart. */
 
 /* Copyright (C) 2013 The Regents of the University of California 
  * See kent/LICENSE or http://genome.ucsc.edu/license/ for licensing information. */
 #include "common.h"
 #include "linefile.h"
 #include "hash.h"
 #include "cheapcgi.h"
 #include "htmshell.h"
 #include "hui.h"
 #include "cart.h"
 
 
 
 static char *defaultDestination = "../cgi-bin/hgGateway";
 
 boolean problem = FALSE;
 char *destination = NULL;
 
+static void resetLocalStorage() 
+/* the cart is for configuration options that are relevant to a session. We are using more and more localStorage settings, these are
+ * relevant to the particular web browser where the browser runs, e.g. notification settings, maybe one day font sizes and color schemes of the UI.
+ * QA must be able to reset these, too, so do this here now */
+{
+jsInline("localStorage.removeItem('hgTracks.hideSpeedNotification');");
+}
+
 void doMiddle()
 /* cartReset - Reset cart. */
 {
 if (problem)
     {	
     warn("To stop Open Redirect abuse, only relative URLs are supported. "
 	   "Request for destination=[%s] rejected.\n", destination);
     }
 cartResetInDb(hUserCookie());
+resetLocalStorage();
+jsInlineFinish();
 }
 
 int main(int argc, char *argv[])
 /* Process command line. */
 {
 long enteredMainTime = clock1000();
 struct dyString *headText = dyStringNew(512);
 destination = cgiUsualString("destination", defaultDestination);
 // Only allow relative URL that does not contain space or quote characters.
 if (strstr(destination, "//") // absolute URL
    || strchr(destination, '\'') // single quote
    || strchr(destination, '"') // double quote
    || strchr(destination, ' ') // space
    || sameString(destination, "") // empty string
     )
     {
     problem = TRUE;
     }
 
 char *csp = getCspMetaHeader();  // ContentSecurityPolicy stops XSS js in destination
 dyStringPrintf(headText, "%s",csp);
 
 if (!problem)
     {
     dyStringPrintf(headText, 
 		   "<META HTTP-EQUIV=\"REFRESH\" CONTENT=\"0;URL=%s\">"
 		   "<META HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\">"
 		   "<META HTTP-EQUIV=\"Expires\" CONTENT=\"-1\">"
 		   ,destination);
     }
 
 htmShellWithHead("Reset Cart", headText->string, doMiddle, NULL);
 
 freeMem(csp);
 dyStringFree(&headText);
 
 cgiExitTime("cartReset", enteredMainTime);
 return 0;
 }