Skip to content

[iOS] Active pointer map may fail to clear in presence of external gesture recognizer#57358

Merged
webkit-commit-queue merged 1 commit into
WebKit:mainfrom
lilyspiniolas:eng/159227684
Jan 28, 2026
Merged

[iOS] Active pointer map may fail to clear in presence of external gesture recognizer#57358
webkit-commit-queue merged 1 commit into
WebKit:mainfrom
lilyspiniolas:eng/159227684

Conversation

@lilyspiniolas

@lilyspiniolas lilyspiniolas commented Jan 27, 2026

Copy link
Copy Markdown
Contributor

7b60c3f

[iOS] Active pointer map may fail to clear in presence of external gesture recognizer
https://bugs.webkit.org/show_bug.cgi?id=306373
rdar://159227684

Reviewed by Abrar Rahman Protyasha.

When a WKWebView is the subview of a parent view which itself has a custom
gesture recognizer, the custom gesture recognizer may block gestures in such
a way that `touchesBegan` fires for WebKit's touch gesture recognizer, but
not `touchesEnded` or `touchesCancelled`. When this happens, we add an active
pointer to the map in PointerCaptureController but never clear it since we
never received a notification that the touch ended or was otherwise cancelled.
When an active touch is present in the map, we do not create pointer events
in `PointerCaptureController::pointerEventForMouseEvent`, so if the parent
view later stops blocking touch gestures, WebKit may continue to fail to
dispatch pointer and click events afterward.

Resolve this by clearing the active pointer map when `reset` is called for
`WKTouchEventsGestureRecognizer`.

* Source/WebCore/page/PointerCaptureController.h:
* Source/WebKit/UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::resetPointerCapture):
* Source/WebKit/UIProcess/WebPageProxy.h:
* Source/WebKit/UIProcess/ios/WKContentViewInteraction.h:
* Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm:
(-[WKContentView _touchEventsGestureRecognizerReset]):
* Source/WebKit/UIProcess/ios/WKTouchEventsGestureRecognizer.mm:
(-[WKTouchEventsGestureRecognizer reset]):
* Source/WebKit/WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::resetPointerCapture):
* Source/WebKit/WebProcess/WebPage/WebPage.h:
* Source/WebKit/WebProcess/WebPage/WebPage.messages.in:

Canonical link: https://commits.webkit.org/306362@main

5bbe686

Misc iOS, visionOS, tvOS & watchOS macOS Linux Windows Apple Internal
✅ 🧪 style ✅ 🛠 ios ✅ 🛠 mac ✅ 🛠 wpe ✅ 🛠 win ⏳ 🛠 ios-apple
✅ 🧪 bindings ✅ 🛠 ios-sim ✅ 🛠 mac-AS-debug ✅ 🧪 wpe-wk2 ✅ 🧪 win-tests ⏳ 🛠 mac-apple
✅ 🧪 webkitperl ✅ 🧪 ios-wk2 ✅ 🧪 api-mac ✅ 🧪 api-wpe ⏳ 🛠 vision-apple
✅ 🧪 ios-wk2-wpt ✅ 🧪 api-mac-debug ⏳ wpe-libwebrtc
✅ 🧪 api-ios ✅ 🧪 mac-wk1 ✅ 🛠 gtk
✅ 🛠 vision ✅ 🧪 mac-wk2 ✅ 🧪 gtk-wk2
✅ 🛠 vision-sim ✅ 🧪 mac-AS-debug-wk2 ✅ 🧪 api-gtk
✅ 🧪 vision-wk2 ✅ 🧪 mac-wk2-stress ✅ 🛠 playstation
✅ 🛠 🧪 unsafe-merge ✅ 🛠 tv 🧪 mac-intel-wk2
✅ 🛠 tv-sim ✅ 🛠 mac-safer-cpp
✅ 🛠 watch
✅ 🛠 watch-sim

@lilyspiniolas lilyspiniolas requested a review from cdumez as a code owner January 27, 2026 22:25
@lilyspiniolas lilyspiniolas self-assigned this Jan 27, 2026
@lilyspiniolas lilyspiniolas added the New Bugs Unclassified bugs are placed in this component until the correct component can be determined. label Jan 27, 2026
@lilyspiniolas lilyspiniolas added the unsafe-merge-queue Applied to send a pull request to merge-queue, but skip building and testing label Jan 28, 2026
…sture recognizer

https://bugs.webkit.org/show_bug.cgi?id=306373
rdar://159227684

Reviewed by Abrar Rahman Protyasha.

When a WKWebView is the subview of a parent view which itself has a custom
gesture recognizer, the custom gesture recognizer may block gestures in such
a way that `touchesBegan` fires for WebKit's touch gesture recognizer, but
not `touchesEnded` or `touchesCancelled`. When this happens, we add an active
pointer to the map in PointerCaptureController but never clear it since we
never received a notification that the touch ended or was otherwise cancelled.
When an active touch is present in the map, we do not create pointer events
in `PointerCaptureController::pointerEventForMouseEvent`, so if the parent
view later stops blocking touch gestures, WebKit may continue to fail to
dispatch pointer and click events afterward.

Resolve this by clearing the active pointer map when `reset` is called for
`WKTouchEventsGestureRecognizer`.

* Source/WebCore/page/PointerCaptureController.h:
* Source/WebKit/UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::resetPointerCapture):
* Source/WebKit/UIProcess/WebPageProxy.h:
* Source/WebKit/UIProcess/ios/WKContentViewInteraction.h:
* Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm:
(-[WKContentView _touchEventsGestureRecognizerReset]):
* Source/WebKit/UIProcess/ios/WKTouchEventsGestureRecognizer.mm:
(-[WKTouchEventsGestureRecognizer reset]):
* Source/WebKit/WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::resetPointerCapture):
* Source/WebKit/WebProcess/WebPage/WebPage.h:
* Source/WebKit/WebProcess/WebPage/WebPage.messages.in:

Canonical link: https://commits.webkit.org/306362@main
@webkit-commit-queue

Copy link
Copy Markdown
Collaborator

Committed 306362@main (7b60c3f): https://commits.webkit.org/306362@main

Reviewed commits have been landed. Closing PR #57358 and removing active labels.

@webkit-commit-queue webkit-commit-queue merged commit 7b60c3f into WebKit:main Jan 28, 2026
@webkit-commit-queue webkit-commit-queue removed the unsafe-merge-queue Applied to send a pull request to merge-queue, but skip building and testing label Jan 28, 2026
pull Bot pushed a commit to Mu-L/flutter that referenced this pull request Jun 16, 2026
The upstream bug has been fixed on iOS 26.4 (PR:
WebKit/WebKit#57358), so we can skip the hacky
workaround now.

Fixes flutter#185372

## 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.
- [ ] 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
via-guy pushed a commit to via-guy/flutter that referenced this pull request Jun 26, 2026
The upstream bug has been fixed on iOS 26.4 (PR:
WebKit/WebKit#57358), so we can skip the hacky
workaround now.

Fixes flutter#185372

## 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.
- [ ] 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

New Bugs Unclassified bugs are placed in this component until the correct component can be determined.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants