/
index.js
110 lines (91 loc) · 2.57 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
module.exports = fullscreen
fullscreen.available = available
fullscreen.enabled = enabled
var EE = require('events').EventEmitter
var ael = require('add-event-listener')
var rel = ael.removeEventListener
function available() {
return !!shim(document.body)
}
function enabled() {
return !!(document.fullscreenEnabled ||
document.webkitFullscreenEnabled ||
document.mozFullScreenEnabled ||
document.msFullscreenEnabled);
}
function fullscreen(el) {
var doc = el.ownerDocument
, body = doc.body
, rfs = shim(el)
, ee = new EE
var vendors = ['', 'webkit', 'moz']
for(var i = 0, len = vendors.length; i < len; ++i) {
ael(doc, vendors[i] + 'fullscreenchange', onfullscreenchange)
ael(doc, vendors[i] + 'fullscreenerror', onfullscreenerror)
}
// MS uses different casing:
ael(doc, 'MSFullscreenChange', onfullscreenchange)
ael(doc, 'MSFullscreenError', onfullscreenerror)
ee.release = release
ee.request = request
ee.dispose = dispose
ee.target = fullscreenelement
if(!shim) {
setTimeout(function() {
ee.emit('error', new Error('fullscreen is not supported'))
}, 0)
}
return ee
function onfullscreenchange() {
if(!fullscreenelement()) {
return ee.emit('release')
}
ee.emit('attain')
}
function onfullscreenerror() {
ee.emit('error')
}
function request() {
return rfs.apply(el, arguments)
}
function release() {
var element_exit = (el.exitFullscreen ||
el.webkitExitFullscreen ||
el.mozCancelFullScreen ||
el.mozExitFullScreen ||
el.msExitFullscreen);
if (element_exit) {
element_exit.apply(el, arguments);
return;
}
var document_exit = (doc.exitFullscreen ||
doc.webkitExitFullscreen ||
doc.mozCancelFullScreen ||
doc.mozExitFullScreen ||
doc.msExitFullscreen);
document_exit.apply(doc, arguments);
}
function fullscreenelement() {
return (0 ||
doc.fullscreenElement ||
doc.webkitFullscreenElement ||
doc.mozFullScreenElement ||
doc.msFullscreenElement ||
null);
}
function dispose() {
for(var i = 0, len = vendors.length; i < len; ++i) {
rel(doc, vendors[i] + 'fullscreenchange', onfullscreenchange)
rel(doc, vendors[i] + 'fullscreenerror', onfullscreenerror)
}
// MS uses different casing:
rel(doc, 'MSFullscreenChange', onfullscreenchange)
rel(doc, 'MSFullscreenError', onfullscreenerror)
}
}
function shim(el) {
return (el.requestFullscreen ||
el.webkitRequestFullscreen ||
el.mozRequestFullScreen ||
el.msRequestFullscreen);
}