Everything written this session that has not been through the device: rounds 43 to 48 (each patch adversarially verified, 43's transient-notice expectation fixed), a partial round 49, the pipeline scripts, the Android Auto design and the icon comparison mock. Also the two harness changes that were never A/B'd — adaptive waits, which may only shorten a declared wait and never lengthen it, and a ship that runs the mock walk and the deploy at the same time. The A/B and its 255-step baseline are in handoff/tools; main stays at what the phone has actually walked.
47 lines
3.2 KiB
Plaintext
47 lines
3.2 KiB
Plaintext
/* the number this round exists to hold at zero, and who broke it */
|
|
a11yAnon: a11yNone.length,
|
|
a11yWho: a11yNone.slice(0, 3).map(whatis).join(' | '),
|
|
a11yBad: a11yAll.map(function (el) { var nm = aname(el); if (!nm) return ''; var j = junk(el, nm); return j ? j + ':' + whatis(el) + ':' + nm.slice(0, 22) : ''; }).filter(Boolean).slice(0, 3).join(' | '),
|
|
/* a layer that is off-screen but still in the tree: the closed
|
|
sheets, the hidden mini bar, the nav under a sheet */
|
|
a11yGhost: (function () {
|
|
var n = 0;
|
|
[].forEach.call(document.querySelectorAll('.sheet:not(.up), .halfsheet:not(.up), .mini.hidden, .nav.gone'), function (h) {
|
|
if (h.matches(A11Y_SEL) && exposed(h)) n++;
|
|
n += [].filter.call(h.querySelectorAll(A11Y_SEL), exposed).length;
|
|
});
|
|
return n;
|
|
})(),
|
|
/* a control that LOOKS chosen and does not say so */
|
|
a11yState: (function () {
|
|
var bad = [];
|
|
[].forEach.call(document.querySelectorAll('.row .sw'), function (sw) {
|
|
var b = sw.closest('button, [role=button]');
|
|
if (!b || !exposed(b)) return;
|
|
var want = sw.classList.contains('on') ? 'true' : 'false';
|
|
if (b.getAttribute('role') !== 'switch' || b.getAttribute('aria-checked') !== want) bad.push('sw:' + aname(b).slice(0, 18));
|
|
});
|
|
[].forEach.call(document.querySelectorAll('.segtabs button, .np-faces .fbtn, .nav button'), function (b) {
|
|
if (!exposed(b)) return;
|
|
var want = b.classList.contains('on') ? 'true' : 'false';
|
|
if (b.getAttribute('role') !== 'tab' || b.getAttribute('aria-selected') !== want) bad.push('tab:' + aname(b).slice(0, 18));
|
|
});
|
|
[].forEach.call(document.querySelectorAll('button.chip'), function (b) {
|
|
if (!exposed(b) || b.classList.contains('tchip')) return;
|
|
if (!b.hasAttribute('aria-pressed')) { if (b.classList.contains('on')) bad.push('chip:' + aname(b).slice(0, 18)); return; }
|
|
if (b.getAttribute('aria-pressed') !== (b.classList.contains('on') ? 'true' : 'false')) bad.push('chip:' + aname(b).slice(0, 18));
|
|
});
|
|
return bad.slice(0, 3).join(' | ');
|
|
})(),
|
|
/* the layer on top: its role, whether it is modal, its name, and
|
|
whether the focus went with it */
|
|
dlg: (function () {
|
|
var d = document.querySelector('.viewer') || document.querySelector('.syncroom')
|
|
|| document.querySelector('.halfsheet.up') || document.querySelector('.sheet.up');
|
|
if (!d) return '';
|
|
var nm = (d.getAttribute('aria-label') || '').trim();
|
|
return (d.getAttribute('role') || '-') + '/' + (d.getAttribute('aria-modal') || '-') + '/' + nm.slice(0, 34) + '/' + (d.contains(document.activeElement) ? 'focus' : 'nofocus');
|
|
})(),
|
|
navTabs: [].map.call(document.querySelectorAll('.nav button'), function (b) { return aname(b) + (b.getAttribute('aria-selected') === 'true' ? '*' : ''); }).join('|'),
|
|
announce: ((document.querySelector('[data-live]') || {}).textContent || '').trim(),
|