blob: f3c8a22b7adc5e84c2183c3b8f5c49245169cc7c [file] [log] [blame]
function check_report_format(report, expected_url, expected_disposition) {
assert_equals(report.type, 'document-policy-violation');
assert_equals(report.url, expected_url);
assert_equals(report.body.featureId, 'font-display-late-swap');
assert_equals(report.body.disposition, expected_disposition);
assert_true('sourceFile' in report.body);
assert_true('lineNumber' in report.body);
assert_true('columnNumber' in report.body);
}
function check_violation_report_format(report, expected_url) {
check_report_format(report, expected_url, 'enforce');
}
function check_report_only_report_format(report, expected_url) {
check_report_format(report, expected_url, 'report');
}
function makeFontFaceDeclaration(family, display) {
url = '/fonts/Ahem.ttf?pipe=trickle(d1)'; // Before the swap period is over
return `@font-face { font-family: ${family}; src: url("${url}"); font-display: ${display}; }`;
}
/**
* Run font-display test with given parameters.
*
* A violation report is expected with fontDisplayValue set to
* ['', 'auto', 'block', 'swap']
*
* No violation report is expected with fontDisplayValue set to
* ['fallback', 'optional']
* @param {String} fontDisplayValue
* @param {(Report, String) => () | undefined} format_check pass a callback to
* check report format if a violation report is expected. If no report is
* expected to be generated, leave this argument undefined.
*/
function runTest(fontDisplayValue, format_check) {
window.onload = () => {
const family = fontDisplayValue + '-face';
const rule = makeFontFaceDeclaration(family, fontDisplayValue);
const style = document.createElement('style');
style.innerHTML = rule;
document.body.appendChild(style);
const div = document.createElement('div');
div.textContent = 'a';
div.style.fontFamily = family + ', Arial';
document.body.appendChild(div);
};
const t = async_test('font-display-late-swap Report Format');
new ReportingObserver(
t.step_func_done((reports, _) => {
assert_equals(reports.length, 1);
assert_true(!!format_check);
format_check(reports[0], document.location.href);
}), {
types: ['document-policy-violation'],
buffered: true
}
).observe();
t.step_timeout(t.step_func_done(() => {
assert_false(!!format_check, 'Expected violation report but did not get one.');
}), 400); // 400ms should be sufficient to observe the violation report.
}
function testFontDisplayPolicyViolationGenerated(fontDisplayValue) {
runTest(fontDisplayValue, check_violation_report_format);
}
function testFontDisplayPolicyReportOnlyGenerated(fontDisplayValue) {
runTest(fontDisplayValue, check_report_only_report_format);
}
function testCompliantWithFontDisplayPolicy(fontDisplayValue) {
runTest(fontDisplayValue);
}