(() => {
const hasWorkingPermissions = 'permissions' in navigator &&
typeof navigator.permissions.query === 'function';
if (hasWorkingPermissions) {
return; }
const permissionStates = {
'geolocation': 'prompt',
'notifications': 'prompt',
'push': 'prompt',
'midi': 'prompt',
'camera': 'prompt',
'microphone': 'prompt',
'speaker': 'prompt',
'device-info': 'granted',
'background-sync': 'granted',
'bluetooth': 'prompt',
'persistent-storage': 'prompt',
'ambient-light-sensor': 'prompt',
'accelerometer': 'prompt',
'gyroscope': 'prompt',
'magnetometer': 'prompt',
'clipboard-read': 'prompt',
'clipboard-write': 'prompt',
'payment-handler': 'prompt',
'idle-detection': 'prompt',
'periodic-background-sync': 'prompt',
'screen-wake-lock': 'prompt',
'nfc': 'prompt',
'storage-access': 'prompt',
'window-placement': 'prompt'
};
class PermissionStatus extends EventTarget {
constructor(state) {
super();
this._state = state;
this._onchange = null;
}
get state() {
return this._state;
}
get onchange() {
return this._onchange;
}
set onchange(handler) {
if (this._onchange) {
this.removeEventListener('change', this._onchange);
}
this._onchange = handler;
if (handler) {
this.addEventListener('change', handler);
}
}
_updateState(newState) {
if (this._state !== newState) {
this._state = newState;
this.dispatchEvent(new Event('change'));
}
}
}
utils.patchToString(PermissionStatus, utils.makeNativeString('PermissionStatus'));
utils.patchToString(PermissionStatus.prototype.constructor, utils.makeNativeString('PermissionStatus'));
const permissions = {
query: async function(permissionDesc) {
if (!permissionDesc || typeof permissionDesc !== 'object') {
return Promise.reject(new TypeError(
"Failed to execute 'query' on 'Permissions': 1 argument required, but only 0 present."
));
}
const name = permissionDesc.name;
if (!name) {
return Promise.reject(new TypeError(
"Failed to execute 'query' on 'Permissions': required member name is undefined."
));
}
const state = permissionStates[name] || 'prompt';
return new PermissionStatus(state);
}
};
utils.patchToString(permissions.query, utils.makeNativeString('query'));
utils.replaceProperty(Object.getPrototypeOf(navigator), 'permissions', {
get() {
return permissions;
}
});
const descriptor = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(navigator), 'permissions');
if (descriptor && descriptor.get) {
utils.patchToString(descriptor.get, utils.makeNativeString('get permissions'));
}
})();