release: v2.1.17

Render upload progress from fractional transfer values while keeping the visible percentage rounded. Move the green fill with a linear compositor transform and cover the 92-to-93 percent transition with monotonic frame-level Electron assertions.

Keep Electron UI verification listeners loopback-only so development validation no longer raises a Windows Firewall prompt under electron.exe. Extend the public source allowlist with the focused network safety regression coverage.
This commit is contained in:
Sucukdeluxe
2026-08-13 04:37:18 +02:00
parent a299fc204b
commit b7754f355b
10 changed files with 137 additions and 32 deletions
+7 -5
View File
@@ -1820,7 +1820,8 @@ function buildRowHtml(job) {
const elapsed = formatTime(job.elapsed);
const remaining = formatTime(job.remaining);
const speed = job.speedKbs > 0 ? `${formatSpeed(job.speedKbs)}` : '';
const pct = Math.min(100, Math.round((job.progress || 0) * 100));
const progress = Math.min(1, Math.max(0, Number(job.progress) || 0));
const pct = Math.round(progress * 100);
const link = job.result ? (job.result.download_url || job.result.embed_url || '') : '';
return `<tr class="${rowClass}" data-job-id="${job.id}" data-link="${escapeAttr(link)}" tabindex="0" aria-selected="${selectedJobIds.has(job.id)}" style="height:${VIRTUAL_ROW_HEIGHT}px">
@@ -1834,7 +1835,7 @@ function buildRowHtml(job) {
<td class="col-progress">
<div class="progress-cell">
<div class="progress-bar-bg">
<div class="progress-bar-fill ${statusClass}" style="width:${pct}%"></div>
<div class="progress-bar-fill ${statusClass}" style="transform:scaleX(${progress})"></div>
</div>
<span class="progress-pct">${job.status === 'preview' ? '' : pct + '%'}</span>
</div>
@@ -1850,7 +1851,8 @@ function _updateRowInPlace(tr, job) {
const elapsed = formatTime(job.elapsed);
const remaining = formatTime(job.remaining);
const speed = job.speedKbs > 0 ? `${formatSpeed(job.speedKbs)}` : '';
const pct = Math.min(100, Math.round((job.progress || 0) * 100));
const progress = Math.min(1, Math.max(0, Number(job.progress) || 0));
const pct = Math.round(progress * 100);
const link = job.result ? (job.result.download_url || job.result.embed_url || '') : '';
// Write DOM only when the target value actually changes — a no-op progress
@@ -1881,8 +1883,8 @@ function _updateRowInPlace(tr, job) {
const fill = cells[7].querySelector('.progress-bar-fill');
if (fill) {
const pctStr = pct + '%';
if (fill.style.width !== pctStr) fill.style.width = pctStr;
const progressTransform = `scaleX(${progress})`;
if (fill.style.transform !== progressTransform) fill.style.transform = progressTransform;
const fillClass = `progress-bar-fill ${statusClass}`;
if (fill.className !== fillClass) fill.className = fillClass;
}
+5 -3
View File
@@ -518,10 +518,12 @@ body.col-resizing, body.col-resizing * { cursor: col-resize !important; user-sel
overflow: hidden;
}
.progress-bar-fill {
width: 100%;
height: 100%;
border-radius: 2px;
will-change: width;
transition: width 220ms ease-out;
transform-origin: left center;
will-change: transform;
transition: transform 360ms linear;
}
.progress-bar-fill.status-uploading { background: linear-gradient(90deg, var(--success), var(--success-end)); }
.progress-bar-fill.status-getting-server { background: var(--accent); }
@@ -1749,7 +1751,7 @@ select.hs-input { max-width: none; width: auto; min-width: 140px; }
}
.progress-bar-fill {
transition-duration: 220ms !important;
transition-duration: 360ms !important;
}
.menu-opening {