)]}'
{
  "commit": "a559210cf875f9f22cd3a0e9c721fe9002a3f5f8",
  "tree": "ee1644b75e08040f0d40ff57d1836b4c0a9e0d08",
  "parents": [
    "e6f0a57762eedd9578b7a3a17eddd86c961ab5ac"
  ],
  "author": {
    "name": "Mouad Debbar",
    "email": "mdebbar@google.com",
    "time": "Tue Aug 18 19:30:07 2026 +0000"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Tue Aug 18 19:30:07 2026 +0000"
  },
  "message": "[web] Guard against disposed pictures in `PrerollVisitor` and `DebugInfoVisitor` (#191224)\n\nIn web scene compositing, `MeasureVisitor` and `PaintVisitor` were\npreviously updated to guard against disposed pictures in `PictureLayer`.\nHowever, `PrerollVisitor.visitPicture` and\n`DebugInfoVisitor.visitPicture` were still calling\n`picture.picture.cullRect` unconditionally.\n\nBecause `LayerTree.preroll()` runs before `measure()` and `paint()`,\ntraversing a layer tree containing a disposed picture resulted in an\nunhandled exception in `PrerollVisitor` before `MeasureVisitor` or\n`PaintVisitor` could handle it.\n\nThis was observed intermittently in CI, for example:\n-\nhttps://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8673190621550647729/+/u/Run_package_tests/drive_examples/stdout\n-\nhttps://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8673184733861262609/+/u/Run_package_tests/drive_examples/stdout\n\nThis PR adds `picture.picture.isDisposed` guards to `PrerollVisitor` and\n`DebugInfoVisitor` and adds unit tests covering disposed pictures across\nlayer visitors and `LayerTree` rendering lifecycle phases.\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 [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 documentation (doc comments with `///`).\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[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[breaking change policy]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes\n[Data Driven Fixes]:\nhttps://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md\n\n---------\n\nCo-authored-by: gemini-code-assist[bot] \u003c176961590+gemini-code-assist[bot]@users.noreply.github.com\u003e",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "ba189a37addc1add774a34d98c6e78b5119fadb4",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/lib/web_ui/lib/src/engine/layer/layer.dart",
      "new_id": "40f58030acf7742dcb0547f8b3b92d6db735cb87",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/lib/web_ui/lib/src/engine/layer/layer.dart"
    },
    {
      "type": "modify",
      "old_id": "0ab95d47ee4e3db8f105c807526cf3a5fbe8af39",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/lib/web_ui/lib/src/engine/layer/layer_scene_builder.dart",
      "new_id": "cebf141c2686040985bc566d9bb9958780f3d8f6",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/lib/web_ui/lib/src/engine/layer/layer_scene_builder.dart"
    },
    {
      "type": "modify",
      "old_id": "7c5820a3fb5a8c41a098ff9347f1842c6112374b",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/lib/web_ui/lib/src/engine/layer/layer_visitor.dart",
      "new_id": "b4150e0ab996541904756ce94427d45ddd7f60d2",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/lib/web_ui/lib/src/engine/layer/layer_visitor.dart"
    },
    {
      "type": "modify",
      "old_id": "32b0b879ee069fac9e034e8088c9289780377ad7",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/lib/web_ui/test/engine/culling_test.dart",
      "new_id": "73822cb879295363971ab4eb0c73c0be235d726c",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/lib/web_ui/test/engine/culling_test.dart"
    },
    {
      "type": "modify",
      "old_id": "069b5e686661332c7c6a2700ae9d13fc136e9ed1",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/lib/web_ui/test/ui/layer_test.dart",
      "new_id": "ed8d86f95196523875a1403e3952ef1bfa36562b",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/lib/web_ui/test/ui/layer_test.dart"
    }
  ]
}
