aboutsummaryrefslogtreecommitdiff
path: root/src/background/presenters/TabPresenter.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/background/presenters/TabPresenter.ts')
-rw-r--r--src/background/presenters/TabPresenter.ts108
1 files changed, 108 insertions, 0 deletions
diff --git a/src/background/presenters/TabPresenter.ts b/src/background/presenters/TabPresenter.ts
new file mode 100644
index 0000000..33c6513
--- /dev/null
+++ b/src/background/presenters/TabPresenter.ts
@@ -0,0 +1,108 @@
+import MemoryStorage from '../infrastructures/MemoryStorage';
+
+const CURRENT_SELECTED_KEY = 'tabs.current.selected';
+const LAST_SELECTED_KEY = 'tabs.last.selected';
+
+type Tab = browser.tabs.Tab;
+
+export default class TabPresenter {
+ open(url: string, tabId?: number): Promise<Tab> {
+ return browser.tabs.update(tabId, { url });
+ }
+
+ create(url: string, opts?: object): Promise<Tab> {
+ return browser.tabs.create({ url, ...opts });
+ }
+
+ async getCurrent(): Promise<Tab> {
+ let tabs = await browser.tabs.query({
+ active: true, currentWindow: true
+ });
+ return tabs[0];
+ }
+
+ getAll(): Promise<Tab[]> {
+ return browser.tabs.query({ currentWindow: true });
+ }
+
+ async getLastSelectedId(): Promise<number | undefined> {
+ let cache = new MemoryStorage();
+ let tabId = await cache.get(LAST_SELECTED_KEY);
+ if (tabId === null || typeof tabId === 'undefined') {
+ return;
+ }
+ return tabId;
+ }
+
+ async getByKeyword(keyword: string, excludePinned = false): Promise<Tab[]> {
+ let tabs = await browser.tabs.query({ currentWindow: true });
+ return tabs.filter((t) => {
+ return t.url && t.url.toLowerCase().includes(keyword.toLowerCase()) ||
+ t.title && t.title.toLowerCase().includes(keyword.toLowerCase());
+ }).filter((t) => {
+ return !(excludePinned && t.pinned);
+ });
+ }
+
+ select(tabId: number): Promise<Tab> {
+ return browser.tabs.update(tabId, { active: true });
+ }
+
+ remove(ids: number[]): Promise<void> {
+ return browser.tabs.remove(ids);
+ }
+
+ async reopen(): Promise<any> {
+ 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 && session.tab.sessionId) {
+ return browser.sessions.restore(session.tab.sessionId);
+ }
+ if (session.window && session.window.sessionId) {
+ return browser.sessions.restore(session.window.sessionId);
+ }
+ }
+
+ reload(tabId: number, cache: boolean): Promise<void> {
+ return browser.tabs.reload(tabId, { bypassCache: cache });
+ }
+
+ setPinned(tabId: number, pinned: boolean): Promise<Tab> {
+ return browser.tabs.update(tabId, { pinned });
+ }
+
+ duplicate(id: number): Promise<Tab> {
+ return browser.tabs.duplicate(id);
+ }
+
+ getZoom(tabId: number): Promise<number> {
+ return browser.tabs.getZoom(tabId);
+ }
+
+ setZoom(tabId: number, factor: number): Promise<void> {
+ return browser.tabs.setZoom(tabId, factor);
+ }
+
+ onSelected(
+ listener: (arg: { tabId: number, windowId: number}) => void,
+ ): void {
+ browser.tabs.onActivated.addListener(listener);
+ }
+}
+
+let tabPresenter = new TabPresenter();
+tabPresenter.onSelected((tab: any) => {
+ let cache = new MemoryStorage();
+
+ let lastId = cache.get(CURRENT_SELECTED_KEY);
+ if (lastId) {
+ cache.set(LAST_SELECTED_KEY, lastId);
+ }
+ cache.set(CURRENT_SELECTED_KEY, tab.tabId);
+});