Compare commits

...

35 Commits

Author SHA1 Message Date
Andrea Marchesini 3b00ade521 Reintroduce all the languages for the next release 2021-12-15 21:09:14 +01:00
Andrea Marchesini 19600a6f2d Merge pull request #2242 from mozilla/bump-version
Bump version number to 8.0.4
2021-12-14 18:19:17 +00:00
Lesley Norton f4df97f9b0 Bump version number to 8.0.4 2021-12-14 12:14:37 -06:00
Andrea Marchesini 4651126fc1 Merge pull request #2225 from mozilla/make-proxy/nativeMessaging-optional
Make proxy & nativeMessaging permissions optional
2021-12-14 18:09:05 +00:00
Andrea Marchesini f544f41145 Fix travis builds 2021-12-14 19:06:17 +01:00
Lesley Norton 478a6dbdc5 Address review comment 2021-12-14 11:46:44 -06:00
Lesley Norton e87be3df2a Fix MAC-689
This prevents permission prompts from getting lost when multiple permission checkboxes are checked before their corresponding prompts are accepted or declined and one of the permissions requires a reboot when enabled (Jira ticket MAC-689)
2021-12-10 11:49:31 -06:00
Lesley Norton cbcae353a3 Use 'inline-size' instead of 'width' 2021-12-08 18:07:08 -06:00
Lesley Norton 29d586353c Fix onboarding panel buttons on Windows 2021-12-08 17:57:55 -06:00
Lesley Norton c91409646a Use localized string 2021-12-08 17:52:26 -06:00
Lesley Norton 2361fc7899 Fix Windows UI edge cases (Jira - 683) 2021-12-08 14:59:04 -08:00
Lesley Norton dc7b5ca396 Add sumo link to options page 2021-12-08 15:58:30 -06:00
Lesley Norton 1f5245b0bc Update options page when permissions change (Jira 682, 686, 680) 2021-12-08 15:57:18 -06:00
Lesley Norton 8e51ea0134 Add ability to enable permissions from Mozilla VPN + Proxy onboarding panel 2021-12-07 10:22:51 -06:00
Lesley Norton 567a284196 Update options page to latest UX 2021-12-07 10:22:51 -06:00
Lesley Norton 2fbb3e0087 Hide Mozilla VPN proxy flags when proxy permission is disabled 2021-12-07 10:22:50 -06:00
Lesley Norton 396411f8b3 Update panel
- Badge the Options icon when proxy and/or nativeMessaging permissions are disabled. Remove on click, don't show again.
- Use localized strings
- Refactors + cleanup
2021-12-07 10:22:50 -06:00
Lesley Norton 3c3b5ae705 Add Mozilla VPN & Proxy permissions block to options.html 2021-12-07 10:22:50 -06:00
Andrea Marchesini 07d7b0cad4 Make the linter happy again 2021-12-07 10:22:50 -06:00
Andrea Marchesini ca861e2727 Permission handlers triggered on add and on remove 2021-12-07 10:22:50 -06:00
Andrea Marchesini c146a0bd11 Move the permission observers in the background scripts 2021-12-07 10:22:49 -06:00
Lesley Norton 1b165aebb5 Handle proxy and nativeMessaging permission disabling + enabling 2021-12-07 10:22:49 -06:00
Lesley Norton ed63f18cf1 Lint roll 2021-12-07 10:22:49 -06:00
Lesley Norton 5a2e631ed3 Gate MozillaVPN tout on enabled permissions in edit container panels 2021-12-07 10:22:49 -06:00
Lesley Norton ef662cdc72 Show permission warning in advanced proxy panel 2021-12-07 10:22:49 -06:00
Lesley Norton 66359941bf Start updates to to options.html 2021-12-07 10:22:49 -06:00
Lesley Norton 09d9b05a93 Make nativeMessaging and proxy permissions optional 2021-12-07 10:22:48 -06:00
Andrea Marchesini e3772b28b9 Disable languages again for 8.0.3 2021-11-30 10:58:52 +01:00
Andrea Marchesini 9aeb80e6ab Merge pull request #2223 from mozilla/proxy
Use an empty object for no-proxy requests
2021-11-30 07:04:10 +01:00
Andrea Marchesini aae1fc0016 Merge pull request #2224 from mozilla/version8.0.3
Version bump: 8.0.3
2021-11-30 07:01:40 +01:00
Andrea Marchesini 64cf810c30 Version bump: 8.0.3 2021-11-29 23:29:11 +01:00
Andrea Marchesini 8bde28a4ac Use an empty object for no-proxy requests 2021-11-29 16:21:36 +01:00
luke crouch ac98046a65 Merge pull request #2215 from Exagone313/confirm-page-autofocus-confirm
Automatically focus confirm button on confirm page
2021-11-28 08:47:15 -06:00
Elouan Martinet cd8e1ea0f7 Automatically focus confirm button on confirm page (#2214)
This is a regression introduced in commit:
05dc48eac2

The autofocus attribute was removed unexpectedly in a localization
change.
2021-11-25 18:31:50 +01:00
Andrea Marchesini 80393ceb04 Include all the languages 2021-11-25 08:12:00 +01:00
18 changed files with 583 additions and 188 deletions
+3
View File
@@ -5,3 +5,6 @@ node_js:
notifications: notifications:
irc: irc:
- "ircs://irc.mozilla.org:6697/#testpilot-containers-bots" - "ircs://irc.mozilla.org:6697/#testpilot-containers-bots"
install:
- npm install --legacy-peer-deps
+2 -3
View File
@@ -11,7 +11,7 @@ git submodule init || die
git submodule update --remote --depth 1 src/_locales || die git submodule update --remote --depth 1 src/_locales || die
print Y "Installing dependencies..." print Y "Installing dependencies..."
npm install || die npm install --legacy-peer-deps || die
print Y "Running tests..." print Y "Running tests..."
npm test npm test
@@ -23,5 +23,4 @@ if [[ $# -gt 0 ]]; then
EXTRA_PARAMS="--filename $1" EXTRA_PARAMS="--filename $1"
fi fi
# Let's include just 'en' for this release $(npm bin)/web-ext build --overwrite-dest $EXTRA_PARAMS || die
$(npm bin)/web-ext build --overwrite-dest $EXTRA_PARAMS --ignore-files $(find _locales/* | grep \/en -v) $(find _locales/* | grep en_) || die
+5 -5
View File
@@ -2,19 +2,19 @@
"name": "testpilot-containers", "name": "testpilot-containers",
"title": "Multi-Account Containers", "title": "Multi-Account Containers",
"description": "Containers helps you keep all the parts of your online life contained in different tabs. Custom labels and color-coded tabs help keep different activities — like online shopping, travel planning, or checking work email — separate.", "description": "Containers helps you keep all the parts of your online life contained in different tabs. Custom labels and color-coded tabs help keep different activities — like online shopping, travel planning, or checking work email — separate.",
"version": "8.0.2", "version": "8.0.4",
"author": "Andrea Marchesini, Luke Crouch, Lesley Norton, Kendall Werts, Maxx Crawford, Jonathan Kingston", "author": "Andrea Marchesini, Luke Crouch, Lesley Norton, Kendall Werts, Maxx Crawford, Jonathan Kingston",
"bugs": { "bugs": {
"url": "https://github.com/mozilla/multi-account-containers/issues" "url": "https://github.com/mozilla/multi-account-containers/issues"
}, },
"dependencies": {}, "dependencies": {},
"devDependencies": { "devDependencies": {
"addons-linter": "^1.3.2", "addons-linter": "^3.23.0",
"ajv": "^6.6.3", "ajv": "^6.6.3",
"chai": "^4.2.0", "chai": "^4.2.0",
"eslint": "^6.6.0", "eslint": "^7.32.0",
"eslint-plugin-no-unsanitized": "^2.0.0", "eslint-plugin-no-unsanitized": "^4.0.0",
"eslint-plugin-promise": "^3.4.0", "eslint-plugin-promise": "^5.2.0",
"htmllint-cli": "0.0.7", "htmllint-cli": "0.0.7",
"json": ">=10.0.0", "json": ">=10.0.0",
"mocha": "^6.2.2", "mocha": "^6.2.2",
+1 -1
View File
@@ -24,7 +24,7 @@
<br /> <br />
<div class="button-container"> <div class="button-container">
<button id="deny" class="button" data-message-id="openInContainer" data-message-arg="current-container-name"></button> <button id="deny" class="button" data-message-id="openInContainer" data-message-arg="current-container-name"></button>
<button id="confirm" class="button primary" data-message-id="openInContainer" data-message-arg="container-name"></button> <button id="confirm" class="button primary" autofocus data-message-id="openInContainer" data-message-arg="container-name"></button>
</div> </div>
</form> </form>
</main> </main>
+104 -11
View File
@@ -1,29 +1,122 @@
body { body {
background: #fff; --grey10: #e7e7e7;
color: #202023;
}
h3 { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
margin-block-start: 2.5rem; background: #fff;
color: rgb(74, 74, 79);
font-size: 13px;
overflow: hidden;
} }
h3:first-of-type { h3:first-of-type {
margin-block-start: 1rem; margin-block-start: 2.5rem;
} }
p,
label { label {
color: rgb(74, 74, 79); display: flex;
align-items: center;
font-size: 14px;
}
label > span {
padding-inline-end: 4px;
}
.settings-group {
margin-block-end: 16px;
}
form {
display: flex;
flex-direction: column;
padding-block-end: 1rem;
}
.settings-group p {
margin-inline-start: 24px;
margin-block: 4px 8px;
}
input[type="checkbox"] {
margin-inline: 0 8px;
margin-block: 1px auto;
inline-size: 16px;
block-size: 16px;
}
button {
margin-inline: 0 auto;
}
.keyboard-shortcut {
display: flex;
flex-direction: row;
justify-content: space-between;
max-inline-size: 70%;
align-items: center;
}
.bold {
font-weight: 600;
}
.moz-vpn-proxy-permissions {
margin-block: 0 2rem;
padding-block-end: 1rem;
border-block-end: 1px solid var(--grey10);
display: flex;
flex-direction: column;
}
h3.moz-vpn-proxy-permissions-title {
margin-block-start: 0;
position: relative;
display: flex;
align-items: center;
}
.warning-icon {
display: flex;
align-items: center;
}
.warning-icon.show-warning::before {
background-image: url("/img/warning.svg");
background-size: 24px;
background-repeat: no-repeat;
background-position: center;
content: "";
display: block;
block-size: 24px;
inline-size: 24px;
margin-inline-end: 0.5rem;
}
.moz-vpn-proxy-permissions-title::before,
.moz-vpn-proxy-permissions-title::after {
background-color: var(--grey10);
content: "";
height: 1px;
flex: 1 1 0%;
}
h3.moz-vpn-proxy-permissions-title::before {
margin-inline-end: 2rem;
margin-inline-start: -50%;
}
h3.moz-vpn-proxy-permissions-title::after {
margin-inline-start: 2rem;
margin-inline-end: -50%;
} }
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
body { body {
background: #202023; background: #23212a;
color: #fff; color: #fff;
} }
p, p {
label {
color: rgb(177, 177, 179); color: rgb(177, 177, 179);
} }
} }
+100 -32
View File
@@ -445,6 +445,7 @@ input:checked + .slider::before {
/* Primary CTA Buttons */ /* Primary CTA Buttons */
.primary-cta { .primary-cta {
block-size: 32px;
background-color: var(--primaryCtaDefault); background-color: var(--primaryCtaDefault);
border: transparent; border: transparent;
border-radius: 4px; border-radius: 4px;
@@ -481,10 +482,6 @@ input:checked + .slider::before {
transition: opacity 0.1s ease-in-out, max-height 0.3s ease-in-out; transition: opacity 0.1s ease-in-out, max-height 0.3s ease-in-out;
} }
#moz-vpn-tout.disappear {
animation: hideTout 0.2s ease-in forwards;
}
@keyframes appear { @keyframes appear {
0% { 0% {
opacity: 0; opacity: 0;
@@ -497,22 +494,6 @@ input:checked + .slider::before {
} }
} }
@keyframes hideTout {
0% {
transform: translateY(0%);
opacity: 1;
}
50% {
opacity: 1;
}
100% {
transform: translateY(20%);
opacity: 0;
}
}
/* Mozilla VPN Controller UI in Container Management Panel */ /* Mozilla VPN Controller UI in Container Management Panel */
.moz-vpn-content, .moz-vpn-content,
@@ -522,9 +503,6 @@ input:checked + .slider::before {
flex-direction: column; flex-direction: column;
padding-block: 16px; padding-block: 16px;
transition: max-height 0.3s ease-in-out, padding-block-end 0.2s ease-in-out; transition: max-height 0.3s ease-in-out, padding-block-end 0.2s ease-in-out;
/* max-block-size: 56px; */
min-block-size: 56px;
box-shadow: 0 0 0 1px var(--hr-grey); box-shadow: 0 0 0 1px var(--hr-grey);
} }
@@ -610,7 +588,8 @@ input.proxies {
.moz-vpn-cta { .moz-vpn-cta {
block-size: 32px; block-size: 32px;
margin-block: 16px; margin-block-start: 16px;
margin-block-end: 4px;
margin-inline: var(--marginInline); margin-inline: var(--marginInline);
text-align: center; text-align: center;
} }
@@ -685,6 +664,7 @@ input.proxies {
max-block-size: 0; max-block-size: 0;
opacity: 0; opacity: 0;
visibility: hidden; visibility: hidden;
display: none;
background-color: var(--bgColor); background-color: var(--bgColor);
transition: max-height 0.2s ease-in-out, opacity 0.2s ease-in-out, visibility 0.2s ease-in-out; transition: max-height 0.2s ease-in-out, opacity 0.2s ease-in-out, visibility 0.2s ease-in-out;
} }
@@ -713,6 +693,7 @@ input.proxies {
} }
.expanded .collapsible-content { .expanded .collapsible-content {
display: flex;
max-block-size: 500px; max-block-size: 500px;
opacity: 1; opacity: 1;
visibility: visible; visibility: visible;
@@ -1337,6 +1318,44 @@ input[type=text] {
min-block-size: 360px; min-block-size: 360px;
} }
.panel.onboarding-panel-8.optional-permissions-disabled {
min-block-size: 420px;
margin-block-end: 0;
margin-inline: 0;
}
.optional-permissions-disabled #moz-vpn-fw-onboarding-done {
display: none !important;
}
.moz-vpn-permissions {
padding-block: var(--marginInline);
padding-inline: var(--marginInline);
background-color: #cececf1c;
border-block-start: 1px solid var(--hr-grey);
display: none;
}
.optional-permissions-disabled .moz-vpn-permissions {
display: block;
inline-size: 100%;
}
.moz-vpn-onboarding-content {
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: center;
padding-inline: var(--marginInline);
padding-block-end: var(--marginInline);
}
.moz-vpn-permissions-copy {
padding-inline: 20px;
font-size: 12px;
margin-block-end: 16px;
}
.panel-content { .panel-content {
flex: 1; flex: 1;
padding-block-start: 16px; padding-block-start: 16px;
@@ -1363,8 +1382,7 @@ input[type=text] {
.onboarding-title { .onboarding-title {
color: #43484e; color: #43484e;
font-size: var(--font-size-heading); font-size: var(--font-size-heading);
margin-block-end: 0; margin-block: 12px;
margin-block-start: 0;
margin-inline-end: 0; margin-inline-end: 0;
margin-inline-start: 0; margin-inline-start: 0;
max-inline-size: 80%; max-inline-size: 80%;
@@ -1518,9 +1536,7 @@ manage things like container crud */
/* Panel footer */ /* Panel footer */
.panel-footer { .panel-footer {
align-items: center; align-items: center;
background: #efefef;
block-size: var(--footerHeight); block-size: var(--footerHeight);
border-block-end: 1px solid #d8d8d8;
color: #000; color: #000;
display: flex; display: flex;
font-size: 13px; font-size: 13px;
@@ -1994,6 +2010,24 @@ input {
text-decoration: none; text-decoration: none;
} }
.info-icon-alert::after {
block-size: 12px;
inline-size: 12px;
background-color: var(--alertColor);
content: "1";
border-radius: 50%;
position: absolute;
inset-block: -5px;
inset-inline-end: -6px;
box-shadow: 0 0 1px #00000075;
font-size: 8px;
color: white;
display: flex;
align-items: center;
justify-content: center;
font-weight: bolder;
}
.delete-warning { .delete-warning {
padding-block-end: 8px; padding-block-end: 8px;
padding-block-start: 8px; padding-block-start: 8px;
@@ -2031,6 +2065,36 @@ tr:hover > td > .trash-button {
margin-inline-start: 8px; margin-inline-start: 8px;
} }
/* ----- Permissions Overlay ---------- */
#advanced-proxy-settings-panel,
.advanced-proxy-panel-content {
position: absolute;
inset-block: 0;
inset-inline: 0;
}
.permissions-overlay {
position: absolute;
inset-inline: 0 0;
inset-block-start: 40px;
inset-block-end: 0;
justify-content: center;
align-content: center;
flex-direction: column;
background-color: white;
padding-block: 2.25rem;
padding-inline: 2.25rem;
display: none;
}
#enable-proxy-permissions {
text-align: center;
font-family: var(--fontMetropolis);
font-size: 14px;
margin-block-start: 1rem;
}
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
:root { :root {
--iconCloseX: url("/img/close-light.svg"); --iconCloseX: url("/img/close-light.svg");
@@ -2061,6 +2125,10 @@ tr:hover > td > .trash-button {
--text-grey: #fefffe; --text-grey: #fefffe;
} }
.permissions-overlay {
background-color: #494755;
}
.tooltip { .tooltip {
background-color: var(--controllerActive); background-color: var(--controllerActive);
} }
@@ -2069,6 +2137,10 @@ tr:hover > td > .trash-button {
box-shadow: 0 0 21px 3px #323139; box-shadow: 0 0 21px 3px #323139;
} }
.moz-vpn-permissions {
background-color: #322f3e;
}
.blue-link { .blue-link {
color: #36abfc; color: #36abfc;
} }
@@ -2152,10 +2224,6 @@ tr:hover > td > .trash-button {
background-color: #676767; background-color: #676767;
} }
.panel-footer {
border-block-end: solid 1px #4a4a4a;
}
input[type="text"]:focus { input[type="text"]:focus {
box-shadow: 0 0 0 3px var(--blue50); box-shadow: 0 0 0 3px var(--blue50);
border-color: var(--blue30); border-color: var(--blue30);
+3
View File
@@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M18.6929 16.0119L13.7399 6.10586C13.5739 5.77358 13.3185 5.49411 13.0025 5.29878C12.6866 5.10346 12.3224 5 11.9509 5C11.5795 5 11.2153 5.10346 10.8993 5.29878C10.5834 5.49411 10.328 5.77358 10.1619 6.10586L5.20894 16.0159C5.0575 16.3206 4.98633 16.659 5.00217 16.999C5.01801 17.3389 5.12033 17.6692 5.29946 17.9586C5.47858 18.2479 5.72858 18.4868 6.0258 18.6526C6.32302 18.8183 6.65762 18.9055 6.99794 18.9059H16.9029C17.2439 18.906 17.5792 18.819 17.8771 18.6531C18.1749 18.4872 18.4255 18.2479 18.6048 17.9579C18.7842 17.668 18.8864 17.337 18.9018 16.9964C18.9172 16.6557 18.8453 16.3169 18.6929 16.0119V16.0119ZM10.9509 8.90586C10.9509 8.64065 11.0563 8.38629 11.2438 8.19876C11.4314 8.01122 11.6857 7.90586 11.9509 7.90586C12.2162 7.90586 12.4705 8.01122 12.658 8.19876C12.8456 8.38629 12.9509 8.64065 12.9509 8.90586V12.9059C12.9509 13.1711 12.8456 13.4254 12.658 13.613C12.4705 13.8005 12.2162 13.9059 11.9509 13.9059C11.6857 13.9059 11.4314 13.8005 11.2438 13.613C11.0563 13.4254 10.9509 13.1711 10.9509 12.9059V8.90586ZM11.9509 17.1559C11.7037 17.1559 11.462 17.0826 11.2565 16.9452C11.0509 16.8078 10.8907 16.6126 10.7961 16.3842C10.7015 16.1558 10.6767 15.9045 10.725 15.662C10.7732 15.4195 10.8922 15.1968 11.0671 15.022C11.2419 14.8472 11.4646 14.7281 11.7071 14.6799C11.9496 14.6317 12.2009 14.6564 12.4293 14.751C12.6577 14.8456 12.8529 15.0058 12.9903 15.2114C13.1276 15.417 13.2009 15.6586 13.2009 15.9059C13.2009 16.2374 13.0692 16.5553 12.8348 16.7897C12.6004 17.0242 12.2825 17.1559 11.9509 17.1559V17.1559Z" fill="#FF4F5E" />
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

+9 -3
View File
@@ -188,13 +188,13 @@ window.assignManager = {
// The following blocks potentially dangerous requests for privacy that come without a tabId // The following blocks potentially dangerous requests for privacy that come without a tabId
if(requestInfo.tabId === -1) { if(requestInfo.tabId === -1) {
return {type: "direct"}; return {};
} }
const tab = await browser.tabs.get(requestInfo.tabId); const tab = await browser.tabs.get(requestInfo.tabId);
const result = await proxifiedContainers.retrieve(tab.cookieStoreId); const result = await proxifiedContainers.retrieve(tab.cookieStoreId);
if (!result || !result.proxy) { if (!result || !result.proxy) {
return {type: "direct"}; return {};
} }
if (!result.proxy.mozProxyEnabled) { if (!result.proxy.mozProxyEnabled) {
@@ -382,6 +382,12 @@ window.assignManager = {
return currentContainerState && currentContainerState.isIsolated; return currentContainerState && currentContainerState.isIsolated;
}, },
maybeAddProxyListeners() {
if (browser.proxy) {
browser.proxy.onRequest.addListener(this.handleProxifiedRequest, {urls: ["<all_urls>"]});
}
},
init() { init() {
browser.contextMenus.onClicked.addListener((info, tab) => { browser.contextMenus.onClicked.addListener((info, tab) => {
info.bookmarkId ? info.bookmarkId ?
@@ -390,7 +396,7 @@ window.assignManager = {
}); });
// Before anything happens we decide if the request should be proxified // Before anything happens we decide if the request should be proxified
browser.proxy.onRequest.addListener(this.handleProxifiedRequest, {urls: ["<all_urls>"]}); this.maybeAddProxyListeners();
// 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
+22
View File
@@ -19,6 +19,28 @@ const backgroundLogic = {
} }
} }
}); });
browser.permissions.onAdded.addListener(permissions => this.resetPermissions(permissions));
browser.permissions.onRemoved.addListener(permissions => this.resetPermissions(permissions));
},
resetPermissions(permissions) {
permissions.permissions.forEach(async permission => {
switch (permission) {
case "bookmarks":
assignManager.resetBookmarksMenuItem();
break;
case "nativeMessaging":
await MozillaVPN_Background.removeMozillaVpnProxies();
await browser.runtime.reload();
break;
case "proxy":
assignManager.maybeAddProxyListeners();
break;
}
});
}, },
async getExtensionInfo() { async getExtensionInfo() {
-3
View File
@@ -20,9 +20,6 @@ const messageHandler = {
case "resetSync": case "resetSync":
response = sync.resetSync(); response = sync.resetSync();
break; break;
case "resetBookmarksContext":
response = assignManager.resetBookmarksMenuItem();
break;
case "deleteContainer": case "deleteContainer":
response = backgroundLogic.deleteContainer(m.message.userContextId); response = backgroundLogic.deleteContainer(m.message.userContextId);
break; break;
+13
View File
@@ -100,6 +100,19 @@ const MozillaVPN_Background = {
get isolationKey() { get isolationKey() {
return this._isolationKey; return this._isolationKey;
}, },
async removeMozillaVpnProxies() {
const proxies = await proxifiedContainers.retrieveAll();
if (!proxies) {
return;
}
for (const proxyObj of proxies) {
const { proxy } = proxyObj;
if (proxy.countryCode !== undefined) {
await proxifiedContainers.delete(proxyObj.cookieStoreId);
}
}
},
}; };
MozillaVPN_Background.init(); MozillaVPN_Background.init();
+10 -1
View File
@@ -5,6 +5,11 @@ const MozillaVPN = {
const mozillaVpnInstalled = await browser.runtime.sendMessage({ method: "MozillaVPN_getInstallationStatus" }); const mozillaVpnInstalled = await browser.runtime.sendMessage({ method: "MozillaVPN_getInstallationStatus" });
this.handleStatusIndicatorsInContainerLists(mozillaVpnInstalled); this.handleStatusIndicatorsInContainerLists(mozillaVpnInstalled);
const permissionsEnabled = await this.bothPermissionsEnabled();
if (!permissionsEnabled) {
return;
}
const proxies = await this.getProxies(identities); const proxies = await this.getProxies(identities);
if (Object.keys(proxies).length === 0) { if (Object.keys(proxies).length === 0) {
return; return;
@@ -156,6 +161,10 @@ const MozillaVPN = {
}; };
}, },
async bothPermissionsEnabled() {
return await browser.permissions.contains({ permissions: ["proxy", "nativeMessaging"] });
},
async getProxyWarnings(proxyObj) { async getProxyWarnings(proxyObj) {
if (!proxyObj) { if (!proxyObj) {
@@ -245,7 +254,7 @@ const MozillaVPN = {
randomInteger = (randomInteger - server.weight); randomInteger = (randomInteger - server.weight);
} }
return nextServer; return nextServer;
} },
}; };
window.MozillaVPN = MozillaVPN; window.MozillaVPN = MozillaVPN;
+65 -18
View File
@@ -1,17 +1,45 @@
const NUMBER_OF_KEYBOARD_SHORTCUTS = 10; const NUMBER_OF_KEYBOARD_SHORTCUTS = 10;
async function requestPermissions() { async function setUpCheckBoxes() {
const checkbox = document.querySelector("#bookmarksPermissions"); document.querySelectorAll("[data-permission-id]").forEach(async(el) => {
if (checkbox.checked) { const permissionId = el.dataset.permissionId;
const granted = await browser.permissions.request({permissions: ["bookmarks"]}); const permissionEnabled = await browser.permissions.contains({ permissions: [permissionId] });
if (!granted) { el.checked = !!permissionEnabled;
checkbox.checked = false; });
}
function disablePermissionsInputs() {
document.querySelectorAll("[data-permission-id").forEach(el => {
el.disabled = true;
});
}
function enablePermissionsInputs() {
document.querySelectorAll("[data-permission-id").forEach(el => {
el.disabled = false;
});
}
document.querySelectorAll("[data-permission-id").forEach(async(el) => {
const permissionId = el.dataset.permissionId;
el.addEventListener("change", async() => {
if (el.checked) {
disablePermissionsInputs();
const granted = await browser.permissions.request({ permissions: [permissionId] });
if (!granted) {
el.checked = false;
enablePermissionsInputs();
}
return; return;
} }
} else { await browser.permissions.remove({ permissions: [permissionId] });
await browser.permissions.remove({permissions: ["bookmarks"]}); });
} });
browser.runtime.sendMessage({ method: "resetBookmarksContext" });
async function maybeShowPermissionsWarningIcon() {
const bothMozillaVpnPermissionsEnabled = await MozillaVPN.bothPermissionsEnabled();
const permissionsWarningEl = document.querySelector(".warning-icon");
permissionsWarningEl.classList.toggle("show-warning", !bothMozillaVpnPermissionsEnabled);
} }
async function enableDisableSync() { async function enableDisableSync() {
@@ -26,12 +54,8 @@ async function enableDisableReplaceTab() {
} }
async function setupOptions() { async function setupOptions() {
const hasPermission = await browser.permissions.contains({permissions: ["bookmarks"]});
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) {
document.querySelector("#bookmarksPermissions").checked = true;
}
document.querySelector("#syncCheck").checked = !!syncEnabled; document.querySelector("#syncCheck").checked = !!syncEnabled;
document.querySelector("#replaceTabCheck").checked = !!replaceTabEnabled; document.querySelector("#replaceTabCheck").checked = !!replaceTabEnabled;
setupContainerShortcutSelects(); setupContainerShortcutSelects();
@@ -78,13 +102,36 @@ function resetOnboarding() {
browser.storage.local.set({"onboarding-stage": 0}); browser.storage.local.set({"onboarding-stage": 0});
} }
async function resetPermissionsUi() {
await maybeShowPermissionsWarningIcon();
await setUpCheckBoxes();
enablePermissionsInputs();
}
browser.permissions.onAdded.addListener(resetPermissionsUi);
browser.permissions.onRemoved.addListener(resetPermissionsUi);
document.addEventListener("DOMContentLoaded", setupOptions); document.addEventListener("DOMContentLoaded", setupOptions);
document.querySelector("#bookmarksPermissions").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); maybeShowPermissionsWarningIcon();
for (let i=0; i < NUMBER_OF_KEYBOARD_SHORTCUTS; i++) { for (let i=0; i < NUMBER_OF_KEYBOARD_SHORTCUTS; i++) {
document.querySelector("#open_container_"+i) document.querySelector("#open_container_"+i)
.addEventListener("change", storeShortcutChoice); .addEventListener("change", storeShortcutChoice);
} }
document.querySelectorAll("[data-btn-id]").forEach(btn => {
btn.addEventListener("click", () => {
switch (btn.dataset.btnId) {
case "reset-onboarding":
resetOnboarding();
break;
case "moz-vpn-learn-more":
browser.tabs.create({
url: MozillaVPN.attachUtmParameters("https://support.mozilla.org/kb/protect-your-container-tabs-mozilla-vpn", "options-learn-more")
});
break;
}
});
});
resetPermissionsUi();
+146 -60
View File
@@ -643,14 +643,29 @@ Logic.registerPanel(P_ONBOARDING_8, {
// This method is called when the object is registered. // This method is called when the object is registered.
initialize() { initialize() {
Utils.addEnterHandler(document.querySelector("#onboarding-done-btn"), async () => { document.querySelectorAll(".onboarding-done").forEach(el => {
await Logic.setOnboardingStage(8); Utils.addEnterHandler(el, async () => {
Logic.showPanel(P_CONTAINERS_LIST); await Logic.setOnboardingStage(8);
Logic.showPanel(P_CONTAINERS_LIST);
});
}); });
}, },
// This method is called when the panel is shown. // This method is called when the panel is shown.
prepare() { async prepare() {
const mozillaVpnPermissionsEnabled = await MozillaVPN.bothPermissionsEnabled();
if (!mozillaVpnPermissionsEnabled) {
const panel = document.querySelector(".onboarding-panel-8");
panel.classList.add("optional-permissions-disabled");
Utils.addEnterHandler(panel.querySelector("#onboarding-enable-permissions"), async () => {
const granted = await browser.permissions.request({ permissions: ["proxy", "nativeMessaging"] });
if (granted) {
await Logic.setOnboardingStage(8);
}
});
}
return Promise.resolve(null); return Promise.resolve(null);
}, },
}); });
@@ -662,24 +677,7 @@ Logic.registerPanel(P_CONTAINERS_LIST, {
// This method is called when the object is registered. // This method is called when the object is registered.
async initialize() { async initialize() {
const mozillaVpnToutName = "moz-tout-main-panel";
await browser.runtime.sendMessage({ method: "MozillaVPN_queryStatus" }); await browser.runtime.sendMessage({ method: "MozillaVPN_queryStatus" });
Utils.addEnterHandler(document.querySelector("#moz-vpn-learn-more"), () => {
MozillaVPN.handleMozillaCtaClick("mac-main-panel-btn");
window.close();
});
Utils.addEnterHandler(document.querySelector(".dismiss-moz-vpn-tout"), async() => {
const { mozillaVpnHiddenToutsList } = await browser.storage.local.get("mozillaVpnHiddenToutsList");
if (typeof(mozillaVpnHiddenToutsList) === "undefined") {
await browser.storage.local.set({ "mozillaVpnHiddenToutsList": [] });
}
document.querySelector("#moz-vpn-tout").classList.add("disappear");
mozillaVpnHiddenToutsList.push({
name: mozillaVpnToutName
});
await browser.storage.local.set({ mozillaVpnHiddenToutsList });
});
Utils.addEnterHandler(document.querySelector("#manage-containers-link"), (e) => { Utils.addEnterHandler(document.querySelector("#manage-containers-link"), (e) => {
if (!e.target.classList.contains("disable-edit-containers")) { if (!e.target.classList.contains("disable-edit-containers")) {
Logic.showPanel(MANAGE_CONTAINERS_PICKER); Logic.showPanel(MANAGE_CONTAINERS_PICKER);
@@ -694,9 +692,6 @@ Logic.registerPanel(P_CONTAINERS_LIST, {
Utils.addEnterHandler(document.querySelector("#always-open-in"), () => { Utils.addEnterHandler(document.querySelector("#always-open-in"), () => {
Logic.showPanel(ALWAYS_OPEN_IN_PICKER); Logic.showPanel(ALWAYS_OPEN_IN_PICKER);
}); });
Utils.addEnterHandler(document.querySelector("#info-icon"), () => {
browser.runtime.openOptionsPage();
});
Utils.addEnterHandler(document.querySelector("#sort-containers-link"), async () => { Utils.addEnterHandler(document.querySelector("#sort-containers-link"), async () => {
try { try {
await browser.runtime.sendMessage({ await browser.runtime.sendMessage({
@@ -708,16 +703,58 @@ Logic.registerPanel(P_CONTAINERS_LIST, {
} }
}); });
const mozillaVpnToutName = "moz-tout-main-panel";
const mozillaVpnPermissionsWarningDotName = "moz-permissions-warning-dot";
let { mozillaVpnHiddenToutsList } = await browser.storage.local.get("mozillaVpnHiddenToutsList");
if (typeof(mozillaVpnHiddenToutsList) === "undefined") {
await browser.storage.local.set({ "mozillaVpnHiddenToutsList": [] });
mozillaVpnHiddenToutsList = [];
}
// Decide whether to show Mozilla VPN tout
const mozVpnTout = document.getElementById("moz-vpn-tout"); const mozVpnTout = document.getElementById("moz-vpn-tout");
const mozillaVpnInstalled = await browser.runtime.sendMessage({ method: "MozillaVPN_getInstallationStatus" }); const mozillaVpnInstalled = await browser.runtime.sendMessage({ method: "MozillaVPN_getInstallationStatus" });
if (mozillaVpnInstalled) { const mozillaVpnToutShouldBeHidden = mozillaVpnHiddenToutsList.find(tout => tout.name === mozillaVpnToutName);
return mozVpnTout.remove(); if (mozillaVpnInstalled || mozillaVpnToutShouldBeHidden) {
mozVpnTout.remove();
} }
const { mozillaVpnHiddenToutsList } = await browser.storage.local.get("mozillaVpnHiddenToutsList");
const mozillaVpnToutShouldBeHidden = mozillaVpnHiddenToutsList && mozillaVpnHiddenToutsList.find(tout => tout.name === mozillaVpnToutName); // Add handlers if tout is visible
if (mozillaVpnToutShouldBeHidden) { const mozVpnDismissTout = document.querySelector(".dismiss-moz-vpn-tout");
return mozVpnTout.remove(); if (mozVpnDismissTout) {
Utils.addEnterHandler((mozVpnDismissTout), async() => {
mozVpnTout.remove();
mozillaVpnHiddenToutsList.push({
name: mozillaVpnToutName
});
await browser.storage.local.set({ mozillaVpnHiddenToutsList });
});
Utils.addEnterHandler(document.querySelector("#moz-vpn-learn-more"), () => {
MozillaVPN.handleMozillaCtaClick("mac-main-panel-btn");
window.close();
});
} }
// Badge Options icon if both nativeMessaging and/or proxy permissions are disabled
const bothMozillaVpnPermissionsEnabled = await MozillaVPN.bothPermissionsEnabled();
const warningDotShouldBeHidden = mozillaVpnHiddenToutsList.find(tout => tout.name === mozillaVpnPermissionsWarningDotName);
const optionsIcon = document.getElementById("info-icon");
if (optionsIcon && !bothMozillaVpnPermissionsEnabled && !warningDotShouldBeHidden) {
optionsIcon.classList.add("info-icon-alert");
}
Utils.addEnterHandler((document.querySelector("#info-icon")), async() => {
browser.runtime.openOptionsPage();
if (!mozillaVpnHiddenToutsList.find(tout => tout.name === mozillaVpnPermissionsWarningDotName)) {
optionsIcon.classList.remove("info-icon-alert");
mozillaVpnHiddenToutsList.push({
name: mozillaVpnPermissionsWarningDotName
});
}
await browser.storage.local.set({ mozillaVpnHiddenToutsList });
});
}, },
unregister() { unregister() {
@@ -799,7 +836,6 @@ Logic.registerPanel(P_CONTAINERS_LIST, {
Utils.addEnterHandler(showPanelButton, () => { Utils.addEnterHandler(showPanelButton, () => {
Logic.showPanel(P_CONTAINER_INFO, identity); Logic.showPanel(P_CONTAINER_INFO, identity);
}); });
} }
const list = document.querySelector("#identities-list"); const list = document.querySelector("#identities-list");
@@ -1438,18 +1474,25 @@ Logic.registerPanel(P_CONTAINER_EDIT, {
async connectedCallback() { async connectedCallback() {
const { mozillaVpnHiddenToutsList } = await browser.storage.local.get("mozillaVpnHiddenToutsList"); const { mozillaVpnHiddenToutsList } = await browser.storage.local.get("mozillaVpnHiddenToutsList");
const mozillaVpnCollapseEditContainerTout = mozillaVpnHiddenToutsList && mozillaVpnHiddenToutsList.find(tout => tout.name === this.toutName); const mozillaVpnCollapseEditContainerTout = mozillaVpnHiddenToutsList && mozillaVpnHiddenToutsList.find(tout => tout.name === this.toutName);
const mozillaVpnInstalled = await browser.runtime.sendMessage({ method: "MozillaVPN_getInstallationStatus" });
this.hideShowButton.addEventListener("click", this); this.hideShowButton.addEventListener("click", this);
if (mozillaVpnCollapseEditContainerTout) { if (mozillaVpnCollapseEditContainerTout && !mozillaVpnInstalled) {
this.collapseUi(); this.collapseUi();
} }
// Add listeners // Add listeners
if (!this.classList.contains("has-attached-listeners")) { if (!this.classList.contains("has-attached-listeners")) {
this.primaryCta.addEventListener("click", () => { const bothMozillaVpnPermissionsEnabled = await MozillaVPN.bothPermissionsEnabled();
MozillaVPN.handleMozillaCtaClick("mac-edit-container-panel-btn"); this.primaryCta.addEventListener("click", async() => {
if (!bothMozillaVpnPermissionsEnabled && mozillaVpnInstalled) {
await browser.permissions.request({ permissions: ["proxy", "nativeMessaging"] });
} else {
MozillaVPN.handleMozillaCtaClick("mac-edit-container-panel-btn");
}
}); });
this.switch.addEventListener("click", async() => { this.switch.addEventListener("click", async() => {
@@ -1502,7 +1545,6 @@ Logic.registerPanel(P_CONTAINER_EDIT, {
await proxifiedContainers.set(id.cookieStoreId, proxy); await proxifiedContainers.set(id.cookieStoreId, proxy);
this.switch.checked = true; this.switch.checked = true;
this.updateProxyDependentUi(proxy); this.updateProxyDependentUi(proxy);
} else { } else {
this.switch.checked = false; this.switch.checked = false;
return; return;
@@ -1518,24 +1560,35 @@ Logic.registerPanel(P_CONTAINER_EDIT, {
const mozillaVpnInstalled = await browser.runtime.sendMessage({ method: "MozillaVPN_getInstallationStatus" }); const mozillaVpnInstalled = await browser.runtime.sendMessage({ method: "MozillaVPN_getInstallationStatus" });
const mozillaVpnConnected = await browser.runtime.sendMessage({ method: "MozillaVPN_getConnectionStatus" }); const mozillaVpnConnected = await browser.runtime.sendMessage({ method: "MozillaVPN_getConnectionStatus" });
if (!mozillaVpnInstalled) { this.subtitle.textContent = browser.i18n.getMessage("integrateContainers");
this.hideEls(this.switch, this.switchLabel, this.currentServerButton); const bothMozillaVpnPermissionsEnabled = await MozillaVPN.bothPermissionsEnabled();
this.subtitle.textContent = browser.i18n.getMessage("protectThisContainer");
this.primaryCta.addEventListener("click", this);
} else { if (mozillaVpnInstalled && !bothMozillaVpnPermissionsEnabled) {
this.subtitle.style.flex = "1 1 100%";
// Mozilla VPN installed... this.classList.remove("show-server-button");
this.subtitle.textContent = browser.i18n.getMessage("additionalPermissionNeeded");
this.hideEls(this.hideShowButton, this.switch, this.switchLabel, this.currentServerButton);
this.primaryCta.style.display = "block";
this.primaryCta.textContent = browser.i18n.getMessage("enable");
return;
}
if (mozillaVpnInstalled) {
// Hide cta and hide/show button // Hide cta and hide/show button
this.hideEls(this.primaryCta, this.hideShowButton); this.hideEls(this.primaryCta, this.hideShowButton);
// Update subtitle // Update subtitle
this.subtitle.textContent = mozillaVpnConnected ? browser.i18n.getMessage("useCustomLocation") : browser.i18n.getMessage("mozillaVpnMustBeOn"); this.subtitle.textContent = mozillaVpnConnected ? browser.i18n.getMessage("useCustomLocation") : browser.i18n.getMessage("mozillaVpnMustBeOn");
this.subtitle.style.flex = "1 1 80%";
this.currentServerButton.style.display = "flex";
} }
if (!mozillaVpnConnected) { if (mozillaVpnConnected) {
[this.switchLabel, this.switch].forEach(el => {
el.style.display = "inline-block";
});
} else {
this.hideEls(this.switch, this.switchLabel, this.currentServerButton); this.hideEls(this.switch, this.switchLabel, this.currentServerButton);
this.switch.checked = false; this.switch.checked = false;
} }
@@ -1582,17 +1635,15 @@ Logic.registerPanel(P_CONTAINER_EDIT, {
this.mozProxyEnabledInput.value = proxyInfo.mozProxyEnabled; this.mozProxyEnabledInput.value = proxyInfo.mozProxyEnabled;
this.proxyAddressInput.value = `${proxyInfo.type}://${proxyInfo.host}:${proxyInfo.port}`; this.proxyAddressInput.value = `${proxyInfo.type}://${proxyInfo.host}:${proxyInfo.port}`;
if (typeof(proxyInfo.countryCode) === "undefined" && proxyInfo.type !== "direct") { if (typeof(proxyInfo.countryCode) === "undefined" && proxyInfo.type) {
// Set custom proxy URL below 'Advanced proxy settings' button label // Set custom proxy URL below 'Advanced proxy settings' button label
this.advancedProxyAddress.textContent = `${proxyInfo.type}://${proxyInfo.host}:${proxyInfo.port}`; this.advancedProxyAddress.textContent = `${proxyInfo.type}://${proxyInfo.host}:${proxyInfo.port}`;
} }
} }
async updateProxyDependentUi(proxyInfo) { async updateProxyDependentUi(proxyInfo) {
const containerHasProxy = typeof(proxyInfo) !== "undefined";
const mozillaVpnProxyLocationAvailable = (proxy) => { const mozillaVpnProxyLocationAvailable = (proxy) => {
return typeof(proxy.countryCode) !== "undefined" && typeof(proxyInfo.cityName) !== "undefined"; return typeof(proxy) !== "undefined" && typeof(proxy.countryCode) !== "undefined" && typeof(proxy.cityName) !== "undefined";
}; };
const mozillaVpnProxyIsEnabled = (proxy) => { const mozillaVpnProxyIsEnabled = (proxy) => {
@@ -1605,7 +1656,7 @@ Logic.registerPanel(P_CONTAINER_EDIT, {
const mozillaVpnConnected = await browser.runtime.sendMessage({ method: "MozillaVPN_getConnectionStatus" }); const mozillaVpnConnected = await browser.runtime.sendMessage({ method: "MozillaVPN_getConnectionStatus" });
if ( if (
!containerHasProxy || !proxyInfo ||
!mozillaVpnProxyLocationAvailable(proxyInfo) || !mozillaVpnProxyLocationAvailable(proxyInfo) ||
!mozillaVpnConnected !mozillaVpnConnected
) { ) {
@@ -1620,7 +1671,7 @@ Logic.registerPanel(P_CONTAINER_EDIT, {
} }
// Populate inputs and server button with current or previously stored mozilla vpn proxy // Populate inputs and server button with current or previously stored mozilla vpn proxy
if(containerHasProxy && mozillaVpnProxyLocationAvailable(proxyInfo)) { if(proxyInfo && mozillaVpnProxyLocationAvailable(proxyInfo)) {
this.currentCountryFlag.style.backgroundImage = `url("./img/flags/${proxyInfo.countryCode.toUpperCase()}.png")`; this.currentCountryFlag.style.backgroundImage = `url("./img/flags/${proxyInfo.countryCode.toUpperCase()}.png")`;
this.currentCountryFlag.style.backgroundImage = proxyInfo.countryCode + ".png"; this.currentCountryFlag.style.backgroundImage = proxyInfo.countryCode + ".png";
this.currentCityName.textContent = proxyInfo.cityName; this.currentCityName.textContent = proxyInfo.cityName;
@@ -1631,12 +1682,10 @@ Logic.registerPanel(P_CONTAINER_EDIT, {
expandUi() { expandUi() {
this.classList.add("expanded"); this.classList.add("expanded");
this.style.maxHeight = 500 + "px";
} }
collapseUi() { collapseUi() {
this.classList.remove("expanded"); this.classList.remove("expanded");
this.style.maxHeight = 56 + "px";
} }
hideEls(...els) { hideEls(...els) {
@@ -1673,6 +1722,10 @@ Logic.registerPanel(P_CONTAINER_EDIT, {
customElements.define("moz-vpn-container-ui", MozVpnContainerUi); customElements.define("moz-vpn-container-ui", MozVpnContainerUi);
const mozillaVpnUi = document.querySelector("moz-vpn-container-ui"); const mozillaVpnUi = document.querySelector("moz-vpn-container-ui");
mozillaVpnUi.updateMozVpnStatusDependentUi(); mozillaVpnUi.updateMozVpnStatusDependentUi();
browser.permissions.onAdded.addListener(() => { mozillaVpnUi.updateMozVpnStatusDependentUi(); });
browser.permissions.onRemoved.addListener(() => { mozillaVpnUi.updateMozVpnStatusDependentUi(); });
const advancedProxySettingsButton = document.querySelector(".advanced-proxy-settings-btn"); const advancedProxySettingsButton = document.querySelector(".advanced-proxy-settings-btn");
Utils.addEnterHandler(advancedProxySettingsButton, () => { Utils.addEnterHandler(advancedProxySettingsButton, () => {
Logic.showPanel(P_ADVANCED_PROXY_SETTINGS, this.getEditInProgressIdentity(), false, false); Logic.showPanel(P_ADVANCED_PROXY_SETTINGS, this.getEditInProgressIdentity(), false, false);
@@ -1835,23 +1888,22 @@ Logic.registerPanel(P_CONTAINER_EDIT, {
return; return;
} }
const proxyData = await proxifiedContainers.retrieve(identity.cookieStoreId); const proxyPermissionEnabled = await browser.permissions.contains({ permissions: ["proxy"] });
if (proxyData) { if (proxyPermissionEnabled) {
if (proxyData.proxy && proxyData.proxy.mozProxyEnabled && !mozillaVpnConnected) { const proxyData = await proxifiedContainers.retrieve(identity.cookieStoreId);
if (proxyData && proxyData.proxy.mozProxyEnabled && !mozillaVpnConnected) {
return; return;
} }
mozillaVpnUi.updateProxyDependentUi(proxyData.proxy); const proxy = proxyData ? proxyData.proxy : {};
return; mozillaVpnUi.updateProxyDependentUi(proxy);
} }
mozillaVpnUi.updateProxyDependentUi({});
}, },
}); });
Logic.registerPanel(P_ADVANCED_PROXY_SETTINGS, { Logic.registerPanel(P_ADVANCED_PROXY_SETTINGS, {
panelSelector: "#advanced-proxy-settings-panel", panelSelector: "#advanced-proxy-settings-panel",
initialize(){ async initialize() {
this._proxyForm = document.querySelector(".advanced-proxy-panel-content"); this._proxyForm = document.querySelector(".advanced-proxy-panel-content");
this._advancedProxyInput = this._proxyForm.querySelector("#edit-advanced-proxy-input"); this._advancedProxyInput = this._proxyForm.querySelector("#edit-advanced-proxy-input");
const clearAdvancedProxyInput = this._proxyForm.querySelector("#clear-advanced-proxy-input"); const clearAdvancedProxyInput = this._proxyForm.querySelector("#clear-advanced-proxy-input");
@@ -1931,6 +1983,40 @@ Logic.registerPanel(P_ADVANCED_PROXY_SETTINGS, {
const identity = Logic.currentIdentity(); const identity = Logic.currentIdentity();
const advancedProxyInput = document.getElementById("edit-advanced-proxy-input"); const advancedProxyInput = document.getElementById("edit-advanced-proxy-input");
const proxyPermissionEnabled = await browser.permissions.contains({ permissions: ["proxy"] });
if (!proxyPermissionEnabled) {
// Restrict tabbing inside advanced proxy panel to proxy permissions ui
const panel = document.getElementById("advanced-proxy-settings-panel");
const clickableEls = panel.querySelectorAll("button, a, input");
clickableEls.forEach(el => {
if (!el.dataset.tabGroup && el.id !== "advanced-proxy-settings-return") {
el.setAttribute("tabindex", "-1");
el.disabled = true;
}
});
// Show proxy permission overlay
const permissionsOverlay = document.getElementById("permissions-overlay");
permissionsOverlay.style.display = "flex";
// Add "enable" button handling
const enableProxyPermissionsButton = document.getElementById("enable-proxy-permissions");
enableProxyPermissionsButton.addEventListener("click", async() => {
const granted = await browser.permissions.request({ permissions: ["proxy"] });
if (granted) {
permissionsOverlay.style.display = "none";
// restore normal panel tabbing
clickableEls.forEach(el => {
el.tabindex = "0";
el.disabled = false;
});
}
});
}
// reset input // reset input
const resetProxyInput = () => { const resetProxyInput = () => {
if (!advancedProxyInput) { if (!advancedProxyInput) {
@@ -1948,7 +2034,7 @@ Logic.registerPanel(P_ADVANCED_PROXY_SETTINGS, {
}; };
const edit_proxy_dom = function(proxy) { const edit_proxy_dom = function(proxy) {
if (proxy.type === "direct" || typeof proxy.type === "undefined" || MozillaVPN.proxyIsDisabled(proxy)) { if (!proxy.type || MozillaVPN.proxyIsDisabled(proxy)) {
resetProxyInput(); resetProxyInput();
return; return;
} }
+1 -1
View File
@@ -51,7 +51,7 @@ proxifiedContainers = {
} }
if (mozillaVpnData && mozillaVpnData.mozProxyEnabled === undefined) { if (mozillaVpnData && mozillaVpnData.mozProxyEnabled === undefined) {
matches.groups.type = "direct"; matches.groups.type = null;
} }
if (!mozillaVpnData) { if (!mozillaVpnData) {
+5 -5
View File
@@ -1,7 +1,7 @@
{ {
"manifest_version": 2, "manifest_version": 2,
"name": "Firefox Multi-Account Containers", "name": "Firefox Multi-Account Containers",
"version": "8.0.2", "version": "8.0.4",
"incognito": "not_allowed", "incognito": "not_allowed",
"description": "__MSG_extensionDescription__", "description": "__MSG_extensionDescription__",
"icons": { "icons": {
@@ -18,16 +18,16 @@
"history", "history",
"idle", "idle",
"management", "management",
"nativeMessaging",
"storage", "storage",
"unlimitedStorage", "unlimitedStorage",
"tabs", "tabs",
"webRequestBlocking", "webRequestBlocking",
"webRequest", "webRequest"
"proxy"
], ],
"optional_permissions": [ "optional_permissions": [
"bookmarks" "bookmarks",
"nativeMessaging",
"proxy"
], ],
"browser_specific_settings": { "browser_specific_settings": {
"gecko": { "gecko": {
+61 -27
View File
@@ -4,85 +4,119 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<script type="text/javascript" src="./js/i18n.js"></script> <script type="text/javascript" src="./js/i18n.js"></script>
<script type="text/javascript" src="./js/mozillaVpn.js"></script>
<script type="text/javascript" src="./js/proxified-containers.js"></script>
<link rel="stylesheet" href="css/options.css"> <link rel="stylesheet" href="css/options.css">
</head> </head>
<body> <body>
<form> <form>
<h3 data-i18n-message-id="optionalPermissions"></h3> <h3 data-i18n-message-id="optionalPermissions"></h3>
<label > <div class="settings-group">
<input type="checkbox" id="bookmarksPermissions"> <label class="permission">
<span data-i18n-message-id="enableBookMarkMenus"></span> <input type="checkbox" data-permission-id="bookmarks" id="bookmarksPermissions">
<span class="bold" 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>
</div>
<div id="moz-vpn-proxy-permissions" class="moz-vpn-proxy-permissions">
<h3 class="moz-vpn-proxy-permissions-title">
<span data-i18n-message-id="mozillaVpnAndProxyPermissionsTitle" class="warning-icon"></span>
</h3>
<div class="moz-vpn-proxy-permissions-content">
<div class="settings-group">
<label class="permission">
<input type="checkbox" data-permission-id="nativeMessaging">
<span class="bold" data-i18n-message-id="nativeMessagingPermissionTitle"></span>
</label>
<p><em data-i18n-message-id="nativeMessagingPermissionDescription"></em></p>
</div>
<div class="settings-group">
<label class="permission">
<input type="checkbox" data-permission-id="proxy">
<span class="bold" data-i18n-message-id="proxyPermissionTitle"></span>
</label>
<p><em data-i18n-message-id="proxyPermissionDescription"></em></p>
</div>
</div>
</div>
<h3 data-i18n-message-id="firefoxAccountsSync"></h3> <h3 data-i18n-message-id="firefoxAccountsSync"></h3>
<label> <div class="settings-group">
<input type="checkbox" id="syncCheck"> <label>
<span data-i18n-message-id="enableSync"></span> <input type="checkbox" id="syncCheck">
</label> <span class="bold" data-i18n-message-id="enableSync"></span>
<p><em data-i18n-message-id="enableSyncDescription"></em></p> </label>
<p><em data-i18n-message-id="enableSyncDescription"></em></p>
</div>
<h3 data-i18n-message-id="tabBehavior"></h3> <h3 data-i18n-message-id="tabBehavior"></h3>
<label>
<input type="checkbox" id="replaceTabCheck"> <div class="settings-group">
<span data-i18n-message-id="replaceTab"></span> <label>
</label> <input type="checkbox" id="replaceTabCheck">
<p><em data-i18n-message-id="replaceTabDescription"></em></p> <span class="bold" data-i18n-message-id="replaceTab"></span>
</label>
<p><em data-i18n-message-id="replaceTabDescription"></em></p>
</div>
<h3 data-i18n-message-id="keyboardShortCuts"></h3> <h3 data-i18n-message-id="keyboardShortCuts"></h3>
<p><em data-i18n-message-id="editWhichContainer"></em></p> <p><em data-i18n-message-id="editWhichContainer"></em></p>
<p><label>
<p><label class="keyboard-shortcut">
<span data-i18n-message-id="keyboardShortCut" data-i18n-placeholder="1"></span> <span data-i18n-message-id="keyboardShortCut" data-i18n-placeholder="1"></span>
<select id="open_container_0"> <select id="open_container_0">
</select> </select>
</label></p> </label></p>
<p><label> <p><label class="keyboard-shortcut">
<span data-i18n-message-id="keyboardShortCut" data-i18n-placeholder="2"></span> <span data-i18n-message-id="keyboardShortCut" data-i18n-placeholder="2"></span>
<select id="open_container_1"> <select id="open_container_1">
</select> </select>
</label></p> </label></p>
<p><label> <p><label class="keyboard-shortcut">
<span data-i18n-message-id="keyboardShortCut" data-i18n-placeholder="3"></span> <span data-i18n-message-id="keyboardShortCut" data-i18n-placeholder="3"></span>
<select id="open_container_2"> <select id="open_container_2">
</select> </select>
</label></p> </label></p>
<p><label> <p><label class="keyboard-shortcut">
<span data-i18n-message-id="keyboardShortCut" data-i18n-placeholder="4"></span> <span data-i18n-message-id="keyboardShortCut" data-i18n-placeholder="4"></span>
<select id="open_container_3"> <select id="open_container_3">
</select> </select>
</label></p> </label></p>
<p><label> <p><label class="keyboard-shortcut">
<span data-i18n-message-id="keyboardShortCut" data-i18n-placeholder="5"></span> <span data-i18n-message-id="keyboardShortCut" data-i18n-placeholder="5"></span>
<select id="open_container_4"> <select id="open_container_4">
</select> </select>
</label></p> </label></p>
<p><label> <p><label class="keyboard-shortcut">
<span data-i18n-message-id="keyboardShortCut" data-i18n-placeholder="6"></span> <span data-i18n-message-id="keyboardShortCut" data-i18n-placeholder="6"></span>
<select id="open_container_5"> <select id="open_container_5">
</select> </select>
</label></p> </label></p>
<p><label> <p><label class="keyboard-shortcut">
<span data-i18n-message-id="keyboardShortCut" data-i18n-placeholder="7"></span> <span data-i18n-message-id="keyboardShortCut" data-i18n-placeholder="7"></span>
<select id="open_container_6"> <select id="open_container_6">
</select> </select>
</label></p> </label></p>
<p><label> <p><label class="keyboard-shortcut">
<span data-i18n-message-id="keyboardShortCut" data-i18n-placeholder="8"></span> <span data-i18n-message-id="keyboardShortCut" data-i18n-placeholder="8"></span>
<select id="open_container_7"> <select id="open_container_7">
</select> </select>
</label></p> </label></p>
<p><label> <p><label class="keyboard-shortcut">
<span data-i18n-message-id="keyboardShortCut" data-i18n-placeholder="9"></span> <span data-i18n-message-id="keyboardShortCut" data-i18n-placeholder="9"></span>
<select id="open_container_8"> <select id="open_container_8">
</select> </select>
</label></p> </label></p>
<p><label> <p><label class="keyboard-shortcut">
<span data-i18n-message-id="keyboardShortCut" data-i18n-placeholder="10"></span> <span data-i18n-message-id="keyboardShortCut" data-i18n-placeholder="10"></span>
<select id="open_container_9"> <select id="open_container_9">
</select> </select>
</label></p> </label></p>
<h3 data-i18n-message-id="onboarding"></h3> <h3 data-i18n-message-id="onboarding"></h3>
<button data-i18n-message-id="resetOnboardingPanels"></button> <button data-btn-id="reset-onboarding" data-i18n-message-id="resetOnboardingPanels"></button>
<p><em data-i18n-message-id="onboardingToggle"></em></p> <p><em data-i18n-message-id="onboardingToggle"></em></p>
<h3>Mozilla VPN</h3>
<button data-btn-id="moz-vpn-learn-more" data-i18n-message-id="learnMore"></button>
</form> </form>
<script src="js/options.js"></script> <script src="js/options.js"></script>
</body> </body>
+33 -18
View File
@@ -62,11 +62,22 @@
</div> </div>
<div class="panel onboarding onboarding-panel-8 hide" id="onboarding-panel-8"> <div class="panel onboarding onboarding-panel-8 hide" id="onboarding-panel-8">
<img class="onboarding-img" alt="" src="/img/moz-vpn-onboarding.svg" /> <div class="moz-vpn-onboarding-content">
<h3 class="onboarding-title" data-i18n-message-id="proxyNowAvailable"></h3> <img class="onboarding-img" alt="" src="/img/moz-vpn-onboarding.svg" />
<p data-i18n-message-id="onboarding-8-description"></p> <h3 class="onboarding-title" data-i18n-message-id="proxyNowAvailable"></h3>
<div class="half-button-wrapper"> <p data-i18n-message-id="onboarding-8-description"></p>
<a href="#" id="onboarding-done-btn" class="half-onboarding-button keyboard-nav" tabindex="0" data-i18n-message-id="done"></a> </div>
<div id="moz-vpn-fw-onboarding-done" class="half-button-wrapper">
<a id="moz-vpn-fw-onboarding-done" href="#" class="half-onboarding-button keyboard-nav onboarding-done" tabindex="0" data-i18n-message-id="done"></a>
</div>
<div class="moz-vpn-permissions">
<div class="moz-vpn-permissions-copy">
<span data-i18n-message-id="mozillaVpnRequiresAdditionalPermissions"></span>
</div>
<div class="half-button-wrapper">
<a href="#" id="permissions-not-now" class="half-onboarding-button grey-button keyboard-nav onboarding-done" tabindex="0" data-i18n-message-id="notNow"></a>
<a href="#" id="onboarding-enable-permissions" class="half-onboarding-button keyboard-nav" tabindex="0" data-i18n-message-id="enable"></a>
</div>
</div> </div>
</div> </div>
@@ -98,7 +109,7 @@
<div class="panel menu-panel container-panel hide" id="container-panel"> <div class="panel menu-panel container-panel hide" id="container-panel">
<h3 class="title">Multi-Account Containers</h3> <h3 class="title">Multi-Account Containers</h3>
<a href="#" class="info-icon" id="info-icon" tabindex="10"> <a href="#" class="info-icon" id="info-icon" tabindex="10">
<img data-i18n-attribute-message-id="info" data-i18n-attribute="alt" alt="" ="info" src="/img/info.svg" / > <img data-i18n-attribute-message-id="info" data-i18n-attribute="alt" alt="" src="/img/info.svg" / >
</a> </a>
<hr> <hr>
<table class="menu"> <table class="menu">
@@ -170,18 +181,18 @@
</table> </table>
</div> </div>
<div id="moz-vpn-tout" class="moz-vpn-content expanded"> <div id="moz-vpn-tout" class="moz-vpn-content expanded">
<div class="flx-row button-wrapper"> <div class="flx-row button-wrapper">
<h4 class="moz-vpn-logo">Mozilla VPN</h4> <h4 class="moz-vpn-logo">Mozilla VPN</h4>
<button class="controller dismiss-moz-vpn-tout" tab-index="0"></button> <button class="controller dismiss-moz-vpn-tout" tab-index="0"></button>
</div>
<div class="collapsible-content flx-col controller-collapsible-content">
<div class="flx-row flx-space-between">
<span class="moz-vpn-subtitle" data-i18n-message-id="protectYourContainers"></span>
</div>
<button id="moz-vpn-learn-more" class="moz-vpn-cta primary-cta" data-i18n-message-id="learnMore"></button>
</div>
</div> </div>
<v-padding-hack-footer></v-padding-hack-footer> <!--presents last container from getting covered up by the 'manage containers button' when list is long--> <div class="collapsible-content flx-col controller-collapsible-content">
<div class="flx-row flx-space-between">
<span class="moz-vpn-subtitle" data-i18n-message-id="integrateContainers"></span>
</div>
<button id="moz-vpn-learn-more" class="moz-vpn-cta primary-cta" data-i18n-message-id="getMozillaVpn"></button>
</div>
</div>
<v-padding-hack-footer></v-padding-hack-footer> <!--prevents last container from getting covered up by the 'manage containers button' when list is long-->
<div class="bottom-btn keyboard-nav controller" id="manage-containers-link" tabindex="0" data-i18n-message-id="manageContainers"></div> <div class="bottom-btn keyboard-nav controller" id="manage-containers-link" tabindex="0" data-i18n-message-id="manageContainers"></div>
</div> </div>
@@ -324,7 +335,7 @@
<span class="slider round"></span> <span class="slider round"></span>
</label> </label>
</div> </div>
<button id="get-mozilla-vpn" class="moz-vpn-cta primary-cta" data-i18n-message-id="learnMore"></button> <button id="get-mozilla-vpn" class="moz-vpn-cta primary-cta" data-i18n-message-id="getMozillaVpn"></button>
<button id="moz-vpn-current-server" class="controller"> <button id="moz-vpn-current-server" class="controller">
<span class="current-country-flag"></span> <span class="current-country-flag"></span>
<span class="current-city-name"></span> <span class="current-city-name"></span>
@@ -437,6 +448,10 @@
<button id="submit-advanced-proxy" class="primary-cta apply-to-container" data-i18n-message-id="applyToContainer"></button> <button id="submit-advanced-proxy" class="primary-cta apply-to-container" data-i18n-message-id="applyToContainer"></button>
<a id="advanced-proxy-settings-learn-more" href="" class="blue-link" data-i18n-message-id="learnMore"></a> <a id="advanced-proxy-settings-learn-more" href="" class="blue-link" data-i18n-message-id="learnMore"></a>
</form> </form>
<div id="permissions-overlay" class="permissions-overlay" data-tab-group="proxy-disabled">
<p data-tab-group="proxy-disabled" data-i18n-message-id="additionalPermissionNeeded"></p>
<button id="enable-proxy-permissions" class="primary-cta" data-tab-group="proxy-disabled">Enable</button>
</div>
</div> </div>
<script src="js/utils.js"></script> <script src="js/utils.js"></script>
<script src="js/popup.js"></script> <script src="js/popup.js"></script>