8bddd781eb83e9f0497d7cba7a0377bdc012d48e angie Wed Jul 8 12:47:51 2015 -0700 Separate processing of related cart vars in a nondeterministic order was wreaking havoc with clade/org/db menus for non-default dbs. For now, wrap those cart vars together so that they are processed correctly. It would be better still to make registerCartVarHandler reject lists of variables; one variable, one handler function. If that proves inconvenient, then we could bind lists of variables to a single handler function. refs #15681 diff --git src/hg/lib/cartJson.c src/hg/lib/cartJson.c index 7284f95..b1f44fb 100644 --- src/hg/lib/cartJson.c +++ src/hg/lib/cartJson.c @@ -650,37 +650,39 @@ } jsonWriteListEnd(jw); // children (dbs) jsonWriteString(jw, "default", hDefaultDbForGenome(org->name)); jsonWriteObjectEnd(jw); // org } jsonWriteListEnd(jw); // children (orgs) jsonWriteString(jw, "default", hDefaultGenomeForClade(clade->name)); jsonWriteObjectEnd(jw); // clade } jsonWriteListEnd(jw); } static void getCladeOrgDbPos(struct cartJson *cj, struct hash *paramHash) /* Get cart's current clade, org, db, position and geneSuggest track. */ { +jsonWriteObjectStart(cj->jw, "cladeOrgDb"); printCladeOrgDbTree(cj->jw); char *db = cartString(cj->cart, "db"); jsonWriteString(cj->jw, "db", db); char *org = cartUsualString(cj->cart, "org", hGenome(db)); jsonWriteString(cj->jw, "org", org); char *clade = cartUsualString(cj->cart, "clade", hClade(org)); jsonWriteString(cj->jw, "clade", clade); +jsonWriteObjectEnd(cj->jw); char *position = cartOptionalString(cj->cart, "position"); if (isEmpty(position)) position = hDefaultPos(db); jsonWriteString(cj->jw, "position", position); printGeneSuggestTrack(cj, db); } static void getStaticHtml(struct cartJson *cj, struct hash *paramHash) /* Read HTML text from a relative path under browser.documentRoot and * write it as an encoded JSON string */ { char *tag = cartJsonOptionalParam(paramHash, "tag"); if (isEmpty(tag)) tag = "html"; char *file = cartJsonRequiredParam(paramHash, "file", cj->jw, "getStaticHtml");