)]}'
{"id": 5068277495758848, "name": "Media element pseudo-classes", "summary": "The :playing, :paused, :seeking, :buffering, :stalled, :muted, and :volume-locked CSS pseudo-classes match <audio> and <video> elements based on their state.\n\nThis is one of the focus areas in https://wpt.fyi/interop-2026.", "markdown_fields": [], "blink_components": ["Blink>Media"], "star_count": 74, "search_tags": [], "created": {"by": "foolip@chromium.org", "when": "2025-11-17 09:33:59.608651"}, "updated": {"by": "foolip@chromium.org", "when": "2026-10-28 15:35:07.576453"}, "category": "Multimedia", "category_int": 4, "feature_notes": null, "web_feature": "media-pseudos", "is_official_web_feature": true, "webdx_usecounter_enum": null, "enterprise_feature_categories": [], "enterprise_product_category": 0, "is_releasenotes_content_reviewed": false, "is_releasenotes_publish_ready": false, "stages": [{"id": 6278507072192512, "created": "2025-11-17 09:34:00.116926", "feature_id": 5068277495758848, "stage_type": 220, "display_name": null, "pm_emails": [], "tl_emails": [], "ux_emails": [], "te_emails": [], "intent_thread_url": "https://groups.google.com/a/chromium.org/d/msgid/blink-dev/691af1b8.050a0220.b6611.0871.GAE%40google.com", "announcement_url": null, "experiment_goals": null, "experiment_risks": null, "origin_trial_id": null, "origin_trial_feedback_url": null, "ot_action_requested": false, "ot_approval_buganizer_component": null, "ot_approval_buganizer_custom_field_id": null, "ot_approval_criteria_url": null, "ot_approval_group_email": null, "ot_chromium_trial_name": null, "ot_description": null, "ot_display_name": null, "ot_documentation_url": null, "ot_emails": [], "ot_feedback_submission_url": null, "ot_has_third_party_support": false, "ot_is_critical_trial": false, "ot_is_deprecation_trial": false, "ot_owner_email": null, "ot_requester_email": null, "ot_require_approvals": false, "ot_use_counter_bucket_number": null, "ot_webfeature_use_counter": null, "extensions": [], "experiment_extension_reason": null, "ot_stage_id": null, "finch_url": null, "rollout_milestone": null, "rollout_platforms": [], "rollout_details": null, "rollout_impact": 2, "rollout_stage_plan": null, "enterprise_policies": [], "desktop_first": null, "android_first": null, "ios_first": null, "webview_first": null, "desktop_last": null, "android_last": null, "ios_last": null, "webview_last": null}, {"id": 5072951963680768, "created": "2025-11-17 09:34:00.207308", "feature_id": 5068277495758848, "stage_type": 230, "display_name": null, "pm_emails": [], "tl_emails": [], "ux_emails": [], "te_emails": [], "intent_thread_url": null, "announcement_url": null, "experiment_goals": null, "experiment_risks": null, "origin_trial_id": null, "origin_trial_feedback_url": null, "ot_action_requested": false, "ot_approval_buganizer_component": null, "ot_approval_buganizer_custom_field_id": null, "ot_approval_criteria_url": null, "ot_approval_group_email": null, "ot_chromium_trial_name": null, "ot_description": null, "ot_display_name": null, "ot_documentation_url": null, "ot_emails": [], "ot_feedback_submission_url": null, "ot_has_third_party_support": false, "ot_is_critical_trial": false, "ot_is_deprecation_trial": false, "ot_owner_email": null, "ot_requester_email": null, "ot_require_approvals": false, "ot_use_counter_bucket_number": null, "ot_webfeature_use_counter": null, "extensions": [], "experiment_extension_reason": null, "ot_stage_id": null, "finch_url": null, "rollout_milestone": null, "rollout_platforms": [], "rollout_details": null, "rollout_impact": 2, "rollout_stage_plan": null, "enterprise_policies": [], "desktop_first": null, "android_first": null, "ios_first": null, "webview_first": null, "desktop_last": null, "android_last": null, "ios_last": null, "webview_last": null}, {"id": 5185523794706432, "created": "2025-11-17 09:34:00.263352", "feature_id": 5068277495758848, "stage_type": 250, "display_name": null, "pm_emails": [], "tl_emails": [], "ux_emails": [], "te_emails": [], "intent_thread_url": null, "announcement_url": null, "experiment_goals": null, "experiment_risks": null, "origin_trial_id": null, "origin_trial_feedback_url": null, "ot_action_requested": false, "ot_approval_buganizer_component": null, "ot_approval_buganizer_custom_field_id": null, "ot_approval_criteria_url": null, "ot_approval_group_email": null, "ot_chromium_trial_name": null, "ot_description": null, "ot_display_name": null, "ot_documentation_url": null, "ot_emails": [], "ot_feedback_submission_url": null, "ot_has_third_party_support": false, "ot_is_critical_trial": false, "ot_is_deprecation_trial": false, "ot_owner_email": null, "ot_requester_email": null, "ot_require_approvals": false, "ot_use_counter_bucket_number": null, "ot_webfeature_use_counter": null, "extensions": [], "experiment_extension_reason": null, "ot_stage_id": null, "finch_url": null, "rollout_milestone": null, "rollout_platforms": [], "rollout_details": null, "rollout_impact": 2, "rollout_stage_plan": null, "enterprise_policies": [], "desktop_first": null, "android_first": null, "ios_first": null, "webview_first": null, "desktop_last": null, "android_last": null, "ios_last": null, "webview_last": null}, {"id": 5077916677439488, "created": "2025-11-17 09:34:00.376567", "feature_id": 5068277495758848, "stage_type": 260, "display_name": null, "pm_emails": [], "tl_emails": [], "ux_emails": [], "te_emails": [], "intent_thread_url": "https://groups.google.com/a/chromium.org/d/msgid/blink-dev/6a022f27.710a0220.3a767f.0268.GAE%40google.com", "announcement_url": null, "experiment_goals": null, "experiment_risks": null, "origin_trial_id": null, "origin_trial_feedback_url": null, "ot_action_requested": false, "ot_approval_buganizer_component": null, "ot_approval_buganizer_custom_field_id": null, "ot_approval_criteria_url": null, "ot_approval_group_email": null, "ot_chromium_trial_name": null, "ot_description": null, "ot_display_name": null, "ot_documentation_url": null, "ot_emails": [], "ot_feedback_submission_url": null, "ot_has_third_party_support": false, "ot_is_critical_trial": false, "ot_is_deprecation_trial": false, "ot_owner_email": null, "ot_requester_email": null, "ot_require_approvals": false, "ot_use_counter_bucket_number": null, "ot_webfeature_use_counter": null, "extensions": [], "experiment_extension_reason": null, "ot_stage_id": null, "finch_url": null, "rollout_milestone": null, "rollout_platforms": [], "rollout_details": null, "rollout_impact": 2, "rollout_stage_plan": null, "enterprise_policies": [], "desktop_first": 158, "android_first": 158, "ios_first": null, "webview_first": 158, "desktop_last": null, "android_last": null, "ios_last": null, "webview_last": null}], "accurate_as_of": "2026-10-19 09:55:12.876228", "creator_email": "foolip@chromium.org", "updater_email": "foolip@chromium.org", "owner_emails": ["foolip@chromium.org"], "editor_emails": [], "cc_emails": [], "spec_mentor_emails": [], "unlisted": false, "deleted": false, "editors": [], "cc_recipients": [], "spec_mentors": [], "creator": "foolip@chromium.org", "feature_type": "Chromium catches up", "feature_type_int": 1, "intent_stage": "None", "intent_stage_int": 0, "active_stage_id": 5077916677439488, "bug_url": "https://crbug.com/40246121", "launch_bug_url": null, "new_crbug_url": "https://bugs.chromium.org/p/chromium/issues/entry?components=Blink>Media&blocking=40246121&cc=foolip@chromium.org", "screenshot_links": [], "first_enterprise_notification_milestone": null, "enterprise_impact": 1, "breaking_change": false, "confidential": false, "shipping_year": 2026, "flag_name": null, "finch_name": "CSSMediaElementPseudos", "non_finch_justification": null, "ongoing_constraints": null, "rollout_plan": 0, "rollout_plan_displayname": "Will ship enabled for all users", "motivation": "Allows styling of media elements or custom media controls based on the state of the media element. For example, a large play button overlaying a video could be hidden while playing.\n\nThere is no expectation that custom media controls can be implemented entirely with CSS, as there is still a lot of state not exposed to CSS.", "devtrial_instructions": null, "activation_risks": null, "measurement": "https://chromestatus.com/metrics/webfeature/timeline/popularity/436", "availability_expectation": null, "adoption_expectation": null, "adoption_plan": null, "initial_public_proposal_url": null, "explainer_links": [], "requires_embedder_support": false, "spec_link": "https://html.spec.whatwg.org/multipage/semantics-other.html#pseudo-classes", "api_spec": false, "automation_spec": false, "interop_compat_risks": null, "all_platforms": true, "all_platforms_descr": null, "non_oss_deps": null, "anticipated_spec_changes": null, "security_risks": null, "ergonomics_risks": null, "wpt": true, "wpt_descr": "https://wpt.fyi/results/?q=feature%3Amedia-pseudos\n\nThe remaining failure in sound-state.html depends on a change to how the muted content attribute should work in HTML:\nhttps://crbug.com/509570175\nhttps://crrev.com/c/7831199", "webview_risks": null, "devrel_emails": ["devrel-chromestatus-all@google.com"], "debuggability": null, "doc_links": [], "sample_links": [], "prefixed": null, "tags": [], "tag_review": null, "tag_review_status": "Not applicable", "tag_review_status_int": 4, "security_review_status": "Pending", "security_review_status_int": 1, "privacy_review_status": "Pending", "privacy_review_status_int": 1, "security_continuity_id": null, "security_launch_issue_id": null, "updated_display": null, "resources": {"samples": [], "docs": []}, "comments": null, "ff_views": 1, "safari_views": 1, "web_dev_views": 4, "browsers": {"chrome": {"bug": "https://crbug.com/40246121", "blink_components": ["Blink>Media"], "devrel": ["devrel-chromestatus-all@google.com"], "owners": ["foolip@chromium.org"], "origintrial": false, "prefixed": null, "flag": false, "status": {"text": "Proposed", "val": 2, "milestone_str": "Proposed"}, "announced": true, "desktop": 158, "android": 158, "webview": 158, "ios": null}, "ff": {"view": {"url": "https://bugzilla.mozilla.org/show_bug.cgi?id=1707584", "notes": null, "text": "Shipped/Shipping", "val": 1}}, "safari": {"view": {"url": "https://bugs.webkit.org/show_bug.cgi?id=229431", "notes": null, "text": "Shipped/Shipping", "val": 1}}, "webdev": {"view": {"text": "No signals", "val": 4, "url": null, "notes": null}}, "other": {"view": {"text": null, "val": null, "url": null, "notes": null}}}, "standards": {"spec": "https://html.spec.whatwg.org/multipage/semantics-other.html#pseudo-classes", "maturity": {"text": "Final published standard: Recommendation, Living Standard, Candidate Recommendation, or similar final form", "short_text": "Published standard", "val": 5}}, "is_released": false, "is_enterprise_feature": false, "experiment_timeline": null, "ai_test_eval_report": "**Conclusion:** Some test suggestions are available. See below.\n\n**Summary of Analysis:** The audit analyzed 14 requirements extracted from the specification. 0 requirements are covered by existing tests, and 14 requirements lack test coverage.\n\n-----\n\n### Detailed Coverage Analysis\n\n\n#### 1. Existence\n**Status:** No test suggestions applicable\n\n\n\n-----\n\n\n\n#### 2. Common Use Cases\n**Status:** Not Covered\n\n* **Spec Requirement:** The :playing pseudo-class must match all media elements whose paused attribute is false.\n\n\n  \n  \u274c Missing test coverage for: The :playing pseudo-class must match all media elements whose paused attribute is false.\n\n\n* **Spec Requirement:** The :paused pseudo-class must match all media elements whose paused attribute is true.\n\n\n  \n  \u274c Missing test coverage for: The :paused pseudo-class must match all media elements whose paused attribute is true.\n\n\n* **Spec Requirement:** The :seeking pseudo-class must match all media elements whose seeking attribute is true.\n\n\n  \n  \u274c Missing test coverage for: The :seeking pseudo-class must match all media elements whose seeking attribute is true.\n\n\n* **Spec Requirement:** The :buffering pseudo-class must match all media elements whose paused attribute is false, networkState attribute is NETWORK_LOADING, and ready state is HAVE_CURRENT_DATA or less.\n\n\n  \n  \u274c Missing test coverage for: The :buffering pseudo-class must match all media elements whose paused attribute is false, networkState attribute is NETWORK_LOADING, and ready state is HAVE_CURRENT_DATA or less.\n\n\n* **Spec Requirement:** The :stalled pseudo-class must match all media elements that match the :buffering pseudo-class and whose currently stalled state is true.\n\n\n  \n  \u274c Missing test coverage for: The :stalled pseudo-class must match all media elements that match the :buffering pseudo-class and whose currently stalled state is true.\n\n\n* **Spec Requirement:** The :muted pseudo-class must match all media elements that are muted.\n\n\n  \n  \u274c Missing test coverage for: The :muted pseudo-class must match all media elements that are muted.\n\n\n* **Spec Requirement:** The :volume-locked pseudo-class must match all media elements when the user agent's volume locked state is true.\n\n\n  \n  \u274c Missing test coverage for: The :volume-locked pseudo-class must match all media elements when the user agent's volume locked state is true.\n\n\n\n\n-----\n\n\n\n#### 3. Error Scenarios\n**Status:** No test suggestions applicable\n\n\n\n-----\n\n\n\n#### 4. Invalidation\n**Status:** No test suggestions applicable\n\n\n\n-----\n\n\n\n#### 5. Integration\n**Status:** Not Covered\n\n* **Spec Requirement:** The `:playing` pseudo-class must match all media elements whose `paused` attribute is false.\n\n\n  \n  \u274c Missing test coverage for: The `:playing` pseudo-class must match all media elements whose `paused` attribute is false.\n\n\n* **Spec Requirement:** The `:paused` pseudo-class must match all media elements whose `paused` attribute is true.\n\n\n  \n  \u274c Missing test coverage for: The `:paused` pseudo-class must match all media elements whose `paused` attribute is true.\n\n\n* **Spec Requirement:** The `:seeking` pseudo-class must match all media elements whose `seeking` attribute is true.\n\n\n  \n  \u274c Missing test coverage for: The `:seeking` pseudo-class must match all media elements whose `seeking` attribute is true.\n\n\n* **Spec Requirement:** The `:buffering` pseudo-class must match all media elements whose `paused` attribute is false, `networkState` attribute is `NETWORK_LOADING`, and ready state is `HAVE_CURRENT_DATA` or less.\n\n\n  \n  \u274c Missing test coverage for: The `:buffering` pseudo-class must match all media elements whose `paused` attribute is false, `networkState` attribute is `NETWORK_LOADING`, and ready state is `HAVE_CURRENT_DATA` or less.\n\n\n* **Spec Requirement:** The `:stalled` pseudo-class must match all media elements that match the `:buffering` pseudo-class and whose 'is currently stalled' state is true.\n\n\n  \n  \u274c Missing test coverage for: The `:stalled` pseudo-class must match all media elements that match the `:buffering` pseudo-class and whose 'is currently stalled' state is true.\n\n\n* **Spec Requirement:** The `:muted` pseudo-class must match all media elements that are muted.\n\n\n  \n  \u274c Missing test coverage for: The `:muted` pseudo-class must match all media elements that are muted.\n\n\n* **Spec Requirement:** The `:volume-locked` pseudo-class must match all media elements when the user agent's volume locked state is true.\n\n\n  \n  \u274c Missing test coverage for: The `:volume-locked` pseudo-class must match all media elements when the user agent's volume locked state is true.\n\n\n\n\n\n-----\n\n### Test Suggestions\n\nFound 14 test suggestions:\n\n\n\n* The :playing pseudo-class must match all media elements whose paused attribute is false.\n\n* The :paused pseudo-class must match all media elements whose paused attribute is true.\n\n* The :seeking pseudo-class must match all media elements whose seeking attribute is true.\n\n* The :buffering pseudo-class must match all media elements whose paused attribute is false, networkState attribute is NETWORK_LOADING, and ready state is HAVE_CURRENT_DATA or less.\n\n* The :stalled pseudo-class must match all media elements that match the :buffering pseudo-class and whose currently stalled state is true.\n\n* The :muted pseudo-class must match all media elements that are muted.\n\n* The :volume-locked pseudo-class must match all media elements when the user agent's volume locked state is true.\n\n* The `:playing` pseudo-class must match all media elements whose `paused` attribute is false.\n\n* The `:paused` pseudo-class must match all media elements whose `paused` attribute is true.\n\n* The `:seeking` pseudo-class must match all media elements whose `seeking` attribute is true.\n\n* The `:buffering` pseudo-class must match all media elements whose `paused` attribute is false, `networkState` attribute is `NETWORK_LOADING`, and ready state is `HAVE_CURRENT_DATA` or less.\n\n* The `:stalled` pseudo-class must match all media elements that match the `:buffering` pseudo-class and whose 'is currently stalled' state is true.\n\n* The `:muted` pseudo-class must match all media elements that are muted.\n\n* The `:volume-locked` pseudo-class must match all media elements when the user agent's volume locked state is true.\n\n", "ai_test_eval_run_status": 1, "ai_test_eval_status_timestamp": "2026-08-17 12:51:03.359168"}