Gecko:Fullscreen API: Difference between revisions
Jump to navigation
Jump to search
(small fix) |
(add e10s content) |
||
| Line 19: | Line 19: | ||
=== Non-E10S === | === Non-E10S === | ||
==== Entering Fullscreen ==== | |||
# the page calls | # the page calls Element.requestFullscreen() (Element::MozRequestFullScreen()) | ||
# ''(async)'' calls nsDocument::RequestFullscreen() | # ''(async)'' calls nsDocument::RequestFullscreen() | ||
# calls nsGlobalWindow::SetFullScreenInternal() | # calls nsGlobalWindow::SetFullScreenInternal() | ||
# calls widget to enter fullscreen | # calls widget to enter fullscreen | ||
# ''(async)'' | # ''(async)'' triggers nsGlobalWindow::FinishFullscreenChange() when the window enters fullscreen | ||
# calls nsIDocument::HandlePendingFullscreenRequests() | # calls nsIDocument::HandlePendingFullscreenRequests() | ||
# change the document state in nsDocument::ApplyFullscreen() | # change the document state in nsDocument::ApplyFullscreen() | ||
==== Exiting Fullscreen by Content ==== | |||
# the page calls | # the page calls document.exitFullscreen() (nsDocument::MozCancelFullScreen()) | ||
# calls nsDocument::RestorePreviousFullScreenState() | |||
# calls nsGlobalWindow::SetFullScreenInternal() | # calls nsGlobalWindow::SetFullScreenInternal() | ||
# calls widget to leave fullscreen | # calls widget to leave fullscreen | ||
# ''(async)'' | # ''(async)'' triggers nsGlobalWindow::FinishFullscreenChange() when the window exits fullscreen | ||
# calls nsIDocument::ExitFullscreenInDocTree() which changes the document state | # calls nsIDocument::ExitFullscreenInDocTree() which changes the document state | ||
==== Exiting Fullscreen by User ==== | |||
(usually via escape key) | |||
# in PresShell::HandleEventInternal() | # in PresShell::HandleEventInternal() | ||
| Line 44: | Line 47: | ||
# then same as above... | # then same as above... | ||
==== Exiting Fullscreen Unexpectedly ==== | |||
(page closure / fullscreen element removal): | |||
# | # two cases: | ||
#* for page closure, nsDocument::OnPageHide() | |||
#* for element removal, Element::UnbindFromTree() | |||
# calls nsIDocument::ExitFullscreenInDocTree() which changes the document state | # calls nsIDocument::ExitFullscreenInDocTree() which changes the document state | ||
# ''(may async)'' calls nsGlobalWindow::SetFullscreenInternal() | # ''(may async)'' calls nsGlobalWindow::SetFullscreenInternal() | ||
| Line 53: | Line 60: | ||
=== E10S === | === E10S === | ||
==== Entering Fullscreen ==== | |||
# in the content process: | |||
## the page calls Element.requestFullscreen() (Element::MozRequestFullScreen()) | |||
## ''(async)'' calls nsDocument::RequestFullscreen() | |||
## dispatches '''MozDOMFullscreen:Request''' event to the chrome | |||
## tab-content.js sends async message "DOMFullscreen:Request" | |||
# in the parent process: | |||
## browser-fullScreen.js calls nsDocument::RequestFullscreen() | |||
## calls nsGlobalWindow::SetFullScreenInternal() | |||
## calls widget to enter fullscreen | |||
## ''(async)'' triggers nsGlobalWindow::FinishFullscreenChange() when the window enters fullscreen | |||
## calls nsIDocument::HandlePendingFullscreenRequests() | |||
## change the document state in nsDocument::ApplyFullscreen() | |||
##* this step also dispatches '''MozDOMFullscreen:Entered''' to the chrome | |||
## browser-fullScreen.js sends async message "DOMFullscreen:Entered" | |||
# in the content process | |||
## tab-content.js calls nsIDocument::HandlePendingFullscreenRequests() | |||
## change the document state in nsDocument::ApplyFullscreen() | |||
==== Exiting Fullscreen by Content ==== | |||
# in the content process: | |||
## the page calls document.exitFullscreen() (nsDocument::MozCancelFullScreen()) | |||
## dispatches '''MozDOMFullscreen:Exit''' event to the chrome | |||
## tab-content.js sends async message "DOMFullscreen:Exit" | |||
# in the parent process: | |||
## browser-fullScreen.js calls nsDocument::RestorePreviousFullScreenState() | |||
## calls nsGlobalWindow::SetFullScreenInternal() | |||
## calls widget to leave fullscreen | |||
## ''(async)'' triggers nsGlobalWindow::FinishFullscreenChange() when the window exits fullscreen | |||
## calls nsIDocument::ExitFullscreenInDocTree() which changes the document state | |||
##* this step also dispatches '''MozDOMFullscreen:Exited''' to the chrome | |||
## browser-fullScreen.js sends async message "DOMFullscreen:Exited" | |||
# in the content process | |||
## tab-content.js calls nsIDocument::ExitFullscreenInDocTree() which changes the document state | |||
=== Browser Element === | === Browser Element === | ||
Revision as of 10:39, 6 August 2015
(WIP)
This page is for documenting our Fullscreen API implementation.
Resources
- Fullscreen API spec
- Fullscreen design from :Verdi also includes some background info
Basic Control Flow
The flow of how Fullscreen API works is a bit complicated because we want to change the state of the document after the window enters or leaves fullscreen, so that we can:
- provide a stable viewport size when we notify the content, and
- insert fullscreen transition there.
This flow is different for non-e10s, e10s, and the browser element, because we need to go across the process boundary in later cases.
Non-E10S
Entering Fullscreen
- the page calls Element.requestFullscreen() (Element::MozRequestFullScreen())
- (async) calls nsDocument::RequestFullscreen()
- calls nsGlobalWindow::SetFullScreenInternal()
- calls widget to enter fullscreen
- (async) triggers nsGlobalWindow::FinishFullscreenChange() when the window enters fullscreen
- calls nsIDocument::HandlePendingFullscreenRequests()
- change the document state in nsDocument::ApplyFullscreen()
Exiting Fullscreen by Content
- the page calls document.exitFullscreen() (nsDocument::MozCancelFullScreen())
- calls nsDocument::RestorePreviousFullScreenState()
- calls nsGlobalWindow::SetFullScreenInternal()
- calls widget to leave fullscreen
- (async) triggers nsGlobalWindow::FinishFullscreenChange() when the window exits fullscreen
- calls nsIDocument::ExitFullscreenInDocTree() which changes the document state
Exiting Fullscreen by User
(usually via escape key)
- in PresShell::HandleEventInternal()
- calls nsIDocument::AsyncExitFullscreen()
- (async) calls nsGlobalWindow::SetFullscreenInternal()
- then same as above...
Exiting Fullscreen Unexpectedly
(page closure / fullscreen element removal):
- two cases:
- for page closure, nsDocument::OnPageHide()
- for element removal, Element::UnbindFromTree()
- calls nsIDocument::ExitFullscreenInDocTree() which changes the document state
- (may async) calls nsGlobalWindow::SetFullscreenInternal()
- calls widget to leave fullscreen
E10S
Entering Fullscreen
- in the content process:
- the page calls Element.requestFullscreen() (Element::MozRequestFullScreen())
- (async) calls nsDocument::RequestFullscreen()
- dispatches MozDOMFullscreen:Request event to the chrome
- tab-content.js sends async message "DOMFullscreen:Request"
- in the parent process:
- browser-fullScreen.js calls nsDocument::RequestFullscreen()
- calls nsGlobalWindow::SetFullScreenInternal()
- calls widget to enter fullscreen
- (async) triggers nsGlobalWindow::FinishFullscreenChange() when the window enters fullscreen
- calls nsIDocument::HandlePendingFullscreenRequests()
- change the document state in nsDocument::ApplyFullscreen()
- this step also dispatches MozDOMFullscreen:Entered to the chrome
- browser-fullScreen.js sends async message "DOMFullscreen:Entered"
- in the content process
- tab-content.js calls nsIDocument::HandlePendingFullscreenRequests()
- change the document state in nsDocument::ApplyFullscreen()
Exiting Fullscreen by Content
- in the content process:
- the page calls document.exitFullscreen() (nsDocument::MozCancelFullScreen())
- dispatches MozDOMFullscreen:Exit event to the chrome
- tab-content.js sends async message "DOMFullscreen:Exit"
- in the parent process:
- browser-fullScreen.js calls nsDocument::RestorePreviousFullScreenState()
- calls nsGlobalWindow::SetFullScreenInternal()
- calls widget to leave fullscreen
- (async) triggers nsGlobalWindow::FinishFullscreenChange() when the window exits fullscreen
- calls nsIDocument::ExitFullscreenInDocTree() which changes the document state
- this step also dispatches MozDOMFullscreen:Exited to the chrome
- browser-fullScreen.js sends async message "DOMFullscreen:Exited"
- in the content process
- tab-content.js calls nsIDocument::ExitFullscreenInDocTree() which changes the document state