diff options
Diffstat (limited to 'ext/js/data/permissions-util.js')
-rw-r--r-- | ext/js/data/permissions-util.js | 191 |
1 files changed, 98 insertions, 93 deletions
diff --git a/ext/js/data/permissions-util.js b/ext/js/data/permissions-util.js index 43aaa87c..837b6d5f 100644 --- a/ext/js/data/permissions-util.js +++ b/ext/js/data/permissions-util.js @@ -16,123 +16,128 @@ * along with this program. If not, see <https://www.gnu.org/licenses/>. */ -import {AnkiUtil} from './anki-util.js'; +import {getFieldMarkers} from './anki-util.js'; -export class PermissionsUtil { - constructor() { - /** @type {Set<string>} */ - this._ankiFieldMarkersRequiringClipboardPermission = new Set([ - 'clipboard-image', - 'clipboard-text' - ]); +/** + * This function returns whether an Anki field marker might require clipboard permissions. + * This is speculative and may not guarantee that the field marker actually does require the permission, + * as the custom handlebars template is not deeply inspected. + * @param {string} marker + * @returns {boolean} + */ +function ankiFieldMarkerMayUseClipboard(marker) { + switch (marker) { + case 'clipboard-image': + case 'clipboard-text': + return true; + default: + return false; } +} + +/** + * @param {chrome.permissions.Permissions} permissions + * @returns {Promise<boolean>} + */ +export function hasPermissions(permissions) { + return new Promise((resolve, reject) => chrome.permissions.contains(permissions, (result) => { + const e = chrome.runtime.lastError; + if (e) { + reject(new Error(e.message)); + } else { + resolve(result); + } + })); +} - /** - * @param {chrome.permissions.Permissions} permissions - * @returns {Promise<boolean>} - */ - hasPermissions(permissions) { - return new Promise((resolve, reject) => chrome.permissions.contains(permissions, (result) => { +/** + * @param {chrome.permissions.Permissions} permissions + * @param {boolean} shouldHave + * @returns {Promise<boolean>} + */ +export function setPermissionsGranted(permissions, shouldHave) { + return ( + shouldHave ? + new Promise((resolve, reject) => chrome.permissions.request(permissions, (result) => { const e = chrome.runtime.lastError; if (e) { reject(new Error(e.message)); } else { resolve(result); } - })); - } - - /** - * @param {chrome.permissions.Permissions} permissions - * @param {boolean} shouldHave - * @returns {Promise<boolean>} - */ - setPermissionsGranted(permissions, shouldHave) { - return ( - shouldHave ? - new Promise((resolve, reject) => chrome.permissions.request(permissions, (result) => { - const e = chrome.runtime.lastError; - if (e) { - reject(new Error(e.message)); - } else { - resolve(result); - } - })) : - new Promise((resolve, reject) => chrome.permissions.remove(permissions, (result) => { - const e = chrome.runtime.lastError; - if (e) { - reject(new Error(e.message)); - } else { - resolve(!result); - } - })) - ); - } - - /** - * @returns {Promise<chrome.permissions.Permissions>} - */ - getAllPermissions() { - return new Promise((resolve, reject) => chrome.permissions.getAll((result) => { + })) : + new Promise((resolve, reject) => chrome.permissions.remove(permissions, (result) => { const e = chrome.runtime.lastError; if (e) { reject(new Error(e.message)); } else { - resolve(result); + resolve(!result); } - })); - } + })) + ); +} - /** - * @param {string} fieldValue - * @returns {string[]} - */ - getRequiredPermissionsForAnkiFieldValue(fieldValue) { - const markers = AnkiUtil.getFieldMarkers(fieldValue); - const markerPermissions = this._ankiFieldMarkersRequiringClipboardPermission; - for (const marker of markers) { - if (markerPermissions.has(marker)) { - return ['clipboardRead']; - } +/** + * @returns {Promise<chrome.permissions.Permissions>} + */ +export function getAllPermissions() { + return new Promise((resolve, reject) => chrome.permissions.getAll((result) => { + const e = chrome.runtime.lastError; + if (e) { + reject(new Error(e.message)); + } else { + resolve(result); + } + })); +} + +/** + * @param {string} fieldValue + * @returns {string[]} + */ +export function getRequiredPermissionsForAnkiFieldValue(fieldValue) { + const markers = getFieldMarkers(fieldValue); + for (const marker of markers) { + if (ankiFieldMarkerMayUseClipboard(marker)) { + return ['clipboardRead']; } - return []; } + return []; +} - /** - * @param {chrome.permissions.Permissions} permissions - * @param {import('settings').ProfileOptions} options - * @returns {boolean} - */ - hasRequiredPermissionsForOptions(permissions, options) { - const permissionsSet = new Set(permissions.permissions); +/** + * @param {chrome.permissions.Permissions} permissions + * @param {import('settings').ProfileOptions} options + * @returns {boolean} + */ +export function hasRequiredPermissionsForOptions(permissions, options) { + const permissionsSet = new Set(permissions.permissions); - if (!permissionsSet.has('nativeMessaging')) { - if (options.parsing.enableMecabParser) { - return false; - } + if (!permissionsSet.has('nativeMessaging')) { + if (options.parsing.enableMecabParser) { + return false; } + } - if (!permissionsSet.has('clipboardRead')) { - if (options.clipboard.enableBackgroundMonitor || options.clipboard.enableSearchPageMonitor) { - return false; - } - const fieldMarkersRequiringClipboardPermission = this._ankiFieldMarkersRequiringClipboardPermission; - const fieldsList = [ - options.anki.terms.fields, - options.anki.kanji.fields - ]; - for (const fields of fieldsList) { - for (const fieldValue of Object.values(fields)) { - const markers = AnkiUtil.getFieldMarkers(fieldValue); - for (const marker of markers) { - if (fieldMarkersRequiringClipboardPermission.has(marker)) { - return false; - } + if (!permissionsSet.has('clipboardRead')) { + if (options.clipboard.enableBackgroundMonitor || options.clipboard.enableSearchPageMonitor) { + return false; + } + const fieldsList = [ + options.anki.terms.fields, + options.anki.kanji.fields + ]; + for (const fields of fieldsList) { + for (const fieldValue of Object.values(fields)) { + const markers = getFieldMarkers(fieldValue); + for (const marker of markers) { + if (ankiFieldMarkerMayUseClipboard(marker)) { + return false; } } } } - - return true; } + + return true; } |