)]}'
{
  "commit": "b4f79899379349bd12b9bc3ca0c70ed9bea18e65",
  "tree": "b973f8238d819065dcc115c81a9d1c69ecf5cd57",
  "parents": [
    "b65f4d9bc3fed2dc2fabdce3122ebf50f503e848"
  ],
  "author": {
    "name": "zhongliugo",
    "email": "zhongliu88889@gmail.com",
    "time": "Fri Jul 24 09:27:18 2026 -0700"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Fri Jul 24 16:27:18 2026 +0000"
  },
  "message": "[web] Cancel touch pointers WebKit abandons mid-gesture (#189608)\n\nFixes #188781\n\n**Problem**\nOn iOS 27, WebKit stops dispatching pointer events for a touch it\npromotes to a native gesture, such as dragging the caret in a text\nfield, and delivers neither `pointerup` nor `pointercancel`. The\nframework is left holding a pointer that never lifts, which wedges\n`BaseTapAndDragGestureRecognizer` so every later tap is silently\ndropped: the field never regains focus and the keyboard never returns.\nAffects every iOS 27 browser, since they all run WebKit; iOS 26 is\nunaffected.\n\n**Fix**\n`_PointerAdapter` tracks which touch devices are down and, on `touchend`\nand `touchcancel`, cancels any the browser no longer lists in `touches`.\nGated to iOSWebKit.\n\n**Demo**\nBefore: https://flutter-demo-47-before.web.app\nAfter:  https://flutter-demo-47-after.web.app\n\n**Repro steps:** \ntype in the field, long-press the caret and drag it, lift, then tap the\nfield.\nBefore, the field is permanently dead after a few tries. \nAfter, it recovers.",
  "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"
    }
  ]
}
