From dd57158ab50affd0926bdc545700651c1bfb416f Mon Sep 17 00:00:00 2001 From: shivangikakkar Date: Thu, 20 Sep 2018 21:34:19 +0530 Subject: [PATCH 1/3] #885 disables move tab to a new window when only one tab is opened --- src/js/popup.js | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/js/popup.js b/src/js/popup.js index a9e3d26..141328c 100644 --- a/src/js/popup.js +++ b/src/js/popup.js @@ -212,6 +212,11 @@ const Logic = { return false; }, + async noOfTabs() { + const activeTabs = await browser.tabs.query({windowId: browser.windows.WINDOW_ID_CURRENT}); + return activeTabs.length; + }, + async refreshIdentities() { const [identities, state] = await Promise.all([ browser.contextualIdentities.query({}), @@ -717,13 +722,21 @@ Logic.registerPanel(P_CONTAINER_INFO, { moveTabsEl.parentNode.insertBefore(fragment, moveTabsEl.nextSibling); } else { - Logic.addEnterHandler(moveTabsEl, async function () { - await browser.runtime.sendMessage({ - method: "moveTabsToWindow", - windowId: browser.windows.WINDOW_ID_CURRENT, - cookieStoreId: Logic.currentIdentity().cookieStoreId, - }); - window.close(); + Logic.noOfTabs().then(result => { + if (result === 1) { + moveTabsEl.classList.remove("clickable"); + } else { + Logic.addEnterHandler(moveTabsEl, async function () { + await browser.runtime.sendMessage({ + method: "moveTabsToWindow", + windowId: browser.windows.WINDOW_ID_CURRENT, + cookieStoreId: Logic.currentIdentity().cookieStoreId, + }); + window.close(); + }); + } + }).catch(error => { + throw new Error(error); }); } } catch (e) { From e57c556427fdb85aef5f7ef4a856e571b19e8f24 Mon Sep 17 00:00:00 2001 From: shivangikakkar Date: Thu, 20 Sep 2018 23:40:22 +0530 Subject: [PATCH 2/3] review changes --- src/js/popup.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/js/popup.js b/src/js/popup.js index 141328c..42b00d3 100644 --- a/src/js/popup.js +++ b/src/js/popup.js @@ -212,7 +212,7 @@ const Logic = { return false; }, - async noOfTabs() { + async numTabs() { const activeTabs = await browser.tabs.query({windowId: browser.windows.WINDOW_ID_CURRENT}); return activeTabs.length; }, @@ -722,8 +722,9 @@ Logic.registerPanel(P_CONTAINER_INFO, { moveTabsEl.parentNode.insertBefore(fragment, moveTabsEl.nextSibling); } else { - Logic.noOfTabs().then(result => { - if (result === 1) { + try { + const numTabs = await Logic.numTabs(); + if (numTabs === 1) { moveTabsEl.classList.remove("clickable"); } else { Logic.addEnterHandler(moveTabsEl, async function () { @@ -735,9 +736,9 @@ Logic.registerPanel(P_CONTAINER_INFO, { window.close(); }); } - }).catch(error => { - throw new Error(error); - }); + } catch (e) { + throw new Error("Could not get the number of active tabs."); + } } } catch (e) { throw new Error("Could not check for incompatible add-ons."); From fe0810b048464888208bc51a38de6e63dc28fc52 Mon Sep 17 00:00:00 2001 From: shivangikakkar Date: Sun, 23 Sep 2018 00:42:43 +0530 Subject: [PATCH 3/3] restructuring the code acc to the review --- src/js/popup.js | 69 +++++++++++++++++++++++++------------------------ 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/src/js/popup.js b/src/js/popup.js index 42b00d3..2964f02 100644 --- a/src/js/popup.js +++ b/src/js/popup.js @@ -217,6 +217,22 @@ const Logic = { return activeTabs.length; }, + _disableMoveTabs(message) { + const moveTabsEl = document.querySelector("#container-info-movetabs"); + const fragment = document.createDocumentFragment(); + const incompatEl = document.createElement("div"); + + moveTabsEl.classList.remove("clickable"); + moveTabsEl.setAttribute("title", message); + + fragment.appendChild(incompatEl); + incompatEl.setAttribute("id", "container-info-movetabs-incompat"); + incompatEl.textContent = message; + incompatEl.classList.add("container-info-tab-row"); + + moveTabsEl.parentNode.insertBefore(fragment, moveTabsEl.nextSibling); + }, + async refreshIdentities() { const [identities, state] = await Promise.all([ browser.contextualIdentities.query({}), @@ -703,46 +719,31 @@ Logic.registerPanel(P_CONTAINER_INFO, { }); // Check if the user has incompatible add-ons installed + let incompatible = false; try { - const incompatible = await browser.runtime.sendMessage({ + incompatible = await browser.runtime.sendMessage({ method: "checkIncompatibleAddons" }); - 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.textContent = "Incompatible with other Experiments."; - incompatEl.classList.add("container-info-tab-row"); - - moveTabsEl.parentNode.insertBefore(fragment, moveTabsEl.nextSibling); - } else { - try { - const numTabs = await Logic.numTabs(); - if (numTabs === 1) { - moveTabsEl.classList.remove("clickable"); - } else { - Logic.addEnterHandler(moveTabsEl, async function () { - await browser.runtime.sendMessage({ - method: "moveTabsToWindow", - windowId: browser.windows.WINDOW_ID_CURRENT, - cookieStoreId: Logic.currentIdentity().cookieStoreId, - }); - window.close(); - }); - } - } catch (e) { - throw new Error("Could not get the number of active tabs."); - } - } } catch (e) { throw new Error("Could not check for incompatible add-ons."); } + const moveTabsEl = document.querySelector("#container-info-movetabs"); + const numTabs = await Logic.numTabs(); + if (incompatible) { + Logic._disableMoveTabs("Moving container tabs is incompatible with Pulse, PageShot, and SnoozeTabs."); + return; + } else if (numTabs === 1) { + Logic._disableMoveTabs("Cannot move a tab from a single-tab window."); + return; + } + Logic.addEnterHandler(moveTabsEl, async function () { + await browser.runtime.sendMessage({ + method: "moveTabsToWindow", + windowId: browser.windows.WINDOW_ID_CURRENT, + cookieStoreId: Logic.currentIdentity().cookieStoreId, + }); + window.close(); + }); }, // This method is called when the panel is shown.