summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/font-access/resources/font-test-utils.js
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/font-access/resources/font-test-utils.js')
-rw-r--r--testing/web-platform/tests/font-access/resources/font-test-utils.js101
1 files changed, 101 insertions, 0 deletions
diff --git a/testing/web-platform/tests/font-access/resources/font-test-utils.js b/testing/web-platform/tests/font-access/resources/font-test-utils.js
new file mode 100644
index 0000000000..e183b35bfa
--- /dev/null
+++ b/testing/web-platform/tests/font-access/resources/font-test-utils.js
@@ -0,0 +1,101 @@
+'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);
+ });
+}