feat: establish reproducible FreeCAD web compatibility baseline
This commit is contained in:
40
public/chrome-persistence-harness.html
Normal file
40
public/chrome-persistence-harness.html
Normal file
@@ -0,0 +1,40 @@
|
||||
<!doctype html>
|
||||
<meta charset="utf-8">
|
||||
<title>Chrome OPFS persistence harness</title>
|
||||
<pre id="result">running</pre>
|
||||
<script type="module">
|
||||
import { createSqliteProjectPersistence } from '/src/facade/projectStore.ts'
|
||||
|
||||
const output = document.querySelector('#result')
|
||||
const report = { schemaVersion: 1, browserId: 'chrome', crossOriginIsolated: globalThis.crossOriginIsolated === true, status: 'running' }
|
||||
const documentSnapshot = {
|
||||
id: 'chrome-opfs-persistence', label: 'Chrome OPFS persistence', version: 7, dirty: true, readOnly: false, units: 'mm',
|
||||
tree: [{ id: 'root', label: 'Root', type: 'feature', state: 'valid' }],
|
||||
objects: [{ id: 'root', typeId: 'PartDesign::Feature', properties: [{ name: 'Label', label: 'Label', type: 'App::PropertyString', value: 'Root', recompute: false }] }],
|
||||
dependencies: [], recompute: { generation: 2, status: 'completed', objectStates: { root: 'up-to-date' }, dirtyObjects: [], order: ['root'], errors: [] },
|
||||
}
|
||||
let persistence
|
||||
try {
|
||||
persistence = createSqliteProjectPersistence()
|
||||
const capabilities = await persistence.initialize()
|
||||
const saved = await persistence.save(documentSnapshot)
|
||||
const loaded = await persistence.load(documentSnapshot.id)
|
||||
const checkpoint = await persistence.loadCheckpoint(documentSnapshot.id, documentSnapshot.version)
|
||||
const bytes = new TextEncoder().encode('chrome-opfs-resource')
|
||||
const resource = await persistence.resource.put(bytes, 'text/plain')
|
||||
const restoredBytes = await persistence.resource.get(resource.hash)
|
||||
await persistence.resource.release(resource.hash)
|
||||
const recovery = await persistence.recovery(documentSnapshot.id)
|
||||
report.capabilities = capabilities
|
||||
report.roundTrip = { savedMode: saved.mode, loadedVersion: loaded?.version ?? null, loadedLabel: loaded?.label ?? null, checkpointVersion: checkpoint?.version ?? null, resourceRoundTrip: restoredBytes ? new TextDecoder().decode(restoredBytes) === 'chrome-opfs-resource' : false, recoveryIntegrity: recovery.integrity, checkpointCount: recovery.checkpoints.length }
|
||||
report.status = report.crossOriginIsolated && capabilities.mode === 'sqlite-opfs' && capabilities.sqliteWasm && capabilities.opfs && saved.mode === 'sqlite-opfs' && loaded?.id === documentSnapshot.id && loaded.version === documentSnapshot.version && checkpoint?.version === documentSnapshot.version && report.roundTrip.resourceRoundTrip && recovery.integrity === 'ok' ? 'pass' : 'failed'
|
||||
} catch (error) {
|
||||
report.status = 'failed'
|
||||
report.error = error instanceof Error ? `${error.name}: ${error.message}` : String(error)
|
||||
} finally {
|
||||
await persistence?.dispose().catch(() => {})
|
||||
}
|
||||
output.textContent = JSON.stringify(report, null, 2)
|
||||
await fetch('/__persistence-report', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify(report) })
|
||||
if (report.status !== 'pass') throw new Error(report.error || 'Chrome OPFS persistence harness failed.')
|
||||
</script>
|
||||
Reference in New Issue
Block a user