storebound/tests/fixtures/console/play-content-rating.html
CRT 8ffc83bb39 console fill: walk the whole form; the owner only reviews and presses the final button
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.
2026-10-12 06:51:01 +08:00

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>