This is the story of the Fullscreen API, one of prefixes, capitalization, and event targets...
March–October 2007: “Shouldn’t the video API include a way to toggle full screen on/off?” asks Mihai Sucan, a mere month after Opera’s debut of the video element. Much is said about the security implications of such an API, nothing happens, and years pass...
November 2009–March 2010: Eric Carlson (Apple) adds an API for fullscreen video to WebKit:
partial interface HTMLVideoElement { readonly attribute boolean webkitSupportsFullscreen; readonly attribute boolean webkitDisplayingFullscreen; void webkitEnterFullScreen(); void webkitExitFullScreen(); }
The webkitbeginfullscreen
and webkitendfullscreen
event are fired on the video element.
The inconsistent capitalization is noticed and fixed by adding webkitEnterFullscreen()
and webkitExitFullscreen()
aliases. The original names are kept for backwards compatibility.
Revisions: 50893, 54143, 55946
June 2010: Robert O’Callahan (Mozilla) begins working on a proposal to allow any element, not just video, to go fullscreen.
August 2010–January 2011: Jer Noble (Apple) implements something similar to the then-current Mozilla proposal in WebKit:
partial interface Element { const unsigned short ALLOW_KEYBOARD_INPUT = 1; void webkitRequestFullScreen(unsigned short flags); } partial interface Document { readonly attribute boolean webkitIsFullScreen; readonly attribute boolean webkitFullScreenKeyboardInputAllowed; readonly attribute Element? webkitCurrentFullScreenElement; void webkitCancelFullScreen(); }
The webkitfullscreenchange
event is fired on the current fullscreen element and bubbles.
September–December 2011: Chris Pearce (Mozilla) begins implementing the proposal in Gecko. Meanwhile, Anne van Kesteren (then Opera, now Mozilla) starts working on a spec at the W3C. The fullscreen element stack is introduced, which makes nested fullscreen (e.g. video in a presentation) possible. When exiting from nested fullscreen, it now becomes un-obvious which element(s) to notify, so the event target is changed to the document.
Revisions: 1c36dc1c92c5, 332cd2925b28
These spec changes are implemented in Gecko, but the old names, and mozFullScreen
, are kept:
partial interface Element { void mozRequestFullScreen(); } partial interface Document { readonly attribute boolean mozFullScreen; readonly attribute boolean mozFullScreenEnabled; readonly attribute Element? mozFullScreenElement; void mozCancelFullScreen(); }
The mozfullscreenchange
event is fired on the document and bubbles.
Bug: 545812
March 2012: Jer Noble implements the W3C spec in WebKit:
partial interface Element { void webkitRequestFullscreen(); } partial interface Document { readonly attribute boolean webkitFullscreenEnabled; readonly attribute Element? webkitFullscreenElement; void webkitExitFullscreen(); }
Notably, the webkitfullscreenchange
event target is the fullscreen element, not the document. Because the event bubbles, listening on the document does work, though.
Revision: 111028
September 2012: The Fullscreen API moves to the WHATWG. The W3C version has been unmaintained ever since.
November 2012: Opera 12.10 is released with support for the spec as it was in February, without prefixes. Opera 12 is the last major version based on Presto, so this unprefixed implementation does not last long.
May 2013: Vincent Scheib (Google) questions why the events bubble. Since it is just an accident of history, they are made to not bubble in the spec.
Commit: 5eb5af63369385c888a5146dda57d462cb9a41da
October 2013: Internet Explorer 11 is released with an ms-prefixed fullscreen API:
partial interface Element { void msRequestFullscreen(); } partial interface Document { readonly attribute boolean msFullscreenEnabled; readonly attribute Element? msFullscreenElement; void msExitFullscreen(); }
The MSFullscreenChange
event is fired on the document... and bubbles! Most likely the implementation predates the spec change.
Now: This is a bit of a mess! The long history of changes in capitalization and event targets has given JavaScript library authors ample opportunity to write code that will fail once the unprefixed API is made available. I’m trying to implement and ship the unprefixed Fullscreen API in Blink, and some bumps in the road are likely.