diff options
Diffstat (limited to 'src/background/shared/tabs.js')
-rw-r--r-- | src/background/shared/tabs.js | 210 |
1 files changed, 97 insertions, 113 deletions
diff --git a/src/background/shared/tabs.js b/src/background/shared/tabs.js index d09f676..26e2e44 100644 --- a/src/background/shared/tabs.js +++ b/src/background/shared/tabs.js @@ -1,141 +1,127 @@ import * as tabCompletions from './completions/tabs'; -const closeTab = (id) => { - return browser.tabs.get(id).then((tab) => { - if (!tab.pinned) { - return browser.tabs.remove(id); - } - }); +const closeTab = async(id) => { + let tab = await browser.tabs.get(id); + if (!tab.pinned) { + return browser.tabs.remove(id); + } }; const closeTabForce = (id) => { return browser.tabs.remove(id); }; -const closeTabByKeywords = (keyword) => { - return browser.tabs.query({ currentWindow: true }).then((tabs) => { - let matched = tabs.filter((t) => { - return t.url.includes(keyword) || t.title.includes(keyword); - }).filter(t => !t.pinned); - - if (matched.length === 0) { - throw new Error('No matching buffer for ' + keyword); - } else if (matched.length > 1) { - throw new Error('More than one match for ' + keyword); - } - browser.tabs.remove(matched[0].id); +const queryByKeyword = async(keyword, excludePinned = false) => { + let tabs = await browser.tabs.query({ currentWindow: true }); + return tabs.filter((t) => { + return t.url.toLowerCase().includes(keyword.toLowerCase()) || + t.title && t.title.toLowerCase().includes(keyword.toLowerCase()); + }).filter((t) => { + return !(excludePinned && t.pinned); }); }; -const closeTabByKeywordsForce = (keyword) => { - return browser.tabs.query({ currentWindow: true }).then((tabs) => { - let matched = tabs.filter((t) => { - return t.url.includes(keyword) || t.title.includes(keyword); - }); - - if (matched.length === 0) { - throw new Error('No matching buffer for ' + keyword); - } else if (matched.length > 1) { - throw new Error('More than one match for ' + keyword); - } - browser.tabs.remove(matched[0].id); - }); +const closeTabByKeywords = async(keyword) => { + let tabs = await queryByKeyword(keyword, true); + if (tabs.length === 0) { + throw new Error('No matching buffer for ' + keyword); + } else if (tabs.length > 1) { + throw new Error('More than one match for ' + keyword); + } + return browser.tabs.remove(tabs[0].id); }; - -const closeTabsByKeywords = (keyword) => { - tabCompletions.getCompletions(keyword).then((tabs) => { - let tabs2 = tabs.filter(tab => !tab.pinned); - browser.tabs.remove(tabs2.map(tab => tab.id)); - }); +const closeTabByKeywordsForce = async(keyword) => { + let tabs = await queryByKeyword(keyword, false); + if (tabs.length === 0) { + throw new Error('No matching buffer for ' + keyword); + } else if (tabs.length > 1) { + throw new Error('More than one match for ' + keyword); + } + return browser.tabs.remove(tabs[0].id); }; -const closeTabsByKeywordsForce = (keyword) => { - tabCompletions.getCompletions(keyword).then((tabs) => { - browser.tabs.remove(tabs.map(tab => tab.id)); - }); +const closeTabsByKeywords = async(keyword) => { + let tabs = await tabCompletions.getCompletions(keyword); + tabs = tabs.filter(tab => !tab.pinned); + return browser.tabs.remove(tabs.map(tab => tab.id)); }; -const reopenTab = () => { - return browser.sessions.getRecentlyClosed({ - maxResults: 1 - }).then((sessions) => { - if (sessions.length === 0) { - return; - } - let session = sessions[0]; - if (session.tab) { - return browser.sessions.restore(session.tab.sessionId); - } - return browser.sessions.restore(session.window.sessionId); - }); +const closeTabsByKeywordsForce = async(keyword) => { + let tabs = await tabCompletions.getCompletions(keyword); + return browser.tabs.remove(tabs.map(tab => tab.id)); }; -const selectAt = (index) => { - return browser.tabs.query({ currentWindow: true }).then((tabs) => { - if (tabs.length < 2) { - return; - } - if (index < 0 || tabs.length <= index) { - throw new RangeError(`tab ${index + 1} does not exist`); - } - let id = tabs[index].id; - return browser.tabs.update(id, { active: true }); +const reopenTab = async() => { + let window = await browser.windows.getCurrent(); + let sessions = await browser.sessions.getRecentlyClosed(); + let session = sessions.find((s) => { + return s.tab && s.tab.windowId === window.id; }); + if (!session) { + return; + } + if (session.tab) { + return browser.sessions.restore(session.tab.sessionId); + } + return browser.sessions.restore(session.window.sessionId); +}; + +const selectAt = async(index) => { + let tabs = await browser.tabs.query({ currentWindow: true }); + if (tabs.length < 2) { + return; + } + if (index < 0 || tabs.length <= index) { + throw new RangeError(`tab ${index + 1} does not exist`); + } + let id = tabs[index].id; + return browser.tabs.update(id, { active: true }); }; -const selectByKeyword = (current, keyword) => { - return browser.tabs.query({ currentWindow: true }).then((tabs) => { - let matched = tabs.filter((t) => { - return t.url.includes(keyword) || t.title.includes(keyword); - }); - - if (matched.length === 0) { - throw new RangeError('No matching buffer for ' + keyword); +const selectByKeyword = async(current, keyword) => { + let tabs = await queryByKeyword(keyword); + if (tabs.length === 0) { + throw new RangeError('No matching buffer for ' + keyword); + } + for (let tab of tabs) { + if (tab.index > current.index) { + return browser.tabs.update(tab.id, { active: true }); } - for (let tab of matched) { - if (tab.index > current.index) { - return browser.tabs.update(tab.id, { active: true }); - } - } - return browser.tabs.update(matched[0].id, { active: true }); - }); + } + return browser.tabs.update(tabs[0].id, { active: true }); }; -const selectPrevTab = (current, count) => { - return browser.tabs.query({ currentWindow: true }).then((tabs) => { - if (tabs.length < 2) { - return; - } - let select = (current - count + tabs.length) % tabs.length; - let id = tabs[select].id; - return browser.tabs.update(id, { active: true }); - }); +const selectPrevTab = async(current, count) => { + let tabs = await browser.tabs.query({ currentWindow: true }); + if (tabs.length < 2) { + return; + } + let select = (current - count + tabs.length) % tabs.length; + let id = tabs[select].id; + return browser.tabs.update(id, { active: true }); }; -const selectNextTab = (current, count) => { - return browser.tabs.query({ currentWindow: true }).then((tabs) => { - if (tabs.length < 2) { - return; - } - let select = (current + count) % tabs.length; - let id = tabs[select].id; - return browser.tabs.update(id, { active: true }); - }); +const selectNextTab = async(current, count) => { + let tabs = await browser.tabs.query({ currentWindow: true }); + if (tabs.length < 2) { + return; + } + let select = (current + count) % tabs.length; + let id = tabs[select].id; + return browser.tabs.update(id, { active: true }); }; -const selectFirstTab = () => { - return browser.tabs.query({ currentWindow: true }).then((tabs) => { - let id = tabs[0].id; - return browser.tabs.update(id, { active: true }); - }); +const selectFirstTab = async() => { + let tabs = await browser.tabs.query({ currentWindow: true }); + let id = tabs[0].id; + return browser.tabs.update(id, { active: true }); }; -const selectLastTab = () => { - return browser.tabs.query({ currentWindow: true }).then((tabs) => { - let id = tabs[tabs.length - 1].id; - return browser.tabs.update(id, { active: true }); - }); +const selectLastTab = async() => { + let tabs = await browser.tabs.query({ currentWindow: true }); + let id = tabs[tabs.length - 1].id; + return browser.tabs.update(id, { active: true }); }; const selectTab = (id) => { @@ -150,14 +136,11 @@ const reload = (current, cache) => { }; const updateTabPinned = (current, pinned) => { - return browser.tabs.query({ currentWindow: true, active: true }) - .then(() => { - return browser.tabs.update(current.id, { pinned: pinned }); - }); + return browser.tabs.update(current.id, { pinned }); }; const toggleTabPinned = (current) => { - updateTabPinned(current, !current.pinned); + return updateTabPinned(current, !current.pinned); }; const duplicate = (id) => { @@ -165,7 +148,8 @@ const duplicate = (id) => { }; export { - closeTab, closeTabForce, closeTabByKeywords, closeTabByKeywordsForce, + closeTab, closeTabForce, + queryByKeyword, closeTabByKeywords, closeTabByKeywordsForce, closeTabsByKeywords, closeTabsByKeywordsForce, reopenTab, selectAt, selectByKeyword, selectPrevTab, selectNextTab, selectFirstTab, |