Implement asynchronous permission requests

This commit is contained in:
Yuya Ochiai
2017-11-05 00:08:59 +09:00
parent d83e7fecd7
commit 77427ad75a
2 changed files with 89 additions and 22 deletions

View File

@@ -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);
};
}