diff options
Diffstat (limited to 'src/background')
-rw-r--r-- | src/background/completion/TabCompletionUseCase.ts | 25 | ||||
-rw-r--r-- | src/background/completion/TabRepository.ts | 2 | ||||
-rw-r--r-- | src/background/completion/impl/TabRepositoryImpl.ts | 32 |
3 files changed, 48 insertions, 11 deletions
diff --git a/src/background/completion/TabCompletionUseCase.ts b/src/background/completion/TabCompletionUseCase.ts index 7e6dce3..dec86e9 100644 --- a/src/background/completion/TabCompletionUseCase.ts +++ b/src/background/completion/TabCompletionUseCase.ts @@ -1,6 +1,6 @@ import { inject, injectable } from "tsyringe"; import TabItem from "./TabItem"; -import TabRepository from "./TabRepository"; +import TabRepository, { Tab } from "./TabRepository"; import TabPresenter from "../presenters/TabPresenter"; import TabFlag from "../../shared/TabFlag"; @@ -14,7 +14,28 @@ export default class TabCompletionUseCase { async queryTabs(query: string, excludePinned: boolean): Promise<TabItem[]> { const lastTabId = await this.tabPresenter.getLastSelectedId(); - const tabs = await this.tabRepository.queryTabs(query, excludePinned); + const allTabs = await this.tabRepository.getAllTabs(excludePinned); + const num = parseInt(query, 10); + let tabs: Tab[] = []; + if (!isNaN(num)) { + const tab = allTabs.find(t => t.index === num - 1); + if (tab) { + tabs = [tab]; + } + } else if (query == '%') { + const tab = allTabs.find(t => t.active); + if (tab) { + tabs = [tab]; + } + } else if (query == '#') { + const tab = allTabs.find(t => t.id === lastTabId); + if (tab) { + tabs = [tab]; + } + } else { + tabs = await this.tabRepository.queryTabs(query, excludePinned); + } + return tabs.map(tab => { let flag = TabFlag.None; if (tab.active) { diff --git a/src/background/completion/TabRepository.ts b/src/background/completion/TabRepository.ts index 61fac3b..fe1b601 100644 --- a/src/background/completion/TabRepository.ts +++ b/src/background/completion/TabRepository.ts @@ -9,4 +9,6 @@ export type Tab = { export default interface TabRepository { queryTabs(query: string, excludePinned: boolean): Promise<Tab[]>; + + getAllTabs(excludePinned: boolean): Promise<Tab[]> } diff --git a/src/background/completion/impl/TabRepositoryImpl.ts b/src/background/completion/impl/TabRepositoryImpl.ts index 6692b27..adcaba7 100644 --- a/src/background/completion/impl/TabRepositoryImpl.ts +++ b/src/background/completion/impl/TabRepositoryImpl.ts @@ -15,13 +15,27 @@ export default class TabRepositoryImpl implements TabRepository { }) .filter(item => item.id && item.title && item.url) .slice(0, COMPLETION_ITEM_LIMIT) - .map(item => ({ - id: item.id!!, - url: item.url!!, - active: item.active, - title: item.title!!, - faviconUrl: item.favIconUrl, - index: item.index, - })) + .map(TabRepositoryImpl.toEntity); } -}
\ No newline at end of file + + async getAllTabs(excludePinned: boolean): Promise<Tab[]> { + if (excludePinned) { + return (await browser.tabs.query({ currentWindow: true, pinned: true })) + .map(TabRepositoryImpl.toEntity) + + } + return (await browser.tabs.query({ currentWindow: true })) + .map(TabRepositoryImpl.toEntity) + } + + private static toEntity(tab: browser.tabs.Tab,): Tab { + return { + id: tab.id!!, + url: tab.url!!, + active: tab.active, + title: tab.title!!, + faviconUrl: tab.favIconUrl, + index: tab.index, + } + } +} |