60 lines
4.0 KiB
HTML
60 lines
4.0 KiB
HTML
<!doctype html>
|
|
<meta charset="utf-8">
|
|
<title>Chrome native Fillet history harness</title>
|
|
<pre id="result">running</pre>
|
|
<script type="module">
|
|
import { BitbybitGeometryRuntime } from '/src/facade/geometryRuntime.ts'
|
|
import { NativeOcctHistoryWorkerProvider } from '/src/facade/nativeHistoryWorkerClient.ts'
|
|
|
|
const output = document.querySelector('#result')
|
|
const report = { schemaVersion: 1, browserId: 'chrome', executionContext: 'geometry-and-history-workers', crossOriginIsolated: globalThis.crossOriginIsolated === true, status: 'running' }
|
|
let runtime
|
|
let provider
|
|
let base
|
|
let result
|
|
try {
|
|
runtime = new BitbybitGeometryRuntime()
|
|
const capabilities = await runtime.initialize()
|
|
provider = new NativeOcctHistoryWorkerProvider({ moduleUrl: '/native/occt-history/bitbybit-occt-history.js' })
|
|
const nativeCapabilities = await provider.initialize()
|
|
runtime.configureNativeHistory(provider)
|
|
const context = { documentId: 'chrome-native-fillet', documentVersion: 1 }
|
|
base = await runtime.createBox({ ...context, width: 6, length: 6, height: 6, center: [0, 0, 0], originOnCenter: true })
|
|
result = await runtime.fillet({ ...context, base, radius: 0.4, indexes: [0] })
|
|
const [quality, mass] = await Promise.all([runtime.qualityReport(result), runtime.massProperties(result)])
|
|
const markerDirectory = await navigator.storage.getDirectory()
|
|
const markerName = 'native-fillet-history-chrome-marker.json'
|
|
const marker = await markerDirectory.getFileHandle(markerName, { create: true })
|
|
const writable = await marker.createWritable()
|
|
await writable.write(JSON.stringify({ operation: 'fillet', provider: nativeCapabilities.providerId }))
|
|
await writable.close()
|
|
const markerText = await (await marker.getFile()).text()
|
|
const records = await runtime.topologyHistory({ ...context, operationId: 'chrome-native-fillet-history', operation: 'fillet', radius: 0.4, inputs: [{ objectId: 'Base', shape: base }], result })
|
|
const relations = { modified: records.filter((record) => record.relation === 'modified').length, generated: records.filter((record) => record.relation === 'generated').length, deleted: records.filter((record) => record.relation === 'deleted').length }
|
|
report.capabilities = capabilities
|
|
report.nativeCapabilities = nativeCapabilities
|
|
report.history = { recordCount: records.length, relations, sourceObjects: [...new Set(records.map((record) => record.sourceObjectId))] }
|
|
report.result = { structuralValid: quality.structuralValid, solids: quality.solids, volume: mass.volume }
|
|
report.opfs = { markerCreated: true, markerSuite: JSON.parse(markerText).operation, markerRemoved: false }
|
|
await markerDirectory.removeEntry(markerName)
|
|
report.opfs.markerRemoved = true
|
|
await runtime.release(result)
|
|
result = undefined
|
|
await runtime.release(base)
|
|
base = undefined
|
|
report.afterRelease = { shapeCount: runtime.capabilities().shapeCount, kernelReferenceCount: runtime.capabilities().kernelReferenceCount }
|
|
report.status = report.crossOriginIsolated && capabilities.status === 'ready' && nativeCapabilities.availability === 'available' && nativeCapabilities.operations.includes('fillet') && records.length > 0 && relations.modified > 0 && relations.generated > 0 && relations.deleted > 0 && quality.structuralValid && quality.solids === 1 && mass.volume > 0 && mass.volume < 216 && report.opfs.markerSuite === 'fillet' && report.opfs.markerRemoved && report.afterRelease.shapeCount === 0 && report.afterRelease.kernelReferenceCount === 0 ? 'pass' : 'failed'
|
|
} catch (error) {
|
|
report.status = 'failed'
|
|
report.error = error instanceof Error ? `${error.name}: ${error.message}` : String(error)
|
|
} finally {
|
|
if (result) await runtime?.release(result).catch(() => {})
|
|
if (base) await runtime?.release(base).catch(() => {})
|
|
provider?.dispose()
|
|
runtime?.dispose()
|
|
}
|
|
output.textContent = JSON.stringify(report, null, 2)
|
|
await fetch('/__native-fillet-history-report', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify(report) })
|
|
if (report.status !== 'pass') throw new Error(report.error || 'Chrome native Fillet history harness failed.')
|
|
</script>
|