Repository navigation
Conversation
bkonyi
force-pushed
the
di/14-android-build-and-toolchain
branch
from
August 11, 2026 14:47
9eca009 to
ab890d8
Compare
bkonyi
force-pushed
the
di/15-apple-build-and-toolchain
branch
from
August 11, 2026 14:47
e0bfcec to
6c5d513
Compare
bkonyi
force-pushed
the
di/14-android-build-and-toolchain
branch
from
August 11, 2026 15:32
ab890d8 to
fd2b2eb
Compare
bkonyi
force-pushed
the
di/15-apple-build-and-toolchain
branch
from
August 11, 2026 15:32
6c5d513 to
f7f3e96
Compare
bkonyi
force-pushed
the
di/14-android-build-and-toolchain
branch
from
August 11, 2026 17:59
fd2b2eb to
4b27056
Compare
bkonyi
force-pushed
the
di/15-apple-build-and-toolchain
branch
from
August 11, 2026 17:59
f7f3e96 to
1b0b5f5
Compare
bkonyi
force-pushed
the
di/14-android-build-and-toolchain
branch
from
August 11, 2026 19:48
4b27056 to
752a24a
Compare
bkonyi
force-pushed
the
di/15-apple-build-and-toolchain
branch
from
August 11, 2026 19:48
1b0b5f5 to
12a780a
Compare
bkonyi
force-pushed
the
di/14-android-build-and-toolchain
branch
from
August 12, 2026 18:17
752a24a to
a9748ac
Compare
bkonyi
force-pushed
the
di/15-apple-build-and-toolchain
branch
from
August 12, 2026 18:17
12a780a to
ce6f1c4
Compare
bkonyi
force-pushed
the
di/14-android-build-and-toolchain
branch
from
August 12, 2026 18:39
a9748ac to
9e45bc1
Compare
bkonyi
force-pushed
the
di/15-apple-build-and-toolchain
branch
from
August 12, 2026 18:39
ce6f1c4 to
06645da
Compare
) https://skia.googlesource.com/skia.git/+log/dec311244db4..ae22da2e8308 2026-09-02 [email protected] Roll vulkan-deps from 4fd3ee403a91 to 8a165328fe35 (3 revisions) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/skia-flutter-autoroll Please CC [email protected],[email protected],[email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Skia: https://bugs.chromium.org/p/skia/issues/entry To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
bkonyi
force-pushed
the
di/15-apple-build-and-toolchain
branch
from
September 2, 2026 13:25
06645da to
7f04e0b
Compare
bkonyi
force-pushed
the
di/14-android-build-and-toolchain
branch
from
September 2, 2026 13:26
9e45bc1 to
fdb15cd
Compare
…#192179) https://dart.googlesource.com/sdk.git/+log/d8d7869d8031..9a8fbde80f6c 2026-09-02 [email protected] Version 3.14.0-186.0.dev If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/dart-sdk-flutter Please CC [email protected],[email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
… and fix macOS test platform
…n compilation (flutter#191590) ## Description Upgrades `package:analyzer` to `14.2.0` and `_fe_analyzer_shared` to `106.0.0` in the root `pubspec.yaml`, pulling in modern transitive dependencies (`analysis_server_plugin: 0.3.21`, `analyzer_plugin: 0.14.15`, `dart_style: 3.1.12`, and `analyzer_testing: 0.4.0`). ### Key Changes: - **Dependency Upgrades**: Bumped `package:analyzer` to `14.2.0` and updated lockfiles. - **Update Packages Command**: Added `dev/flutter_analyzer_plugin` to `_updatePubspec` in `packages/flutter_tools/lib/src/commands/update_packages.dart` and added hermetic test coverage in `update_packages_test.dart`. - **Plugin Migration & Base Class**: - Introduced `FlutterAnalysisRule` in `dev/flutter_analyzer_plugin/lib/src/flutter_analysis_rule.dart` which intercepts `registerNodeProcessors` and automatically skips rule and visitor registration for read-only Material and Cupertino implementations and tests. - Migrated all 17 `dev/flutter_analyzer_plugin` rules to extend `FlutterAnalysisRule` and implement `registerCustomNodeProcessors`. - Migrated rules and test fixtures to Analyzer 14 AST patterns and `package:analyzer_testing`. - Added unit test suite `dev/flutter_analyzer_plugin/test/flutter_analysis_rule_test.dart` verifying path filtering behavior. - **Rule Scopes & Improvements**: - `no_sync_async_star`: Restricted to `packages/` and `examples/`, excluding test files. - `no_test_imports`: Restricted to `packages/` to avoid flagging runner helpers. - `integration_test_timeouts`: Restricted to `dev/` directory. - `deprecation_syntax`: Excluded `analyze-test-input` fixtures. - `skip_test_comments`: Expanded ignore scan window across multi-line argument nodes. - **Snippets Migration**: Migrated `dev/snippets` AST visitors and mock filesystem resource provider to Analyzer 14. - **SDK Compatibility**: Added `dependency_overrides: analysis_server_plugin: ^0.3.21` to subpackage `analysis_options.yaml` files to allow isolated plugin runners to resolve on development/master Dart SDKs that specify unreleased protocol constraints. - **Linter Fixes**: - Replaced `scope.catchError` with `scope.then(..., onError: ...)` in `packages/flutter_tools/lib/src/desktop_device.dart`. - Added missing `@protected` annotations to non-material public `State` subtypes in `packages/flutter/lib` (`form.dart`, `raw_tooltip.dart`). - **CI Tuning**: - Added heartbeat progress output every 30s during analysis passes in `dev/bots/analyze.dart` and `dev/devicelab/lib/tasks/analysis.dart`. - Updated `Linux analyzer_benchmark` in `.ci.yaml` to set `device_type: none`, routing to 32 GB RAM VM drone bots. ## Tests - Added unit tests in `packages/flutter_tools/test/commands.shard/hermetic/update_packages_test.dart`. - Added unit tests in `dev/flutter_analyzer_plugin/test/flutter_analysis_rule_test.dart`. - Ran all 65 unit tests in `dev/flutter_analyzer_plugin` (all pass). - Ran all 18 unit tests in `dev/snippets` (all pass). - Ran `flutter analyze --flutter-repo` (0 issues found).
flutter/packages@7a7912f...18fe786 2026-09-02 [email protected] [path_parsing] Fix deprecation lints (flutter/packages#12704) 2026-09-02 [email protected] [material_ui] Use super parameters in more places (flutter/packages#12460) 2026-09-02 [email protected] [material_ui] Add a README and placeholders for migrating gen_defaults templates (flutter/packages#12714) 2026-09-01 [email protected] [image_picker] Add native tests for image, metadata, photo-asset, and PHPicker save utilities (flutter/packages#12536) 2026-09-01 [email protected] [material_ui] Port routes_transition_test to material_ui (flutter/packages#12634) 2026-09-01 [email protected] Roll Flutter from c8c5e3b to 0cbd1a4 (23 revisions) (flutter/packages#12712) 2026-09-01 [email protected] [material_ui] Remove !chrome in text_field_test.dart (flutter/packages#12548) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-packages-flutter-autoroll Please CC [email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
This change resolves two sources of flakiness in `hybrid_android_views_integration_test`: 1. **FutureDataHandler Lazy Await:** Updates `FutureDataHandler` to lazily create and await a `Completer` when a driver message arrives before `registerHandler` is called by `onPlatformViewCreated`, preventing premature "unsupported driver message" errors. 2. **Disable Page Route Animations:** Switches `_pushPage` to use `PageRouteBuilder` with zero transition duration and adds `waitUntilNoTransientCallbacks()` before running motion event replay tests, eliminating in-flight coordinate transformation offsets on embedded platform views. should help with flutter#190992
…lutter#190770) ## Summary Part 12 of the modular dependency injection migration. Migrates `CustomDevicesCommand` and `CustomDevicesConfig` to explicit constructor dependency injection (`ToolContext`), eliminating ambient global references and adding hermetic unit tests. Part of flutter#47161
…ework build commands
performance optimization reflected in malioc ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [AI contribution guidelines] and understand my responsibilities, or I am not using AI tools. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [x] I listed at least one issue that this PR fixes in the description above. - [x] I updated/added relevant in-code documentation (doc comments with `///`). - [x] If this PR introduces a new feature or capability, I created and linked a website documentation issue or PR in [flutter/website] (or verified none is needed). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. If this change needs to override an active code freeze, provide a comment explaining why. The code freeze workflow can be overridden by code reviewers. See pinned issues for any active code freezes with guidance. **Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [AI contribution guidelines]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [flutter/website]: https://github.com/flutter/website [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
…lutter#189544) Fixes flutter#149426 **Problem:** In a `PageView`/`TabBarView` wrapped by a `SelectionArea`, drag-selecting text with a mouse on desktop/web flips to the next page and bounces back. **Cause:** A selection drag reuses the scrollable's edge auto-scroll. That is wanted for most scrollables (a `ListView`'s drag-past-edge "select to scroll"), but a page-snapping scrollable flips to an adjacent page instead of revealing more content. The existing physics guard doesn't help, since `PageScrollPhysics` accepts a user offset. **Fix:** Add `ScrollPhysics.allowSelectionEdgeScrolling`, in the same vein as `allowUserScrolling`/`allowImplicitScrolling`. It defaults to `true`; `PageScrollPhysics` overrides it to `false`. The `Scrollable` selection handler skips edge auto-scroll when the resolved physics returns `false`. It delegates through `parent`, so it resolves even when the page physics are wrapped. No import cycle, and no `deviceKind` on `SelectionEdgeUpdateEvent`. `CarouselScrollPhysics` should override this too; tracked separately in flutter#190737 since it lives in Material. **Tests:** - A `PageView` does not flip while a selection drag reaches its edge, and the selection still extends into the widget beside it. - A `ListView` still edge scrolls ("select to scroll") during a selection drag. - A `ListView` nested in a `PageView` still edge scrolls without flipping the page, in both axes. - `ScrollPhysics.allowSelectionEdgeScrolling` default, override, and parent delegation. Before: https://github.com/user-attachments/assets/cc5893df-07c7-49bf-86c0-09448de8a221 After: https://github.com/user-attachments/assets/c3e8140d-c308-460a-9275-e76961cd6184 ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [AI contribution guidelines] and understand my responsibilities, or I am not using AI tools. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [x] I listed at least one issue that this PR fixes in the description above. - [x] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. If this change needs to override an active code freeze, provide a comment explaining why. The code freeze workflow can be overridden by code reviewers. See pinned issues for any active code freezes with guidance. **Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [AI contribution guidelines]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
A `SliverAppBar` whose `expandedHeight` reacts to scroll direction (a common "collapse on scroll down" header pattern) can change extent while a fling is in flight. When that happens, the outer scroll position is transiently outside `[minScrollExtent, maxScrollExtent]` for one frame, until the next layout catches up. `_NestedScrollCoordinator._getMetrics` assumed the outer position was always in range when computing ballistic metrics, so this could either trip an `assert` (`extra >= 0.0` / `extra <= 0.0`) or, worse, produce a degenerate `minRange == maxRange` that gets treated as "no activity needed" silently abandoning the outer position out of range indefinitely. This adds `_NestedScrollPosition.correctPixelsIfOutOfRange()`, called from the coordinator right before the branch that depends on the outer position being in range. The "inner list at rest" branch is left untouched: it already uses the outer's full range (never degenerate) and self-corrects smoothly via the ballistic simulation, so forcing a correction there isn't needed and would risk turning a legitimate bounce-back animation into an abrupt snap. Fixes flutter#191112 N/A — no changes to the flutter/tests repo. ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [AI contribution guidelines] and understand my responsibilities, or I am not using AI tools. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [x] I listed at least one issue that this PR fixes in the description above. - [x] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. If this change needs to override an active code freeze, provide a comment explaining why. The code freeze workflow can be overridden by code reviewers. See pinned issues for any active code freezes with guidance. **Note**: The Flutter team is currently trialing the use of [Gemini Code Assist for GitHub](https://developers.google.com/gemini-code-assist/docs/review-github-code). Comments from the `gemini-code-assist` bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [AI contribution guidelines]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md --------- Co-authored-by: Victor Sanni <[email protected]>
…ngsGLESTest` (flutter#192196) Previously, this method was not mocked and would return an undefined value when it was called in the `BufferBindingsGLESTest` unit tests. When the returned value happened to be false, this makes the tests fail. We've seen this failure pop up multiple times recently. Examples: https://ci.chromium.org/ui/p/flutter/builders/try/Linux%20linux_unopt/47431/overview https://ci.chromium.org/ui/p/flutter/builders/try/Linux%20linux_unopt/47434/overview https://ci.chromium.org/ui/p/flutter/builders/prod/Linux%20linux_unopt/19763/overview I can't consistently repro the failure at HEAD or at the PRs which produced the example failures. But I I tested that modifying this PR to return `GL_FALSE` instead of `GL_TRUE` does consistently reproduce the failure.
`FocusableActionDetector` wraps a `Focus` widget internally and forwards
`focusNode`, `autofocus`, `descendantsAreFocusable`, and
`descendantsAreTraversable`, but not `skipTraversal`. That leaves no way
to keep a `FocusableActionDetector` in the focus chain for key events
while excluding it from focus traversal, even though the inner `Focus`
already supports exactly that.
This adds a `skipTraversal` parameter to `FocusableActionDetector` and
passes it straight through to the inner `Focus`. It is typed `bool?` to
match `Focus.skipTraversal`, so the default of `null` keeps the current
behavior and `Focus` still resolves it to `false` unless a focus node
overrides it. The `skipTraversal` documentation on `Focus` is pulled
into a `{@template flutter.widgets.Focus.skipTraversal}` block so
`FocusableActionDetector` can reuse it with `{@macro}`, the same
convention already used for `descendantsAreFocusable` and
`descendantsAreTraversable`.
This revives flutter#187356, which picked up an LGTM before it was auto closed
after 21 days without a reply. That earlier PR also bundled some
unrelated private named parameter changes that drew review comments, so
this version is trimmed down to just the `skipTraversal` forwarding plus
its test.
Fixes flutter#187093
## Pre-launch Checklist
- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [AI contribution guidelines] and understand my
responsibilities, or I am not using AI tools.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [Flutter Style Guide], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.
If you need help, consider asking for advice on the #hackers-new channel
on [Discord].
<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[AI contribution guidelines]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#ai-contribution-guidelines
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
…92209) https://skia.googlesource.com/skia.git/+log/ae22da2e8308..823f82e18177 2026-09-02 recipe-mega-autoroller@chops-service-accounts.iam.gserviceaccount.com Roll recipe dependencies (trivial). 2026-09-02 [email protected] [SkSL] Support readonly textures as sampled textures or storage images 2026-09-02 [email protected] [graphite] Refactor colortype/format optimization function TextureFormatXferFn.cpp 2026-09-02 [email protected] Manual roll ANGLE from 058752902278 to 4466b5e36d03 (8 revisions) 2026-09-02 [email protected] Revert "[SkContexts] Prefactor SkCPU Code" 2026-09-02 recipe-mega-autoroller@chops-service-accounts.iam.gserviceaccount.com Roll recipe dependencies (trivial). 2026-09-02 [email protected] [Fonts] Fix outdated workaround in SkFontMgr 2026-09-02 [email protected] [fontconfig] Add unit tests for SkFontMgr_fontconfig_priv::remove_weak 2026-09-02 [email protected] Remove moxcms crate from MODULE.bazel 2026-09-02 [email protected] [SkContexts] Prefactor SkCPU Code 2026-09-02 recipe-mega-autoroller@chops-service-accounts.iam.gserviceaccount.com Roll recipe dependencies (trivial). 2026-09-02 [email protected] [graphite] Fix bit generation in TextureFormatTest 2026-09-02 [email protected] Manual roll Dawn from 1bb06c07d91e to be6033b3c823 (14 revisions) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/skia-flutter-autoroll Please CC [email protected],[email protected],[email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Skia: https://bugs.chromium.org/p/skia/issues/entry To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
…bC_... (flutter#192212) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/fuchsia-test-scripts-flutter Please CC [email protected],[email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
…... (flutter#192215) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/fuchsia-linux-sdk-flutter Please CC [email protected],[email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Flutter: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
fixes flutter#182604 Historically, the configuration/order of children and parents for widgets is identical across both traversal and hit test order. However, with introduction over OverlayPortal, flutter@fccfa97, this is no longer always the case. For example when traversing, the actual portal child, eg, a floating drop down box, is a child of the `OverlayPortal`. However when hit testing, the portal child is a child of the `Overlay`. Prior to this pr, both setChildrenInHitTestOrder and setChildren have identical implementations. ``` for (SemanticsObject* child in _childrenInHitTestOrder) { if (child.parent == self) { child.parent = nil; } } _childrenInHitTestOrder = [childrenInHitTestOrder copy]; for (SemanticsObject* child in _childrenInHitTestOrder) { child.parent = self; } ``` On every frame, setChildren and setChildrenInHitTestOrder is run sequentially on every widget. So first, when setChildren is run for `OverlayPortal`, it sets `portalChild.parent = overlayPortal`. This is the correct traversal order. Then, sometime later, it runs setChildrenInHitTestOrder for `Overlay`, which sets portalChild.parent = overlay`. This is incorrect. This is why in the bug the accessibility nodes still exist, just weirdly offset - because its now anchored to 0, 0 of `Overlay` instead of the the position over `OverlayPortal`. Because hittest order strictly walks top down (parent isnt ever accessed), we don't actually have to do any mutation to the parents. https://github.com/user-attachments/assets/df093797-7482-42ba-ba4c-b9a172484031
…ff-Refiner-self-adb31f30
Migrates `_toolContext` and `_appleContext` field extractions to Dart 3 object pattern destructuring in `BuildIOSArchiveCommand.runCommand`.
Migrates context field extractions to Dart 3 object pattern destructuring in `build_ios_framework.dart` and `build_macos_framework.dart`.
…lar context objects
Refactors XcodeCodeSigningSettings to provide context constructors
(XcodeCodeSigningSettings({required PlistParser plistParser, required ToolContext toolContext})
and XcodeCodeSigningSettings.fromContexts({required AppleContext appleContext, required ToolContext toolContext}))
instead of requiring callers to unpack 8+ individual arguments. Adds
DarwinAddToAppCodesigning.fromContexts and refactors BuildCommand to instantiate
codesigning from context objects and pass directly to subcommands.
bkonyi
added a commit
that referenced
this pull request
Nov 6, 2026
…tures Only include the UTF-8 encoding remediation hint in `TestCommand.verifyThenRunCommand` when `readAsStringSync` fails due to a UTF-8 decoding error (`err.osError == null` and `readAsBytesSync` succeeds), rather than on OS or filesystem read failures. Add a hermetic regression test for OS `FileSystemException`s and document the AppleDouble and UTF-16 LE byte-array fixtures in `test_test.dart`. Previous output (AppleDouble sidecar files): ``` Failed to decode data using encoding 'utf-8', path = '/usr/local/google/home/bkonyi/.gemini/jetski/brain/ee6d5e68-1051-40e6-a23a-a289ca33c97a/scratch/repro_app/test/._a_test.dart' dart:io _File.readAsStringSync package:test_core/src/runner/loader.dart 41:22 Loader.parseSuiteMetadata.<fn>.<fn> package:async/src/result/result.dart 67:40 new Result package:test_core/src/runner/loader.dart 38:14 Loader.parseSuiteMetadata.<fn> dart:_compact_hash _LinkedHashMapMixin.putIfAbsent package:test_core/src/runner/loader.dart 36:35 Loader.parseSuiteMetadata package:test_core/src/runner/loader.dart 266:41 Loader.loadFile This is an unexpected error. Please file an issue at http://github.com/dart-lang/test with the stack trace and instructions for reproducing the error. FileSystemException: Failed to decode data using encoding 'utf-8', path = '/usr/local/google/home/bkonyi/.gemini/jetski/brain/ee6d5e68-1051-40e6-a23a-a289ca33c97a/scratch/repro_app/test/._widget_test.dart' #0 _File._tryDecode (dart:io/file_impl.dart:704:7) #1 _File.readAsStringSync (dart:io/file_impl.dart:715:7) #2 Loader.parseSuiteMetadata.<anonymous closure>.<anonymous closure> (package:test_core/src/runner/loader.dart:41:22) #3 new Result (package:async/src/result/result.dart:67:40) #4 Loader.parseSuiteMetadata.<anonymous closure> (package:test_core/src/runner/loader.dart:38:14) #5 _LinkedHashMapMixin.putIfAbsent (dart:_compact_hash:631:23) #6 Loader.parseSuiteMetadata (package:test_core/src/runner/loader.dart:36:35) flutter#7 Loader.loadFile (package:test_core/src/runner/loader.dart:266:41) <asynchronous suspension> Feature flags enabled: enable-web, enable-linux-desktop, enable-macos-desktop, enable-windows-desktop, enable-android, enable-ios, cli-animations, enable-native-assets, enable-record-use, enable-swift-package-manager, omit-legacy-version-file, enable-lldb-debugging, enable-uiscene-migration, enable-riscv64, enable-hcpp ``` Current output (AppleDouble sidecar files): ``` 00:00 +0: loading /usr/local/google/home/bkonyi/.gemini/jetski/brain/ee6d5e68-1051-40e6-a23a-a289ca33c97a/scratch/repro_app/test/widget_test.dart 00:00 +0: passes 00:00 +1: All tests passed! ``` Previous output (non-UTF-8 test files): ``` Failed to decode data using encoding 'utf-8', path = '/usr/local/google/home/bkonyi/.gemini/jetski/brain/ee6d5e68-1051-40e6-a23a-a289ca33c97a/scratch/repro_app/test/non_utf8_1_test.dart' dart:io _File.readAsStringSync package:test_core/src/runner/loader.dart 41:22 Loader.parseSuiteMetadata.<fn>.<fn> package:async/src/result/result.dart 67:40 new Result package:test_core/src/runner/loader.dart 38:14 Loader.parseSuiteMetadata.<fn> dart:_compact_hash _LinkedHashMapMixin.putIfAbsent package:test_core/src/runner/loader.dart 36:35 Loader.parseSuiteMetadata package:test_core/src/runner/loader.dart 266:41 Loader.loadFile This is an unexpected error. Please file an issue at http://github.com/dart-lang/test with the stack trace and instructions for reproducing the error. FileSystemException: Failed to decode data using encoding 'utf-8', path = '/usr/local/google/home/bkonyi/.gemini/jetski/brain/ee6d5e68-1051-40e6-a23a-a289ca33c97a/scratch/repro_app/test/non_utf8_2_test.dart' #0 _File._tryDecode (dart:io/file_impl.dart:704:7) #1 _File.readAsStringSync (dart:io/file_impl.dart:715:7) #2 Loader.parseSuiteMetadata.<anonymous closure>.<anonymous closure> (package:test_core/src/runner/loader.dart:41:22) #3 new Result (package:async/src/result/result.dart:67:40) #4 Loader.parseSuiteMetadata.<anonymous closure> (package:test_core/src/runner/loader.dart:38:14) #5 _LinkedHashMapMixin.putIfAbsent (dart:_compact_hash:631:23) #6 Loader.parseSuiteMetadata (package:test_core/src/runner/loader.dart:36:35) flutter#7 Loader.loadFile (package:test_core/src/runner/loader.dart:266:41) <asynchronous suspension> Feature flags enabled: enable-web, enable-linux-desktop, enable-macos-desktop, enable-windows-desktop, enable-android, enable-ios, cli-animations, enable-native-assets, enable-record-use, enable-swift-package-manager, omit-legacy-version-file, enable-lldb-debugging, enable-uiscene-migration, enable-riscv64, enable-hcpp ``` Current output (non-UTF-8 test files): ``` Failed to read test file "/usr/local/google/home/bkonyi/.gemini/jetski/brain/ee6d5e68-1051-40e6-a23a-a289 ca33c97a/scratch/repro_app/test/non_utf8_1_test.dart": Failed to decode data using encoding 'utf-8'. Ensure that the file is a valid UTF-8 encoded Dart test file. ```
bkonyi
added a commit
that referenced
this pull request
Nov 9, 2026
… overwrite test Updates `native_assets_flutter_test_manifest_overwrite_test.dart` to invoke `flutterBin` (`test_utils.dart`) with `@Timeout(Duration(minutes: 5))` instead of manually compiling `bin/flutter_tools.dart` to `flutter_tools.dill`, and uses `loadPackageConfig`, `PackageConfig`, `Package`, `LanguageVersion`, and `savePackageConfig` from `package:package_config/package_config.dart` to construct the offline test project's `.dart_tool/package_config.json`. Previous output: ``` Unhandled exception: FileSystemException: Cannot rename file to '/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_196121_dst.tmp', path = '/tmp/repro_196121_src.tmp' (OS Error: Invalid cross-device link, errno = 18) #0 _File.throwIfError (dart:io/file_impl.dart:779:7) #1 _File.renameSync (dart:io/file_impl.dart:396:5) #2 ForwardingFileSystemEntity.renameSync (package:file/src/forwarding/forwarding_file_system_entity.dart:50:49) #3 ErrorHandlingFile.renameSync.<anonymous closure> (package:flutter_tools/src/base/error_handling_io.dart:430:31) #4 _runSync (package:flutter_tools/src/base/error_handling_io.dart:1116:16) #5 ErrorHandlingFile.renameSync (package:flutter_tools/src/base/error_handling_io.dart:429:12) #6 main (file:///usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_exdev.dart:24:37) flutter#7 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:313:19) flutter#8 _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12) ``` Current output: ``` Flutter failed to rename file at "/tmp/repro_196121_src.tmp" to "/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_196121_dst.tmp". A file system operation failed across different volumes or mount points. FileSystemException: Cannot rename file to '/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_196121_dst.tmp', path = '/tmp/repro_196121_src.tmp' (OS Error: Invalid cross-device link, errno = 18) Ensure that the project, build output, and temporary directories are on the same writable volume, or check external volume and security software settings. ``` Previous output (flutter test overwriting existing native_assets.json): ``` Flutter failed to delete file at "/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4 d2ca98a9/scratch/repro_app/build/native_assets/linux/native_assets.json". Please ensure that the SDK and/or project is installed in a location that has read/write permissions for the current user. Try running: sudo chown -R $(whoami) /usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc 4d2ca98a9/scratch/repro_app/build/native_assets/linux/native_assets.json ``` Current output (flutter test overwriting existing native_assets.json): ``` 00:00 +0: loading /usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_app/test/smoke_test.dart 00:00 +0: smoke test 00:00 +1: All tests passed! ``` Fixes flutter#196121
bkonyi
added a commit
that referenced
this pull request
Nov 9, 2026
Simplifies the fix and tests for avoiding redundant `native_assets.json` deletion and handling `EXDEV`: - Restores `ErrorHandlingFileSystem.deleteIfExists` to upstream and removes custom `ForwardingFileSystem` test doubles in `error_handling_io_test.dart`, testing `EXDEV` (`errno = 18`) directly with `MemoryFileSystem.test(opHandle: exceptionHandler.opHandle)`. - Streams `targetDir.list(followLinks: false)` in `_copyNativeCodeAssetsForOS` with `entity is File` instead of `.toList()` and `typeSync`, and deduplicates `installCodeAssets` test setup in `native_assets_test.dart`. - Removes the redundant `flutter test` subprocess integration test (`native_assets_flutter_test_manifest_overwrite_test.dart`). Reproduction notes: Both output pairs below were captured on a Linux host, which cannot reproduce the macOS external-volume behavior directly. The first pair comes from a small Dart script (`repro_exdev.dart`) calling `ErrorHandlingFileSystem.file(...).renameSync(...)` from `/tmp` (`tmpfs`) to an `ext4` directory to trigger a real kernel `EXDEV` (`errno = 18`). The second pair comes from running `BOT=true flutter test --no-pub -r expanded` on a minimal app after making `build/native_assets/linux` read-only (`chmod 0555`) while leaving `native_assets.json` writable (`0644`), so `unlink(2)` fails while in-place truncation succeeds; with a writable `build/native_assets/linux` directory, the unfixed tool passes with the same 3-line test output. Local workspace paths inside the fenced output blocks are preserved verbatim to match exact command output. Previous output: ``` Unhandled exception: FileSystemException: Cannot rename file to '/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_196121_dst.tmp', path = '/tmp/repro_196121_src.tmp' (OS Error: Invalid cross-device link, errno = 18) #0 _File.throwIfError (dart:io/file_impl.dart:779:7) #1 _File.renameSync (dart:io/file_impl.dart:396:5) #2 ForwardingFileSystemEntity.renameSync (package:file/src/forwarding/forwarding_file_system_entity.dart:50:49) #3 ErrorHandlingFile.renameSync.<anonymous closure> (package:flutter_tools/src/base/error_handling_io.dart:430:31) #4 _runSync (package:flutter_tools/src/base/error_handling_io.dart:1116:16) #5 ErrorHandlingFile.renameSync (package:flutter_tools/src/base/error_handling_io.dart:429:12) #6 main (file:///usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_exdev.dart:24:37) flutter#7 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:313:19) flutter#8 _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12) ``` Current output: ``` Flutter failed to rename file at "/tmp/repro_196121_src.tmp" to "/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_196121_dst.tmp". A file system operation failed across different volumes or mount points. FileSystemException: Cannot rename file to '/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_196121_dst.tmp', path = '/tmp/repro_196121_src.tmp' (OS Error: Invalid cross-device link, errno = 18) Ensure that the project, build output, and temporary directories are on the same writable volume, or check external volume and security software settings. ``` Previous output (flutter test overwriting existing native_assets.json): ``` Flutter failed to delete file at "/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4 d2ca98a9/scratch/repro_app/build/native_assets/linux/native_assets.json". Please ensure that the SDK and/or project is installed in a location that has read/write permissions for the current user. Try running: sudo chown -R $(whoami) /usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc 4d2ca98a9/scratch/repro_app/build/native_assets/linux/native_assets.json ``` Current output (flutter test overwriting existing native_assets.json): ``` 00:00 +0: loading /usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_app/test/smoke_test.dart 00:00 +0: smoke test 00:00 +1: All tests passed! ``` Fixes flutter#196121
bkonyi
added a commit
that referenced
this pull request
Nov 9, 2026
…ative assets Restores `.toList()` on `targetDir.list(followLinks: false)` in `_copyNativeCodeAssetsForOS` so directory enumeration completes before deleting stale entries in `targetDir`, avoiding concurrent directory stream mutation issues on Windows and network filesystems. Reproduction notes: Both output pairs below were captured on a Linux host, which cannot reproduce the macOS external-volume behavior directly. The first pair comes from a small Dart script (`repro_exdev.dart`) calling `ErrorHandlingFileSystem.file(...).renameSync(...)` from `/tmp` (`tmpfs`) to an `ext4` directory to trigger a real kernel `EXDEV` (`errno = 18`). The second pair comes from running `BOT=true flutter test --no-pub -r expanded` on a minimal app after making `build/native_assets/linux` read-only (`chmod 0555`) while leaving `native_assets.json` writable (`0644`), so `unlink(2)` fails while in-place truncation succeeds; with a writable `build/native_assets/linux` directory, the unfixed tool passes with the same 3-line test output. Local workspace paths inside the fenced output blocks are preserved verbatim to match exact command output. Previous output: ``` Unhandled exception: FileSystemException: Cannot rename file to '/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_196121_dst.tmp', path = '/tmp/repro_196121_src.tmp' (OS Error: Invalid cross-device link, errno = 18) #0 _File.throwIfError (dart:io/file_impl.dart:779:7) #1 _File.renameSync (dart:io/file_impl.dart:396:5) #2 ForwardingFileSystemEntity.renameSync (package:file/src/forwarding/forwarding_file_system_entity.dart:50:49) #3 ErrorHandlingFile.renameSync.<anonymous closure> (package:flutter_tools/src/base/error_handling_io.dart:430:31) #4 _runSync (package:flutter_tools/src/base/error_handling_io.dart:1116:16) #5 ErrorHandlingFile.renameSync (package:flutter_tools/src/base/error_handling_io.dart:429:12) #6 main (file:///usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_exdev.dart:24:37) flutter#7 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:313:19) flutter#8 _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12) ``` Current output: ``` Flutter failed to rename file at "/tmp/repro_196121_src.tmp" to "/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_196121_dst.tmp". A file system operation failed across different volumes or mount points. FileSystemException: Cannot rename file to '/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_196121_dst.tmp', path = '/tmp/repro_196121_src.tmp' (OS Error: Invalid cross-device link, errno = 18) Ensure that the project, build output, and temporary directories are on the same writable volume, or check external volume and security software settings. ``` Previous output (flutter test overwriting existing native_assets.json): ``` Flutter failed to delete file at "/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4 d2ca98a9/scratch/repro_app/build/native_assets/linux/native_assets.json". Please ensure that the SDK and/or project is installed in a location that has read/write permissions for the current user. Try running: sudo chown -R $(whoami) /usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc 4d2ca98a9/scratch/repro_app/build/native_assets/linux/native_assets.json ``` Current output (flutter test overwriting existing native_assets.json): ``` 00:00 +0: loading /usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_app/test/smoke_test.dart 00:00 +0: smoke test 00:00 +1: All tests passed! ``` Fixes flutter#196121
bkonyi
added a commit
that referenced
this pull request
Nov 11, 2026
…lutter#196134) Previously, `installCodeAssets` invoked `_copyNativeCodeAssetsForOS` on every `flutter test` run, which listed `build/native_assets/<os>/` and deleted `native_assets.json` right before `_writeNativeAssetsJson` truncated and overwrote that same file in place. On macOS external volumes (for example `/Volumes/...` where endpoint-security or recycle-bin interposers intercept `unlink(2)` and attempt a cross-volume `rename(2)`), unlinking `native_assets.json` failed with `FileSystemException (OS Error: Cross-device link, errno = 18)` (`EXDEV`). In addition, `_handlePosixException` did not map `EXDEV` (`errno = 18`) to a `ToolExit`. This change: 1. Skips deleting `native_assets.json` in `_copyNativeCodeAssetsForOS` when it already exists on disk as a regular file, since `_writeNativeAssetsJson` immediately truncates and overwrites it in place (while still deleting stale bundled native asset artifacts, directories, and symlinks). 2. Handles POSIX `EXDEV` (`errno = 18`) in `_handlePosixException` on Linux and macOS by throwing an actionable `ToolExit` instead of crashing with an unhandled `FileSystemException`. Reproduction notes: Both output pairs below were captured on a Linux host, which cannot reproduce the macOS external-volume behavior directly. The first pair comes from a small Dart script (`repro_exdev.dart`) calling `ErrorHandlingFileSystem.file(...).renameSync(...)` from `/tmp` (`tmpfs`) to an `ext4` directory to trigger a real kernel `EXDEV` (`errno = 18`). The second pair comes from running `BOT=true flutter test --no-pub -r expanded` on a minimal app after making `build/native_assets/linux` read-only (`chmod 0555`) while leaving `native_assets.json` writable (`0644`), so `unlink(2)` fails while in-place truncation succeeds; with a writable `build/native_assets/linux` directory, the unfixed tool passes with the same 3-line test output. Local workspace paths inside the fenced output blocks are preserved verbatim to match exact command output. Previous output: ``` Unhandled exception: FileSystemException: Cannot rename file to '/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_196121_dst.tmp', path = '/tmp/repro_196121_src.tmp' (OS Error: Invalid cross-device link, errno = 18) #0 _File.throwIfError (dart:io/file_impl.dart:779:7) #1 _File.renameSync (dart:io/file_impl.dart:396:5) #2 ForwardingFileSystemEntity.renameSync (package:file/src/forwarding/forwarding_file_system_entity.dart:50:49) #3 ErrorHandlingFile.renameSync.<anonymous closure> (package:flutter_tools/src/base/error_handling_io.dart:430:31) #4 _runSync (package:flutter_tools/src/base/error_handling_io.dart:1116:16) #5 ErrorHandlingFile.renameSync (package:flutter_tools/src/base/error_handling_io.dart:429:12) #6 main (file:///usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_exdev.dart:24:37) flutter#7 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:313:19) flutter#8 _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12) ``` Current output: ``` Flutter failed to rename file at "/tmp/repro_196121_src.tmp" to "/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_196121_dst.tmp". A file system operation failed across different volumes or mount points. FileSystemException: Cannot rename file to '/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_196121_dst.tmp', path = '/tmp/repro_196121_src.tmp' (OS Error: Invalid cross-device link, errno = 18) Ensure that the project, build output, and temporary directories are on the same writable volume, or check external volume and security software settings. ``` Previous output (flutter test overwriting existing native_assets.json): ``` Flutter failed to delete file at "/usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4 d2ca98a9/scratch/repro_app/build/native_assets/linux/native_assets.json". Please ensure that the SDK and/or project is installed in a location that has read/write permissions for the current user. Try running: sudo chown -R $(whoami) /usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc 4d2ca98a9/scratch/repro_app/build/native_assets/linux/native_assets.json ``` Current output (flutter test overwriting existing native_assets.json): ``` 00:00 +0: loading /usr/local/google/home/bkonyi/.gemini/jetski/brain/0a669702-1e2d-46a6-9c37-fdc4d2ca98a9/scratch/repro_app/test/smoke_test.dart 00:00 +0: smoke test 00:00 +1: All tests passed! ``` Fixes flutter#196121
bkonyi
added a commit
that referenced
this pull request
Nov 12, 2026
flutter#196136) Previously, `ErrorHandlingFile.readAsStringSync` dropped its `encoding` parameter when calling `delegate.readAsStringSync()`, forcing UTF-8 decoding even when callers requested another encoding (unlike `readAsString`, `readAsLines`, and `readAsLinesSync`, which already forwarded `encoding`). Because `flutter_tools` wraps `LocalFileSystem` in `ErrorHandlingFileSystem`, callers such as `ScreenshotCommand.ensureOutputIsNotJsonRpcError` (which passes `AsciiCodec(allowInvalid: true)` when checking small screenshot files for JSON-RPC error payloads) crashed with a `FileSystemException`. Forward `encoding` to `delegate.readAsStringSync(encoding: encoding)` and add regression tests covering `ErrorHandlingFile.readAsStringSync` backed by `LocalFileSystem` and `ScreenshotCommand.ensureOutputIsNotJsonRpcError` on `ErrorHandlingFileSystem`. Fixes flutter#196225 Previous output: ``` Screenshot written to flutter_01.skp (0kB). FileSystemException: Failed to decode data using encoding 'utf-8', path = '/tmp/repro_screenshot_skp.QPQNLT/flutter_01.skp' #0 _File._tryDecode (dart:io/file_impl.dart:704:7) #1 _File.readAsStringSync (dart:io/file_impl.dart:715:7) #2 ForwardingFile.readAsStringSync (package:file/src/forwarding/forwarding_file.dart:99:16) #3 ErrorHandlingFile.readAsStringSync.<anonymous closure> (package:flutter_tools/src/base/error_handling_io.dart:258:22) #4 _runSync (package:flutter_tools/src/base/error_handling_io.dart:1116:16) #5 ErrorHandlingFile.readAsStringSync (package:flutter_tools/src/base/error_handling_io.dart:257:12) #6 ScreenshotCommand.ensureOutputIsNotJsonRpcError (package:flutter_tools/src/commands/screenshot.dart:198:39) flutter#7 ScreenshotCommand.runSkia (package:flutter_tools/src/commands/screenshot.dart:180:5) <asynchronous suspension> flutter#8 ScreenshotCommand.runCommand (package:flutter_tools/src/commands/screenshot.dart:123:19) <asynchronous suspension> flutter#9 FlutterCommand.run.<anonymous closure> (package:flutter_tools/src/runner/flutter_command.dart:876:27) <asynchronous suspension> flutter#10 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19) <asynchronous suspension> flutter#11 CommandRunner.runCommand (package:args/command_runner.dart:212:13) <asynchronous suspension> flutter#12 FlutterCommandRunner.runCommand.<anonymous closure> (package:flutter_tools/src/runner/flutter_command_runner.dart:689:9) <asynchronous suspension> flutter#13 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19) <asynchronous suspension> flutter#14 FlutterCommandRunner.runCommand (package:flutter_tools/src/runner/flutter_command_runner.dart:619:5) <asynchronous suspension> flutter#15 FlutterCommandRunner.run (package:flutter_tools/src/runner/flutter_command_runner.dart:379:5) <asynchronous suspension> flutter#16 run.<anonymous closure>.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:flutter_tools/runner.dart:419:19) <asynchronous suspension> flutter#17 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19) <asynchronous suspension> flutter#18 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19) <asynchronous suspension> flutter#19 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19) <asynchronous suspension> flutter#20 main (package:flutter_tools/executable.dart:133:3) <asynchronous suspension> Feature flags enabled: enable-web, enable-linux-desktop, enable-macos-desktop, enable-windows-desktop, enable-android, enable-ios, cli-animations, enable-native-assets, enable-record-use, enable-swift-package-manager, omit-legacy-version-file, enable-lldb-debugging, enable-uiscene-migration, enable-riscv64, enable-hcpp ``` Current output: ``` Screenshot written to flutter_01.skp (0kB). ```
bkonyi
added a commit
that referenced
this pull request
Nov 12, 2026
Update `screenshot_test.dart` to write its synthetic package configuration via `writePackageConfigFiles`, resolve local engine paths via `LocalEngineLocator` and `getLocalEngineArguments()` with a normalized absolute `flutterBin` path, and register `flutter_tester` teardown immediately after process startup with early-exit reporting. Previous output: ``` _flutter.screenshotSkp: (-32000) Cannot capture SKP screenshot with Impeller enabled. #0 new _OutstandingRequest (package:vm_service/src/vm_service.dart:280:34) #1 VmService._call.<anonymous closure> (package:vm_service/src/vm_service.dart:1962:25) #2 VmService._call (package:vm_service/src/vm_service.dart:1974:8) #3 VmService.callServiceExtension (package:vm_service/src/vm_service.dart:1905:14) #4 FlutterVmService._checkedCallServiceExtension (package:flutter_tools/src/vmservice.dart:835:28) #5 FlutterVmService.screenshotSkp (package:flutter_tools/src/vmservice.dart:1069:12) #6 ScreenshotCommand.runSkia (package:flutter_tools/src/commands/screenshot.dart:167:54) <asynchronous suspension> flutter#7 ScreenshotCommand.runCommand (package:flutter_tools/src/commands/screenshot.dart:123:19) <asynchronous suspension> flutter#8 FlutterCommand.run.<anonymous closure> (package:flutter_tools/src/runner/flutter_command.dart:876:27) <asynchronous suspension> flutter#9 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19) <asynchronous suspension> flutter#10 CommandRunner.runCommand (package:args/command_runner.dart:212:13) <asynchronous suspension> flutter#11 FlutterCommandRunner.runCommand.<anonymous closure> (package:flutter_tools/src/runner/flutter_command_runner.dart:689:9) <asynchronous suspension> flutter#12 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19) <asynchronous suspension> flutter#13 FlutterCommandRunner.runCommand (package:flutter_tools/src/runner/flutter_command_runner.dart:619:5) <asynchronous suspension> flutter#14 FlutterCommandRunner.run (package:flutter_tools/src/runner/flutter_command_runner.dart:379:5) <asynchronous suspension> flutter#15 run.<anonymous closure>.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:flutter_tools/runner.dart:419:19) <asynchronous suspension> flutter#16 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19) <asynchronous suspension> flutter#17 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19) <asynchronous suspension> flutter#18 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19) <asynchronous suspension> flutter#19 main (package:flutter_tools/executable.dart:133:3) <asynchronous suspension> Feature flags enabled: enable-web, enable-linux-desktop, enable-macos-desktop, enable-windows-desktop, enable-android, enable-ios, cli-animations, enable-native-assets, enable-record-use, enable-swift-package-manager, omit-legacy-version-file, enable-lldb-debugging, enable-uiscene-migration, enable-riscv64, enable-hcpp ``` Current output: ``` The Skia picture request failed: Cannot capture SKP screenshot with Impeller enabled. ``` Fixes flutter#196119
bkonyi
added a commit
that referenced
this pull request
Nov 13, 2026
…#196132) Previously, running `flutter screenshot --type=skia` against an application with Impeller enabled crashed with an unhandled `vm_service.RPCError` (`-32000`) because the engine rejects `_flutter.screenshotSkp` requests under Impeller and `ScreenshotCommand.runSkia` did not catch `RPCError`. Catch `vm_service.RPCError` in `ScreenshotCommand.runSkia` and exit cleanly via `throwToolExit` with the engine's error message. Previous output: ``` _flutter.screenshotSkp: (-32000) Cannot capture SKP screenshot with Impeller enabled. #0 new _OutstandingRequest (package:vm_service/src/vm_service.dart:280:34) #1 VmService._call.<anonymous closure> (package:vm_service/src/vm_service.dart:1962:25) #2 VmService._call (package:vm_service/src/vm_service.dart:1974:8) #3 VmService.callServiceExtension (package:vm_service/src/vm_service.dart:1905:14) #4 FlutterVmService._checkedCallServiceExtension (package:flutter_tools/src/vmservice.dart:835:28) #5 FlutterVmService.screenshotSkp (package:flutter_tools/src/vmservice.dart:1069:12) #6 ScreenshotCommand.runSkia (package:flutter_tools/src/commands/screenshot.dart:167:54) <asynchronous suspension> flutter#7 ScreenshotCommand.runCommand (package:flutter_tools/src/commands/screenshot.dart:123:19) <asynchronous suspension> flutter#8 FlutterCommand.run.<anonymous closure> (package:flutter_tools/src/runner/flutter_command.dart:876:27) <asynchronous suspension> flutter#9 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19) <asynchronous suspension> flutter#10 CommandRunner.runCommand (package:args/command_runner.dart:212:13) <asynchronous suspension> flutter#11 FlutterCommandRunner.runCommand.<anonymous closure> (package:flutter_tools/src/runner/flutter_command_runner.dart:689:9) <asynchronous suspension> flutter#12 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19) <asynchronous suspension> flutter#13 FlutterCommandRunner.runCommand (package:flutter_tools/src/runner/flutter_command_runner.dart:619:5) <asynchronous suspension> flutter#14 FlutterCommandRunner.run (package:flutter_tools/src/runner/flutter_command_runner.dart:379:5) <asynchronous suspension> flutter#15 run.<anonymous closure>.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:flutter_tools/runner.dart:419:19) <asynchronous suspension> flutter#16 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19) <asynchronous suspension> flutter#17 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19) <asynchronous suspension> flutter#18 AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:174:19) <asynchronous suspension> flutter#19 main (package:flutter_tools/executable.dart:133:3) <asynchronous suspension> Feature flags enabled: enable-web, enable-linux-desktop, enable-macos-desktop, enable-windows-desktop, enable-android, enable-ios, cli-animations, enable-native-assets, enable-record-use, enable-swift-package-manager, omit-legacy-version-file, enable-lldb-debugging, enable-uiscene-migration, enable-riscv64, enable-hcpp ``` Current output: ``` The Skia picture request failed: Cannot capture SKP screenshot with Impeller enabled. ``` Fixes flutter#196119
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Migrates Apple build subcommands and their Darwin/Xcode toolchain integrations to use modular dependency injection (
ToolContext,AppleContext,BuildSystem,Analytics) and eliminates reliance on ambient globals.Migrated Commands & Components
BuildIOSCommand,BuildIOSArchiveCommand, and_BuildIOSSubCommandinpackages/flutter_tools/lib/src/commands/build_ios.dart.BuildFrameworkCommandandBuildIOSFrameworkCommandinpackages/flutter_tools/lib/src/commands/build_ios_framework.dart.BuildMacosCommandinpackages/flutter_tools/lib/src/commands/build_macos.dart.BuildMacOSFrameworkCommandinpackages/flutter_tools/lib/src/commands/build_macos_framework.dart.packages/flutter_tools/lib/src/commands/build.dartandpackages/flutter_tools/lib/executable.dartusingtoolDependencies.appleContext,toolDependencies.toolContext, andtoolDependencies.buildSystem.build_darwin_framework_test.dart,build_ios_test.dart,build_ipa_export_plist_test.dart,build_ipa_test.dart, andbuild_macos_test.dartto run hermetically with explicit dependencies and fakes.Compare
di/14-android-build-and-toolchain...di/15-apple-build-and-toolchain