console fill: labels match straight and curly quotes (Developer’s Advertising, the user’s identity); an App Privacy dialog step with no inputs (the definitions page) is passed with Next

This commit is contained in:
CRTkafa 2026-10-12 07:52:11 +08:00
parent 0035931734
commit 18fde37b9b
4 changed files with 33 additions and 9 deletions

View file

@ -238,7 +238,7 @@ describe.skipIf(!browser)('App Privacy: each data type set up from the real page
expect(Object.keys(got).sort()).toEqual([...SIX_NAMES].sort());
const c = await clicks(b);
for (const never of ['?', 'Publish', 'Edit', 'Cancel', 'Back']) expect(c).not.toContain(never);
expect(c.filter(x => x === 'Next')).toHaveLength(12);
expect(c.filter(x => x === 'Next')).toHaveLength(18);
expect(c.filter(x => x === 'Save')).toHaveLength(6);
expect(log.lines).toContain('the Data Types section lists exactly the collected types of the config: storebound sets up each one');
expect(log.lines).toContain('clicked "Set Up Purchase History" (navigation)');
@ -297,7 +297,7 @@ describe.skipIf(!browser)('App Privacy: each data type set up from the real page
expect(pj.controls).toContainEqual({ role: 'switch', name: 'Account identity', checked: false });
await Bun.sleep(500);
const c = await clicks(b);
expect(c.filter(x => x === 'Next')).toHaveLength(2 * 2 + 1); // two types done, Device ID's first step only
expect(c.filter(x => x === 'Next')).toHaveLength(2 * 3 + 1); // two types done (purposes, linked, definitions), Device ID's first step only
expect(c).not.toContain('Publish');
expect(c).not.toContain('?');
await b.context.close();

View file

@ -41,7 +41,7 @@ const ROWS = [
['Usage Data', 'Product Interaction', 'Product Interaction'],
['Diagnostics', 'Crash Data', 'Crash Data'],
];
const PURPOSES = ['Third-Party Advertising', "Developer's Advertising or Marketing", 'Analytics', 'Product Personalization', 'App Functionality', 'Other Purposes'];
const PURPOSES = ['Third-Party Advertising', 'Developer’s Advertising or Marketing', 'Analytics', 'Product Personalization', 'App Functionality', 'Other Purposes'];
const q = new URLSearchParams(location.search);
const unknown = q.get('unknown');
const preset = Object.fromEntries(q.getAll('preset').map(v => { const [t, ps] = v.split(':'); return [t, ps ? ps.split('|') : []]; }));
@ -68,7 +68,7 @@ function setUpDone(type, purposes) {
a.innerHTML = `<p>${purposes.join(', ')}</p><button type="button" role="button">Edit</button>`;
a.querySelector('button').addEventListener('click', () => openType(type));
}
// the per-type dialog: purposes > Next > linked > Next > tracking > Save
// the per-type dialog: purposes > Next > linked > Next > definitions (text only, real console) > Next > tracking > Save
function openType(type) {
const low = type.toLowerCase();
const d = document.createElement('dialog');
@ -82,9 +82,10 @@ function openType(type) {
+ PURPOSES.map((p, i) => `<div><input type="checkbox" id="purpose_${i}"><div><label for="purpose_${i}"><p>${p}</p><p>Description of ${p}</p></label></div></div>`).join('')
+ `<div><button type="button">Cancel</button><button type="button" data-go="2">Next</button></div></div>`
+ `<div data-p="2" hidden>${step2}<div><button type="button" data-go="1">Back</button><button type="button">Cancel</button><button type="button" data-go="3">Next</button></div></div>`
+ `<div data-p="3" hidden>`
+ `<div data-p="3" hidden><p>Let’s define two important terms before continuing.</p><h5>Tracking</h5><p>Linking data collected from your app with third-party data.</p><h5>Third-Party Data</h5><p>Data about a user collected from other companies.</p><div><button type="button" data-go="2">Back</button><button type="button">Cancel</button><button type="button" data-go="4">Next</button></div></div>`
+ `<div data-p="4" hidden>`
+ radio('tracking', 'yes', `<strong>Yes</strong>, we use ${low} for tracking purposes`) + radio('tracking', 'no', `<strong>No</strong>, we do not use ${low} for tracking purposes`)
+ `<div><button type="button" data-go="2">Back</button><button type="button">Cancel</button><button type="button" data-save>Save</button></div></div></div>`;
+ `<div><button type="button" data-go="3">Back</button><button type="button">Cancel</button><button type="button" data-save>Save</button></div></div></div>`;
d.setAttribute('open', '');
d.addEventListener('click', e => {
const go = e.target.closest('[data-go]')?.getAttribute('data-go');