Gecko:Fullscreen API: Difference between revisions

From MozillaWiki
Jump to navigation Jump to search
(small fix)
(add e10s content)
Line 19: Line 19:
=== Non-E10S ===
=== Non-E10S ===


For entering fullscreen:
==== Entering Fullscreen ====


# the page calls [https://fullscreen.spec.whatwg.org/#dom-element-requestfullscreen Element.requestFullscreen()] (Element::MozRequestFullScreen())
# 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)'' calls nsGlobalWindow::FinishFullscreenChange() <-- triggers when the window enters fullscreen
# ''(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()


For exiting fullscreen by page:
==== Exiting Fullscreen by Content ====


# the page calls [https://fullscreen.spec.whatwg.org/#dom-document-exitfullscreen document.exitFullscreen()] (nsDocument::MozCancelFullScreen())
# 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)'' calls nsGlobalWindow::FinishFullscreenChange() <-- triggers when the window exits fullscreen
# ''(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


For exiting fullscreen by user (via escape key):
==== 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...


For exiting fullscreen unexpectedly (page closure / fullscreen element removal):
==== Exiting Fullscreen Unexpectedly ====
 
(page closure / fullscreen element removal):


# in nsDocument::OnPageHide() (for page closure) / Element::UnbindFromTree() (for 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

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:

  1. provide a stable viewport size when we notify the content, and
  2. 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

  1. the page calls Element.requestFullscreen() (Element::MozRequestFullScreen())
  2. (async) calls nsDocument::RequestFullscreen()
  3. calls nsGlobalWindow::SetFullScreenInternal()
  4. calls widget to enter fullscreen
  5. (async) triggers nsGlobalWindow::FinishFullscreenChange() when the window enters fullscreen
  6. calls nsIDocument::HandlePendingFullscreenRequests()
  7. change the document state in nsDocument::ApplyFullscreen()

Exiting Fullscreen by Content

  1. the page calls document.exitFullscreen() (nsDocument::MozCancelFullScreen())
  2. calls nsDocument::RestorePreviousFullScreenState()
  3. calls nsGlobalWindow::SetFullScreenInternal()
  4. calls widget to leave fullscreen
  5. (async) triggers nsGlobalWindow::FinishFullscreenChange() when the window exits fullscreen
  6. calls nsIDocument::ExitFullscreenInDocTree() which changes the document state

Exiting Fullscreen by User

(usually via escape key)

  1. in PresShell::HandleEventInternal()
  2. calls nsIDocument::AsyncExitFullscreen()
  3. (async) calls nsGlobalWindow::SetFullscreenInternal()
  4. then same as above...

Exiting Fullscreen Unexpectedly

(page closure / fullscreen element removal):

  1. two cases:
    • for page closure, nsDocument::OnPageHide()
    • for element removal, Element::UnbindFromTree()
  2. calls nsIDocument::ExitFullscreenInDocTree() which changes the document state
  3. (may async) calls nsGlobalWindow::SetFullscreenInternal()
  4. calls widget to leave fullscreen

E10S

Entering Fullscreen

  1. in the content process:
    1. the page calls Element.requestFullscreen() (Element::MozRequestFullScreen())
    2. (async) calls nsDocument::RequestFullscreen()
    3. dispatches MozDOMFullscreen:Request event to the chrome
    4. tab-content.js sends async message "DOMFullscreen:Request"
  2. in the parent process:
    1. browser-fullScreen.js calls nsDocument::RequestFullscreen()
    2. calls nsGlobalWindow::SetFullScreenInternal()
    3. calls widget to enter fullscreen
    4. (async) triggers nsGlobalWindow::FinishFullscreenChange() when the window enters fullscreen
    5. calls nsIDocument::HandlePendingFullscreenRequests()
    6. change the document state in nsDocument::ApplyFullscreen()
      • this step also dispatches MozDOMFullscreen:Entered to the chrome
    7. browser-fullScreen.js sends async message "DOMFullscreen:Entered"
  3. in the content process
    1. tab-content.js calls nsIDocument::HandlePendingFullscreenRequests()
    2. change the document state in nsDocument::ApplyFullscreen()

Exiting Fullscreen by Content

  1. in the content process:
    1. the page calls document.exitFullscreen() (nsDocument::MozCancelFullScreen())
    2. dispatches MozDOMFullscreen:Exit event to the chrome
    3. tab-content.js sends async message "DOMFullscreen:Exit"
  2. in the parent process:
    1. browser-fullScreen.js calls nsDocument::RestorePreviousFullScreenState()
    2. calls nsGlobalWindow::SetFullScreenInternal()
    3. calls widget to leave fullscreen
    4. (async) triggers nsGlobalWindow::FinishFullscreenChange() when the window exits fullscreen
    5. calls nsIDocument::ExitFullscreenInDocTree() which changes the document state
      • this step also dispatches MozDOMFullscreen:Exited to the chrome
    6. browser-fullScreen.js sends async message "DOMFullscreen:Exited"
  3. in the content process
    1. tab-content.js calls nsIDocument::ExitFullscreenInDocTree() which changes the document state

Browser Element