-
Notifications
You must be signed in to change notification settings - Fork 20
/
web-compat.js
105 lines (101 loc) · 3.43 KB
/
web-compat.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
import { defineProperty, getFeatureSettingEnabled } from '../utils'
/**
* Fixes incorrect sizing value for outerHeight and outerWidth
*/
function windowSizingFix () {
if (window.outerHeight !== 0 && window.outerWidth !== 0) {
return
}
window.outerHeight = window.innerHeight
window.outerWidth = window.innerWidth
}
/**
* Add missing navigator.credentials API
*/
function navigatorCredentialsFix () {
try {
if ('credentials' in navigator && 'get' in navigator.credentials) {
return
}
const value = {
get () {
return Promise.reject(new Error())
}
}
defineProperty(Navigator.prototype, 'credentials', {
value,
configurable: true,
enumerable: true
})
} catch {
// Ignore exceptions that could be caused by conflicting with other extensions
}
}
function safariObjectFix () {
try {
// @ts-expect-error https://app.asana.com/0/1201614831475344/1203979574128023/f
if (window.safari) {
return
}
defineProperty(window, 'safari', {
value: {
},
configurable: true,
enumerable: true
})
// @ts-expect-error https://app.asana.com/0/1201614831475344/1203979574128023/f
defineProperty(window.safari, 'pushNotification', {
value: {
},
configurable: true,
enumerable: true
})
// @ts-expect-error https://app.asana.com/0/1201614831475344/1203979574128023/f
defineProperty(window.safari.pushNotification, 'toString', {
value: () => { return '[object SafariRemoteNotification]' },
configurable: true,
enumerable: true
})
class SafariRemoteNotificationPermission {
constructor () {
this.deviceToken = null
this.permission = 'denied'
}
}
// @ts-expect-error https://app.asana.com/0/1201614831475344/1203979574128023/f
defineProperty(window.safari.pushNotification, 'permission', {
value: (name) => {
return new SafariRemoteNotificationPermission()
},
configurable: true,
enumerable: true
})
// @ts-expect-error https://app.asana.com/0/1201614831475344/1203979574128023/f
defineProperty(window.safari.pushNotification, 'requestPermission', {
value: (name, domain, options, callback) => {
if (typeof callback === 'function') {
callback(new SafariRemoteNotificationPermission())
return
}
const reason = "Invalid 'callback' value passed to safari.pushNotification.requestPermission(). Expected a function."
throw new Error(reason)
},
configurable: true,
enumerable: true
})
} catch {
// Ignore exceptions that could be caused by conflicting with other extensions
}
}
export function init (args) {
const featureName = 'web-compat'
if (getFeatureSettingEnabled(featureName, args, 'windowSizing')) {
windowSizingFix()
}
if (getFeatureSettingEnabled(featureName, args, 'navigatorCredentials')) {
navigatorCredentialsFix()
}
if (getFeatureSettingEnabled(featureName, args, 'safariObject')) {
safariObjectFix()
}
}