Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: flutter/flutter
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 8b3e8f5a1e64
Choose a base ref
...
head repository: flutter/flutter
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 27fec0e365a3
Choose a head ref
  • 15 commits
  • 60 files changed
  • 12 contributors

Commits on Sep 14, 2026

  1. [Linux] Clear the frame when there is nothing to render (#192461)

    If everything on screen is transparent the engine sends a frame with no
    layers in it. We treated that as "nothing to do" and kept showing the
    last frame, so the old contents stayed on screen forever.
    
    Now each frame clears before the layers are drawn, so an empty frame
    clears the window. This also fixes transparent parts of a frame showing
    the previous frame through them.
    
    Two other things stopped an empty frame working:
    
    - The Wayland renderer returned before presenting the frame, so a first
    frame with no layers never showed the window.
    - The software renderer only drew a layer if it was the only layer, and
    drew it in the corner instead of at its position. It now draws all the
    layers like the OpenGL renderer does.
    
    Fixes #191870
    robert-ancell authored Sep 14, 2026
    Configuration menu
    Copy the full SHA
    07b6e70 View commit details
    Browse the repository at this point in the history
  2. Configuration menu
    Copy the full SHA
    f5825b8 View commit details
    Browse the repository at this point in the history
  3. Configuration menu
    Copy the full SHA
    2d7c9ed View commit details
    Browse the repository at this point in the history
  4. Configuration menu
    Copy the full SHA
    8225c75 View commit details
    Browse the repository at this point in the history
  5. fix(web): hide --web-content-hash until content hashing is complete (#…

    …192663)
    
    `--web-content-hash` currently hashes only the compiled entrypoints
    (#191914). Static assets (#191915), the service worker precache manifest
    (#191916), and deferred loading parts (#191917) are all still unhashed,
    so
    a build with the flag enabled can continue to serve stale cached
    content.
    Advertising the flag now sets an expectation the implementation does not
    yet meet.
    
    The flag has not shipped in any release. It landed on master in #190153
    on
    2026-09-10, after the flutter-3.48-candidate.0 fork, so hiding it costs
    nothing today. It also avoids committing to the flag's boolean shape
    before
    the remaining phases show whether granularity is needed.
    
    Locks the behavior into the existing `flutter build web option
    visibility`
    tests, including the verbose-help variant, so the flag stays hidden
    rather
    than becoming verbose-only by accident.
    
    Un-hide once #191915 and #191916 have landed.
    kevmoo authored Sep 14, 2026
    Configuration menu
    Copy the full SHA
    bdb24b7 View commit details
    Browse the repository at this point in the history
  6. RELAND: [devicelab] Clean up Chrome profile directories and trap abor…

    …t signals in web benchmarks (#192655)
    
    Ensures temporary Chrome user profile directories created during web
    benchmarks are reliably deleted, and ensures benchmark child processes
    (Chrome, Shelf, and `flutter run`) are cleaned up when benchmarks
    complete or when interrupted with SIGINT/SIGTERM.
    
    Part of #191316
    
    _Tip for reviewers: Recommend viewing with "Hide whitespace" enabled
    (`?w=1`), as wrapping the task body in `try ... finally` re-indents the
    inner block._
    
    I fixed the issue with the Chrome lifecycle that caused the original
    revert.
    
    ## 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
    harryterkelsen authored Sep 14, 2026
    Configuration menu
    Copy the full SHA
    e300b37 View commit details
    Browse the repository at this point in the history
  7. Configuration menu
    Copy the full SHA
    a638a66 View commit details
    Browse the repository at this point in the history
  8. Sync CHANGELOG.md from stable (#192499)

    This PR automates the synchronization of `CHANGELOG.md` from the
    `stable` branch to the `master` branch.
    flutteractionsbot authored Sep 14, 2026
    Configuration menu
    Copy the full SHA
    94ae3da View commit details
    Browse the repository at this point in the history
  9. docs: migrate design document guidance to flutter/rfc (#192648)

    Update documentation across the repository, issue templates, and
    contribution guides to establish flutter/rfc as the authoritative
    workflow for Flutter RFCs and design documents:
    
    - Streamline docs/contributing/Design-Documents.md to focus on the RFC
    threshold, PR-based approvals, and source-code documentation.
    - Update .github/ISSUE_TEMPLATE/07_design_doc.yml to require flutter/rfc
    pull request links.
    - Update CONTRIBUTING.md, Tree-hygiene.md, Chat.md, and issue hygiene
    docs to point to flutter/rfc and clarify breaking change policies.
    - Remove obsolete references to flutter.dev/go/template and clarify
    fcontrib.org account history.
    jtmcdole authored Sep 14, 2026
    Configuration menu
    Copy the full SHA
    435cf9a View commit details
    Browse the repository at this point in the history
  10. Warn users on potential removal of dart:html in dry run (#192710)

    Update the dry-run warning messages in flutter_tools to clearly
    communicate that dart:html, dart:js, and legacy JS interop libraries
    are deprecated and planned for removal from the Dart SDK in a future
    release, encouraging users to migrate to package:web and
    dart:js_interop.
    
    Fixes #190562
    kevmoo authored Sep 14, 2026
    Configuration menu
    Copy the full SHA
    79c1e5e View commit details
    Browse the repository at this point in the history
  11. ci(bringup): cleanup some bringup (#192752)

    - Linux_android_emu external_textures_integration_test: marked as
    suppressed, but is gret.
    - Linux linux_android_aot_engine_size_exp: not bringup, but suppressed
    and presubmit: false.
    - Windows windows_unopt: green and slightly flakey; supressed so it will
    run in presubmit.
    - Mac windowing_test: green
    
    
    There is now only 2 `bringup:true`
    jtmcdole authored Sep 14, 2026
    Configuration menu
    Copy the full SHA
    cefeaef View commit details
    Browse the repository at this point in the history
  12. Configuration menu
    Copy the full SHA
    6b6aaaf View commit details
    Browse the repository at this point in the history
  13. Request unbuffered dispatch for platform view motion events after `_P…

    …latformViewGestureRecognizer` rejects gesture (#192259)
    
    Changes platform view touch input for all modes to request the
    unbuffered stream for the given event when the GestureArena determines
    the platform view has bowed out of ownership of that event, via
    [View.requestUnbufferedDispatch()](https://developer.android.com/reference/kotlin/android/view/View#requestunbuffereddispatch).
    Flutter content itself makes this request, but currently platform views
    don't.
    
    This greatly improves platform view scrolling smoothness, while having
    no breaking change or impact on platform views performing gesture
    handling (because the GestureArena has determined that they don't own
    the input event).
    
    ### Problem & Invariant
    Under high-load or scrolling scenarios, buffered touch dispatch causes
    visible jank and input lag. Flutter requests unbuffered dispatch for its
    own rendering, but platform views continue using buffered streams unless
    requested. Simply requesting unbuffered dispatch unconditionally can
    cause issues if gestures are still competing or owned by the platform
    view. Scoping unbuffered dispatch to gestures that Flutter has won
    ensures that platform views receive fast, unbuffered dispatch
    specifically during Flutter gestures (like scrolling).
    
    ### Architecture & Gesture Correlation (`embedderId`)
    Previous iterations attempted to correlate gestures across the channel
    by matching synthetic `downTime` timestamps packed into
    `PointerDownEvent.timeStamp`. However, resamplers or clock drift can
    alter event timestamps.
    
    Instead, this PR uses Flutter's canonical `embedderId` mechanism:
    1. **Android Touch Processor**: When an Android `MotionEvent` arrives,
    `AndroidTouchProcessor` tracks it using
    `MotionEventTracker.track(event)` and populates
    `packet.putLong(motionEventId)`, which the framework receives as
    `PointerEvent.embedderId`.
    2. **Framework Arena Resolution**: `_PlatformViewGestureRecognizer`
    records the `embedderId` of the pointer-down event. When Flutter wins
    the arena and calls `rejectGesture(pointer)`, the framework sends
    `gestureId` (set to `embedderId`) over the `flutter/platform_views`
    system channel.
    3. **Engine Correlation (`MotionEventTracker.peek`)**:
    - `PlatformViewsController` and `PlatformViewsController2` handle
    `onRejectGesture(viewId, gestureId)`.
    - The controllers query
    `motionEventTracker.peek(MotionEventId.from(gestureId))` to look up the
    native `MotionEvent` without consuming it from the tracker.
    - From this `MotionEvent`, the native `downTime` is retrieved and passed
    to `FlutterMutatorView` and `PlatformViewWrapper`.
    - `PlatformViewGestureTracker` marks `flutterWonGesture = true` if the
    `downTime` matches the current active gesture stream, and keeps calling
    `requestUnbufferedDispatch()` for all remaining events in the gesture
    until `ACTION_UP` or `ACTION_CANCEL`.
    4. **Graceful Degradation / Fails Closed**:
    - If `peek()` returns `null` (e.g. if the event was already popped or on
    non-Android embedders), or if `gestureId` is 0 or unmatched, the
    optimization degrades gracefully to standard buffered touch dispatch
    without breaking input handling.
    
    ### Tests
    - **Framework tests**:
    `packages/flutter/test/rendering/platform_view_test.dart`
    - Verifies `rejectGesture` passes the pointer's `embedderId` as
    `gestureId`.
    - Verifies multi-touch gestures correctly pass individual `embedderId`s.
      - Verifies no channel call is dispatched when `embedderId` is 0.
    - **Engine Robolectric tests**:
    - `PlatformViewsControllerTest`: Verifies `rejectGesture` with valid
    `gestureId` looks up tracked `MotionEvent` and enables unbuffered
    dispatch; verifies mismatched or missing IDs do not enable it.
    - `PlatformViewsController2Test`: Verifies same behavior on the modern
    hybrid composition pipeline.
    - `FlutterMutatorViewTest` and `PlatformViewWrapperTest`: Verifies
    gesture tracking across `ACTION_DOWN`, `ACTION_MOVE` sequences, and
    resetting on `ACTION_UP`/`ACTION_CANCEL`.
    
    Supersedes #192249
    
    ## 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].
    - [ ] 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.
    
    <!-- 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
    
    ---
    *Generated with Gemini / AI assistance.*
    gmackall authored Sep 14, 2026
    Configuration menu
    Copy the full SHA
    c5ddcd2 View commit details
    Browse the repository at this point in the history
  14. Roll Skia from 83c984a6daf5 to 59904977fcbb (8 revisions) (#192767)

    https://skia.googlesource.com/skia.git/+log/83c984a6daf5..59904977fcbb
    
    2026-09-14 [email protected] [spanify] Rewrite C-style arrays to
    std::array and std::to_array
    2026-09-14 [email protected] [graphite] Use SkOpts for swizzle+
    premul/unpremul transfers
    2026-09-14
    recipe-mega-autoroller@chops-service-accounts.iam.gserviceaccount.com
    Roll recipe dependencies (trivial).
    2026-09-14 [email protected] [Maintenance] Merge dump_record and
    dump_capture
    2026-09-14 [email protected] [graphite] Reduce _ALWAYS tracing
    overhead
    2026-09-14 [email protected] Reland "[graphite] Use approx-sized
    MSAA and D/S attachments when possible"
    2026-09-14 [email protected] Roll
    vulkan-deps from 8bcad2f78f55 to d60dc547ea78 (2 revisions)
    2026-09-14 [email protected] Revert "Give Android build approvers
    OWNERS for Android-only files"
    
    If this roll has caused a breakage, revert this CL and set the roller
    to dry run mode 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
    engine-flutter-autoroll authored Sep 14, 2026
    Configuration menu
    Copy the full SHA
    8f392c2 View commit details
    Browse the repository at this point in the history
  15. Add dedicated rubber band spring for overscroll recovery in BouncingS…

    …crollPhysics (#187568)
    
    > [!NOTE] 
    > **Relanding** #182426.
    >
    > Thank you for your review and guidance on the previous PR.
    >
    > I'm relanding this with the fix for the test failures that caused the
    issue before. *(I've updated the regression test to account for the
    faster convergence rate of the new physics.)*
    
    Fixes #181752
    *(for detailed analysis, measurements, and discussion, please refer to
    the original issue.)*
    
    This pull request implements a dedicated “rubber band” physics for
    overscroll snap-back in BouncingScrollPhysics on iOS to better match the
    native UIScrollView feel.
    
    <img width="1000" alt="546867255-4ad56291-9603-40c1-ae5a-3e319017c3c9"
    src="https://github.com/user-attachments/assets/8e72ebff-fb8f-4613-b042-7668db15bcf5"
    />
    
    - - -
    
    > [!NOTE]
    > This change adjusts spring constants and simulation behavior
    > to improve iOS scroll fidelity.
    >
    > Given that this change primarily involves physics parameter tuning,
    > it may reasonably qualify as test-exempt. However, I am not entirely
    > certain what level of automated testing would be considered
    appropriate.
    >
    > Please let me know if additional tests are expected,
    > and I am happy to update the PR accordingly.
    
    ## Pre-launch Checklist
    
    - [x] I read the [Contributor Guide] and followed the process outlined
    there for submitting PRs.
    - [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].
    
    **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
    [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: Tong Mu <[email protected]>
    Co-authored-by: Victor Sanni <[email protected]>
    Co-authored-by: Elliott Brooks <[email protected]>
    4 people authored Sep 14, 2026
    Configuration menu
    Copy the full SHA
    27fec0e View commit details
    Browse the repository at this point in the history
Loading