Compare commits

...

32 Commits

Author SHA1 Message Date
luke crouch 50f5ebfcff Merge pull request #2099 from mozilla/version-bump
Update version number to 7.4.0
2021-08-09 09:37:23 -05:00
Maxx Crawford 0b760ce465 Update version number to 7.4.0 2021-08-09 09:32:45 -05:00
luke crouch bedebb7c0e Merge pull request #1620 from Gitoffthelawn/patch-1
Improve accessibility by adjusting AMO links
2021-07-28 14:18:17 -05:00
Maxx Crawford 9447792e53 Merge pull request #1683 from CSCD01/issue-1231
Fixes #1231 confirmation page alignment
2021-07-28 10:22:01 -05:00
luke crouch 8512794b43 Merge pull request #2079 from rpl/fix/add-unlimitedStorage-permission
fix: Add unlimitedStorage permission to make sure storage.local does not hit quota limits or IndexedDB QuotaManager data eviction
2021-07-26 09:22:57 -05:00
luke crouch 081ea0bedb Merge pull request #2052 from cammarin/runtime-geturl
Replace deprecated method `browser.extension.getURL()`
2021-07-26 09:09:17 -05:00
Maxx Crawford d2c00a10cf Merge pull request #2026 from ncallaway/always-open-in-title
Rename 'always open in' title
2021-07-26 08:39:44 -05:00
Luca Greco 56b85a8cdd fix: Add unlimitedStorage permission to make sure storage.local doesn't hit quota limits or IndexedDB QuotaManager data eviction 2021-07-14 20:25:04 +02:00
Carlos Marin 4e4ed390e0 Replace deprecated method
Close #2047
2021-05-18 14:36:29 -03:00
Noah Callaway 86edd8c8a2 Rename 'always open in' title 2021-04-23 00:10:37 -07:00
Maxx Crawford 4b56a2f0bb Merge pull request #1930 from schra/fix/development-instructions
Fix development instructions in README
2021-03-09 13:59:01 -06:00
luke crouch 66be5e288d Merge pull request #1950 from mozilla/version-bump
Bump version from 7.2.0 to 7.3.0
2021-01-22 09:37:27 -06:00
Maxx Crawford 7ebed4521d Bump version from 7.2.0 to 7.3.0 2021-01-22 09:30:17 -06:00
luke crouch 68b1b2fe37 Merge pull request #1608 from sryze/container-reordering
Implement container reordering
2021-01-22 09:14:52 -06:00
Sergey Zolotarev 89719f7243 Implement container reordering 2021-01-21 23:59:31 +06:00
André Schröder 4d76c937fe fix typos 2021-01-11 20:11:06 +01:00
André Schröder 649110ed45 fix concerns 2021-01-11 20:09:11 +01:00
luke crouch f4bcd30434 Merge pull request #1947 from mozilla/1946-minor-release-bump
Fix #1946 - Update package.json/manifest to 7.2.0
2021-01-11 11:24:11 -06:00
Maxx Crawford c2ff3f00f2 Fix #1946 - Update package.json/manifest to 7.2.0 2021-01-11 10:16:53 -06:00
Maxx Crawford 6494b98157 Merge pull request #1945 from mozilla/update-web-ext
update web-ext to 5.4.1
2021-01-11 10:13:36 -06:00
luke crouch c371cd11d0 update web-ext to 5.4.1 2021-01-11 09:33:08 -06:00
luke crouch 1b22753811 Merge pull request #1751 from JakeWharton/patch-1
Remove automatic capitalization of container name
2021-01-11 09:22:07 -06:00
Maxx Crawford e7af96b625 Merge pull request #1944 from dannycolin/dark-mode
Add a dark mode to MAC
2021-01-11 09:16:05 -06:00
Danny Colin 0c04b83207 fix css indentations 2021-01-10 19:02:42 -05:00
Danny Colin 6b73cee79e fix gradient colors in open tabs list 2021-01-10 18:59:16 -05:00
Danny Colin d7688cb1f5 fix stylelint errors 2021-01-08 13:19:18 -05:00
Danny Colin c03df9d246 add a dark theme 2021-01-08 13:11:02 -05:00
Andre Schröder a1d01f8ff2 Fix development instructions in README
web-ext will not work when following the instructions without having
this diff applied:

