Foix #2138 - Add proxy as optional permission, add toggle option on settings page, conditionally show proxy container settings if approved/added

This commit is contained in:
Maxx Crawford 2021-09-29 14:54:32 -05:00
parent 98e3412d68
commit df34d8fac7
No known key found for this signature in database
GPG key ID: 71DBD3273B65FEF9
9 changed files with 67 additions and 17 deletions

View file

@ -221,6 +221,12 @@
"enableBookMarkMenus": { "enableBookMarkMenus": {
"message": "Enable Bookmark Menus" "message": "Enable Bookmark Menus"
}, },
"enableProxy": {
"message": "Enable custom per-container proxy settings"
},
"enableProxyDescription": {
"message": "This setting allows you to route all traffic from a specific Container through a proxy. This feature requires the proxy permission. This permission grants the add-on to control browser proxy settings."
},
"enableSync": { "enableSync": {
"message": "Enable Sync" "message": "Enable Sync"
}, },

View file

@ -585,6 +585,10 @@ manage things like container crud */
padding-inline-start: 0; padding-inline-start: 0;
} }
.edit-container-panel fieldset.proxy-container-settings.is-hidden {
display: none;
}
.edit-container-panel fieldset:last-of-type { .edit-container-panel fieldset:last-of-type {
margin-block-start: 16px; margin-block-start: 16px;
} }

View file

@ -372,7 +372,7 @@ window.assignManager = {
return currentContainerState && currentContainerState.isIsolated; return currentContainerState && currentContainerState.isIsolated;
}, },
init() { async init() {
browser.contextMenus.onClicked.addListener((info, tab) => { browser.contextMenus.onClicked.addListener((info, tab) => {
info.bookmarkId ? info.bookmarkId ?
this._onClickedBookmark(info) : this._onClickedBookmark(info) :
@ -380,7 +380,15 @@ window.assignManager = {
}); });
// Before anything happens we decide if the request should be proxified // Before anything happens we decide if the request should be proxified
const hasProxyPermission = await browser.permissions.contains({
permissions: ["proxy"]
});
console.log("hasProxyPermission: ", hasProxyPermission);
if (hasProxyPermission) {
browser.proxy.onRequest.addListener(this.handleProxifiedRequest, {urls: ["<all_urls>"]}); browser.proxy.onRequest.addListener(this.handleProxifiedRequest, {urls: ["<all_urls>"]});
}
// Before a request is handled by the browser we decide if we should // Before a request is handled by the browser we decide if we should
// route through a different container // route through a different container

View file

@ -106,6 +106,10 @@ const messageHandler = {
return assignManager._setOrRemoveAssignment(tab.id, m.url, m.newUserContextId, m.value); return assignManager._setOrRemoveAssignment(tab.id, m.url, m.newUserContextId, m.value);
}); });
break; break;
case "proxyPermissionCheck":
return await browser.permissions.contains({
permissions: ["proxy"],
});
} }
return response; return response;
}); });

View file

