Compare commits
32 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a328e5bf91 | |||
| 46a55da277 | |||
| 1746d8379b | |||
| f57cf92f41 | |||
| 54659f5c77 | |||
| 2badd22f41 | |||
| 21b7386a94 | |||
| 529b9bb482 | |||
| 3adb333022 | |||
| cc988a303e | |||
| 46349e1a70 | |||
| acff80a234 | |||
| bbe655d879 | |||
| 7cbace9cc9 | |||
| 9372899bfa | |||
| 4d42a74e66 | |||
| 76f7a64cb8 | |||
| 1af8cf8222 | |||
| 11a3b2facd | |||
| bd993d2f84 | |||
| cf9683174d | |||
| f617ca26bb | |||
| 41686fdf6c | |||
| c67a985847 | |||
| 639399925c | |||
| 2ded900188 | |||
| 3ae1803420 | |||
| 17b2d8c773 | |||
| 7025c98e7b | |||
| 6f4d3c4327 | |||
| c2f2d69ba1 | |||
| 42b0312790 |
+11
-12
@@ -1,28 +1,27 @@
|
||||
<!--
|
||||
Feel free to ignore this Issue template if you just want to ask or suggest something. If you experience an Issue then please provide all asked informations.
|
||||
Feel free to ignore this Issue template if you just want to ask or suggest something. If you experience an Issue then please provide all asked information.
|
||||
|
||||
Note: If "Firefox will: Never remember history" in the Firefox Preferences/Options under "Privacy & Security > History" is selected, then Multi-Account Containers will not work, since Containers aren't available in Private Windows.
|
||||
Also please make sure that:
|
||||
- "Firefox will: Never remember history" in the Firefox Preferences/Options under "Privacy & Security > History" is NOT selected
|
||||
- You are NOT using Firefox in a Private Window
|
||||
- You can see a grayed out but ticked Checkbox with the description "Enable Container Tabs" in the Firefox Preferences/Options under "Tabs"
|
||||
-->
|
||||
- Is "Firefox will: Never remember history" in the Firefox Preferences/Options under "Privacy & Security > History" selected? Yes/No:
|
||||
- Are you using Firefox in a Private Window? Yes/No:
|
||||
- Can you see a grayed out but ticked Checkbox with the description "Enable Container Tabs" in the Firefox Preferences/Options under "Tabs"? Yes/No:
|
||||
- Multi-Account Containers Version:
|
||||
- Operating System + Version:
|
||||
- Firefox Version:
|
||||
- Other installed Add-ons + Version + Enabled/Disabled-Status:
|
||||
<!-- To be able to Copy&Paste the full list of your Add-ons navigate to "about:support" and scroll down to "Extensions" -->
|
||||
<!-- To be able to copy & paste the full list of your Add-ons navigate to "about:support" and scroll down to "Extensions" -->
|
||||
|
||||
|
||||
### Actual behavior
|
||||
..
|
||||
|
||||
|
||||
### Expected behavior
|
||||
..
|
||||
|
||||
|
||||
### Steps to reproduce
|
||||
1. ..
|
||||
2. ..
|
||||
3. ..
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
### Notes
|
||||
..
|
||||
+14
-2
@@ -1,3 +1,15 @@
|
||||
# Code Of Conduct
|
||||
# Community Participation Guidelines
|
||||
|
||||
This add-on follows the [Mozilla Community Participation Guidelines](https://www.mozilla.org/en-US/about/governance/policies/participation/) for our code of conduct.
|
||||
This repository is governed by Mozilla's code of conduct and etiquette guidelines.
|
||||
For more details, please read the
|
||||
[Mozilla Community Participation Guidelines](https://www.mozilla.org/about/governance/policies/participation/).
|
||||
|
||||
## How to Report
|
||||
For more information on how to report violations of the Community Participation Guidelines, please read our '[How to Report](https://www.mozilla.org/about/governance/policies/participation/reporting/)' page.
|
||||
|
||||
<!--
|
||||
## Project Specific Etiquette
|
||||
|
||||
In some cases, there will be additional project etiquette i.e.: (https://bugzilla.mozilla.org/page.cgi?id=etiquette.html).
|
||||
Please update for your project.
|
||||
-->
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
"name": "testpilot-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.",
|
||||
"version": "6.1.0",
|
||||
"version": "6.1.1",
|
||||
"author": "Andrea Marchesini, Luke Crouch and Jonathan Kingston",
|
||||
"bugs": {
|
||||
"url": "https://github.com/mozilla/multi-account-containers/issues"
|
||||
|
||||
@@ -47,7 +47,7 @@ html {
|
||||
}
|
||||
|
||||
#redirect-url {
|
||||
background: #efefef;
|
||||
background: #efedf0; /* Grey 20 */
|
||||
border-radius: 2px;
|
||||
line-height: 1.5;
|
||||
padding-block-end: 0.5rem;
|
||||
@@ -56,6 +56,14 @@ html {
|
||||
padding-inline-start: 0.5rem;
|
||||
}
|
||||
|
||||
/* stylelint-disable media-feature-name-no-unknown */
|
||||
@media (prefers-color-scheme: dark) {
|
||||
#redirect-url {
|
||||
background: #38383d; /* Grey 70 */
|
||||
}
|
||||
}
|
||||
/* stylelint-enable */
|
||||
|
||||
#redirect-url img {
|
||||
block-size: 16px;
|
||||
inline-size: 16px;
|
||||
|
||||
+18
-7
@@ -19,8 +19,13 @@ html {
|
||||
|
||||
body {
|
||||
font-family: Roboto, Noto, "San Francisco", Ubuntu, "Segoe UI", "Fira Sans", message-box, Arial, sans-serif;
|
||||
inline-size: 300px;
|
||||
max-inline-size: 300px;
|
||||
inline-size: calc(var(--overflow-size) + 299px);
|
||||
max-inline-size: calc(var(--overflow-size) + 299px);
|
||||
}
|
||||
|
||||
html,
|
||||
body {
|
||||
block-size: 100%; /* Bugfix: issue 948 */
|
||||
}
|
||||
|
||||
:root {
|
||||
@@ -45,8 +50,10 @@ body {
|
||||
--small-text-size: 0.833rem; /* 10px */
|
||||
--small-radius: 3px;
|
||||
--icon-button-size: calc(calc(var(--block-line-separation-size) * 2) + 1.66rem); /* 20px */
|
||||
--column-panel-inline-size: 268px;
|
||||
--column-panel-inline-size: calc(var(--overflow-size) + 267px);
|
||||
--inactive-opacity: 0.3;
|
||||
--overflow-size: 1px;
|
||||
--icon-fit: 8;
|
||||
}
|
||||
|
||||
@media (min-resolution: 1dppx) {
|
||||
@@ -236,7 +243,7 @@ table {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* Panels keep everything togethert */
|
||||
/* Panels keep everything together */
|
||||
.panel {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@@ -577,7 +584,7 @@ span ~ .panel-header-text {
|
||||
}
|
||||
|
||||
.edit-containers-panel .userContext-wrapper {
|
||||
max-inline-size: 204px;
|
||||
max-inline-size: calc(var(--overflow-size) + 203px);
|
||||
}
|
||||
|
||||
.disable-edit-containers {
|
||||
@@ -783,8 +790,12 @@ span ~ .panel-header-text {
|
||||
padding-inline-start: 16px;
|
||||
}
|
||||
|
||||
.edit-container-panel .columns {
|
||||
overflow: hidden; /* Bugfix: issue 948 */
|
||||
}
|
||||
|
||||
#edit-sites-assigned {
|
||||
flex: 1;
|
||||
flex: 1000; /* Bugfix: issue 948 */
|
||||
}
|
||||
|
||||
#edit-sites-assigned h3 {
|
||||
@@ -822,7 +833,7 @@ span ~ .panel-header-text {
|
||||
align-items: center;
|
||||
block-size: 29px;
|
||||
display: flex;
|
||||
flex: 0 0 calc(100% / 8);
|
||||
flex: 0 0 calc(100% / var(--icon-fit));
|
||||
}
|
||||
|
||||
.radio-choice > .radio-container > label {
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="context-fill #bebebe" fill-opacity="context-fill-opacity" d="M12.9137931,3.0862069 L12.9137931,1.27586207 C12.9137931,0.84736528 12.5664278,0.5 12.137931,0.5 C11.7094342,0.5 11.362069,0.84736528 11.362069,1.27586207 L11.362069,1.27586207 L11.362069,3.0862069 L9.55172414,3.0862069 C9.12322735,3.0862069 8.77586207,3.43357218 8.77586207,3.86206897 C8.77586207,4.29056575 9.12322735,4.63793103 9.55172414,4.63793103 L11.362069,4.63793103 L11.362069,6.44827586 C11.362069,6.87677265 11.7094342,7.22413793 12.137931,7.22413793 L12.137931,7.22413793 C12.5664278,7.22413793 12.9137931,6.87677265 12.9137931,6.44827586 L12.9137931,6.44827586 L12.9137931,4.63793103 L14.7241379,4.63793103 C15.1526347,4.63793103 15.5,4.29056575 15.5,3.86206897 L15.5,3.86206897 C15.5,3.43357218 15.1526347,3.0862069 14.7241379,3.0862069 L14.7241379,3.0862069 L12.9137931,3.0862069 Z M0.5,9.76803178 C0.5,9.22007158 0.94118947,8.77586207 1.49216971,8.77586207 L6.23196822,8.77586207 C6.77992842,8.77586207 7.22413793,9.21705154 7.22413793,9.76803178 L7.22413793,14.5078303 C7.22413793,15.0557905 6.78294846,15.5 6.23196822,15.5 L1.49216971,15.5 C0.94420951,15.5 0.5,15.0588105 0.5,14.5078303 L0.5,9.76803178 Z M8.77586207,9.76803178 C8.77586207,9.22007158 9.21705154,8.77586207 9.76803178,8.77586207 L14.5078303,8.77586207 C15.0557905,8.77586207 15.5,9.21705154 15.5,9.76803178 L15.5,14.5078303 C15.5,15.0557905 15.0588105,15.5 14.5078303,15.5 L9.76803178,15.5 C9.22007158,15.5 8.77586207,15.0588105 8.77586207,14.5078303 L8.77586207,9.76803178 Z M0.5,1.49216971 C0.5,0.94420951 0.94118947,0.5 1.49216971,0.5 L6.23196822,0.5 C6.77992842,0.5 7.22413793,0.94118947 7.22413793,1.49216971 L7.22413793,6.23196822 C7.22413793,6.77992842 6.78294846,7.22413793 6.23196822,7.22413793 L1.49216971,7.22413793 C0.94420951,7.22413793 0.5,6.78294846 0.5,6.23196822 L0.5,1.49216971 Z"></path>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
@@ -12,7 +12,11 @@ const assignManager = {
|
||||
getSiteStoreKey(pageUrl) {
|
||||
const url = new window.URL(pageUrl);
|
||||
const storagePrefix = "siteContainerMap@@_";
|
||||
return `${storagePrefix}${url.hostname}`;
|
||||
if (url.port === "80" || url.port === "443") {
|
||||
return `${storagePrefix}${url.hostname}`;
|
||||
} else {
|
||||
return `${storagePrefix}${url.hostname}${url.port}`;
|
||||
}
|
||||
},
|
||||
|
||||
setExempted(pageUrl, tabId) {
|
||||
|
||||
@@ -218,7 +218,7 @@ const backgroundLogic = {
|
||||
async queryIdentitiesState(windowId) {
|
||||
const identities = await browser.contextualIdentities.query({});
|
||||
const identitiesOutput = {};
|
||||
const identitiesPromise = identities.map(async function (identity) {
|
||||
const identitiesPromise = identities.map(async (identity) => {
|
||||
const { cookieStoreId } = identity;
|
||||
const containerState = await identityState.storageArea.get(cookieStoreId);
|
||||
const openTabs = await browser.tabs.query({
|
||||
|
||||
+12
-5
@@ -20,14 +20,21 @@ async function load() {
|
||||
|
||||
document.getElementById("redirect-form").addEventListener("submit", (e) => {
|
||||
e.preventDefault();
|
||||
const buttonTarget = e.explicitOriginalTarget;
|
||||
switch (buttonTarget.id) {
|
||||
case "confirm":
|
||||
confirmSubmit(redirectUrl, cookieStoreId);
|
||||
break;
|
||||
let button = "confirm"; // Confirm is the form default.
|
||||
let buttonTarget = e.explicitOriginalTarget;
|
||||
if (buttonTarget.tagName !== "BUTTON") {
|
||||
buttonTarget = buttonTarget.closest("button");
|
||||
}
|
||||
if (buttonTarget && buttonTarget.id) {
|
||||
button = buttonTarget.id;
|
||||
}
|
||||
switch (button) {
|
||||
case "deny":
|
||||
denySubmit(redirectUrl);
|
||||
break;
|
||||
case "confirm":
|
||||
confirmSubmit(redirectUrl, cookieStoreId);
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
+28
-16
@@ -395,7 +395,7 @@ Logic.registerPanel(P_ONBOARDING_1, {
|
||||
initialize() {
|
||||
// Let's move to the next panel.
|
||||
[...document.querySelectorAll(".onboarding-start-button")].forEach(startElement => {
|
||||
Logic.addEnterHandler(startElement, async function () {
|
||||
Logic.addEnterHandler(startElement, async () => {
|
||||
await Logic.setOnboardingStage(1);
|
||||
Logic.showPanel(P_ONBOARDING_2);
|
||||
});
|
||||
@@ -419,7 +419,7 @@ Logic.registerPanel(P_ONBOARDING_2, {
|
||||
initialize() {
|
||||
// Let's move to the containers list panel.
|
||||
[...document.querySelectorAll(".onboarding-next-button")].forEach(nextElement => {
|
||||
Logic.addEnterHandler(nextElement, async function () {
|
||||
Logic.addEnterHandler(nextElement, async () => {
|
||||
await Logic.setOnboardingStage(2);
|
||||
Logic.showPanel(P_ONBOARDING_3);
|
||||
});
|
||||
@@ -443,7 +443,7 @@ Logic.registerPanel(P_ONBOARDING_3, {
|
||||
initialize() {
|
||||
// Let's move to the containers list panel.
|
||||
[...document.querySelectorAll(".onboarding-almost-done-button")].forEach(almostElement => {
|
||||
Logic.addEnterHandler(almostElement, async function () {
|
||||
Logic.addEnterHandler(almostElement, async () => {
|
||||
await Logic.setOnboardingStage(3);
|
||||
Logic.showPanel(P_ONBOARDING_4);
|
||||
});
|
||||
@@ -465,7 +465,7 @@ Logic.registerPanel(P_ONBOARDING_4, {
|
||||
// This method is called when the object is registered.
|
||||
initialize() {
|
||||
// Let's move to the containers list panel.
|
||||
Logic.addEnterHandler(document.querySelector("#onboarding-done-button"), async function () {
|
||||
Logic.addEnterHandler(document.querySelector("#onboarding-done-button"), async () => {
|
||||
await Logic.setOnboardingStage(4);
|
||||
Logic.showPanel(P_ONBOARDING_5);
|
||||
});
|
||||
@@ -486,7 +486,7 @@ Logic.registerPanel(P_ONBOARDING_5, {
|
||||
// This method is called when the object is registered.
|
||||
initialize() {
|
||||
// Let's move to the containers list panel.
|
||||
Logic.addEnterHandler(document.querySelector("#onboarding-longpress-button"), async function () {
|
||||
Logic.addEnterHandler(document.querySelector("#onboarding-longpress-button"), async () => {
|
||||
await Logic.setOnboardingStage(5);
|
||||
Logic.showPanel(P_CONTAINERS_LIST);
|
||||
});
|
||||
@@ -516,7 +516,7 @@ Logic.registerPanel(P_CONTAINERS_LIST, {
|
||||
}
|
||||
});
|
||||
|
||||
Logic.addEnterHandler(document.querySelector("#sort-containers-link"), async function () {
|
||||
Logic.addEnterHandler(document.querySelector("#sort-containers-link"), async () => {
|
||||
try {
|
||||
await browser.runtime.sendMessage({
|
||||
method: "sortTabs"
|
||||
@@ -659,7 +659,7 @@ Logic.registerPanel(P_CONTAINERS_LIST, {
|
||||
tr.appendChild(manage);
|
||||
}
|
||||
|
||||
Logic.addEnterHandler(tr, async function (e) {
|
||||
Logic.addEnterHandler(tr, async (e) => {
|
||||
if (e.target.matches(".open-newtab")
|
||||
|| e.target.parentNode.matches(".open-newtab")
|
||||
|| e.type === "keydown") {
|
||||
@@ -717,7 +717,7 @@ Logic.registerPanel(P_CONTAINER_INFO, {
|
||||
Logic.showPreviousPanel();
|
||||
});
|
||||
|
||||
Logic.addEnterHandler(document.querySelector("#container-info-hideorshow"), async function () {
|
||||
Logic.addEnterHandler(document.querySelector("#container-info-hideorshow"), async () => {
|
||||
const identity = Logic.currentIdentity();
|
||||
try {
|
||||
browser.runtime.sendMessage({
|
||||
@@ -749,7 +749,7 @@ Logic.registerPanel(P_CONTAINER_INFO, {
|
||||
Logic._disableMoveTabs("Cannot move a tab from a single-tab window.");
|
||||
return;
|
||||
}
|
||||
Logic.addEnterHandler(moveTabsEl, async function () {
|
||||
Logic.addEnterHandler(moveTabsEl, async () => {
|
||||
await browser.runtime.sendMessage({
|
||||
method: "moveTabsToWindow",
|
||||
windowId: browser.windows.WINDOW_ID_CURRENT,
|
||||
@@ -829,14 +829,14 @@ Logic.registerPanel(P_CONTAINER_INFO, {
|
||||
tr.addEventListener("mouseout", tabTitleHoverEvent);
|
||||
|
||||
tr.classList.add("clickable");
|
||||
Logic.addEnterHandler(tr, async function () {
|
||||
Logic.addEnterHandler(tr, async () => {
|
||||
await browser.tabs.update(tab.id, {active: true});
|
||||
window.close();
|
||||
});
|
||||
|
||||
const closeTab = document.getElementById(tab.id);
|
||||
if (closeTab) {
|
||||
Logic.addEnterHandler(closeTab, async function(e) {
|
||||
Logic.addEnterHandler(closeTab, async (e) => {
|
||||
await browser.tabs.remove(Number(e.target.id));
|
||||
window.close();
|
||||
});
|
||||
@@ -985,9 +985,9 @@ Logic.registerPanel(P_CONTAINER_EDIT, {
|
||||
const trElement = document.createElement("div");
|
||||
/* As we don't have the full or correct path the best we can assume is the path is HTTPS and then replace with a broken icon later if it doesn't load.
|
||||
This is pending a better solution for favicons from web extensions */
|
||||
const assumedUrl = `https://${site.hostname}`;
|
||||
const assumedUrl = `https://${site.hostname}/favicon.ico`;
|
||||
trElement.innerHTML = escaped`
|
||||
<img class="icon" src="${assumedUrl}/favicon.ico">
|
||||
<div class="favicon"></div>
|
||||
<div title="${site.hostname}" class="truncate-text hostname">
|
||||
${site.hostname}
|
||||
</div>
|
||||
@@ -995,9 +995,10 @@ Logic.registerPanel(P_CONTAINER_EDIT, {
|
||||
class="pop-button-image delete-assignment"
|
||||
src="/img/container-delete.svg"
|
||||
/>`;
|
||||
trElement.getElementsByClassName("favicon")[0].appendChild(Utils.createFavIconElement(assumedUrl));
|
||||
const deleteButton = trElement.querySelector(".delete-assignment");
|
||||
const that = this;
|
||||
Logic.addEnterHandler(deleteButton, async function () {
|
||||
Logic.addEnterHandler(deleteButton, async () => {
|
||||
const userContextId = Logic.currentUserContextId();
|
||||
// Lets show the message to the current tab
|
||||
// TODO remove then when firefox supports arrow fn async
|
||||
@@ -1082,7 +1083,7 @@ Logic.registerPanel(P_CONTAINER_DELETE, {
|
||||
Logic.showPreviousPanel();
|
||||
});
|
||||
|
||||
Logic.addEnterHandler(document.querySelector("#delete-container-ok-link"), async function () {
|
||||
Logic.addEnterHandler(document.querySelector("#delete-container-ok-link"), async () => {
|
||||
/* This promise wont resolve if the last tab was removed from the window.
|
||||
as the message async callback stops listening, this isn't an issue for us however it might be in future
|
||||
if you want to do anything post delete do it in the background script.
|
||||
@@ -1130,7 +1131,7 @@ Logic.registerPanel(P_CONTAINERS_ACHIEVEMENT, {
|
||||
// This method is called when the object is registered.
|
||||
initialize() {
|
||||
// Set done and move to the containers list panel.
|
||||
Logic.addEnterHandler(document.querySelector("#achievement-done-button"), async function () {
|
||||
Logic.addEnterHandler(document.querySelector("#achievement-done-button"), async () => {
|
||||
await Logic.setAchievementDone("manyContainersOpened");
|
||||
Logic.showPanel(P_CONTAINERS_LIST);
|
||||
});
|
||||
@@ -1143,3 +1144,14 @@ Logic.registerPanel(P_CONTAINERS_ACHIEVEMENT, {
|
||||
});
|
||||
|
||||
Logic.init();
|
||||
|
||||
window.addEventListener("resize", function () {
|
||||
//for overflow menu
|
||||
const difference = window.innerWidth - document.body.offsetWidth;
|
||||
if (difference > 2) {
|
||||
//if popup is in the overflow menu, window will be larger than 300px
|
||||
const root = document.documentElement;
|
||||
root.style.setProperty("--overflow-size", difference + "px");
|
||||
root.style.setProperty("--icon-fit", "12");
|
||||
}
|
||||
});
|
||||
+7
-2
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"manifest_version": 2,
|
||||
"name": "Firefox Multi-Account Containers",
|
||||
"version": "6.1.0",
|
||||
"version": "6.1.1",
|
||||
|
||||
"description": "Multi-Account 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.",
|
||||
"icons": {
|
||||
@@ -47,7 +47,12 @@
|
||||
"browser_style": true,
|
||||
"default_icon": "img/container-site.svg",
|
||||
"default_title": "Multi-Account Containers",
|
||||
"default_popup": "popup.html"
|
||||
"default_popup": "popup.html",
|
||||
"theme_icons": [{
|
||||
"light": "img/container-site-light.svg",
|
||||
"dark": "img/container-site.svg",
|
||||
"size": 32
|
||||
}]
|
||||
},
|
||||
|
||||
"background": {
|
||||
|
||||
Reference in New Issue
Block a user