```
$ ./node_modules/web-ext/bin/web-ext run -s src/
(node:41062) Warning: Accessing non-existent property 'cat' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
(node:41062) Warning: Accessing non-existent property 'cd' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'chmod' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'cp' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'dirs' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'pushd' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'popd' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'echo' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'tempdir' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'pwd' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'exec' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'ls' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'find' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'grep' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'head' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'ln' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'mkdir' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'rm' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'mv' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'sed' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'set' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'sort' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'tail' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'test' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'to' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'toEnd' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'touch' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'uniq' of module exports inside circular dependency
(node:41062) Warning: Accessing non-existent property 'which' of module exports inside circular dependency
Applying config file: ./package.json
Running web extension from /home/andre/Git/multi-account-containers/src
Use --verbose or open Tools > Web Developer > Browser Console to see logging

WebExtError: Temporary add-on installation is not supported in this version of Firefox (you need Firefox 49 or higher). For older Firefox versions, use --pre-install
    at FirefoxDesktopExtensionRunner._callee6$ (/home/andre/Git/multi-account-containers/node_modules/web-ext/dist/webpack:/src/extension-runners/firefox-desktop.js:273:19)
    at tryCatch (/home/andre/Git/multi-account-containers/node_modules/web-ext/node_modules/regenerator-runtime/runtime.js:62:40)
    at Generator.invoke [as _invoke] (/home/andre/Git/multi-account-containers/node_modules/web-ext/node_modules/regenerator-runtime/runtime.js:296:22)
    at Generator.prototype.<computed> [as throw] (/home/andre/Git/multi-account-containers/node_modules/web-ext/node_modules/regenerator-runtime/runtime.js:114:21)
    at step (/home/andre/Git/multi-account-containers/node_modules/web-ext/dist/webpack:/node_modules/babel-runtime/helpers/asyncToGenerator.js:17:1)
    at /home/andre/Git/multi-account-containers/node_modules/web-ext/dist/webpack:/node_modules/babel-runtime/helpers/asyncToGenerator.js:30:1
    at processTicksAndRejections (node:internal/process/task_queues:93:5)
```

web-ext will work when following the instructions with having this diff
applied:

```
$ web-ext run -s src/
Applying config file: ./package.json
Running web extension from /home/andre/Git/multi-account-containers/src
Use --verbose or open Tools > Web Developer > Browser Console to see logging
Installed /home/andre/Git/multi-account-containers/src as a temporary add-on
The extension will reload if any source file changes
Press R to reload (and Ctrl-C to quit)
```

I copied the wording from
https://github.com/mdn/webextensions-examples/blob/2184fee75afcde39328384b36adf9e52c5917949/README.md

I guess the underlying problem is that the web-ext version specified in
the package.json is very outdated. By installing the web-ext tool via
the provided instructions it fixes the problem.

Furthermore, the `webextensions-examples` repo doesn't specify web-ext
in their package.json which means that installing web-ext via the
provided instructions seems to be the preferred way. (So maybe web-ext
should be removed from the package.json entirely?)

