| '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); |
| }); |
| } |