e0d9ec4b45b45a909e219e29d74fa8be55618078
max
  Fri Apr 26 03:10:32 2024 -0700
CSP for china tracking, refs #32535

diff --git src/lib/htmshell.c src/lib/htmshell.c
index 54590fc..d0a096c 100644
--- src/lib/htmshell.c
+++ src/lib/htmshell.c
@@ -996,30 +996,32 @@
 // used by hgIntegrator jsHelper and others
 dyStringAppend(policy, " code.jquery.com/jquery-1.9.1.min.js");
 dyStringAppend(policy, " code.jquery.com/jquery-1.12.3.min.js");
 dyStringAppend(policy, " code.jquery.com/ui/1.10.3/jquery-ui.min.js");
 dyStringAppend(policy, " code.jquery.com/ui/1.11.0/jquery-ui.min.js");
 dyStringAppend(policy, " code.jquery.com/ui/1.12.1/jquery-ui.js");
 
 // used by google analytics
 dyStringAppend(policy, " www.google-analytics.com/analytics.js");
 
 // used by google tag manager (new version of analytics)
 dyStringAppend(policy, " www.googletagmanager.com/gtag/js");
 
 // cirm cdw lib and web browse
 dyStringAppend(policy, " www.samsarin.com/project/dagre-d3/latest/dagre-d3.js");
+// genome-china analytics
+dyStringAppend(policy, " hm.baidu.com/hm.js");
 
 dyStringAppend(policy, " cdnjs.cloudflare.com/ajax/libs/bowser/1.6.1/bowser.min.js");
 dyStringAppend(policy, " cdnjs.cloudflare.com/ajax/libs/d3/3.4.4/d3.min.js");
 dyStringAppend(policy, " cdnjs.cloudflare.com/ajax/libs/jquery/1.12.1/jquery.min.js");
 dyStringAppend(policy, " cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/jstree.min.js");
 dyStringAppend(policy, " cdnjs.cloudflare.com/ajax/libs/jstree/3.3.4/jstree.min.js");
 dyStringAppend(policy, " cdnjs.cloudflare.com/ajax/libs/jstree/3.3.7/jstree.min.js");
 dyStringAppend(policy, " cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js");
 
 dyStringAppend(policy, " login.persona.org/include.js");
 
 // expMatrix
 dyStringAppend(policy, " ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js");
 dyStringAppend(policy, " ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js");
 dyStringAppend(policy, " ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js");
@@ -1114,71 +1116,59 @@
 
 void generateCspMetaHeader(FILE *f)
 /* generate meta CSP header */
 {
 char *meta = getCspMetaHeader();
 fputs(meta, f);
 freeMem(meta);
 }
 
 
 void _htmStartWithHead(FILE *f, char *head, char *title, boolean printDocType, int dirDepth)
 /* Write out bits of header that both stand-alone .htmls
  * and CGI returned .htmls need, including optional head info */
 {
 if (printDocType)
-    {
-//#define TOO_TIMID_FOR_CURRENT_HTML_STANDARDS
-#ifdef TOO_TIMID_FOR_CURRENT_HTML_STANDARDS
-    fputs("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">\n", f);
-#else///ifndef TOO_TIMID_FOR_CURRENT_HTML_STANDARDS
-    char *browserVersion;
-    if (btIE == cgiClientBrowser(&browserVersion, NULL, NULL) && *browserVersion < '8')
-        fputs("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">\n", f);
-    else
     fputs("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" "
           "\"http://www.w3.org/TR/html4/loose.dtd\">\n",f);
-    // Strict would be nice since it fixes atleast one IE problem (use of :hover CSS pseudoclass)
-#endif///ndef TOO_TIMID_FOR_CURRENT_HTML_STANDARDS
-    }
 
 if (doNotTranslate)
     fputs("<HTML lang='en' class='notranslate' translate='no'>\n", f); // switches off auto-translation question
 else
     fputs("<HTML>\n", f);
 
 fputs("<HEAD>\n", f);
 
 if (doNotTranslate)
     fputs("<meta name='google' content='notranslate' />\n", f); // switches off translation bar in Chrome and related browsers
 
 // CSP header
 generateCspMetaHeader(f);
 
 fputs(head, f);
 htmlFprintf(f,"<TITLE>%s</TITLE>\n", title); 
 if (endsWith(title,"Login - UCSC Genome Browser")) 
     fprintf(f,"\t<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html;CHARSET=iso-8859-1\">\n");
 fprintf(f, "\t<META http-equiv=\"Content-Script-Type\" content=\"text/javascript\">\n");
 if (htmlStyle != NULL)
     fputs(htmlStyle, f);
 if (htmlStyleSheet != NULL)
     fprintf(f,"<link href=\"%s\" rel=\"stylesheet\" type=\"text/css\">\n", htmlStyleSheet);
 if (htmlStyleTheme != NULL)
     fputs(htmlStyleTheme, f);
 
-
+// With Analytics 4 we need the Javascript file in the header
 htmlPrintAnalyticsLink(f);
 
 fputs("</HEAD>\n\n",f);
 printBodyTag(f);
 htmlWarnBoxSetup(f);
 }
 
 
 void htmlStart(char *title)
 /* Write the start of an html from CGI */
 {
 puts("Content-Type:text/html");
 puts("\n");
 _htmStartWithHead(stdout, "", title, TRUE, 1);
 }