<feed xmlns='http://www.w3.org/2005/Atom'>
<title>newos4/modules/test/test-download-url.js, branch main</title>
<subtitle>newOS4 - the browser terminal that runs WebX11 user spaces</subtitle>
<id>https://newos.webx11.duckdns.org/newos4/atom?h=main</id>
<link rel='self' href='https://newos.webx11.duckdns.org/newos4/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://newos.webx11.duckdns.org/newos4/'/>
<updated>2026-10-26T13:56:44+00:00</updated>
<entry>
<title>feat(newos4): mobile download/share UX — deferred blob revoke, multi-select, Web Share, 44px targets</title>
<updated>2026-10-26T13:56:44+00:00</updated>
<author>
<name>Agando</name>
<email>roduccomm@gmail.com</email>
</author>
<published>2026-10-26T13:56:44+00:00</published>
<link rel='alternate' type='text/html' href='https://newos.webx11.duckdns.org/newos4/commit/?id=0e3d019e8b2dcc335f02a277039368e8b7d36b03'/>
<id>urn:sha1:0e3d019e8b2dcc335f02a277039368e8b7d36b03</id>
<content type='text'>
Executes .hermes/plans/2026-10-24_051600-newos4-mobile-download-share.md (approved via the feedback
dashboard; marker autonomy: safe). Front-end only, v4.6.94 -&gt; v4.6.95.

T1 modules/ext/filemgr.js — URL.revokeObjectURL ran in the same tick as a.click(); iOS Safari and
   Android Chrome hand the blob: URL to the download manager asynchronously, so the transfer was
   aborted while the status line still said "Downloaded". Now revoked after 30 s.
T2 download honours the multi-selection via _getSelectedPaths() (falling back to _selectedFile),
   reports "⬇ Downloaded N files" and "❌ Skipped &lt;path&gt;" instead of a silent partial success.
T3 share: navigator.share -&gt; clipboard.writeText -&gt; inline read-only &lt;input&gt; (focused, selected).
   prompt() is suppressed in iOS standalone PWAs and most Android WebViews, which is why tapping 🔗
   did nothing. Unresolvable space now reports "🔗 Share unavailable — no space resolved".
T4 both preview toolbar buttons: min-height/min-width 44px, touch-action manipulation, 1em, gap 10px
   (was 24px/0.85em/6px — the smallest tap targets in the UI).
T5 _previewShareUrl falls back _resolveSpaceName -&gt; _detectSpaceName (webdav.js:22) -&gt; page path,
   and returns null rather than emitting /spaces//&lt;path&gt;.
T6 the URL helpers are now module-scope pure functions exported for Node, so
   modules/test/test-download-url.js tests the shipped code instead of a local copy (4 -&gt; 6 cases).
   Also fixes a latent bug that made require() impossible: `typeof window.webx11` throws under Node
   because typeof does not protect a member access on an undefined global.

Verified on the served bundle (filemgr.js is concatenated into critical-ext-bundle.js, NOT
core-bundle.js — the plan's T7 grep pointed at the wrong file): HTTP 200, 129 867 B, 2x
navigator.share, 3x fmBuildShareUrl, deferred revoke present, 11x min-height:44px.
Live browser probe on /spaces/newos4/main.html: _previewShareUrl('docs/a.md') -&gt;
https://webx11.duckdns.org/spaces/newos4/docs/a.md (no double slash); with navigator.share absent
and clipboard blocked, clicking 🔗 produced .fm-share-input containing that URL; button style ends
min-height:44px;min-width:44px;touch-action:manipulation; toolbar gap:10px.
node modules/test/test-download-url.js -&gt; 6 PASS. lint-no-undef clean (55 files).
maintain: PASS version v4.6.95 x3, syntax OK, HTTP 200 /main.html.

Also adds admin/docs/session-overview-2026-10-26.md (glm-5.3-compressed session record).
</content>
</entry>
<entry>
<title>fix(newos4): download link uses the user's space; WebDAV share copies verified file links; preview fullscreen+share; files-&gt;WebDAV upload button (v4.6.45)</title>
<updated>2026-10-21T20:34:12+00:00</updated>
<author>
<name>Agando</name>
<email>roduccomm@gmail.com</email>
</author>
<published>2026-10-21T20:34:12+00:00</published>
<link rel='alternate' type='text/html' href='https://newos.webx11.duckdns.org/newos4/commit/?id=82de48abbac8ae50f3c3859a4118a606145fc55a'/>
<id>urn:sha1:82de48abbac8ae50f3c3859a4118a606145fc55a</id>
<content type='text'>
- download: URL built from _resolveSpaceName() (config url = logged-in user), not the page space
- WebDAV browser 🔗: shares selected FILES only, URL-encoded, HEAD-verified (200) before claiming success;
  folders offer a tar fallback instead of a guaranteed-403 link
- file manager preview: ⛶ fullscreen + 🔗 copy-link toolbar (was none)
- file manager toolbar: ☁ WebDAV publishes selected/current file via webdav-push
- modules/test/test-download-url.js: 4 PASS
- rebuild bundles, bump v4.6.44 -&gt; v4.6.45 (loader + 3 script tags)
</content>
</entry>
</feed>
