Compare commits

...
Sign in to create a new pull request.

3 commits

9 changed files with 72 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,13 @@ 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"]
});
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

@ -23,6 +23,9 @@ const messageHandler = {
case "resetBookmarksContext": case "resetBookmarksContext":
response = assignManager.resetBookmarksMenuItem(); response = assignManager.resetBookmarksMenuItem();
break; break;
case "resetProxySupport":
response = assignManager.init();
break;
case "deleteContainer": case "deleteContainer":
response = backgroundLogic.deleteContainer(m.message.userContextId); response = backgroundLogic.deleteContainer(m.message.userContextId);
break; break;
@ -106,6 +109,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,17 +1,28 @@
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" });
}
if (permission === "proxy") {
browser.runtime.sendMessage({ method: "resetProxySupport" });
}
} }
async function enableDisableSync() { async function enableDisableSync() {
@ -26,11 +37,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 +94,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;
}); });
// Query if user has proxy permissions.
// If so, we want to show the custom proxy settings options for the container:
const hasProxyPermission = await browser.runtime.sendMessage({
method: "proxyPermissionCheck",
});
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>