Mouse cursor remains visible after entering HTML5 fullscreen on macOS until mouse movement occurs, even when cursor:none is already active
Categories
(Core :: Widget: Cocoa, defect)
Tracking
()
| Tracking | Status | |
|---|---|---|
| firefox152 | --- | fixed |
People
(Reporter: bonnfrankfurt, Assigned: spohl)
Details
Attachments
(1 file)
|
48 bytes,
text/x-phabricator-request
|
Details |
User Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0
Steps to reproduce:
- Opened YouTube in Firefox on macOS.
- Started playing a video.
- Waited until the player entered its normal autohide state.
- Entered fullscreen.
- Did not move the mouse after entering fullscreen.
- Observed that the cursor remained visible.
- Moved the mouse once and observed that the cursor then updated as expected.
Actual results:
After entering fullscreen, the mouse cursor remained visible even though the player was already in its autohide state. The cursor only disappeared after a subsequent mouse movement.
Expected results:
The mouse cursor should disappear immediately when fullscreen autohide becomes active, without requiring an additional mouse movement.
| Reporter | ||
Comment 1•1 month ago
|
||
This is reproducible on YouTube on macOS.
I verified that the issue does not seem to be caused by YouTube failing to enter its autohide state. While the cursor was still visible in fullscreen, the player state already indicated:
- document fullscreen = yes
- YouTube fullscreen state = yes
- YouTube autohide state = yes
I also tested with a simple WebExtension that toggles cursor: none via keypress.
Result:
- outside fullscreen, toggling
cursor: noneworks immediately - immediately after entering fullscreen, toggling
cursor: nonedoes not visibly update the cursor until the mouse is moved - after a mouse movement, the cursor state updates as expected
This suggests the problem may be that Firefox does not immediately refresh/apply cursor state changes after entering fullscreen until a mouse event occurs.
Updated•1 month ago
|
Comment 2•16 days ago
|
||
The severity field is not set for this bug.
:jfkthame, could you have a look please?
For more information, please visit BugBot documentation.
Comment 3•9 days ago
|
||
This is probably on the widget side more so than CSS.
| Assignee | ||
Comment 4•9 days ago
|
||
Is this a regression? If so, could you run mozregression to see when this started happening? You can either choose to use the GUI tool, or simply run these three commands in a Terminal window:
sudo easy_install pip
sudo python3 -m pip install -U mozregression --ignore-installed
mozregression
A number of Firefox versions will open in succession to narrow down when this started occurring. Simply type "good" or "bad" in Terminal based on whether or not a build reproduces the bug. Once finished, please post the output from the last run. It should give a last good and first bad revision as well as a link to look at the changesets in that range. Thank you!
| Assignee | ||
Updated•9 days ago
|
| Assignee | ||
Comment 5•9 days ago
|
||
MOZDynamicCursor only forwards a cursor change to AppKit when the type
or NSCursor* differs from the cached value, so when the page is already
in cursor:none state at the moment the user enters HTML5 fullscreen,
nothing re-pushes our cached state across the fullscreen transition.
AppKit's transition swaps the content view into a new fullscreen
NSWindow and re-evaluates cursor rects, leaving the on-screen cursor
visible until the next mouse-moved event re-runs resetCursorRects and
[MOZDynamicCursor set] re-establishes the cached state. The reporter's
case is YouTube's autohide cursor:none surviving fullscreen entry: the
cursor stays visible until the user wiggles the mouse.
Add MOZDynamicCursor::reassertCurrentCursor as an explicit "re-push my
cached state" entry point that bypasses the dedup checks, and call it
from nsCocoaWindow::CocoaWindowDidEnterFullscreen (which fires for
both enter and exit transitions, including the failure paths).
For cursor:none we pair an unhide with a hide. NSCursor's hide/unhide
counter saturates at zero, so the pair is a no-op when our hide is
still on the stack and re-establishes the hide if AppKit dropped it
during the transition. For other types we just call set on the cached
NSCursor*.
Updated•9 days ago
|
| Assignee | ||
Updated•9 days ago
|
Description
•