aboutsummaryrefslogtreecommitdiff
path: root/ext/bg/js
diff options
context:
space:
mode:
authortoasted-nutbread <toasted-nutbread@users.noreply.github.com>2021-02-08 17:52:41 -0500
committerGitHub <noreply@github.com>2021-02-08 17:52:41 -0500
commit849e4fabe1dffc2851fcb338dae8400d6c8e46ca (patch)
treee49dbd86ec20a2a11fc8938b8f6a4e1a9c57501e /ext/bg/js
parent008809e0e73665249b7b3dd7c14a1761aa06bd39 (diff)
Native messaging optional permission (#1348)
* Refactor PermissionsToggleController to not require a setting * Update nativeMessaging to be optional on Chrome * Update parsing.enableMecabParser setting to request permissions * Update permissions page to use PermissionsToggleController * Update permissions documentation * Disable toggle for permissions which are not optional
Diffstat (limited to 'ext/bg/js')
-rw-r--r--ext/bg/js/permissions-main.js65
-rw-r--r--ext/bg/js/settings/permissions-toggle-controller.js42
2 files changed, 57 insertions, 50 deletions
diff --git a/ext/bg/js/permissions-main.js b/ext/bg/js/permissions-main.js
index 366a057b..5b17a5dd 100644
--- a/ext/bg/js/permissions-main.js
+++ b/ext/bg/js/permissions-main.js
@@ -17,6 +17,8 @@
/* global
* DocumentFocusController
+ * PermissionsToggleController
+ * SettingsController
* api
*/
@@ -36,45 +38,24 @@ async function isAllowedFileSchemeAccess() {
return await new Promise((resolve) => chrome.extension.isAllowedFileSchemeAccess(resolve));
}
-function hasPermissions(permissions) {
- return new Promise((resolve) => chrome.permissions.contains({permissions}, (result) => {
- const e = chrome.runtime.lastError;
- resolve(!e && result);
- }));
-}
-
-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);
- }
- })) :
- new Promise((resolve, reject) => chrome.permissions.remove({permissions}, (result) => {
- const e = chrome.runtime.lastError;
- if (e) {
- reject(new Error(e.message));
- } else {
- resolve(!result);
- }
- }))
- );
-}
+function setupPermissionsToggles() {
+ const manifest = chrome.runtime.getManifest();
+ let optionalPermissions = manifest.optional_permissions;
+ if (!Array.isArray(optionalPermissions)) { optionalPermissions = []; }
+ optionalPermissions = new Set(optionalPermissions);
-function setupPermissionCheckbox(checkbox, permissions) {
- checkbox.addEventListener('change', (e) => {
- updatePermissionCheckbox(checkbox, permissions, e.currentTarget.checked);
- }, false);
-}
+ const hasAllPermisions = (set, values) => {
+ for (const value of values) {
+ if (!set.has(value)) { return false; }
+ }
+ return true;
+ };
-async function updatePermissionCheckbox(checkbox, permissions, value) {
- checkbox.checked = !value;
- const hasPermission = await setPermissionsGranted(permissions, value);
- checkbox.checked = hasPermission;
+ for (const toggle of document.querySelectorAll('.permissions-toggle')) {
+ let permissions = toggle.dataset.requiredPermissions;
+ permissions = (typeof permissions === 'string' && permissions.length > 0 ? permissions.split(' ') : []);
+ toggle.disabled = !hasAllPermisions(optionalPermissions, permissions);
+ }
}
(async () => {
@@ -82,6 +63,8 @@ async function updatePermissionCheckbox(checkbox, permissions, value) {
const documentFocusController = new DocumentFocusController();
documentFocusController.prepare();
+ setupPermissionsToggles();
+
for (const node of document.querySelectorAll('.extension-id-example')) {
node.textContent = chrome.runtime.getURL('/');
}
@@ -92,13 +75,11 @@ async function updatePermissionCheckbox(checkbox, permissions, value) {
setupEnvironmentInfo();
const permissionsCheckboxes = [
- document.querySelector('#permission-checkbox-clipboard-read'),
document.querySelector('#permission-checkbox-allow-in-private-windows'),
document.querySelector('#permission-checkbox-allow-file-url-access')
];
const permissions = await Promise.all([
- hasPermissions(['clipboardRead']),
isAllowedIncognitoAccess(),
isAllowedFileSchemeAccess()
]);
@@ -107,7 +88,11 @@ async function updatePermissionCheckbox(checkbox, permissions, value) {
permissionsCheckboxes[i].checked = permissions[i];
}
- setupPermissionCheckbox(permissionsCheckboxes[0], ['clipboardRead']);
+ const settingsController = new SettingsController(0);
+ settingsController.prepare();
+
+ const permissionsToggleController = new PermissionsToggleController(settingsController);
+ permissionsToggleController.prepare();
await promiseTimeout(100);
diff --git a/ext/bg/js/settings/permissions-toggle-controller.js b/ext/bg/js/settings/permissions-toggle-controller.js
index 07db1cf8..2e58ec67 100644
--- a/ext/bg/js/settings/permissions-toggle-controller.js
+++ b/ext/bg/js/settings/permissions-toggle-controller.js
@@ -41,9 +41,16 @@ class PermissionsToggleController {
// Private
_onOptionsChanged({options}) {
- const accessor = new ObjectPropertyAccessor(options);
+ let accessor = null;
for (const toggle of this._toggles) {
- const path = ObjectPropertyAccessor.getPathArray(toggle.dataset.permissionsSetting);
+ const {permissionsSetting} = toggle.dataset;
+ if (typeof permissionsSetting !== 'string') { continue; }
+
+ if (accessor === null) {
+ accessor = new ObjectPropertyAccessor(options);
+ }
+
+ const path = ObjectPropertyAccessor.getPathArray(permissionsSetting);
let value;
try {
value = accessor.get(path, path.length);
@@ -58,23 +65,38 @@ class PermissionsToggleController {
async _onPermissionsToggleChange(e) {
const toggle = e.currentTarget;
let value = toggle.checked;
+ const valuePre = !value;
+ const {permissionsSetting} = toggle.dataset;
+ const hasPermissionsSetting = typeof permissionsSetting === 'string';
- if (value) {
- toggle.checked = false;
- value = await this._settingsController.setPermissionsGranted(this._getRequiredPermissions(toggle), true);
+ if (value || !hasPermissionsSetting) {
+ toggle.checked = valuePre;
+ try {
+ value = await this._settingsController.setPermissionsGranted(this._getRequiredPermissions(toggle), value);
+ } catch (error) {
+ value = valuePre;
+ }
toggle.checked = value;
}
- this._setToggleValid(toggle, true);
-
- await this._settingsController.setProfileSetting(toggle.dataset.permissionsSetting, value);
+ if (hasPermissionsSetting) {
+ this._setToggleValid(toggle, true);
+ await this._settingsController.setProfileSetting(permissionsSetting, value);
+ }
}
_onPermissionsChanged({permissions: {permissions}}) {
const permissionsSet = new Set(permissions);
for (const toggle of this._toggles) {
- const valid = !toggle.checked || this._hasAll(permissionsSet, this._getRequiredPermissions(toggle));
- this._setToggleValid(toggle, valid);
+ const {permissionsSetting} = toggle.dataset;
+ const hasPermissions = this._hasAll(permissionsSet, this._getRequiredPermissions(toggle));
+
+ if (typeof permissionsSetting === 'string') {
+ const valid = !toggle.checked || hasPermissions;
+ this._setToggleValid(toggle, valid);
+ } else {
+ toggle.checked = hasPermissions;
+ }
}
}