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/hgTables/hgTables.c src/hg/hgTables/hgTables.c
index e12fb9f..2cf93db 100644
--- src/hg/hgTables/hgTables.c
+++ src/hg/hgTables/hgTables.c
@@ -366,82 +366,41 @@
 sr = sqlGetResult(conn, NOSQLINJ "select chrom,chromStart,chromEnd,name from encodeRegions order by name desc");
 while ((row = sqlNextRow(sr)) != NULL)
     {
     AllocVar(region);
     region->chrom = cloneString(row[0]);
     region->start = atoi(row[1]);
     region->end = atoi(row[2]);
     region->name = cloneString(row[3]);	/* encode region name	*/
     slAddHead(&list, region);
     }
 sqlFreeResult(&sr);
 hFreeConn(&conn);
 return list;
 }
 
-boolean searchPosition(char *range, struct region *region)
-/* Try and fill in region via call to hgFind. Return FALSE
- * if it can't find a single position. */
-{
-struct hgPositions *hgp = NULL;
-char retAddr[512];
-char position[512];
-safef(retAddr, sizeof(retAddr), "%s", getScriptName());
-hgp = findGenomePosWeb(database, range, &region->chrom, &region->start, &region->end,
-	cart, TRUE, retAddr);
-if (hgp != NULL && hgp->singlePos != NULL)
-    {
-    safef(position, sizeof(position),
-	    "%s:%d-%d", region->chrom, region->start+1, region->end);
-    cartSetString(cart, hgtaRange, position);
-    return TRUE;
-    }
-else if (region->start == 0)	/* Confusing way findGenomePosWeb says pos not found. */
-    {
-    cartSetString(cart, hgtaRange, hDefaultPos(database));
-    return FALSE;
-    }
-else
-    return FALSE;
-}
-
-boolean lookupPosition()
-/* Look up position (aka range) if need be.  Return FALSE if it puts
- * up multiple positions. */
+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, hgtaRange, "")));
-boolean isSingle = TRUE;
 range = trimSpaces(range);
-if (range[0] != 0)
-    {
-    struct region r;
-    cartSetLastPosition(cart, range, oldVars);
-    isSingle = searchPosition(range, &r);
-    if (!isSingle)
-	{
-	// In case user manually edits the browser location as described in #13009,
-	// revert the position.  If they instead choose from the list as we expect,
-	// that will set the position to their choice.
-	char *lastPosition = cartUsualString(cart, "lastPosition", hDefaultPos(database));
-	cartSetString(cart, "position", lastPosition);
-	}
-    }
-else
-    {
-    cartSetString(cart, hgtaRange, hDefaultPos(database));
-    }
-return isSingle;
+if (isEmpty(range))
+    range = hDefaultPos(database);
+struct hgPositions *hgp = hgFindSearch(cart, &range, NULL, NULL, NULL, getScriptName(), dyWarn);
+cartSetString(cart, hgtaRange, range);
+return hgp;
 }
 
 struct region *getRegions()
 /* Consult cart to get list of regions to work on. */
 {
 char *regionType = cartUsualString(cart, hgtaRegionType, "genome");
 struct region *regionList = NULL, *region;
 if (sameString(regionType, hgtaRegionTypeGenome))
     {
     regionList = getRegionsFullGenome();
     }
 else if (sameString(regionType, hgtaRegionTypeRange))
     {
     char *range = cartString(cart, hgtaRange);
     boolean parseOk = FALSE;
@@ -1791,45 +1750,54 @@
 if (backgroundStatus)
     {
     getBackgroundStatus(backgroundStatus);
     exit(0);
     }
 
 char *backgroundExec = cgiUsualString("backgroundExec", NULL);
 if (sameOk(backgroundExec,"gsSendToDM"))
     {
     gsSendToDM();
     exit(0);
     }
 
 /* Init track and group lists and figure out what page to put up. */
 initGroupsTracksTables();
-if (lookupPosition())
+struct dyString *dyWarn = dyStringNew(0);
+struct hgPositions *hgp = lookupPosition(dyWarn);
+if (hgp->singlePos && isEmpty(dyWarn->string))
     {
     if (cartUsualBoolean(cart, hgtaDoGreatOutput, FALSE))
 	doGetGreatOutput(dispatch);
     else
 	dispatch();
     }
 else
     {
+    cartWebStartHeader(cart, database, "Table Browser");
+    if (isNotEmpty(dyWarn->string))
+        warn("%s", dyWarn->string);
+    if (hgp->posCount > 1)
+        hgPositionsHtml(database, hgp, hgTablesName(), cart);
+    else
+        {
         struct sqlConnection *conn = NULL;
         if (!trackHubDatabase(database))
             conn = curTrack ? hAllocConnTrack(database, curTrack) : hAllocConn(database);
-    webPushErrHandlersCartDb(cart, database);
         mainPageAfterOpen(conn);
         hFreeConn(&conn);
+        }
     cartWebEnd();
     }
 
 textOutClose(&compressPipeline, &saveStdout);
 
 if (doGenomeSpace())
     {
     if (gsTemp)
 	{
 	cartSetString(cart, "gsTemp", gsTemp);
 	char *workUrl = NULL;
 	startBackgroundWork("./hgTables backgroundExec=gsSendToDM", &workUrl);
 
 	htmlOpen("Uploading Output to GenomeSpace");