diff options
| author | Shin'ya Ueoka <ueokande@i-beam.org> | 2018-07-28 20:05:06 +0900 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-07-28 20:05:06 +0900 | 
| commit | ed2bd7d75ee1e7aa1db7d03c3f908c740ded1983 (patch) | |
| tree | 6ac3f5ac5126e1a07c958549c782aedd586c6534 /src/background/presenters/tab.js | |
| parent | 84a9655bb39e5902b417e124a0eb23d80808a6a7 (diff) | |
| parent | 4bd2084ba7b23327c26a2d8b24dc4169c14bfa17 (diff) | |
Merge pull request #440 from ueokande/background-clean-architecture
Background clean architecture
Diffstat (limited to 'src/background/presenters/tab.js')
| -rw-r--r-- | src/background/presenters/tab.js | 101 | 
1 files changed, 101 insertions, 0 deletions
| diff --git a/src/background/presenters/tab.js b/src/background/presenters/tab.js new file mode 100644 index 0000000..2a06a5a --- /dev/null +++ b/src/background/presenters/tab.js @@ -0,0 +1,101 @@ +export default class TabPresenter { +  open(url, tabId) { +    return browser.tabs.update(tabId, { url }); +  } + +  create(url, opts) { +    return browser.tabs.create({ url, ...opts }); +  } + +  async getCurrent() { +    let tabs = await browser.tabs.query({ +      active: true, currentWindow: true +    }); +    return tabs[0]; +  } + +  getAll() { +    return browser.tabs.query({ currentWindow: true }); +  } + +  async getByKeyword(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); +    }); +  } + +  select(tabId) { +    return browser.tabs.update(tabId, { active: true }); +  } + +  async selectAt(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 }); +  } + +  remove(ids) { +    return browser.tabs.remove(ids); +  } + +  async reopen() { +    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); +  } + +  reload(tabId, cache) { +    return browser.tabs.reload(tabId, { bypassCache: cache }); +  } + +  setPinned(tabId, pinned) { +    return browser.tabs.update(tabId, { pinned }); +  } + +  duplicate(id) { +    return browser.tabs.duplicate(id); +  } + +  getZoom(tabId) { +    return browser.tabs.getZoom(tabId); +  } + +  setZoom(tabId, factor) { +    return browser.tabs.setZoom(tabId, factor); +  } + +  async createAdjacent(url, { openerTabId, active }) { +    let tabs = await browser.tabs.query({ +      active: true, currentWindow: true +    }); +    return browser.tabs.create({ +      url, +      openerTabId, +      active, +      index: tabs[0].index + 1 +    }); +  } + +  onSelected(listener) { +    browser.tabs.onActivated.addListener(listener); +  } +} | 
