)]}'
{
  "commit": "97db29fcaa2aa757c8d86f06187b5268bf4eed4a",
  "tree": "12f709a3211e2a26b7d72435f6ae94ebe6d082c4",
  "parents": [
    "38785ef8b19e2a1ee1303167074ec98f95f7cb5b"
  ],
  "author": {
    "name": "Kevin Moore",
    "email": "kevmoo@users.noreply.github.com",
    "time": "Mon Oct 12 17:41:09 2026 +0000"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Mon Oct 12 17:41:09 2026 +0000"
  },
  "message": "[web] Skip non-focusable containers in Focusable.focusAsRouteDefault (#194138)\n\nGuards `Focusable.focusAsRouteDefault()` with `if\n(!semanticsObject.isFocusable) return false;` so non-focusable container\nroles (`SemanticScrollable`, `SemanticForm`, `SemanticList`,\n`SemanticTable`) do not swallow initial route focus when dialogs or\ndrawers open on Web. Verified: `felt test --suite\nchrome-dart2js-canvaskit-engine\ntest/engine/semantics/semantics_test.dart` (271 passed). Part of\nhttps://github.com/flutter/flutter/issues/138371 (related to\nhttps://github.com/flutter/flutter/issues/122876,\nhttps://github.com/flutter/flutter/issues/120894).\n\n-\n`engine/src/flutter/lib/web_ui/lib/src/engine/semantics/focusable.dart`:\nReturns `false` from `focusAsRouteDefault()` when\n`!semanticsObject.isFocusable` (matching `Focusable.update()`, which\nonly sets `tabindex\u003d\"0\"` when `isFocusable` is `true`).\n-\n`engine/src/flutter/lib/web_ui/test/engine/semantics/semantics_test.dart`:\nResets `onSemanticsActionEvent` in suite `tearDown` and verifies that\n`SemanticRoute` skips non-focusable `SemanticScrollable`,\n`SemanticForm`, `SemanticList`, and `SemanticTable` containers to focus\nthe first inner focusable descendant.\n\n## Pre-launch Checklist\n\n- [x] I read the [Contributor Guide] and followed the process outlined\nthere for submitting PRs.\n- [x] I read the [AI contribution guidelines] and understand my\nresponsibilities, or I am not using AI tools.\n- [x] I read the [Tree Hygiene] wiki page, which explains my\nresponsibilities.\n- [x] I read and followed the [Flutter Style Guide], including [Features\nwe expect every widget to implement].\n- [x] I signed the [CLA].\n- [x] I listed at least one issue that this PR fixes in the description\nabove.\n- [x] I updated/added relevant in-code documentation (doc comments with\n`///`).\n- [x] If this PR introduces a new feature or capability, I created and\nlinked a website documentation issue or PR in [flutter/website] (or\nverified none is needed).\n- [x] I added new tests to check the change I am making, or this PR is\n[test-exempt].\n- [x] I followed the [breaking change policy] and added [Data Driven\nFixes] where supported.\n- [x] All existing and new tests are passing.\n\n\u003c!-- Links --\u003e\n[Contributor Guide]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview\n[AI contribution guidelines]:\nhttps://github.com/flutter/flutter/blob/main/CONTRIBUTING.ai.md\n[Tree Hygiene]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md\n[test-exempt]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests\n[Flutter Style Guide]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md\n[Features we expect every widget to implement]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement\n[CLA]: https://cla.developers.google.com/\n[flutter/tests]: https://github.com/flutter/tests\n[flutter/website]: https://github.com/flutter/website\n[breaking change policy]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes\n[Discord]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md\n[Data Driven Fixes]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "8d0c25e9895b74001a35f8c9babf25cda81c5f07",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/lib/web_ui/lib/src/engine/semantics/focusable.dart",
      "new_id": "f12b712141c08c880b7bdc323d4440c13ae7b3ac",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/lib/web_ui/lib/src/engine/semantics/focusable.dart"
    },
    {
      "type": "modify",
      "old_id": "a46a3ba45dc030e1f73ba437b385c25db58619e2",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/lib/web_ui/test/engine/semantics/semantics_test.dart",
      "new_id": "638988489d34b5cfa571a672264f761d79ac7fbe",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/lib/web_ui/test/engine/semantics/semantics_test.dart"
    }
  ]
}
