100 lines
2.7 KiB
JavaScript
100 lines
2.7 KiB
JavaScript
'use strict';
|
|
|
|
// Filters an array of FontData by font names. Used to reduce down
|
|
// the size of test data.
|
|
function filterFonts(fonts, filter) {
|
|
const filteredFont = [];
|
|
for (const font of fonts) {
|
|
if (filter.includes(font.postscriptName)) {
|
|
filteredFont.push(font);
|
|
}
|
|
}
|
|
return filteredFont;
|
|
}
|
|
|
|
async function parseFontData(fontBlob) {
|
|
// Parsed result to be returned.
|
|
const fontInfo = {};
|
|
|
|
try {
|
|
// Parse the version info.
|
|
fontInfo.versionTag = await getTag(fontBlob, 0);
|
|
// Parse the table data.
|
|
const numTables = await getUint16(fontBlob, 4);
|
|
[fontInfo.tables, fontInfo.tableMeta] =
|
|
await getTableData(fontBlob, numTables);
|
|
} catch (error) {
|
|
throw `Error parsing font table: ${error.message}`;
|
|
}
|
|
|
|
return fontInfo;
|
|
}
|
|
|
|
async function getTableData(fontBlob, numTables) {
|
|
const dataMap = new Map();
|
|
const metaMap = new Map();
|
|
let blobOffset = 12;
|
|
|
|
for (let i = 0; i < numTables; i++) {
|
|
const tag = await getTag(fontBlob, blobOffset);
|
|
const checksum = await getUint32(fontBlob, blobOffset + 4);
|
|
const offset = await getUint32(fontBlob, blobOffset + 8);
|
|
const size = await getUint32(fontBlob, blobOffset + 12);
|
|
const tableBlob = fontBlob.slice(offset, offset + size);
|
|
dataMap.set(tag, tableBlob);
|
|
metaMap.set(tag, {checksum, offset, size});
|
|
blobOffset += 16;
|
|
}
|
|
|
|
return [dataMap, metaMap];
|
|
}
|
|
|
|
async function getTag(blob, offset) {
|
|
return (new TextDecoder)
|
|
.decode(await blob.slice(offset, offset + 4).arrayBuffer());
|
|
}
|
|
|
|
async function getUint16(blob, offset) {
|
|
const slice = blob.slice(offset, offset + 2);
|
|
const buf = await slice.arrayBuffer();
|
|
const dataView = new DataView(buf);
|
|
return dataView.getUint16(0);
|
|
}
|
|
|
|
async function getUint32(blob, offset) {
|
|
const slice = blob.slice(offset, offset + 4);
|
|
const buf = await slice.arrayBuffer();
|
|
const dataView = new DataView(buf);
|
|
return dataView.getUint32(0);
|
|
}
|
|
|
|
function promiseDocumentReady() {
|
|
return new Promise(resolve => {
|
|
if (document.readyState === 'complete') {
|
|
resolve();
|
|
}
|
|
window.addEventListener('load', () => {
|
|
resolve();
|
|
}, {once: true});
|
|
});
|
|
}
|
|
|
|
function isPlatformSupported() {
|
|
if (navigator.platform.indexOf('Mac') !== -1 ||
|
|
navigator.platform.indexOf('Win') !== -1 ||
|
|
navigator.platform.indexOf('Linux') !== -1) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function font_access_test(test_function, name, properties) {
|
|
return promise_test(async (t) => {
|
|
if (!isPlatformSupported()) {
|
|
await promise_rejects_dom(t, 'NotSupportedError', self.queryLocalFonts());
|
|
return;
|
|
}
|
|
await test_driver.set_permission({name: 'local-fonts'}, 'granted');
|
|
await test_function(t, name, properties);
|
|
});
|
|
}
|