)]}'
{
  "commit": "effb186f3172afa211230de73d83af2788e44324",
  "tree": "f8b40d66fc5e8c6598441ab0497c99b04a38b89c",
  "parents": [
    "9e68281b1f23c4a2a32c2255d7628ba2d58b7c4c"
  ],
  "author": {
    "name": "zhongliugo",
    "email": "zhongliu88889@gmail.com",
    "time": "Wed Jul 29 14:38:14 2026 -0700"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Wed Jul 29 21:38:14 2026 +0000"
  },
  "message": "[beta] [web] Cancel touch pointers WebKit abandons mid-gesture (#190231)\n\nThis pull request cherry-picks #189608 into the beta release branch (flutter-3.47-candidate.0) so the fix ships in the next stable release.\r\n\r\n### Issue Link:\r\nhttps://github.com/flutter/flutter/issues/188781\r\n\r\n### Impact Description:\r\nP0 regression. On iOS 27, which affects every browser since they all run WebKit, a text field in a Flutter web app can become permanently unresponsive after a common gesture. When the user long-press-drags the selection caret and\r\nlifts, WebKit abandons the touch without delivering `pointerup` or `pointercancel`, leaving the framework holding a pointer that never lifts. This wedges the tap-and-drag gesture recognizer, so every later tap is silently dropped: the field never regains focus and the keyboard never returns, and the user can no longer type. It breaks text input in shipping production web apps. iOS 26 is unaffected.\r\n\r\n### Changelog Description:\r\n[flutter/188781] When dragging the text selection caret on iOS 27 web browsers, text fields could become permanently unresponsive to taps and never regain focus; they now recover.\r\n\r\n### Workaround:\r\nNo in-app workaround. Reloading the page temporarily restores the field, but it breaks again the next time the gesture occurs.\r\n\r\n### Risk:\r\nThe change is small and strictly gated to iOS WebKit. It only cancels touch pointers the browser has already dropped from its `touches` list, so it cannot affect other platforms or normal pointer handling.\r\n\r\n### Test Coverage:\r\nThe fix adds 341 lines of engine unit tests in `pointer_binding_test.dart` covering the touch-cancel logic.\r\n\r\n### Validation Steps:\r\n1. Open a Flutter web app containing a TextField on an iOS 27 device, any browser.\r\n2. Tap the field to focus it and type some text.\r\n3. Long-press the selection caret, drag it, then lift your finger.\r\n4. Tap the field again, and repeat a few times.\r\n5. Before the fix the field becomes permanently dead: taps do nothing, no focus, no keyboard. After the fix the field keeps responding and recovers.\r\n\r\nDemo before: https://flutter-demo-47-before.web.app\r\nDemo after:  https://flutter-demo-47-after.web.app",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "ac296f15b64337d8f801f17794bc253ef28dd8c2",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/lib/web_ui/lib/src/engine/dom.dart",
      "new_id": "489581eaaea571608dc2c0f98af514ce3c31bb91",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/lib/web_ui/lib/src/engine/dom.dart"
    },
    {
      "type": "modify",
      "old_id": "d0b8e14d2a29ebded19d1682b079ad0452aae3b7",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/lib/web_ui/lib/src/engine/pointer_binding.dart",
      "new_id": "411338fdb11cf827226ca019e09bf287f03824e2",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/lib/web_ui/lib/src/engine/pointer_binding.dart"
    },
    {
      "type": "modify",
      "old_id": "528c8ee35354a83da0555bd4ed9fa42543131288",
      "old_mode": 33188,
      "old_path": "engine/src/flutter/lib/web_ui/test/engine/pointer_binding_test.dart",
      "new_id": "2a387b23672fdbcaf1cacdc62688e64fb8eee991",
      "new_mode": 33188,
      "new_path": "engine/src/flutter/lib/web_ui/test/engine/pointer_binding_test.dart"
    }
  ]
}
