5872e3a9d5f3d2916bbf10f359011b9d04fc3b93
max
  Wed Aug 26 03:18:39 2026 -0700
Revert "Share a link: create the session only when the user asks, and copy in one click"

This reverts commit 3f97b357c59.  The change was work in progress and was
committed by mistake; web.c still has the matching data-shortlink part
uncommitted, so this half does not stand on its own.  The genark syncFtp commit
that went out with it is fine and stays.

diff --git src/hg/js/hgSession.js src/hg/js/hgSession.js
index 1cba1a3abdd..a1dda41235a 100644
--- src/hg/js/hgSession.js
+++ src/hg/js/hgSession.js
@@ -35,40 +35,39 @@
 
 var sessData = null;   // set in sessionBuild: {config, sessions}
 var sessDt = null;     // the DataTable API
 var sessSelectMode = false;   // bulk-select (checkbox column) shown?
 
 function sessEnc(s) {
     // HTML-escape via the shared utils.js helper (escapes quotes too, so it is attribute-safe).
     return (typeof htmlEncode === 'function') ? htmlEncode(String(s == null ? '' : s)) : String(s);
 }
 
 function sessNum(n) {
     return (typeof commify === 'function') ? commify(n) : String(n);
 }
 
 function sessRandomShareName() {
-    // Auto-name convention for machine-generated session names: a leading "_" (which marks the name
-    // as internally generated, and is kept verbatim by the short-link encoder) followed by 8 URL-safe
-    // alphanumeric chars.  This is the single source of the convention: the top-right "Share a link"
-    // menu (topLinks.js) and hgSession.c both defer to a name generated here.
+    // Mirror the server's auto/anonymous share-name convention ("share_" + 8 URL-safe alphanumeric
+    // chars).  hgSession.c's doSaveSessionJson generates the same style server-side for the top-right
+    // "Share a link"; we generate it here so the confirm dialog can show the name before saving.
     var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
     var s = '';
     for (var i = 0; i < 8; i++) {
         s += chars.charAt(Math.floor(Math.random() * chars.length));
     }
-    return '_' + s;
+    return 'share_' + s;
 }
 
 function sessMbpPos(pos) {
     // Shorten a position to megabases to save horizontal space:
     // "chr7:155799529-155812871" -> "chr7:155.80-155.81 Mbp".  Falls back to the raw string
     // if it doesn't parse.
     var m = /^(.+):([0-9,]+)-([0-9,]+)$/.exec(String(pos));
     if (!m) { return String(pos); }
     var s = parseInt(m[2].replace(/,/g, ''), 10);
     var e = parseInt(m[3].replace(/,/g, ''), 10);
     if (isNaN(s) || isNaN(e)) { return String(pos); }
     return m[1] + ':' + (s / 1e6).toFixed(2) + '-' + (e / 1e6).toFixed(2) + ' Mbp';
 }
 
 function sessMsg(text, cls) {
@@ -421,31 +420,31 @@
 }
 
 // Build the base params for an action on a given session (decoded name; the CGI re-encodes it).
 function sessActParams(action, row) {
     var p = {};
     p[action] = '1';
     p[SESS_P.oldName] = row.name;
     return p;
 }
 
 // ---- Save current view ---------------------------------------------------
 
 function sessDoSave() {
     var name = document.getElementById('sessSaveName').value.trim();
     if (!name) {
-        // Empty name: offer to save under a random internal "_XXXXXXXX" name, after
+        // Empty name: offer to save under a server-style random "share_XXXXXXXX" name, after
         // confirming the user really meant to leave it blank.
         var rand = sessRandomShareName();
         sessConfirm({
             title: 'Save without a name?',
             bodyHtml: 'You left the session name empty. Your session will be saved under the ' +
                 'randomly generated name <b>' + sessEnc(rand) + '</b>.<br><br>You can also create ' +
                 'these quick share links any time from the <b>Share a link</b> option at the top ' +
                 'right of every Genome Browser page.',
             okLabel: 'Save session',
             onOk: function() { sessModalClose(); sessDoSaveWithName(rand); }
         });
         return;
     }
     sessDoSaveWithName(name);
 }