)]}'
{
  "commit": "26037dff87ade9d9dee04cc2ef90b3fe5cf0faf3",
  "tree": "1031cf63902e78d7c1f3a5a80cd949729f02d3f4",
  "parents": [
    "45d86cf670da997402ce3e959135c115f2b60364"
  ],
  "author": {
    "name": "chunhtai",
    "email": "47866232+chunhtai@users.noreply.github.com",
    "time": "Mon Mar 24 13:11:13 2025 -0700"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Mon Mar 24 20:11:13 2025 +0000"
  },
  "message": "Add set semantics enabled API and wire iOS a11y bridge (#161265)\n\nfixes https://github.com/flutter/flutter/issues/158399\n\nold pr https://github.com/flutter/engine/pull/56691\n\npreviously the only correct way to enable semantics is that ios\nembedding receive signal from native OS, it call SetSemanticsEnabled to\nshell and then to dart to enable semantics tree generation.\n\nIf for some reason framework decide to enable semantics first, e.g.\nthrough SemanticsBinding.instance.ensureSemantics(typically due to\nintegration test or ci that wants to test semantics), the update will be\ndropped in shell. Even if it later on receive signal from native OS to\nturn on semantics, it can\u0027t construct the complete accessibility tree in\nembedding because the updatesemantics sends diff update and previous\nupdates are gone forever. It will end up in a broken state.\n\nThis pr changes so that the only source of truth will be in the\nframework side. When framework starts generating the the semantics tree,\nit will call SetSemanticsTreeEnabled through dart:ui, and the embedding\nneeds to prepare itself to accept semantics update after receiving the\nmessage.\n\nThis however require some refactoring on iOS embedding because it will\nonly create a11y bridge when receiving OS notification when assitive\ntechnologies turns on.\n\nThis requires three phase transition\n\nadd an empty dart:ui API setSemanticsTreeEnabled\nmakes framework calls the empty API.\nmerge this pr with actual implementation of setSemanticsTreeEnabled\n\nI will do the android part in a separate pr\n\n\n## Pre-launch Checklist\n\n- [ ] I read the [Contributor Guide] and followed the process outlined\nthere for submitting PRs.\n- [ ] I read the [Tree Hygiene] wiki page, which explains my\nresponsibilities.\n- [ ] I read and followed the [Flutter Style Guide], including [Features\nwe expect every widget to implement].\n- [ ] I signed the [CLA].\n- [ ] I listed at least one issue that this PR fixes in the description\nabove.\n- [ ] I updated/added relevant documentation (doc comments with `///`).\n- [ ] I added new tests to check the change I am making, or this PR is\n[test-exempt].\n- [ ] I followed the [breaking change policy] and added [Data Driven\nFixes] where supported.\n- [ ] All existing and new tests are passing.\n\nIf you need help, consider asking for advice on the #hackers-new channel\non [Discord].\n\n\u003c!-- Links --\u003e\n[Contributor Guide]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview\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[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": "ec78451126babd0d6876013bbdd9d177ccc08afd",
      "old_mode": 33188,
      "old_path": "dev/integration_tests/ios_host_app/flutterapp/lib/main",
      "new_id": "87557d41728132cfb8d3df51d059bbca867a29f5",
      "new_mode": 33188,
      "new_path": "dev/integration_tests/ios_host_app/flutterapp/lib/main"
    },
    {
      "type": "modify",
      "old_id": "a7b219ad069f1cc49c7d22031d6328642d820008",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/ci/licenses_golden/excluded_files",
      "new_id": "711ca379ea2f63305dddc643456280dff2219ebf",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/ci/licenses_golden/excluded_files"
    },
    {
      "type": "modify",
      "old_id": "000285ab84eb5fd5d653b6c85b93dc3ebe5febff",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/ci/licenses_golden/licenses_flutter",
      "new_id": "89bb8ecb09bc3af2be51fbed780567c6ecb6a44e",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/ci/licenses_golden/licenses_flutter"
    },
    {
      "type": "modify",
      "old_id": "7d1864308ca0b65818de946d444f2acacb929d7a",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/lib/ui/dart_ui.cc",
      "new_id": "292b7e305372986ce9cdce1b64276a0cad205bd7",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/lib/ui/dart_ui.cc"
    },
    {
      "type": "modify",
      "old_id": "3d65c6b6ce2d22e1e445e2b8d29475b4d9715d33",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/lib/ui/platform_dispatcher.dart",
      "new_id": "ce01a20ec2ee5c9f7d1a00d94b7dfc5dd03e38e6",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/lib/ui/platform_dispatcher.dart"
    },
    {
      "type": "modify",
      "old_id": "48a18692cf85f54dd7c489da1b4fdd3ee0b65ef0",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/lib/ui/window.dart",
      "new_id": "3140a6d033240c8fab93961cd470ad15c3ef34da",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/lib/ui/window.dart"
    },
    {
      "type": "modify",
      "old_id": "c47a45ea0af242b389cc18953c6ef702cfd3b400",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/lib/ui/window/platform_configuration.cc",
      "new_id": "46b0d745a594255dc7422ed7cc570b01bc7df27a",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/lib/ui/window/platform_configuration.cc"
    },
    {
      "type": "modify",
      "old_id": "29ee8ca4fffaafd5b78da209003b39eb258fef47",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/lib/ui/window/platform_configuration.h",
      "new_id": "0219a5a0f93739923ff0edb6a6003dec5f9936c7",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/lib/ui/window/platform_configuration.h"
    },
    {
      "type": "modify",
      "old_id": "b4dd689d5a9083af55db14b94b1cc8d7faaf5499",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/lib/web_ui/lib/platform_dispatcher.dart",
      "new_id": "36b74594828ef8461ea491bf6bd44dc61a7a642a",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/lib/web_ui/lib/platform_dispatcher.dart"
    },
    {
      "type": "modify",
      "old_id": "528b57bf8db79943aeb9a9d3afd2f614068032dd",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/lib/web_ui/lib/src/engine/platform_dispatcher.dart",
      "new_id": "c7c1618076bd3e4715e40417445959c7b065c058",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/lib/web_ui/lib/src/engine/platform_dispatcher.dart"
    },
    {
      "type": "modify",
      "old_id": "a0e8610a6e3be7fd9da0f33faf1e15723ef8e64f",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/runtime/BUILD.gn",
      "new_id": "5167d321482b87bb572b48e309e6dc623b0fa60a",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/runtime/BUILD.gn"
    },
    {
      "type": "modify",
      "old_id": "602011c1c5dc95a69184df072d463cc76ee0b8dd",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/runtime/dart_isolate_unittests.cc",
      "new_id": "3be980588e173ce5abe833139f874e9e4a8f31db",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/runtime/dart_isolate_unittests.cc"
    },
    {
      "type": "modify",
      "old_id": "0a85f5f97d95a9738c094cfc1afd11a0fb69cf90",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/runtime/fixtures/runtime_test.dart",
      "new_id": "748298b7533b0aeea1017b89b1bdc33f891a8a59",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/runtime/fixtures/runtime_test.dart"
    },
    {
      "type": "modify",
      "old_id": "113e1fb8c9394185dae0c95971355d7bcf7e1e9e",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/runtime/runtime_controller.cc",
      "new_id": "feba155b00de777a158f18c3036eae364958bf23",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/runtime/runtime_controller.cc"
    },
    {
      "type": "modify",
      "old_id": "5b11cf2b819df983d88d809a24fe2ffeb31ff7e9",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/runtime/runtime_controller.h",
      "new_id": "adc6c85334f1e0cfdc4c9b48fa62fa988f4eadba",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/runtime/runtime_controller.h"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "a8e27bae1e39fed8f0fabc34e2e8c7427450761c",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/runtime/runtime_controller_unittests.cc"
    },
    {
      "type": "modify",
      "old_id": "d5df45979189e021efb09f29cb6fa80b33c54735",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/runtime/runtime_delegate.h",
      "new_id": "84ca390db09f1afe99b150875b4e848338cb324c",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/runtime/runtime_delegate.h"
    },
    {
      "type": "modify",
      "old_id": "56e894335aa37ef7982bcc9972f77f22486157f9",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/shell/common/engine.cc",
      "new_id": "ae5d68e168cb2da1b2d7261c7e8179919743b030",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/shell/common/engine.cc"
    },
    {
      "type": "modify",
      "old_id": "8d911741931ad876bc39e0889ddb6dafb8998361",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/shell/common/engine.h",
      "new_id": "b7cd105c47f7751399ba31b0cc03eb6ef907775d",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/shell/common/engine.h"
    },
    {
      "type": "modify",
      "old_id": "fc97a8c0e2405b6641872710a67833b5eacddbe1",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/shell/common/engine_animator_unittests.cc",
      "new_id": "479e26f4a137e845c220dd1f83bde7669ad3b0da",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/shell/common/engine_animator_unittests.cc"
    },
    {
      "type": "modify",
      "old_id": "131db5bff6c7a26e7db353e5b00228ef4e078661",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/shell/common/engine_unittests.cc",
      "new_id": "324104d918531af9ca8c6f7e91fc90767de35694",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/shell/common/engine_unittests.cc"
    },
    {
      "type": "modify",
      "old_id": "9ca28042011892b1bcbf9dad31322d2b82c2a578",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/shell/common/platform_view.cc",
      "new_id": "496c75f85d288b87d605c5b740c9a0e0fd3924e3",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/shell/common/platform_view.cc"
    },
    {
      "type": "modify",
      "old_id": "7be2b1ca0974fb868066c1fa85b0147ec8dbbb87",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/shell/common/platform_view.h",
      "new_id": "2eb9e1d98998afb0f9048bb2faddb2034bb51acf",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/shell/common/platform_view.h"
    },
    {
      "type": "modify",
      "old_id": "31aa6e73e77081c865d9b96fe982d96f297e0f2e",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/shell/common/shell.cc",
      "new_id": "fbce24f8ef66cff3fd95cccbff9f46382b39ec21",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/shell/common/shell.cc"
    },
    {
      "type": "modify",
      "old_id": "a5305e7abfdc953eca7902a7a1622ebd903cb95d",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/shell/common/shell.h",
      "new_id": "2a3f0fccb4e9b1102376cb67ca1e7c7b7dda0a45",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/shell/common/shell.h"
    },
    {
      "type": "modify",
      "old_id": "edcdbb71d006ef6a3b6777dcb8d10397638179fd",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/shell/platform/darwin/ios/BUILD.gn",
      "new_id": "fda68241aa25f5810da8b29d520ef05a7d615810",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/shell/platform/darwin/ios/BUILD.gn"
    },
    {
      "type": "modify",
      "old_id": "274dff306ce8daa7f841b9e44b3a871cb8fe664e",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/shell/platform/darwin/ios/platform_view_ios.h",
      "new_id": "7f03b7b8abb0182954bb63889d612f5d03596c64",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/shell/platform/darwin/ios/platform_view_ios.h"
    },
    {
      "type": "modify",
      "old_id": "15f6223d70095d4ea28370767022c6e5bdb9a157",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/shell/platform/darwin/ios/platform_view_ios.mm",
      "new_id": "a7195ecd95599770109db612baa7b1e6cf857dba",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/shell/platform/darwin/ios/platform_view_ios.mm"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "335763bd6d32ca4a73be259fca46f6e6f8235594",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/shell/platform/darwin/ios/platform_view_ios_test.mm"
    },
    {
      "type": "modify",
      "old_id": "34eb8ff7b8328c1896b5110fdce498992fa57db2",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/shell/platform/embedder/fixtures/main.dart",
      "new_id": "ab712c4454f64113574767a5dab9641e657b2c6e",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/shell/platform/embedder/fixtures/main.dart"
    },
    {
      "type": "modify",
      "old_id": "8174aa8afb29345a4e591ef52bc1c3e79d3c6f36",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/shell/platform/windows/fixtures/main.dart",
      "new_id": "f3aec5f677c35d680ad9476a8a3fdd1e9952c8d2",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/shell/platform/windows/fixtures/main.dart"
    },
    {
      "type": "modify",
      "old_id": "e129f8a771c38e15f42f43a6523027fbb1a94ea8",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/testing/ios_scenario_app/lib/src/locale_initialization.dart",
      "new_id": "c0c11989cb45c6deaa7d4ff233e2c215a7b0348a",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/testing/ios_scenario_app/lib/src/locale_initialization.dart"
    },
    {
      "type": "modify",
      "old_id": "e09ab6538438c1b1ad2d7869167fceadb3cf88ce",
      "old_mode": 33188,
      "old_path": "packages/flutter/lib/src/semantics/binding.dart",
      "new_id": "2a1749a2df6d3feeb60fe3ad6544ce5471a97403",
      "new_mode": 33188,
      "new_path": "packages/flutter/lib/src/semantics/binding.dart"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c5578c78c89e106e739c4f26c0271820faa686e1",
      "new_mode": 33188,
      "new_path": "packages/flutter/test/semantics/semantics_binding_set_semantics_tree_enabled_test.dart"
    }
  ]
}
