af730d9e24c0642fe39657f890bc117ed015ccbf galt Wed Feb 15 01:12:26 2017 -0800 CSP code cleanup. Using new var-args versions of functions jsInlineF and jsOnEventByIdF to avoid using lots of fixed-size local javascript strings. diff --git src/hg/lib/hui.c src/hg/lib/hui.c index f684ccc..9bdc66c 100644 --- src/hg/lib/hui.c +++ src/hg/lib/hui.c @@ -49,45 +49,42 @@ #include "tagRepo.h" #define SMALLBUF 256 #define MAX_SUBGROUP 9 #define ADD_BUTTON_LABEL "add" #define CLEAR_BUTTON_LABEL "clear" #define JBUFSIZE 2048 #define DEF_BUTTON "<IMG id=\"btn_%s\" src=\"../images/%s\" alt=\"%s\">\n" #define DEF_BUTTON_JS "setCheckBoxesThatContain('%s',true,false,'%s','','%s');" \ "setCheckBoxesThatContain('%s',false,false,'%s','_defOff','%s');" #define DEFAULT_BUTTON(nameOrId,anc,beg,contains) \ printf(DEF_BUTTON,(anc),"defaults_sm.png","default"); \ safef(id, sizeof id, "btn_%s", (anc)); \ - safef(javascript, sizeof javascript, DEF_BUTTON_JS,(nameOrId),(beg),(contains),(nameOrId),(beg),(contains)); \ - jsOnEventById("click", id, javascript); + jsOnEventByIdF("click", id, DEF_BUTTON_JS,(nameOrId),(beg),(contains),(nameOrId),(beg),(contains)); #define PM_BUTTON "<IMG height=18 width=18 id=\"btn_%s\" src=\"../images/%s\" alt=\"%s\">\n" #define PM_BUTTON_JS "setCheckBoxesThatContain('%s',%s,true,'%s','','%s');" #define PLUS_BUTTON(nameOrId,anc,beg,contains) \ printf(PM_BUTTON, (anc), "add_sm.gif", "+"); \ safef(id, sizeof id, "btn_%s", (anc)); \ - safef(javascript, sizeof javascript, PM_BUTTON_JS, (nameOrId),"true", (beg),(contains)); \ - jsOnEventById("click", id, javascript); + jsOnEventByIdF("click", id, PM_BUTTON_JS, (nameOrId),"true", (beg),(contains)); #define MINUS_BUTTON(nameOrId,anc,beg,contains) \ printf(PM_BUTTON, (anc), "remove_sm.gif", "-"); \ safef(id, sizeof id, "btn_%s", (anc)); \ - safef(javascript, sizeof javascript, PM_BUTTON_JS, (nameOrId),"false", (beg),(contains)); \ - jsOnEventById("click", id, javascript); + jsOnEventByIdF("click", id, PM_BUTTON_JS, (nameOrId),"false", (beg),(contains)); boolean isEncode2(char *database) // Return true for ENCODE2 assemblies { return (sameString(database, "hg18") || sameString(database, "hg19") || sameString(database, "mm9")); } static char *htmlStringForDownloadsLink(char *database, struct trackDb *tdb, char *name,boolean nameIsFile) // Returns an HTML string for a downloads link { // If has fileSortOrder, then link to new hgFileUi if (!nameIsFile && trackDbSetting(tdb, FILE_SORT_ORDER) != NULL) { char * link = needMem(PATH_LEN); // 512 should be enough @@ -318,34 +315,32 @@ // If metadata from metaTbl exists, create a link that will allow toggling it's display { char *tagStormFile = trackDbSetting(tdb, "metaDb"); if (tagStormFile == NULL) { const struct mdbObj *safeObj = metadataForTable(db,tdb,NULL); if (safeObj == NULL || safeObj->vars == NULL) return FALSE; } char id[256]; safef(id, sizeof id, "div_%s_link", tdb->track); printf("%s<A id='%s' HREF='#a_meta_%s' " "title='Show metadata details...'>%s<img src='../images/downBlue.png'/></A>", (embeddedInText?" ":"<P>"),id,tdb->track, (title?title:"")); -char javascript[1024]; -safef(javascript, sizeof javascript, "return metadataShowHide(\"%s\",%s,true);", +jsOnEventByIdF("click", id, "return metadataShowHide(\"%s\",%s,true);", tdb->track, showLongLabel?"true":"false"); -jsOnEventById("click", id, javascript); printf("<DIV id='div_%s_meta' style='display:none;'>%s</div>",tdb->track, metadataAsHtmlTable(db,tdb,showLongLabel,FALSE)); return TRUE; } void extraUiLinks(char *db,struct trackDb *tdb) // Show metadata, and downloads, schema links where appropriate { char *tagStormFile = trackDbSetting(tdb, "metaDb"); boolean hasMetadata = (tagStormFile != NULL) || (!tdbIsComposite(tdb) && !trackHubDatabase(db) && metadataForTable(db, tdb, NULL) != NULL); if (hasMetadata) printf("<b>Metadata:</b><br>%s\n", metadataAsHtmlTable(db, tdb, FALSE, FALSE)); boolean schemaLink = (!tdbIsDownloadsOnly(tdb) && !trackHubDatabase(db) && isCustomTrack(tdb->table) == FALSE) @@ -4549,42 +4544,39 @@ if (membersForAll->members[dimV] && -1 != (ix = stringArrayIx(membersForAll->members[dimV]->groupTag, membership->subgroups, membership->count))) view = membership->membership[ix]; char classList[256]; if (view != NULL) safef(classList,sizeof(classList),"clickable fauxInput%s subVisDD %s", (visibleCB ? "":" disabled"),view); // view should be last! else safef(classList,sizeof(classList),"clickable fauxInput%s subVisDD", (visibleCB ? "":" disabled")); #define SUBTRACK_CFG_VIS "<div id='%s_faux' class='%s' style='width:65px;'>%s</div>\n" printf(SUBTRACK_CFG_VIS,subtrack->track,classList,hStringFromTv(vis)); char id[256]; safef(id, sizeof id, "%s_faux", subtrack->track); - char javascript[1024]; - safef(javascript, sizeof javascript, "return subCfg.replaceWithVis(this,\"%s\",true);", subtrack->track); - jsOnEventById("click", id, javascript); + jsOnEventByIdF("click", id, "return subCfg.replaceWithVis(this,\"%s\",true);", subtrack->track); if (cType != cfgNone) // make a wrench { safef(id, sizeof id, "%s_toggle", subtrack->track); #define SUBTRACK_CFG_WRENCH "<span id='%s' class='clickable%s' " \ "title='Configure this subtrack'><img src='../images/wrench.png'></span>\n" printf(SUBTRACK_CFG_WRENCH,id,(visibleCB ? "":" disabled")); - safef(javascript, sizeof javascript, "return subCfg.cfgToggle(this,\"%s\");", subtrack->track); - jsOnEventById("click", id, javascript); + jsOnEventByIdF("click", id, "return subCfg.cfgToggle(this,\"%s\");", subtrack->track); } } printf("</TD>"); // If sortable, then there must be a column per sortable dimension if (sortOrder != NULL) { int sIx=0; for (sIx=0; sIx <sortOrder->count; sIx++) { char *col = sortOrder->column[sIx]; ix = stringArrayIx(col, membership->subgroups, membership->count); // TODO: Sort needs to expand from subGroups to labels as well if (ix >= 0) { @@ -6447,31 +6439,30 @@ char trackName[255]; char query[256]; char **row; struct sqlConnection *conn; struct sqlResult *sr; char *words[MAX_SP_SIZE]; int defaultOffSpeciesCnt = 0; if (cartOptionalString(cart, "ajax") == NULL) jsIncludeFile("utils.js",NULL); //jsInit(); puts("\n<P><B>Species selection:</B> "); cgiContinueHiddenVar("g"); char id[256]; -char javascript[1024]; PLUS_BUTTON( "id", "plus_pw","cb_maf_","_maf_") MINUS_BUTTON("id","minus_pw","cb_maf_","_maf_") char prefix[512]; safef(prefix, sizeof prefix, "%s.", name); char *defaultOffSpecies = trackDbSetting(tdb, "speciesDefaultOff"); struct hash *offHash = NULL; if (defaultOffSpecies) { offHash = newHash(5); DEFAULT_BUTTON( "id", "default_pw","cb_maf_","_maf_") int wordCt = chopLine(defaultOffSpecies, words); defaultOffSpeciesCnt = wordCt; /* build hash of species that should be off */ @@ -7383,41 +7374,39 @@ continue; count++; if (count==1) // First time set up a table puts("<BR><TABLE>"); printf("<TR><TH valign=top align='right'> <B><EM>%s</EM></B>:</TH>", membersForAll->members[ix]->groupTitle); int aIx; for (aIx=0;aIx<membersForAll->members[ix]->count;aIx++) { if (membersForAll->members[ix]->tags[aIx] != NULL) { assert(membersForAll->members[ix]->subtrackList[aIx]->val != NULL); printf("<TH align=left nowrap>"); char objName[SMALLBUF]; - char javascript[JBUFSIZE]; char other[JBUFSIZE]; boolean alreadySet=FALSE; if (membersForAll->members[ix]->selected != NULL) alreadySet = membersForAll->members[ix]->selected[aIx]; safef(objName, sizeof(objName), "%s.mat_%s_dim%c_cb",parentTdb->track, membersForAll->members[ix]->tags[aIx],membersForAll->letters[ix]); - safef(javascript,sizeof(javascript), "matCbClick(this);"); safef(other, sizeof other, "class='matCB abc %s'", membersForAll->members[ix]->tags[aIx]); cgiMakeCheckBoxIdAndMore(objName,alreadySet,objName,other); - jsOnEventById("click", objName, javascript); + jsOnEventById("click", objName, "matCbClick(this);"); printf("%s",compositeLabelWithVocabLink(db,parentTdb, membersForAll->members[ix]->subtrackList[aIx]->val, membersForAll->members[ix]->groupTag, membersForAll->members[ix]->titles[aIx])); puts("</TH>"); } } puts("</TR>"); } if (count>0) puts("</TABLE>"); return count; } #ifdef DEBUG @@ -7534,39 +7523,38 @@ safef(javascript, sizeof javascript, PM_BUTTON_FILTER_COMP_JS, (tf)); \ jsOnEventById("click", id, javascript); MAKE_PM_BUTTON_FILTER_COMP("true", "plus_fc",'+') MAKE_PM_BUTTON_FILTER_COMP("false","minus_fc",'-') printf("</TD>\n"); } // Now make a filterComp box for each ABC dimension int dimIx=dimA; for (dimIx=dimA;dimIx<membersForAll->dimMax;dimIx++) { printf("<TD align='left'><B>%s:</B><BR>\n", labelWithVocabLinkForMultiples(db,parentTdb,membersForAll->members[dimIx])); - #define FILTER_COMPOSITE_FORMAT "<SELECT id='%s' name='%s.filterComp.%s' %s " \ - "style='display: none; font-size:.8em;' " \ - "class='filterComp'><BR>\n" - #define FILTER_COMPOSITE_FORMAT_JS "filterCompositeSelectionChanged(this);" safef(id, sizeof id, "fc%d",dimIx); - printf(FILTER_COMPOSITE_FORMAT,id,parentTdb->track,membersForAll->members[dimIx]->groupTag, + printf( + "<SELECT id='%s' name='%s.filterComp.%s' %s " + "style='display: none; font-size:.8em;' " + "class='filterComp'><BR>\n" + ,id,parentTdb->track,membersForAll->members[dimIx]->groupTag, "multiple"); - safef(javascript, sizeof javascript, FILTER_COMPOSITE_FORMAT_JS); - jsOnEventById("change", id, javascript); + jsOnEventById("change", id, "filterCompositeSelectionChanged(this);"); // DO we support anything besides multi? // (membersForAll->members[dimIx]->fcType == fctMulti?"multiple ":"")); if (membersForAll->members[dimIx]->fcType != fctOneOnly) printf("<OPTION%s>All</OPTION>\n", (sameWord("All",membersForAll->checkedTags[dimIx])?" SELECTED":"") ); int ix=0; for (ix=0;ix<membersForAll->members[dimIx]->count; ix++) { boolean alreadySet = membersForAll->members[dimIx]->selected[ix]; printf("<OPTION%s value=%s>%s</OPTION>\n",(alreadySet?" SELECTED":""), membersForAll->members[dimIx]->tags[ix],membersForAll->members[dimIx]->titles[ix]); } @@ -7811,40 +7799,37 @@ } static boolean compositeUiAllButtons(char *db, struct cart *cart, struct trackDb *parentTdb, char *formName) // UI for composite tracks: all/none buttons only (as opposed to matrix or lots of buttons { if (trackDbCountDescendantLeaves(parentTdb) <= 1) return FALSE; if (dimensionsExist(parentTdb)) return FALSE; #define PM_BUTTON_GLOBAL "<IMG height=18 width=18 id='%s' src='../images/%s'>" #define PM_BUTTON_GLOBAL_JS "matSubCBsCheck(%s);" char id[256]; -char javascript[1024]; safef(id, sizeof id, "btn_plus_all"); -safef(javascript, sizeof javascript, PM_BUTTON_GLOBAL_JS, "true"); printf(PM_BUTTON_GLOBAL, id, "add_sm.gif"); -jsOnEventById("click", id, javascript); +jsOnEventByIdF("click", id, PM_BUTTON_GLOBAL_JS, "true"); safef(id, sizeof id, "btn_minus_all"); -safef(javascript, sizeof javascript, PM_BUTTON_GLOBAL_JS, "false"); printf(PM_BUTTON_GLOBAL, id, "remove_sm.gif"); -jsOnEventById("click", id, javascript); +jsOnEventByIdF("click", id, PM_BUTTON_GLOBAL_JS, "false"); puts(" <B>Select all subtracks</B><BR>"); return TRUE; } static boolean compositeUiNoMatrix(char *db, struct cart *cart, struct trackDb *parentTdb, char *formName) // UI for composite tracks: subtrack selection. This is the default UI // without matrix controls. { int i, j, k; char *words[SMALLBUF]; char option[SMALLBUF]; int wordCnt; char *name, *value;