aboutsummaryrefslogtreecommitdiff
path: root/src/background/presenters/tab.js
blob: 6ad9736afa47801b4437d8381ca8b356a0ac5d72 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import MemoryStorage from '../infrastructures/memory-storage';

const CURRENT_SELECTED_KEY = 'tabs.current.selected';
const LAST_SELECTED_KEY = 'tabs.last.selected';

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 getLastSelectedId() {
    let cache = new MemoryStorage();
    let tabId = await cache.get(LAST_SELECTED_KEY);
    if (tabId === null || typeof tabId === 'undefined') {
      return;
    }
    return tabId;
  }

  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);
  }
}

let tabPresenter = new TabPresenter();
tabPresenter.onSelected((tab) => {
  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);
});