|
|
|
@ -185,4 +185,79 @@ describe("downloadMarkdownFile", () => { |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
test("still revokes object URL when anchor click throws", () => { |
|
|
|
const windowDescriptor = Object.getOwnPropertyDescriptor(globalThis, "window"); |
|
|
|
const documentDescriptor = Object.getOwnPropertyDescriptor(globalThis, "document"); |
|
|
|
const urlDescriptor = Object.getOwnPropertyDescriptor(globalThis, "URL"); |
|
|
|
|
|
|
|
let revokedArg = ""; |
|
|
|
let removed = false; |
|
|
|
const blobUrl = "blob:error-case"; |
|
|
|
const clickError = new Error("click failed"); |
|
|
|
|
|
|
|
const anchor = { |
|
|
|
href: "", |
|
|
|
download: "", |
|
|
|
style: { display: "" }, |
|
|
|
click: () => { |
|
|
|
throw clickError; |
|
|
|
}, |
|
|
|
remove: () => { |
|
|
|
removed = true; |
|
|
|
}, |
|
|
|
}; |
|
|
|
|
|
|
|
Object.defineProperty(globalThis, "window", { |
|
|
|
value: {}, |
|
|
|
configurable: true, |
|
|
|
writable: true, |
|
|
|
}); |
|
|
|
|
|
|
|
Object.defineProperty(globalThis, "document", { |
|
|
|
value: { |
|
|
|
createElement: (_tag: string) => anchor, |
|
|
|
body: { |
|
|
|
appendChild: (_node: unknown) => undefined, |
|
|
|
}, |
|
|
|
}, |
|
|
|
configurable: true, |
|
|
|
writable: true, |
|
|
|
}); |
|
|
|
|
|
|
|
Object.defineProperty(globalThis, "URL", { |
|
|
|
value: { |
|
|
|
createObjectURL: (_blob: Blob) => blobUrl, |
|
|
|
revokeObjectURL: (url: string) => { |
|
|
|
revokedArg = url; |
|
|
|
}, |
|
|
|
}, |
|
|
|
configurable: true, |
|
|
|
writable: true, |
|
|
|
}); |
|
|
|
|
|
|
|
try { |
|
|
|
expect(() => downloadMarkdownFile("broken.md", "# broken")).toThrow("click failed"); |
|
|
|
expect(removed).toBe(true); |
|
|
|
expect(revokedArg).toBe(blobUrl); |
|
|
|
} finally { |
|
|
|
if (windowDescriptor) { |
|
|
|
Object.defineProperty(globalThis, "window", windowDescriptor); |
|
|
|
} else { |
|
|
|
Reflect.deleteProperty(globalThis, "window"); |
|
|
|
} |
|
|
|
|
|
|
|
if (documentDescriptor) { |
|
|
|
Object.defineProperty(globalThis, "document", documentDescriptor); |
|
|
|
} else { |
|
|
|
Reflect.deleteProperty(globalThis, "document"); |
|
|
|
} |
|
|
|
|
|
|
|
if (urlDescriptor) { |
|
|
|
Object.defineProperty(globalThis, "URL", urlDescriptor); |
|
|
|
} else { |
|
|
|
Reflect.deleteProperty(globalThis, "URL"); |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
|