Gecko:Fullscreen API: Difference between revisions
Jump to navigation
Jump to search
(add e10s content) |
(update content for e10s) |
||
Line 49: | Line 49: | ||
==== Exiting Fullscreen Unexpectedly ==== | ==== Exiting Fullscreen Unexpectedly ==== | ||
(page closure / fullscreen element removal) | (page closure / navigation / fullscreen element removal) | ||
# two cases: | # two cases: | ||
#* for page closure, nsDocument::OnPageHide() | #* for page closure and navigation, nsDocument::OnPageHide() | ||
#* for element removal, Element::UnbindFromTree() | #* for element removal, Element::UnbindFromTree() | ||
# calls nsIDocument::ExitFullscreenInDocTree() which changes the document state | # calls nsIDocument::ExitFullscreenInDocTree() which changes the document state | ||
Line 96: | Line 96: | ||
# in the content process | # in the content process | ||
## tab-content.js calls nsIDocument::ExitFullscreenInDocTree() which changes the document state | ## tab-content.js calls nsIDocument::ExitFullscreenInDocTree() which changes the document state | ||
==== Exiting Fullscreen by User ==== | |||
Since user always uses the chrome to exit fullscreen | |||
* The parent process part is the same as [[#Exiting Fullscreen by User|Non-E10S / Exiting Fullscreen by User]] | |||
* The content process only has the last step in [[#Exiting Fullscreen by Content 2|E10S / Exiting Fullscreen by Content]] above | |||
==== Exiting Fullscreen Unexpectedly ==== | |||
(navigation / fullscreen element removal) | |||
# in the content process: | |||
## two cases: | |||
##* for navigation, nsDocument::OnPageHide() | |||
##* for element removal, Element::UnbindFromTree() | |||
## calls nsIDocument::ExitFullscreenInDocTree() which changes the document state | |||
##* this step also dispatches '''MozDOMFullscreen:Exited''' 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 | |||
=== Browser Element === | === Browser Element === |
Revision as of 10:53, 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 / navigation / fullscreen element removal)
- two cases:
- for page closure and navigation, 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
Exiting Fullscreen by User
Since user always uses the chrome to exit fullscreen
- The parent process part is the same as Non-E10S / Exiting Fullscreen by User
- The content process only has the last step in E10S / Exiting Fullscreen by Content above
Exiting Fullscreen Unexpectedly
(navigation / fullscreen element removal)
- in the content process:
- two cases:
- for navigation, nsDocument::OnPageHide()
- for element removal, Element::UnbindFromTree()
- calls nsIDocument::ExitFullscreenInDocTree() which changes the document state
- this step also dispatches MozDOMFullscreen:Exited to the chrome
- tab-content.js sends async message "DOMFullscreen:Exit"
- two cases:
- 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