diff --git a/e2e/ambassador/src/background/index.js b/e2e/ambassador/src/background/index.js index c3e9dc1..6425b54 100644 --- a/e2e/ambassador/src/background/index.js +++ b/e2e/ambassador/src/background/index.js @@ -1,6 +1,6 @@ import { WINDOWS_CREATE, WINDOWS_REMOVE, WINDOWS_GET, - TABS_CREATE, + TABS_CREATE, TABS_SELECT_AT, EVENT_KEYPRESS, EVENT_KEYDOWN, EVENT_KEYUP, SCROLL_GET, SCROLL_SET, } from '../shared/messages'; @@ -20,6 +20,11 @@ receiveContentMessage((message) => { url: message.url, windowId: message.windowId, }); + case TABS_SELECT_AT: + return tabs.selectAt({ + windowId: message.windowId, + index: message.index, + }); case EVENT_KEYPRESS: case EVENT_KEYDOWN: case EVENT_KEYUP: diff --git a/e2e/ambassador/src/background/tabs.js b/e2e/ambassador/src/background/tabs.js index 93d47a3..d049500 100644 --- a/e2e/ambassador/src/background/tabs.js +++ b/e2e/ambassador/src/background/tabs.js @@ -13,6 +13,14 @@ const create = (props = {}) => { }); }; +const selectAt = (props = {}) => { + return browser.tabs.query({ windowId: props.windowId }).then((tabs) => { + let target = tabs[props.index]; + return browser.tabs.update(target.id, { active: true }); + }); +}; + + export { - create, + create, selectAt }; diff --git a/e2e/ambassador/src/client/tabs.js b/e2e/ambassador/src/client/tabs.js index 4db3c11..6aaefbd 100644 --- a/e2e/ambassador/src/client/tabs.js +++ b/e2e/ambassador/src/client/tabs.js @@ -1,4 +1,6 @@ -import { TABS_CREATE } from '../shared/messages'; +import { + TABS_CREATE, TABS_SELECT_AT, +} from '../shared/messages'; import * as ipc from './ipc'; const create = (windowId, url) => { @@ -9,4 +11,12 @@ const create = (windowId, url) => { }); }; -export { create }; +const selectAt = (windowId, index) => { + return ipc.send({ + type: TABS_SELECT_AT, + windowId, + index, + }); +}; + +export { create, selectAt }; diff --git a/e2e/ambassador/src/shared/messages.js b/e2e/ambassador/src/shared/messages.js index dd389db..9fd1054 100644 --- a/e2e/ambassador/src/shared/messages.js +++ b/e2e/ambassador/src/shared/messages.js @@ -4,6 +4,7 @@ const WINDOWS_CREATE = 'windows.create'; const WINDOWS_REMOVE = 'windows.remove'; const WINDOWS_GET = 'windows.get'; const TABS_CREATE = 'tabs.create'; +const TABS_SELECT_AT = 'tabs.selectAt'; const EVENT_KEYPRESS = 'event.keypress'; const EVENT_KEYDOWN = 'event.keydown'; const EVENT_KEYUP = 'event.keyup'; @@ -19,6 +20,7 @@ export { WINDOWS_GET, TABS_CREATE, + TABS_SELECT_AT, EVENT_KEYPRESS, EVENT_KEYDOWN, diff --git a/e2e/contents/tab.test.js b/e2e/contents/tab.test.js index 707acef..852c6d9 100644 --- a/e2e/contents/tab.test.js +++ b/e2e/contents/tab.test.js @@ -3,18 +3,18 @@ import * as windows from "../ambassador/src/client/windows"; import * as tabs from "../ambassador/src/client/tabs"; import * as keys from "../ambassador/src/client/keys"; -const SERVER_URL = "localhost:11111"; +const SERVER_URL = "localhost:11111/"; describe("tab test", () => { let targetWindow; - before(() => { - return windows.create().then((win) => { + beforeEach(() => { + return windows.create(SERVER_URL).then((win) => { targetWindow = win; }); }); - after(() => { + afterEach(() => { return windows.remove(targetWindow.id); }); @@ -51,4 +51,128 @@ describe("tab test", () => { expect(actual.tabs).to.have.lengthOf(before.tabs.length + 1); }); }) + + it('selects previous tab by K', () => { + return Promise.resolve().then(() => { + return tabs.create(targetWindow.id, SERVER_URL + '#1') + }).then(() => { + return tabs.create(targetWindow.id, SERVER_URL + '#2') + }).then(() => { + return tabs.create(targetWindow.id, SERVER_URL + '#3'); + }).then(() => { + return tabs.selectAt(targetWindow.id, 2); + }).then((tab) => { + return keys.press(tab.id, 'K', { shiftKey: true }); + }).then(() => { + return windows.get(targetWindow.id); + }).then((win) => { + expect(win.tabs[1].active).to.be.true; + }); + }); + + it('selects previous tab by K rotatory', () => { + return Promise.resolve().then(() => { + return tabs.create(targetWindow.id, SERVER_URL + '#1') + }).then(() => { + return tabs.create(targetWindow.id, SERVER_URL + '#2') + }).then(() => { + return tabs.create(targetWindow.id, SERVER_URL + '#3'); + }).then(() => { + return tabs.selectAt(targetWindow.id, 0); + }).then((tab) => { + return keys.press(tab.id, 'K', { shiftKey: true }); + }).then(() => { + return windows.get(targetWindow.id); + }).then((win) => { + expect(win.tabs[3].active).to.be.true; + }); + }); + + it('selects next tab by J', () => { + return Promise.resolve().then(() => { + return tabs.create(targetWindow.id, SERVER_URL + '#1') + }).then(() => { + return tabs.create(targetWindow.id, SERVER_URL + '#2') + }).then(() => { + return tabs.create(targetWindow.id, SERVER_URL + '#3'); + }).then(() => { + return tabs.selectAt(targetWindow.id, 2); + }).then((tab) => { + return keys.press(tab.id, 'J', { shiftKey: true }); + }).then(() => { + return windows.get(targetWindow.id); + }).then((win) => { + expect(win.tabs[3].active).to.be.true; + }); + }); + + it('selects previous tab by J rotatory', () => { + return Promise.resolve().then(() => { + return tabs.create(targetWindow.id, SERVER_URL + '#1') + }).then(() => { + return tabs.create(targetWindow.id, SERVER_URL + '#2') + }).then(() => { + return tabs.create(targetWindow.id, SERVER_URL + '#3'); + }).then(() => { + return tabs.selectAt(targetWindow.id, 3); + }).then((tab) => { + return keys.press(tab.id, 'J', { shiftKey: true }); + }).then(() => { + return windows.get(targetWindow.id); + }).then((win) => { + expect(win.tabs[0].active).to.be.true; + }); + }); + + it('selects first tab by g0', () => { + return Promise.resolve().then(() => { + return tabs.create(targetWindow.id, SERVER_URL + '#1') + }).then(() => { + return tabs.create(targetWindow.id, SERVER_URL + '#2') + }).then(() => { + return tabs.create(targetWindow.id, SERVER_URL + '#3'); + }).then(() => { + return tabs.selectAt(targetWindow.id, 2); + }).then((tab) => { + return keys.press(tab.id, 'g').then(() => tab); + }).then((tab) => { + return keys.press(tab.id, '0'); + }).then(() => { + return windows.get(targetWindow.id); + }).then((win) => { + expect(win.tabs[0].active).to.be.true; + }); + }); + + it('selects last tab by g$', () => { + return Promise.resolve().then(() => { + return tabs.create(targetWindow.id, SERVER_URL + '#1') + }).then(() => { + return tabs.create(targetWindow.id, SERVER_URL + '#2') + }).then(() => { + return tabs.create(targetWindow.id, SERVER_URL + '#3'); + }).then(() => { + return tabs.selectAt(targetWindow.id, 2); + }).then((tab) => { + return keys.press(tab.id, 'g').then(() => tab); + }).then((tab) => { + return keys.press(tab.id, '$'); + }).then(() => { + return windows.get(targetWindow.id); + }).then((win) => { + expect(win.tabs[3].active).to.be.true; + }); + }); + + it('deletes tab by d', () => { + return Promise.resolve().then(() => { + return tabs.create(targetWindow.id, SERVER_URL + '#1'); + }).then((tab) => { + return keys.press(tab.id, 'd'); + }).then(() => { + return windows.get(targetWindow.id); + }).then((win) => { + expect(win.tabs).to.have.lengthOf(1); + }); + }); });