)]}'
{"id": 5123999844663296, "name": "Remove [LegacyNoInterfaceObject] from FontFaceSet IDL", "summary": "Chromium's FontFaceSet IDL previously used [LegacyNoInterfaceObject], which hid FontFaceSet as a global property and deleted the constructor property from its prototype. This deviated from the CSS Font Loading spec and differed from Safari and Firefox behavior. This change removes [LegacyNoInterfaceObject] from the FontFaceSet IDL, so FontFaceSet is properly exposed as a global property. Since no constructor() is defined in the IDL, calling new FontFaceSet() from JavaScript now throws TypeError: Illegal constructor, matching the spec. This also fixes the historical.html WPT, which was previously failing in Chromium.", "markdown_fields": [], "blink_components": ["Blink>Fonts"], "star_count": 42, "search_tags": [], "created": {"by": "dileepmaurya@microsoft.com", "when": "2026-05-21 11:52:11.729003"}, "updated": {"by": "dileepmaurya@microsoft.com", "when": "2026-06-22 09:04:46.211691"}, "category": "Miscellaneous", "category_int": 2, "feature_notes": null, "web_feature": "Font-face-set", "is_official_web_feature": true, "webdx_usecounter_enum": null, "enterprise_feature_categories": ["1"], "enterprise_product_category": 0, "is_releasenotes_content_reviewed": false, "is_releasenotes_publish_ready": false, "stages": [{"id": 5149785133809664, "created": "2026-05-21 11:52:12.661630", "feature_id": 5123999844663296, "stage_type": 320, "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": 6275685040652288, "created": "2026-05-21 11:52:12.662977", "feature_id": 5123999844663296, "stage_type": 330, "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": 4868310157099008, "created": "2026-05-21 11:52:12.664165", "feature_id": 5123999844663296, "stage_type": 360, "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": 151, "android_first": 151, "ios_first": 151, "webview_first": 151, "desktop_last": null, "android_last": null, "ios_last": null, "webview_last": null}], "accurate_as_of": "2026-06-22 09:04:46.211691", "creator_email": "dileepmaurya@microsoft.com", "updater_email": "dileepmaurya@microsoft.com", "owner_emails": ["dileepmaurya@microsoft.com"], "editor_emails": [], "cc_emails": [], "spec_mentor_emails": [], "unlisted": false, "deleted": false, "editors": [], "cc_recipients": [], "spec_mentors": [], "creator": "dileepmaurya@microsoft.com", "feature_type": "No developer-visible change", "feature_type_int": 2, "intent_stage": "None", "intent_stage_int": 0, "active_stage_id": 4868310157099008, "bug_url": "https://issues.chromium.org/issues/477568263", "launch_bug_url": null, "new_crbug_url": "https://bugs.chromium.org/p/chromium/issues/entry?components=Blink>Fonts&blocking=477568263&cc=dileepmaurya@microsoft.com", "screenshot_links": [], "first_enterprise_notification_milestone": 150, "enterprise_impact": 2, "breaking_change": false, "confidential": false, "shipping_year": 2026, "flag_name": null, "finch_name": null, "non_finch_justification": "No Finch flag is needed.\n- There is nothing being enabled or disabled in Chromium's runtime. The constructor is not in Blink's IDL today and was not in any prior shipping milestone, so there is no behaviour change to gate, ramp, or kill-switch.\n- This change is purely a WPT regression test ensuring the spec-aligned absence of the constructor stays absent. A Finch flag would have nothing meaningful to control.", "ongoing_constraints": null, "rollout_plan": 0, "rollout_plan_displayname": "Will ship enabled for all users", "motivation": "Chromium applied [LegacyNoInterfaceObject] to FontFaceSet, hiding it as a global property and breaking \"FontFaceSet\" in self. This caused 18 WPT idlharness failures and one historical.html failure. Safari and Firefox already expose FontFaceSet globally. This brings Chromium into spec compliance with no new constructor exposed.", "devtrial_instructions": null, "activation_risks": null, "measurement": null, "availability_expectation": null, "adoption_expectation": null, "adoption_plan": null, "initial_public_proposal_url": null, "explainer_links": [], "requires_embedder_support": false, "spec_link": "https://drafts.csswg.org/css-font-loading/#fontfaceset", "api_spec": false, "automation_spec": false, "interop_compat_risks": "This change removes [LegacyNoInterfaceObject] from FontFaceSet. The IDL retains [Exposed=(Window,Worker)] and defines no constructor. This aligns Chromium with the CSS Font Loading spec (per CSSWG resolution w3c/csswg-drafts#10390), with Firefox, and with WebKit.\n \nObservable changes for web content:\n  1. FontFaceSet is exposed as a property of Window and Worker globals: typeof FontFaceSet changes from \"undefined\" to \"function\", and \"FontFaceSet\" in self changes from false to true.\n  2. new FontFaceSet(...) throws TypeError: Illegal constructor; previously it threw ReferenceError: FontFaceSet is not defined.\n  3. document.fonts.constructor returns FontFaceSet; previously prototype-chain traversal reached EventTarget because [LegacyNoInterfaceObject] removed FontFaceSet.prototype.constructor. As a consequence, new document.fonts.constructor(...) previously constructed an EventTarget and now throws TypeError: Illegal constructor.\n \nCompatibility risk is low.\nNo pre-change code path in Chromium produced a FontFaceSet instance: the literal new FontFaceSet(...) threw ReferenceError, and the prototype-walk path new document.fonts.constructor(...) produced an EventTarget. Access to the existing FontFaceSet instance via document.fonts is unchanged. The historical.html WPT and 18 FontFaceSet sub-tests in css/css-font-loading/idlharness.https.html move from failing to passing.\n", "all_platforms": true, "all_platforms_descr": "Supported uniformly across all platforms.", "non_oss_deps": null, "anticipated_spec_changes": null, "security_risks": "Low risk.\nNo new APIs, no new attack surface, and no changes to cross-origin behavior or font loading lifecycle.", "ergonomics_risks": null, "wpt": true, "wpt_descr": "https://wpt.fyi/results/css/css-font-loading/historical.html", "webview_risks": null, "devrel_emails": ["devrel-chromestatus-all@google.com"], "debuggability": "No changes to DevTools.\nExisting behavior (TypeError for constructor usage) remains unchanged and debuggable.", "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://issues.chromium.org/issues/477568263", "blink_components": ["Blink>Fonts"], "devrel": ["devrel-chromestatus-all@google.com"], "owners": ["dileepmaurya@microsoft.com"], "origintrial": false, "prefixed": null, "flag": false, "status": {"text": "Proposed", "val": 2, "milestone_str": "Proposed"}, "announced": true, "desktop": 151, "android": 151, "webview": 151, "ios": 151}, "ff": {"view": {"url": "https://developer.mozilla.org/en-US/docs/Web/API/FontFaceSet", "notes": "Firefox has long exposed FontFaceSet as a global without a constructor. MDN compat: https://developer.mozilla.org/en-US/docs/Web/API/FontFaceSet", "text": "Shipped/Shipping", "val": 1}}, "safari": {"view": {"url": "https://bugs.webkit.org/show_bug.cgi?id=276794", "notes": "", "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://drafts.csswg.org/css-font-loading/#fontfaceset", "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": null, "ai_test_eval_run_status": null, "ai_test_eval_status_timestamp": null}