@ -1,19 +1,26 @@
const NUMBER_OF_KEYBOARD_SHORTCUTS = 10; const NUMBER_OF_KEYBOARD_SHORTCUTS = 10;
async function requestPermissions() { async function requestPermissions(event) {
const checkbox = document.querySelector("#bookmarksPermissions"); const checkbox = event.target;
const permission = checkbox.dataset.permission;
if (checkbox.checked) { if (checkbox.checked) {
const granted = await browser.permissions.request({permissions: ["bookmarks"]}); const granted = await browser.permissions.request({
permissions: [permission],
});
if (!granted) { if (!granted) {
checkbox.checked = false; checkbox.checked = false;
return; return;
} }
} else { } else {
await browser.permissions.remove({permissions: ["bookmarks"]}); await browser.permissions.remove({ permissions: [permission] });
} }
if (permission === "bookmarks") {
browser.runtime.sendMessage({ method: "resetBookmarksContext" }); browser.runtime.sendMessage({ method: "resetBookmarksContext" });
} }
}
async function enableDisableSync() { async function enableDisableSync() {
const checkbox = document.querySelector("#syncCheck"); const checkbox = document.querySelector("#syncCheck");
await browser.storage.local.set({syncEnabled: !!checkbox.checked}); await browser.storage.local.set({syncEnabled: !!checkbox.checked});
@ -26,11 +33,15 @@ async function enableDisableReplaceTab() {
} }
async function setupOptions() { async function setupOptions() {
const hasPermission = await browser.permissions.contains({permissions: ["bookmarks"]}); const hasBookmarksPermission = await browser.permissions.contains({permissions: ["bookmarks"]});
const hasProxyPermission = await browser.permissions.contains({permissions: ["proxy"]});
const { syncEnabled } = await browser.storage.local.get("syncEnabled"); const { syncEnabled } = await browser.storage.local.get("syncEnabled");
const { replaceTabEnabled } = await browser.storage.local.get("replaceTabEnabled"); const { replaceTabEnabled } = await browser.storage.local.get("replaceTabEnabled");
if (hasPermission) { if (hasBookmarksPermission) {
document.querySelector("#bookmarksPermissions").checked = true; document.querySelector("#bookmarksPermission").checked = true;
}
if (hasProxyPermission) {
document.querySelector("#proxyPermission").checked = true;
} }
document.querySelector("#syncCheck").checked = !!syncEnabled; document.querySelector("#syncCheck").checked = !!syncEnabled;
document.querySelector("#replaceTabCheck").checked = !!replaceTabEnabled; document.querySelector("#replaceTabCheck").checked = !!replaceTabEnabled;
@ -79,7 +90,10 @@ function resetOnboarding() {
} }
document.addEventListener("DOMContentLoaded", setupOptions); document.addEventListener("DOMContentLoaded", setupOptions);
document.querySelector("#bookmarksPermissions").addEventListener( "change", requestPermissions); document
.querySelectorAll(".permissionCheckbox").forEach( checkbox =>{
checkbox.addEventListener("change", requestPermissions);
});
document.querySelector("#syncCheck").addEventListener( "change", enableDisableSync); document.querySelector("#syncCheck").addEventListener( "change", enableDisableSync);
document.querySelector("#replaceTabCheck").addEventListener( "change", enableDisableReplaceTab); document.querySelector("#replaceTabCheck").addEventListener( "change", enableDisableReplaceTab);
document.querySelector("button").addEventListener("click", resetOnboarding); document.querySelector("button").addEventListener("click", resetOnboarding);

View file

@ -1428,6 +1428,16 @@ Logic.registerPanel(P_CONTAINER_EDIT, {
iconInput.checked = iconInput.value === identity.icon; iconInput.checked = iconInput.value === identity.icon;
}); });
const hasProxyPermission = await browser.runtime.sendMessage({
method: "proxyPermissionCheck",
});
console.log("hasProxyPermission: ", hasProxyPermission);
if (hasProxyPermission) {
document.querySelector(".proxy-container-settings").classList.remove("is-hidden");
}
// Clear the proxy field before doing the retrieval requests below // Clear the proxy field before doing the retrieval requests below
document.querySelector("#edit-container-panel-proxy").value = ""; document.querySelector("#edit-container-panel-proxy").value = "";

View file

@ -28,11 +28,11 @@
"unlimitedStorage", "unlimitedStorage",
"tabs", "tabs",
"webRequestBlocking", "webRequestBlocking",
"webRequest", "webRequest"
"proxy"
], ],
"optional_permissions": [ "optional_permissions": [
"bookmarks" "bookmarks",
"proxy"
], ],
"commands": { "commands": {
"_execute_browser_action": { "_execute_browser_action": {

View file

@ -11,11 +11,15 @@
<form> <form>
<h3 data-i18n-message-id="optionalPermissions"></h3> <h3 data-i18n-message-id="optionalPermissions"></h3>
<label > <label >
<input type="checkbox" id="bookmarksPermissions"> <input class="permissionCheckbox" data-permission="bookmarks" type="checkbox" id="bookmarksPermission">
<span data-i18n-message-id="enableBookMarkMenus"></span> <span data-i18n-message-id="enableBookMarkMenus"></span>
</label> </label>
<p><em data-i18n-message-id="enableBookMarkMenusDescription"></em></p> <p><em data-i18n-message-id="enableBookMarkMenusDescription"></em></p>
<label >
<input class="permissionCheckbox" data-permission="proxy" type="checkbox" id="proxyPermission">
<span data-i18n-message-id="enableProxy"></span>
</label>
<p><em data-i18n-message-id="enableProxyDescription"></em></p>
<h3 data-i18n-message-id="firefoxAccountsSync"></h3> <h3 data-i18n-message-id="firefoxAccountsSync"></h3>
<label> <label>
<input type="checkbox" id="syncCheck"> <input type="checkbox" id="syncCheck">

View file

@ -277,7 +277,7 @@
<fieldset id="edit-container-panel-choose-icon" class="radio-choice"> <fieldset id="edit-container-panel-choose-icon" class="radio-choice">
<legend class="form-header" data-i18n-message-id="icon"></legend> <legend class="form-header" data-i18n-message-id="icon"></legend>
</fieldset> </fieldset>
<fieldset> <fieldset class="proxy-container-settings is-hidden">
<legend>Proxy (Optional)</legend> <legend>Proxy (Optional)</legend>
<input type="text" name="container-proxy" id="edit-container-panel-proxy" maxlength="50" placeholder="type://host:port"/> <input type="text" name="container-proxy" id="edit-container-panel-proxy" maxlength="50" placeholder="type://host:port"/>
</fieldset> </fieldset>