forked from quasarframework/quasar
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAppFullscreen.js
More file actions
118 lines (95 loc) · 2.76 KB
/
AppFullscreen.js
File metadata and controls
118 lines (95 loc) · 2.76 KB
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
111
112
113
114
115
116
117
118
import Vue from 'vue'
import { isSSR, client } from './Platform.js'
const prefixes = {}
// needed for consistency across browsers,
// including IE11 which does not return anything
function promisify (target, fn) {
try {
const res = target[fn]()
return res === void 0
? Promise.resolve()
: res
}
catch (err) {
return Promise.reject(err)
}
}
function checkActive (plugin) {
plugin.activeEl = document.fullscreenElement ||
document.mozFullScreenElement ||
document.webkitFullscreenElement ||
document.msFullscreenElement ||
null
plugin.isActive = plugin.activeEl !== null
}
export default {
isCapable: false,
isActive: false,
activeEl: null,
request (target) {
if (this.isCapable === true) {
const el = target || document.documentElement
if (el !== this.activeEl) {
const q = client.is.ie === true && this.activeEl !== null && el.contains(this.activeEl)
? this.exit()
: Promise.resolve()
return q
.then(() => promisify(el, prefixes.request))
.catch(error => (
this.activeEl !== null
? this.exit().then(() => promisify(el, prefixes.request))
: Promise.reject(error)
))
.then(res => {
checkActive(this)
return res
})
}
}
return this.__getErr()
},
exit () {
return this.isCapable === true && this.isActive === true
? promisify(document, prefixes.exit).then(res => {
checkActive(this)
return this.isActive ? this.exit() : res
})
: this.__getErr()
},
toggle (target) {
const el = target || document.documentElement
return this.activeEl === el
? this.exit()
: this.request(el)
},
install ({ $q }) {
$q.fullscreen = this
this.__getErr = () => Promise.resolve()
if (isSSR === true) { return }
prefixes.request = [
'requestFullscreen',
'msRequestFullscreen', 'mozRequestFullScreen', 'webkitRequestFullscreen'
].find(request => document.documentElement[request] !== void 0)
this.isCapable = prefixes.request !== void 0
if (this.isCapable === false) {
// it means the browser does NOT support it
this.__getErr = () => Promise.reject('Not capable')
return
}
prefixes.exit = [
'exitFullscreen',
'msExitFullscreen', 'mozCancelFullScreen', 'webkitExitFullscreen'
].find(exit => document[exit])
checkActive(this)
;[
'onfullscreenchange',
'onmsfullscreenchange', 'onwebkitfullscreenchange'
].forEach(evt => {
document[evt] = () => {
checkActive(this)
}
})
Vue.util.defineReactive(this, 'isActive', this.isActive)
Vue.util.defineReactive(this, 'activeEl', this.activeEl)
}
}