Implement asynchronous permission requests
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
const {dialog} = require('electron');
|
||||
const {ipcMain} = require('electron');
|
||||
const {URL} = require('url');
|
||||
const fs = require('fs');
|
||||
|
||||
@@ -54,8 +54,41 @@ class PermissionManager {
|
||||
}
|
||||
}
|
||||
|
||||
function dequeueRequests(requestQueue, permissionManager, origin, permission, status) {
|
||||
switch (status) {
|
||||
case 'allow':
|
||||
permissionManager.grant(origin, permission);
|
||||
break;
|
||||
case 'block':
|
||||
permissionManager.deny(origin, permission);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (status === 'allow' || status === 'block') {
|
||||
const newQueue = requestQueue.filter((request) => {
|
||||
if (request.origin === origin && request.permission === permission) {
|
||||
request.callback(status === 'allow');
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
});
|
||||
requestQueue.splice(0, requestQueue.length, ...newQueue);
|
||||
} else {
|
||||
const index = requestQueue.findIndex((request) => {
|
||||
return request.origin === origin && request.permission === permission;
|
||||
});
|
||||
requestQueue[index].callback(false);
|
||||
requestQueue.splice(index, 1);
|
||||
}
|
||||
}
|
||||
|
||||
function permissionRequestHandler(mainWindow, permissionFile) {
|
||||
const permissionManager = new PermissionManager(permissionFile);
|
||||
const requestQueue = [];
|
||||
ipcMain.on('update-permission', (event, origin, permission, status) => {
|
||||
dequeueRequests(requestQueue, permissionManager, origin, permission, status);
|
||||
});
|
||||
return (webContents, permission, callback) => {
|
||||
const targetURL = new URL(webContents.getURL());
|
||||
if (permissionManager.isDenied(targetURL.origin, permission)) {
|
||||
@@ -67,28 +100,12 @@ function permissionRequestHandler(mainWindow, permissionFile) {
|
||||
return;
|
||||
}
|
||||
|
||||
const buttons = ['Allow', 'Deny', 'Skip'];
|
||||
const result = dialog.showMessageBox(mainWindow, {
|
||||
type: 'warning',
|
||||
buttons,
|
||||
title: 'Permission Required',
|
||||
message: `${targetURL.host} is requesting "${permission}" permission`,
|
||||
cancelId: 2,
|
||||
noLink: false
|
||||
requestQueue.push({
|
||||
origin: targetURL.origin,
|
||||
permission,
|
||||
callback
|
||||
});
|
||||
switch (result) {
|
||||
case buttons.indexOf('Allow'):
|
||||
permissionManager.grant(targetURL.origin, permission);
|
||||
callback(true);
|
||||
return;
|
||||
case buttons.indexOf('Deny'):
|
||||
permissionManager.deny(targetURL.origin, permission);
|
||||
callback(false);
|
||||
return;
|
||||
default:
|
||||
callback(false);
|
||||
|
||||
}
|
||||
mainWindow.webContents.send('request-permission', targetURL.origin, permission);
|
||||
};
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user