Fixes #1926
2020-12-23 04:13:16 +01:00
Jake Wharton 9c80781e3f Remove automatic capitalization of container name
The name is not capitalized in the address bar or the list of names in the extension popup.
2020-05-27 14:36:18 -04:00
Khansa Kiasatina 2ed9eaee8a fix lint 2020-03-13 17:25:09 -04:00
Khansa Kiasatina c03c3c118c fix alignment 2020-03-08 17:02:58 -04:00
Gitoffthelawn 4bd412aa9b Improve accessibility by adjusting AMO links
Let's open this to everyone and not assume any specific language or country.
AMO will automatically redirect to user's language and country.
2020-01-23 02:02:12 -08:00
10 changed files with 262 additions and 37 deletions
+35 -9
View File
@@ -2,7 +2,7 @@
The Firefox Multi-Account Containers extension lets you carve out a separate box for each of your online lives no more opening a different browser just to check your work email! [Learn More Here](https://blog.mozilla.org/firefox/introducing-firefox-multi-account-containers/) The Firefox Multi-Account Containers extension lets you carve out a separate box for each of your online lives no more opening a different browser just to check your work email! [Learn More Here](https://blog.mozilla.org/firefox/introducing-firefox-multi-account-containers/)
[Available on addons.mozilla.org](https://addons.mozilla.org/en-GB/firefox/addon/multi-account-containers/) [Available on addons.mozilla.org](https://addons.mozilla.org/firefox/addon/multi-account-containers/)
For more info, see: For more info, see:
@@ -18,17 +18,43 @@ For more info, see:
## Development ## Development
1. `npm install` ### Running Locally
2. `./node_modules/web-ext/bin/web-ext run -s src/`
#### Via WebExtensions API (web-ext)
1. Install the [web-ext](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Getting_started_with_web-ext) tool.
2. Run `web-ext run -s src/`. This launches Firefox and installs the extension automatically.
This tool provides some additional development features, such as [automatic reloading](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Getting_started_with_web-ext#Automatic_extension_reloading).
#### Via about:debugging in Firefox
1. Open the `about:debugging` page in Firefox.
2. Click on `This Firefox`.
3. Click on [Load Temporary Add-on](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Temporary_Installation_in_Firefox).
4. Select `src/manifest.json`.
Here is a [video](https://www.youtube.com/watch?v=cer9EUKegG4) that demonstrates how to do this.
### Testing ### Testing
`npm run test`
or * Install dependencies:
`npm run lint` ```
npm install
```
for just the linter * Run all tests:
```
npm run test
```
* Only run the linter:
```
npm run lint
```
There is a timeout test that sometimes fails on certain machines, so make sure to run the tests on your clone before you make any changes to see if you have this problem. There is a timeout test that sometimes fails on certain machines, so make sure to run the tests on your clone before you make any changes to see if you have this problem.
@@ -43,12 +69,12 @@ There is a timeout test that sometimes fails on certain machines, so make sure t
#### Publish to AMO #### Publish to AMO
1. `npm run-script build` 1. `npm run-script build`
2. [Upload the `.zip` to AMO](https://addons.mozilla.org/en-US/developers/addon/multi-account-containers/versions/submit/) 2. [Upload the `.zip` to AMO](https://addons.mozilla.org/developers/addon/multi-account-containers/versions/submit/)
#### Publish to GitHub #### Publish to GitHub
Finally, we also publish the release to GitHub for those followers. Finally, we also publish the release to GitHub for those followers.
1. Download the signed `.xpi` from [the addon versions page](https://addons.mozilla.org/en-US/developers/addon/multi-account-containers/versions) 1. Download the signed `.xpi` from [the addon versions page](https://addons.mozilla.org/developers/addon/multi-account-containers/versions)
2. [Make the new release on 2. [Make the new release on
GitHub](https://github.com/mozilla/multi-account-containers/releases/new) GitHub](https://github.com/mozilla/multi-account-containers/releases/new)
* Use the version number for "Tag version" and "Release title" * Use the version number for "Tag version" and "Release title"
+3 -3
View File
@@ -2,7 +2,7 @@
"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": "7.1.0", "version": "7.4.0",
"author": "Andrea Marchesini, Luke Crouch and Jonathan Kingston", "author": "Andrea Marchesini, Luke Crouch and Jonathan Kingston",
"bugs": { "bugs": {
"url": "https://github.com/mozilla/multi-account-containers/issues" "url": "https://github.com/mozilla/multi-account-containers/issues"
@@ -22,10 +22,10 @@
"nyc": "^15.0.0", "nyc": "^15.0.0",
"sinon": "^7.5.0", "sinon": "^7.5.0",
"sinon-chai": "^3.3.0", "sinon-chai": "^3.3.0",
"stylelint-order": "^4.0.0",
"stylelint": "^13.5.0", "stylelint": "^13.5.0",
"stylelint-config-standard": "^20.0.0", "stylelint-config-standard": "^20.0.0",
"web-ext": "^2.9.3", "stylelint-order": "^4.0.0",
"web-ext": "^5.4.1",
"webextensions-jsdom": "^1.2.1" "webextensions-jsdom": "^1.2.1"
}, },
"homepage": "https://github.com/mozilla/multi-account-containers#readme", "homepage": "https://github.com/mozilla/multi-account-containers#readme",
+6 -2
View File
@@ -18,7 +18,6 @@ main {
button .container-name, button .container-name,
#current-container-name { #current-container-name {
font-weight: bold; font-weight: bold;
text-transform: capitalize;
} }
@media only screen and (max-width: 1300px) { @media only screen and (max-width: 1300px) {
@@ -28,7 +27,7 @@ button .container-name,
/* for a mid sized window we have enough for this but not our image */ /* for a mid sized window we have enough for this but not our image */
.title { .title {
background-image: url("chrome://global/skin/icons/info.svg"); background-image: url('chrome://global/skin/icons/info.svg');
} }
} }
@@ -77,6 +76,11 @@ dfn {
font-style: normal; font-style: normal;
} }
#deny,
#confirm {
flex-grow: 1;
}
.button-container > button { .button-container > button {
min-inline-size: 240px; min-inline-size: 240px;
} }
+116
View File
@@ -691,6 +691,10 @@ h3.title {
max-inline-size: 300px; max-inline-size: 300px;
} }
.menu-item.drag-over td {
border-block-start: 2px solid var(--text-normal-color);
}
.disabled-menu-item { .disabled-menu-item {
color: grey; color: grey;
cursor: default; cursor: default;
@@ -931,3 +935,115 @@ tr > td > .trash-button {
tr:hover > td > .trash-button { tr:hover > td > .trash-button {
display: block; display: block;
} }
.move-button {
cursor: move;
display: inline-block;
height: 100%;
inline-size: 16px;
margin-block-end: 4px;
margin-block-start: 4px;
margin-inline-end: 10px;
margin-inline-start: auto;
text-align: center;
}
.move-button > img {
height: 16px;
}
@media (prefers-color-scheme: dark) {
:root {
--title-text-color: #fff;
--text-normal-color: #f9f9fa;
--text-heading-color: #fff;
}
html {
background-color: #4a4a4a;
}
body {
color: #fff;
--hr-grey: #38383d;
--text-grey: #f9f9fa;
}
h3.title {
color: #fff;
}
.bottom-btn {
background-color: #737373;
border: solid 1px #737373;
}
.btn-return.arrow-left {
background-color: transparent;
}
.onboarding-title,
.delete-container-confirm-title {
color: #ededf0;
}
input {
border: solid 1px #737373;
}
#edit-container-panel-name-input {
background-color: #38383d;
color: #fff;
}
.delete-container {
background-color: #4a4a4a;
}
.delete-btn {
background-color: #737373;
color: #f9f9fa;
}
.cancel-button,
.grey-button {
background-color: #737373;
color: #fff;
}
.button.secondary:hover,
.button.secondary:focus {
background-color: #676767;
}
.panel-footer {
border-block-end: solid 1px #4a4a4a;
}
img.menu-icon,
.menu-icon > img,
.menu-arrow > img,
.info-icon > img,
.btn-return.arrow-left {
filter: invert(1);
}
#edit-sites-assigned .menu-icon,
#container-info-table .menu-icon {
filter: invert(0);
}
.truncate-text::after {
background: #4a4a4a;
mask-image: linear-gradient(to right, transparent, #4a4a4a 70%);
}
[data-identity-color="grey"] {
--identity-icon-color: #ededf0;
}
[type="radio"]:checked + [data-identity-color="grey"] {
--identity-icon-color: #616161;
}
}
+13
View File
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><script xmlns=""/>
<defs/>
<g id="All" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="hamburger-menu" fill="#858585">
<g id="Group" transform="translate(2.000000, 6.000000)">
<rect id="Rectangle-path" x="0" y="0" width="26" height="2"/>
<rect id="Rectangle-path" x="0" y="8" width="26" height="2"/>
<rect id="Rectangle-path" x="0" y="16" width="26" height="2"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 706 B

+1 -1
View File
@@ -698,7 +698,7 @@ window.assignManager = {
reloadPageInContainer(url, currentUserContextId, userContextId, index, active, neverAsk = false, openerTabId = null) { reloadPageInContainer(url, currentUserContextId, userContextId, index, active, neverAsk = false, openerTabId = null) {
const cookieStoreId = backgroundLogic.cookieStoreId(userContextId); const cookieStoreId = backgroundLogic.cookieStoreId(userContextId);
const loadPage = browser.extension.getURL("confirm-page.html"); const loadPage = browser.runtime.getURL("confirm-page.html");
// False represents assignment is not permitted // False represents assignment is not permitted
// If the user has explicitly checked "Never Ask Again" on the warning page we will send them straight there // If the user has explicitly checked "Never Ask Again" on the warning page we will send them straight there
if (neverAsk) { if (neverAsk) {
+1 -1
View File
@@ -22,7 +22,7 @@ const backgroundLogic = {
}, },
async getExtensionInfo() { async getExtensionInfo() {
const manifestPath = browser.extension.getURL("manifest.json"); const manifestPath = browser.runtime.getURL("manifest.json");
const response = await fetch(manifestPath); const response = await fetch(manifestPath);
const extensionInfo = await response.json(); const extensionInfo = await response.json();
return extensionInfo; return extensionInfo;
+1 -1
View File
@@ -24,7 +24,7 @@ async function addMessage(message) {
divElement.innerText = message.text; divElement.innerText = message.text;
const imageElement = document.createElement("img"); const imageElement = document.createElement("img");
const imagePath = browser.extension.getURL("/img/container-site-d-24.png"); const imagePath = browser.runtime.getURL("/img/container-site-d-24.png");
const response = await fetch(imagePath); const response = await fetch(imagePath);
const blob = await response.blob(); const blob = await response.blob();
const objectUrl = URL.createObjectURL(blob); const objectUrl = URL.createObjectURL(blob);
+84 -19
View File
@@ -10,6 +10,8 @@ const DEFAULT_ICON = "circle";
const NEW_CONTAINER_ID = "new"; const NEW_CONTAINER_ID = "new";
const ONBOARDING_STORAGE_KEY = "onboarding-stage"; const ONBOARDING_STORAGE_KEY = "onboarding-stage";
const CONTAINER_ORDER_STORAGE_KEY = "container-order";
const CONTAINER_DRAG_DATA_TYPE = "firefox-container";
// List of panels // List of panels
const P_ONBOARDING_1 = "onboarding1"; const P_ONBOARDING_1 = "onboarding1";
@@ -39,7 +41,7 @@ function addRemoveSiteIsolation() {
} }
async function getExtensionInfo() { async function getExtensionInfo() {
const manifestPath = browser.extension.getURL("manifest.json"); const manifestPath = browser.runtime.getURL("manifest.json");
const response = await fetch(manifestPath); const response = await fetch(manifestPath);
const extensionInfo = await response.json(); const extensionInfo = await response.json();
return extensionInfo; return extensionInfo;
@@ -192,16 +194,29 @@ const Logic = {
elementToEnable.classList.remove("disabled-menu-item"); elementToEnable.classList.remove("disabled-menu-item");
}, },
async saveContainerOrder(rows) {
const containerOrder = {};
rows.forEach((node, index) => {
return containerOrder[node.dataset.containerId] = index;
});
await browser.storage.local.set({
[CONTAINER_ORDER_STORAGE_KEY]: containerOrder
});
},
async refreshIdentities() { async refreshIdentities() {
const [identities, state] = await Promise.all([ const [identities, state, containerOrderStorage] = await Promise.all([
browser.contextualIdentities.query({}), browser.contextualIdentities.query({}),
browser.runtime.sendMessage({ browser.runtime.sendMessage({
method: "queryIdentitiesState", method: "queryIdentitiesState",
message: { message: {
windowId: browser.windows.WINDOW_ID_CURRENT windowId: browser.windows.WINDOW_ID_CURRENT
} }
}) }),
browser.storage.local.get([CONTAINER_ORDER_STORAGE_KEY])
]); ]);
const containerOrder =
containerOrderStorage && containerOrderStorage[CONTAINER_ORDER_STORAGE_KEY];
this._identities = identities.map((identity) => { this._identities = identities.map((identity) => {
const stateObject = state[identity.cookieStoreId]; const stateObject = state[identity.cookieStoreId];
if (stateObject) { if (stateObject) {
@@ -211,8 +226,11 @@ const Logic = {
identity.numberOfOpenTabs = stateObject.numberOfOpenTabs; identity.numberOfOpenTabs = stateObject.numberOfOpenTabs;
identity.isIsolated = stateObject.isIsolated; identity.isIsolated = stateObject.isIsolated;
} }
if (containerOrder) {
identity.order = containerOrder[identity.cookieStoreId];
}
return identity; return identity;
}); }).sort((i1, i2) => i1.order - i2.order);
}, },
getPanelSelector(panel) { getPanelSelector(panel) {
@@ -785,8 +803,8 @@ Logic.registerPanel(P_CONTAINER_INFO, {
}); });
// Populating the panel: name and icon // Populating the panel: name and icon
document.getElementById("container-info-title").textContent = identity.name; document.getElementById("container-info-title").textContent = identity.name;
const alwaysOpen = document.querySelector("#always-open-in-info-panel"); const alwaysOpen = document.querySelector("#always-open-in-info-panel");
Utils.addEnterHandler(alwaysOpen, async () => { Utils.addEnterHandler(alwaysOpen, async () => {
Utils.alwaysOpenInContainer(identity); Utils.alwaysOpenInContainer(identity);
window.close(); window.close();
@@ -923,7 +941,7 @@ Logic.registerPanel(OPEN_NEW_CONTAINER_PICKER, {
tr.setAttribute("tabindex", "0"); tr.setAttribute("tabindex", "0");
const td = document.createElement("td"); const td = document.createElement("td");
td.innerHTML = Utils.escaped` td.innerHTML = Utils.escaped`
<div class="menu-icon"> <div class="menu-icon">
<div class="usercontext-icon" <div class="usercontext-icon"
data-identity-icon="${identity.icon}" data-identity-icon="${identity.icon}"
@@ -999,19 +1017,66 @@ Logic.registerPanel(MANAGE_CONTAINERS_PICKER, {
tr.setAttribute("tabindex", "0"); tr.setAttribute("tabindex", "0");
const td = document.createElement("td"); const td = document.createElement("td");
td.innerHTML = Utils.escaped` td.innerHTML = Utils.escaped`
<div class="menu-icon hover-highlight"> <div class="menu-icon hover-highlight">
<div class="usercontext-icon" <div class="usercontext-icon"
data-identity-icon="${identity.icon}" data-identity-icon="${identity.icon}"
data-identity-color="${identity.color}"> data-identity-color="${identity.color}">
</div> </div>
</div> </div>
<span class="menu-text">${identity.name}</span>`; <span class="menu-text">${identity.name}</span>
<span class="move-button">
<img
class="pop-button-image"
src="/img/container-move.svg"
/>
</span>`;
fragment.appendChild(tr); fragment.appendChild(tr);
tr.appendChild(td); tr.appendChild(td);
tr.draggable = true;
tr.dataset.containerId = identity.cookieStoreId;
tr.addEventListener("dragstart", (e) => {
e.dataTransfer.setData(CONTAINER_DRAG_DATA_TYPE, identity.cookieStoreId);
});
tr.addEventListener("dragover", (e) => {
if (e.dataTransfer.types.includes(CONTAINER_DRAG_DATA_TYPE)) {
tr.classList.add("drag-over");
e.preventDefault();
}
});
tr.addEventListener("dragenter", (e) => {
if (e.dataTransfer.types.includes(CONTAINER_DRAG_DATA_TYPE)) {
e.preventDefault();
tr.classList.add("drag-over");
}
});
tr.addEventListener("dragleave", (e) => {
if (e.dataTransfer.types.includes(CONTAINER_DRAG_DATA_TYPE)) {
e.preventDefault();
tr.classList.remove("drag-over");
}
});
tr.addEventListener("drop", async (e) => {
e.preventDefault();
const parent = tr.parentNode;
const containerId = e.dataTransfer.getData(CONTAINER_DRAG_DATA_TYPE);
let droppedElement;
parent.childNodes.forEach((node) => {
if (node.dataset.containerId === containerId) {
droppedElement = node;
}
});
if (droppedElement && droppedElement !== tr) {
tr.classList.remove("drag-over");
parent.insertBefore(droppedElement, tr);
await Logic.saveContainerOrder(parent.childNodes);
await Logic.refreshIdentities();
}
});
Utils.addEnterHandler(tr, () => { Utils.addEnterHandler(tr, () => {
pickedFunction(identity); pickedFunction(identity);
}); });
@@ -1045,10 +1110,10 @@ Logic.registerPanel(REOPEN_IN_CONTAINER_PICKER, {
const pickedFunction = function (identity) { const pickedFunction = function (identity) {
const newUserContextId = Utils.userContextId(identity.cookieStoreId); const newUserContextId = Utils.userContextId(identity.cookieStoreId);
Utils.reloadInContainer( Utils.reloadInContainer(
currentTab.url, currentTab.url,
false, false,
newUserContextId, newUserContextId,
currentTab.index + 1, currentTab.index + 1,
currentTab.active currentTab.active
); );
window.close(); window.close();
@@ -1061,7 +1126,7 @@ Logic.registerPanel(REOPEN_IN_CONTAINER_PICKER, {
tr.classList.add("menu-item", "hover-highlight", "keyboard-nav"); tr.classList.add("menu-item", "hover-highlight", "keyboard-nav");
const td = document.createElement("td"); const td = document.createElement("td");
td.innerHTML = Utils.escaped` td.innerHTML = Utils.escaped`
<div class="menu-icon hover-highlight"> <div class="menu-icon hover-highlight">
<div class="mac-icon"> <div class="mac-icon">
</div> </div>
@@ -1074,10 +1139,10 @@ Logic.registerPanel(REOPEN_IN_CONTAINER_PICKER, {
Utils.addEnterHandler(tr, () => { Utils.addEnterHandler(tr, () => {
Utils.reloadInContainer( Utils.reloadInContainer(
currentTab.url, currentTab.url,
false, false,
0, 0,
currentTab.index + 1, currentTab.index + 1,
currentTab.active currentTab.active
); );
window.close(); window.close();
@@ -1091,7 +1156,7 @@ Logic.registerPanel(REOPEN_IN_CONTAINER_PICKER, {
tr.setAttribute("tabindex", "0"); tr.setAttribute("tabindex", "0");
const td = document.createElement("td"); const td = document.createElement("td");
td.innerHTML = Utils.escaped` td.innerHTML = Utils.escaped`
<div class="menu-icon hover-highlight"> <div class="menu-icon hover-highlight">
<div class="usercontext-icon" <div class="usercontext-icon"
data-identity-icon="${identity.icon}" data-identity-icon="${identity.icon}"
@@ -1132,7 +1197,7 @@ Logic.registerPanel(ALWAYS_OPEN_IN_PICKER, {
// This method is called when the panel is shown. // This method is called when the panel is shown.
prepare() { prepare() {
Logic.listenToPickerBackButton(); Logic.listenToPickerBackButton();
document.getElementById("picker-title").textContent = "Reopen This Site in"; document.getElementById("picker-title").textContent = "Always Open in";
const fragment = document.createDocumentFragment(); const fragment = document.createDocumentFragment();
document.getElementById("new-container-div").innerHTML = ""; document.getElementById("new-container-div").innerHTML = "";
@@ -1143,7 +1208,7 @@ Logic.registerPanel(ALWAYS_OPEN_IN_PICKER, {
tr.setAttribute("tabindex", "0"); tr.setAttribute("tabindex", "0");
const td = document.createElement("td"); const td = document.createElement("td");
td.innerHTML = Utils.escaped` td.innerHTML = Utils.escaped`
<div class="menu-icon hover-highlight"> <div class="menu-icon hover-highlight">
<div class="usercontext-icon" <div class="usercontext-icon"
data-identity-icon="${identity.icon}" data-identity-icon="${identity.icon}"
+2 -1
View File
@@ -1,7 +1,7 @@
{ {
"manifest_version": 2, "manifest_version": 2,
"name": "Firefox Multi-Account Containers", "name": "Firefox Multi-Account Containers",
"version": "7.1.0", "version": "7.4.0",
"incognito": "not_allowed", "incognito": "not_allowed",
"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.", "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": { "icons": {
@@ -25,6 +25,7 @@
"idle", "idle",
"management", "management",
"storage", "storage",
"unlimitedStorage",
"tabs", "tabs",
"webRequestBlocking", "webRequestBlocking",
"webRequest" "webRequest"