4a030195664cbdd1d3c1a4b81b1ed41dbf6d9bc5
angie
  Fri Feb 15 14:02:58 2019 -0800
Prevent hgFind lib (specifically genomePos -> hgPositionsHtml) from opening a web page; instead, pass up results and warning messages to the calling CGI so it can open the page its own way.  refs #22945
hgTracks, hgTables and hgVai used to call findGenomePos{,Web} to resolve positions; hgTables and hgVai had to detect after the fact whether an HTML page had been started (with warnings and/or multiple results).
In fact, hgPositionsHtml called webEnd which could cause conflicts with what the CGI was doing afterwards.
Now, instead of findGenomePos{,Web} there is hgFindSearch which returns hgp and also warning messages, if any, via a dyString parameter.
The calling CGI decides how to open the page if necessary (for hgTracks, it's already open) and displays warnings/multiple results -- or just proceeds as usual with the single position result.

diff --git src/hg/hgVai/hgVai.c src/hg/hgVai/hgVai.c
index c4f3862..109760f 100644
--- src/hg/hgVai/hgVai.c
+++ src/hg/hgVai/hgVai.c
@@ -26,30 +26,31 @@
 #include "trackHub.h"
 #include "hubConnect.h"
 #include "twoBit.h"
 #include "gpFx.h"
 #include "bigGenePred.h"
 #include "udc.h"
 #include "knetUdc.h"
 #include "md5.h"
 #include "regexHelper.h"
 #include "hAnno.h"
 #include "annoGratorQuery.h"
 #include "annoGratorGpVar.h"
 #include "annoFormatVep.h"
 #include "annoStreamBigBed.h"
 #include "annoStreamDb.h"
+#include "annoStreamVcf.h"
 #include "windowsToAscii.h"
 #include "obscure.h"
 
 #include "libifyMe.h"
 
 #define GENCODE_TAG_DOC_URL "\"http://www.gencodegenes.org/gencode_tags.html\""
 #define GENCODE_BASIC_DOC_URL "\"http://www.gencodegenes.org/faq.html\""
 #define REFSEQ_STATUS_DOC_URL "\"https://www.ncbi.nlm.nih.gov/books/NBK21091/table/ch18.T.refseq_status_codes\""
 #define APPRIS_DOC_URL "\"http://appris.bioinfo.cnio.es/#/help/database\""
 
 #define HGVS_MUST_USE_ACC "Note: HGVS terms must use versioned transcript or genomic accessions " \
     "(e.g. NM_000023.3, NC_000012.11, ENST00000000233.9), not gene symbols."
 
 /* Global Variables */
 struct cart *cart;		/* CGI and other variables */
@@ -2983,30 +2984,43 @@
 struct annoGratorQuery *query = annoGratorQueryNew(assembly, primary, gratorList, vepOut);
 struct slName *comment;
 for (comment = commentList;  comment != NULL;  comment = comment->next)
     vepOut->comment(vepOut, comment->name);
 if (chrom != NULL)
     annoGratorQuerySetRegion(query, chrom, start, end);
 annoGratorQueryExecute(query);
 annoGratorQueryFree(&query);
 
 if (doHtml)
     webEnd();
 else if (! isCommandLine)
     textOutClose(&compressPipeline, NULL);
 }
 
+struct hgPositions *lookupPosition(struct dyString *dyWarn)
+/* Look up position (aka range) if need be.  Return a container of matching tables and positions.
+ * Warnings/errors are appended to dyWarn. */
+{
+char *range = windowsToAscii(cloneString(cartUsualString(cart, hgvaRange, "")));
+range = trimSpaces(range);
+if (isEmpty(range))
+    range = hDefaultPos(database);
+struct hgPositions *hgp = hgFindSearch(cart, &range, NULL, NULL, NULL, cgiScriptName(), dyWarn);
+cartSetString(cart, hgvaRange, range);
+return hgp;
+}
+
 int main(int argc, char *argv[])
 /* Process command line. */
 {
 long enteredMainTime = clock1000();
 if (hIsPrivateHost())
     pushCarefulMemHandler(LIMIT_2or6GB);
 
 cgiSpoof(&argc, argv);
 boolean isCommandLine = (cgiOptionalString("cgiSpoof") != NULL);
 if (!isCommandLine)
     htmlPushEarlyHandlers(); /* Make errors legible during initialization. */
 oldVars = hashNew(10);
 boolean startQuery = (cgiUsualString("hgva_startQuery", NULL) != NULL);
 if (startQuery)
     {
@@ -3026,43 +3040,45 @@
 /* Set up global variables. */
 getDbAndGenome(cart, &database, &genome, oldVars);
 initGenbankTableNames(database);
 regionType = cartUsualString(cart, hgvaRegionType, hgvaRegionTypeGenome);
 if (isEmpty(cartOptionalString(cart, hgvaRange)))
     cartSetString(cart, hgvaRange, hDefaultPos(database));
 
 int timeout = cartUsualInt(cart, "udcTimeout", 300);
 if (udcCacheTimeout() < timeout)
     udcSetCacheTimeout(timeout);
 knetUdcInstall();
 
 char *range = trimSpaces(windowsToAscii(cartUsualString(cart, hgvaRange, "")));
 cartSetLastPosition(cart, range, oldVars);
 cartTrackDbInit(cart, &fullTrackList, &fullGroupList, TRUE);
-if (lookupPosition(cart, hgvaRange))
+struct dyString *dyWarn = dyStringNew(0);
+struct hgPositions *hgp = lookupPosition(dyWarn);
+if (hgp->singlePos && isEmpty(dyWarn->string))
     {
     if (startQuery)
 	doQuery();
     else if (! isCommandLine)
 	doUi();
     }
 else
     {
-    // Revert to lastPosition if we have multiple matches or warnings,
-    // especially in case user manually edits browser location as in #13009:
-    char *position = cartUsualString(cart, "lastPosition", hDefaultPos(database));
-    cartSetString(cart, hgvaRange, position);
-    if (webGotWarnings())
-	{
-	// We land here when lookupPosition pops up a warning box.
-	// Reset the problematic position and show the main page.
+    if (startQuery)
+        // Need Content-type (html)
+        cartWebStartHeader(cart, database, "Variant Annotation Integrator");
+    else
+        cartWebStart(cart, database, "Variant Annotation Integrator");
+    if (isNotEmpty(dyWarn->string))
+        warn("%s", dyWarn->string);
+    if (hgp->posCount > 1)
+        hgPositionsHtml(database, hgp, hgVaiName(), cart);
+    else
         doMainPage();
-	}
-    // If lookupPosition returned FALSE and didn't report warnings,
-    // then it wrote HTML showing multiple position matches & links.
+    cartWebEnd();
     }
 
 cartCheckout(&cart);
 if (! isCommandLine)
     cgiExitTime("hgVai", enteredMainTime);
 return 0;
 }