aboutsummaryrefslogtreecommitdiff
path: root/src/background/shared/tabs.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/background/shared/tabs.js')
-rw-r--r--src/background/shared/tabs.js210
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,