diff --git a/index.js b/index.js index 1680f8d..878236b 100644 --- a/index.js +++ b/index.js @@ -8,6 +8,12 @@ const DEFAULT_TAB = "about:newtab"; const SHOW_MENU_TIMEOUT = 100; const HIDE_MENU_TIMEOUT = 300; +const INCOMPATIBLE_ADDON_IDS = [ + "pulse@mozilla.com", + "snoozetabs@mozilla.com", + "jid1-NeEaf3sAHdKHPA@jetpack" // PageShot +]; + const IDENTITY_COLORS = [ { name: "blue", color: "#00a7e0" }, { name: "turquoise", color: "#01bdad" }, @@ -40,6 +46,7 @@ const PREFS = [ [ "privacy.usercontext.about_newtab_segregation.enabled", true ], ]; +const { AddonManager } = require("resource://gre/modules/AddonManager.jsm"); const { attachTo, detachFrom } = require("sdk/content/mod"); const { Cu } = require("chrome"); const { ContextualIdentityService } = require("resource://gre/modules/ContextualIdentityService.jsm"); @@ -181,7 +188,8 @@ const ContainerService = { "removeIdentity", "updateIdentity", "getPreference", - "sendTelemetryPayload" + "sendTelemetryPayload", + "checkIncompatibleAddons" ]; // Map of identities. @@ -488,6 +496,15 @@ const ContainerService = { this._sendEvent(payload); }, + checkIncompatibleAddons() { + return new Promise(resolve => { + AddonManager.getAddonsByIDs(INCOMPATIBLE_ADDON_IDS, (addons) => { + addons = addons.filter((a) => a && a.isActive); + resolve(addons.length !== 0); + }); + }); + }, + // Tabs management hideTabs(args) { diff --git a/webextension/css/popup.css b/webextension/css/popup.css index b35efda..e2c8cd2 100644 --- a/webextension/css/popup.css +++ b/webextension/css/popup.css @@ -427,7 +427,13 @@ span ~ .panel-header-text { margin-block-start: 4px; } -.container-info-tab-row:not(.clickable) { +#container-info-movetabs-incompat { + font-size: 10px; + opacity: 0.3; +} + +.container-info-tab-row:not(.clickable), +.select-row:not(.clickable) { opacity: 0.3; } diff --git a/webextension/js/popup.js b/webextension/js/popup.js index b8f982c..c75985c 100644 --- a/webextension/js/popup.js +++ b/webextension/js/popup.js @@ -302,13 +302,36 @@ Logic.registerPanel(P_CONTAINER_INFO, { }); }); - document.querySelector("#container-info-movetabs").addEventListener("click", () => { - return browser.runtime.sendMessage({ - method: "moveTabsToWindow", - userContextId: Logic.currentIdentity().userContextId, - }).then(() => { - window.close(); - }); + // Check if the user has incompatible add-ons installed + browser.runtime.sendMessage({ + method: "checkIncompatibleAddons" + }).then(incompatible => { + const moveTabsEl = document.querySelector("#container-info-movetabs"); + if (incompatible) { + const fragment = document.createDocumentFragment(); + const incompatEl = document.createElement("div"); + + moveTabsEl.classList.remove("clickable"); + moveTabsEl.setAttribute("title", "Moving container tabs is incompatible with Pulse, PageShot, and SnoozeTabs."); + + fragment.appendChild(incompatEl); + incompatEl.setAttribute("id", "container-info-movetabs-incompat"); + incompatEl.innerText = "Incompatible with other Experiments."; + incompatEl.classList.add("container-info-tab-row"); + + moveTabsEl.parentNode.insertBefore(fragment, moveTabsEl.nextSibling); + } else { + moveTabsEl.addEventListener("click", () => { + return browser.runtime.sendMessage({ + method: "moveTabsToWindow", + userContextId: Logic.currentIdentity().userContextId, + }).then(() => { + window.close(); + }); + }); + } + }).catch(() => { + throw new Error("Could not check for incompatible add-ons."); }); },