App Privacy stopped at "now click Get Started yourself" and every page asked the owner to click Next. The owner should not click what storebound can safely do. - Every button of every console form is classified (navigation, draft-save, final-submit) in FORM_BUTTONS (cli/lib/console-forms.ts), citing Apple's and Google's help pages. A scoped flow gate (flowAllowed) lets navigation through; the generic click gate stays absolute for field clicks. - App Privacy: Get Started, Edit next to Data Types (never the Privacy Policy Edit), each data type / "Set Up <type>", Next, and the Save inside the questionnaire dialogs (a draft: Apple publishes only after Publish, per "Manage app privacy"). Each type's dialog may be one page or purposes > Next > linked > Next > tracking > Save. It ends with "review the summary, then press Publish yourself". Publish is never clicked. - Play content rating and target audience: Next by itself. Save draft, Submit, the final Save, Create and Create app stay the owner's. - An uncertain answer stops the walk on its page (outlined, "answer needed on ...") until the owner has set it; then it goes on. Fixture apple-app-privacy-flow.html (first time, ?existing=1, decoys); tests/console-flow.test.ts with the guardrail that no log line asks the owner to click a navigation control.
33 lines
2.3 KiB
HTML
33 lines
2.3 KiB
HTML
<!doctype html>
|
|
<!-- MODELED, not recorded: a sanitized stand-in for Play Console > Policy > App content > Content rating (IARC), written
|
|
from Google's public help page "Content ratings" (email address, category, questionnaire, Save draft / Next /
|
|
Submit on the Summary). The question wording is modeled on the IARC topics, not copied from the console. -->
|
|
<html lang="en"><head><meta charset="utf-8"><title>Content rating - Play Console</title><script src="_common.js"></script></head>
|
|
<body>
|
|
<h1>Content rating</h1>
|
|
<section data-step>
|
|
<p><label>Email address <input type="email"></label></p>
|
|
<fieldset><legend>Category</legend>
|
|
<label><input type="radio" name="cat"> Game</label>
|
|
<label><input type="radio" name="cat"> Social or communication</label>
|
|
<label><input type="radio" name="cat"> All other app types</label>
|
|
</fieldset>
|
|
<button type="button">Save draft</button> <button type="button" data-next>Next</button>
|
|
</section>
|
|
<section data-step hidden id="q"><button type="button">Save draft</button> <button type="button" data-next>Next</button></section>
|
|
<section data-step hidden><h2>Summary</h2><p>Calculated ratings</p><button type="button">Submit</button></section>
|
|
<script>
|
|
const Q = ['Does the app contain any violence?', 'Does the app contain content that might scare or frighten (fear or horror)?',
|
|
'Does the app contain sexual content or nudity?', 'Does the app contain profanity or crude language?',
|
|
'Does the app contain references to drugs, alcohol or tobacco?', 'Does the app contain crude humour?',
|
|
'Does the app let users gamble with real money?', 'Does the app contain simulated gambling?',
|
|
'Does the app offer randomized paid items (loot boxes)?', 'Can users interact or exchange content with other users?',
|
|
"Does the app share the user's current physical location with other users?", 'Does the app allow users to purchase digital goods?',
|
|
'Does the app give unrestricted internet access, such as a web browser?'];
|
|
Q.forEach((q, i) => {
|
|
const d = document.createElement('div'); d.setAttribute('role', 'radiogroup'); d.setAttribute('aria-label', q);
|
|
d.innerHTML = `<p>${q}</p><label><input type="radio" name="q${i}"> Yes</label><label><input type="radio" name="q${i}"> No</label>`;
|
|
document.getElementById('q').prepend(d);
|
|
});
|
|
</script>
|
|
</body></html>
|