Allow explicit retry of failed native preview preparation
This commit is contained in:
1 parent
370db7e791
commit
f7f67afff9
4 files changed
+35
-3
No files matched your search
@@ -264,9 +264,21 @@ const mediaLane = new LatestLane<PreviewRequest>(
|
||||
(request) => previewRevision.accepts(request.revision),
|
||||
(request, error) => {
|
||||
if (!previewRevision.accepts(request.revision)) return;
|
||||
element("media-preview-status").hidden = false;
|
||||
element("media-preview-status").textContent =
|
||||
`Preview unavailable: ${String(error)}. Use Open file.`;
|
||||
const status = element("media-preview-status");
|
||||
status.hidden = false;
|
||||
status.textContent = `Preview unavailable: ${String(error)}. Use Open file.`;
|
||||
const retry = document.createElement("button");
|
||||
retry.type = "button";
|
||||
retry.textContent = "Retry preview";
|
||||
retry.addEventListener("click", () => {
|
||||
const revision = previewRevision.retry(request.revision);
|
||||
if (revision === undefined) return;
|
||||
unloadMedia();
|
||||
status.hidden = false;
|
||||
status.textContent = "Preparing media preview…";
|
||||
mediaLane.submit({ revision, result: request.result });
|
||||
});
|
||||
status.append(" ", retry);
|
||||
},
|
||||
);
|
||||
let displayedRequestId: number | null = null;
|
||||
|
||||
@@ -98,6 +98,10 @@ export class PreviewRevision {
|
||||
accepts(revision: number) {
|
||||
return revision === this.revision && this.key !== "";
|
||||
}
|
||||
retry(revision: number): number | undefined {
|
||||
if (!this.accepts(revision)) return undefined;
|
||||
return ++this.revision;
|
||||
}
|
||||
clear() {
|
||||
this.key = "";
|
||||
this.revision++;
|
||||
|
||||
@@ -11,6 +11,18 @@ import {
|
||||
import { LatestLane } from "../src/search-state.ts";
|
||||
const settle = () => new Promise((resolve) => setImmediate(resolve));
|
||||
|
||||
test("explicit preview retry invalidates old work and cannot retry a stale selection", () => {
|
||||
const state = new PreviewRevision();
|
||||
const first = state.select("first");
|
||||
const retried = state.retry(first.revision);
|
||||
assert.equal(typeof retried, "number");
|
||||
assert.equal(state.accepts(first.revision), false);
|
||||
assert.equal(state.accepts(retried), true);
|
||||
assert.equal(state.retry(first.revision), undefined);
|
||||
state.select("second");
|
||||
assert.equal(state.retry(retried), undefined);
|
||||
});
|
||||
|
||||
test("indexed content refresh invalidates a decoded preview at the same path", () => {
|
||||
const revision = new PreviewRevision();
|
||||
const source = { kind: "timestamp_ms", number: 1200 };
|
||||
|
||||
Reference in new issue
Block a user