Bug 1802193 Part 2: Make a test of focus exiting fullscreen work with asynchronous...
commitd04111bac7fa135b2b51256fa36ccacb3196c2e9
authorBrad Werth <bwerth@mozilla.com>
Fri, 16 Jun 2023 16:14:03 +0000 (16 16:14 +0000)
committerBrad Werth <bwerth@mozilla.com>
Fri, 16 Jun 2023 16:14:03 +0000 (16 16:14 +0000)
tree9817bfc535cf7fd9d8729400537250047a69705c
parent6475bde8c20b0effff1bae0413c08ea604179d5f
Bug 1802193 Part 2: Make a test of focus exiting fullscreen work with asynchronous fullscreen transitions. r=edgar

This adds an additional action that is triggered when the fullscreen
transition event is received. That interim action is used to re-focus the
original tab. Without this change, an asynchronous fullscreen transition
will silently swallow the MozAfterPaint event that is necessary to detect
the end of fullscreen.

Before this change, with asynchronous transitions, here's the flow:
1) The test opens Tab 1 which opens Tab 2.
2) Tab 1 enters fullscreen. This transition takes awhile but signals
success early. This is intentional because we want web content to be able
to be fully layed out when the fullscreen transition is complete.
3) Thinking that it has reached fullscreen, the test focuses Tab 2, which
causes a fullscreen exit transition to be queued up but not yet run.
Then Tab 1 is unfocused and a MozAfterPaint message is sent, but nobody is
listening for it so it has no effect. If the fullscreen transition was
synchronous, the actions of Step 6 (below) would happen before the change
in focus and there would be an event listener ready for the MozAfterPaint
event.
4) The test waits for the DOMFullscreenChild to send the
DOMFullscreen:Painted message, which it will do when it receives a
MozAfterPaint event.
5) Enter fullscreen transition completes, exit fullscreen transition
starts.
6) The MozDOMFullscreen:Exited event is sent to the DOMFullscreenChild,
which starts listening for the MozAfterPaint event. This event has
already been sent.
7) Test times out.

This change adds an additional action to take place between steps 6 and 7.
That additional action refocuses Tab 1. This makes it send another
MozAfterPaint event which the DOMFullscreenChild is ready to receive.

Differential Revision: https://phabricator.services.mozilla.com/D180884
browser/base/content/test/fullscreen/browser_fullscreen_window_focus.js
browser/base/content/test/fullscreen/head.js