Merge pull request #417 from ueokande/async-function
Use await/async on e2e test
This commit is contained in:
commit
897e010f42
26 changed files with 732 additions and 1064 deletions
|
@ -6,116 +6,78 @@ import { CLIENT_URL } from '../web-server/url';
|
|||
describe("tab test", () => {
|
||||
let targetWindow;
|
||||
|
||||
beforeEach(() => {
|
||||
return windows.create(CLIENT_URL).then((win) => {
|
||||
targetWindow = win;
|
||||
});
|
||||
beforeEach(async () => {
|
||||
targetWindow = await windows.create(CLIENT_URL);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
return windows.remove(targetWindow.id);
|
||||
afterEach(async () => {
|
||||
await windows.remove(targetWindow.id);
|
||||
});return
|
||||
|
||||
it('follows link by `f`', async() => {
|
||||
let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/follow');
|
||||
await keys.press(tab.id, 'f');
|
||||
await new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
await keys.press(tab.id, 'a');
|
||||
await new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
|
||||
tab = tabs.get(tab.id);
|
||||
expect(tab.url).to.be.equal(CLIENT_URL + '/follow#a');
|
||||
});
|
||||
|
||||
it('follows link by `f`', () => {
|
||||
let targetTab;
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '/follow').then((tab) => {
|
||||
targetTab = tab;
|
||||
return keys.press(targetTab.id, 'f');
|
||||
}).then(() => {
|
||||
return new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
}).then(() => {
|
||||
return keys.press(targetTab.id, 'a');
|
||||
}).then(() => {
|
||||
return new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
}).then(() => {
|
||||
return tabs.get(targetTab.id);
|
||||
}).then((tab) => {
|
||||
expect(tab.url).to.be.equal(CLIENT_URL + '/follow#a');
|
||||
});
|
||||
it('follows link into new tab by `F`', async () => {
|
||||
let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/follow');
|
||||
await keys.press(tab.id, 'F', { shiftKey: true });
|
||||
await new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
await keys.press(tab.id, 'a');
|
||||
await new Promise(resolve => { setTimeout(() => resolve(), 500) });
|
||||
|
||||
let win = await windows.get(targetWindow.id);
|
||||
let urls = win.tabs.map(t => t.url);
|
||||
expect(urls).to.have.lengthOf(3);
|
||||
expect(urls).to.include(CLIENT_URL + '/');
|
||||
expect(urls).to.include(CLIENT_URL + '/follow');
|
||||
expect(urls).to.include(CLIENT_URL + '/follow#a');
|
||||
});
|
||||
|
||||
it('follows link into new tab by `F`', () => {
|
||||
let targetTab;
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '/follow').then((tab) => {
|
||||
targetTab = tab;
|
||||
return keys.press(targetTab.id, 'F', { shiftKey: true });
|
||||
}).then(() => {
|
||||
return new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
}).then(() => {
|
||||
return keys.press(targetTab.id, 'a');
|
||||
}).then(() => {
|
||||
return new Promise(resolve => { setTimeout(() => resolve(), 500) });
|
||||
}).then(() => {
|
||||
return windows.get(targetWindow.id);
|
||||
}).then((win) => {
|
||||
let urls = win.tabs.map(t => t.url);
|
||||
expect(urls).to.have.lengthOf(3);
|
||||
expect(urls).to.include(CLIENT_URL + '/');
|
||||
expect(urls).to.include(CLIENT_URL + '/follow');
|
||||
expect(urls).to.include(CLIENT_URL + '/follow#a');
|
||||
});
|
||||
it('follows link with target=_blank into new tab by `f`', async () => {
|
||||
let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/follow');
|
||||
await keys.press(tab.id, 'f');
|
||||
await new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
await keys.press(tab.id, 'b');
|
||||
await new Promise(resolve => { setTimeout(() => resolve(), 500) });
|
||||
|
||||
let win = await windows.get(targetWindow.id);
|
||||
let urls = win.tabs.map(t => t.url);
|
||||
expect(urls).to.have.lengthOf(3);
|
||||
expect(urls).to.include(CLIENT_URL + '/');
|
||||
expect(urls).to.include(CLIENT_URL + '/follow');
|
||||
expect(urls).to.include(CLIENT_URL + '/follow#external');
|
||||
});
|
||||
|
||||
it('follows link with target=_blank into new tab by `f`', () => {
|
||||
let targetTab;
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '/follow').then((tab) => {
|
||||
targetTab = tab;
|
||||
return keys.press(targetTab.id, 'f');
|
||||
}).then(() => {
|
||||
return new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
}).then(() => {
|
||||
return keys.press(targetTab.id, 'b');
|
||||
}).then(() => {
|
||||
return new Promise(resolve => { setTimeout(() => resolve(), 500) });
|
||||
}).then(() => {
|
||||
return windows.get(targetWindow.id);
|
||||
}).then((win) => {
|
||||
let urls = win.tabs.map(t => t.url);
|
||||
expect(urls).to.have.lengthOf(3);
|
||||
expect(urls).to.include(CLIENT_URL + '/');
|
||||
expect(urls).to.include(CLIENT_URL + '/follow');
|
||||
expect(urls).to.include(CLIENT_URL + '/follow#external');
|
||||
});
|
||||
it('follows link with target=_blank into new tab by `F`', async () => {
|
||||
let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/follow');
|
||||
await keys.press(tab.id, 'F', { shiftKey: true });
|
||||
await new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
await keys.press(tab.id, 'b');
|
||||
await new Promise(resolve => { setTimeout(() => resolve(), 500) });
|
||||
|
||||
let win = await windows.get(targetWindow.id);
|
||||
let urls = win.tabs.map(t => t.url);
|
||||
expect(urls).to.have.lengthOf(3);
|
||||
expect(urls).to.include(CLIENT_URL + '/');
|
||||
expect(urls).to.include(CLIENT_URL + '/follow');
|
||||
expect(urls).to.include(CLIENT_URL + '/follow#external');
|
||||
});
|
||||
|
||||
it('follows link with target=_blank into new tab by `F`', () => {
|
||||
let targetTab;
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '/follow').then((tab) => {
|
||||
targetTab = tab;
|
||||
return keys.press(targetTab.id, 'F', { shiftKey: true });
|
||||
}).then(() => {
|
||||
}).then(() => {
|
||||
return new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
}).then(() => {
|
||||
return keys.press(targetTab.id, 'b');
|
||||
}).then(() => {
|
||||
return new Promise(resolve => { setTimeout(() => resolve(), 500) });
|
||||
}).then(() => {
|
||||
return windows.get(targetWindow.id);
|
||||
}).then((win) => {
|
||||
let urls = win.tabs.map(t => t.url);
|
||||
expect(urls).to.have.lengthOf(3);
|
||||
expect(urls).to.include(CLIENT_URL + '/');
|
||||
expect(urls).to.include(CLIENT_URL + '/follow');
|
||||
expect(urls).to.include(CLIENT_URL + '/follow#external');
|
||||
});
|
||||
});
|
||||
it('follows area by `F`', async () => {
|
||||
let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/follow');
|
||||
await keys.press(tab.id, 'f');
|
||||
await new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
await keys.press(tab.id, 'c');
|
||||
await new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
|
||||
it('follows area by `F`', () => {
|
||||
let targetTab;
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '/follow').then((tab) => {
|
||||
targetTab = tab;
|
||||
return keys.press(targetTab.id, 'f');
|
||||
}).then(() => {
|
||||
return new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
}).then(() => {
|
||||
return keys.press(targetTab.id, 'c');
|
||||
}).then(() => {
|
||||
return new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
}).then(() => {
|
||||
return tabs.get(targetTab.id);
|
||||
}).then((tab) => {
|
||||
expect(tab.url).to.be.equal(CLIENT_URL + '/follow#area');
|
||||
});
|
||||
tab = await tabs.get(tab.id);
|
||||
expect(tab.url).to.be.equal(CLIENT_URL + '/follow#area');
|
||||
});
|
||||
});
|
||||
|
|
|
@ -7,150 +7,96 @@ import { CLIENT_URL } from '../web-server/url';
|
|||
describe("navigate test", () => {
|
||||
let targetWindow;
|
||||
|
||||
before(() => {
|
||||
return windows.create().then((win) => {
|
||||
targetWindow = win;
|
||||
return tabs.create(targetWindow.id, CLIENT_URL);
|
||||
});
|
||||
before(async () => {
|
||||
targetWindow = await windows.create();
|
||||
await tabs.create(targetWindow.id, CLIENT_URL);
|
||||
});
|
||||
|
||||
after(() => {
|
||||
return windows.remove(targetWindow.id);
|
||||
after(async () => {
|
||||
await windows.remove(targetWindow.id);
|
||||
});
|
||||
|
||||
it('goes to parent', () => {
|
||||
let targetTab;
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '/a/b/c').then((tab) => {
|
||||
targetTab = tab;
|
||||
return keys.press(targetTab.id, 'g');
|
||||
}).then(() => {
|
||||
return keys.press(targetTab.id, 'u');
|
||||
}).then(() => {
|
||||
return new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
}).then(() => {
|
||||
return tabs.get(targetTab.id);
|
||||
}).then((tab) => {
|
||||
expect(tab.url).to.be.equal(CLIENT_URL + '/a/b/');
|
||||
});
|
||||
it('goes to parent', async () => {
|
||||
let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/a/b/c');
|
||||
await keys.press(tab.id, 'g');
|
||||
await keys.press(tab.id, 'u');
|
||||
await new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
|
||||
tab = await tabs.get(tab.id);
|
||||
expect(tab.url).to.be.equal(CLIENT_URL + '/a/b/');
|
||||
});
|
||||
|
||||
it('removes hash', () => {
|
||||
let targetTab;
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '/a/b/c#navigate').then((tab) => {
|
||||
targetTab = tab;
|
||||
return keys.press(targetTab.id, 'g');
|
||||
}).then(() => {
|
||||
return keys.press(targetTab.id, 'u');
|
||||
}).then(() => {
|
||||
return tabs.get(targetTab.id);
|
||||
}).then((tab) => {
|
||||
expect(tab.url).to.be.equal(CLIENT_URL + '/a/b/c#');
|
||||
});
|
||||
it('removes hash', async () => {
|
||||
let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/a/b/c#navigate');
|
||||
await keys.press(tab.id, 'g');
|
||||
await keys.press(tab.id, 'u');
|
||||
tab = await tabs.get(tab.id);
|
||||
expect(tab.url).to.be.equal(CLIENT_URL + '/a/b/c#');
|
||||
});
|
||||
|
||||
it('goes to root', () => {
|
||||
let targetTab;
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '/a/b/c').then((tab) => {
|
||||
targetTab = tab;
|
||||
return keys.press(targetTab.id, 'g');
|
||||
}).then(() => {
|
||||
return keys.press(targetTab.id, 'U', { shiftKey: true });
|
||||
}).then(() => {
|
||||
return new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
}).then(() => {
|
||||
return tabs.get(targetTab.id);
|
||||
}).then((tab) => {
|
||||
expect(tab.url).to.be.equal(CLIENT_URL + '/');
|
||||
});
|
||||
it('goes to root', async () => {
|
||||
let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/a/b/c');
|
||||
await keys.press(tab.id, 'g');
|
||||
await keys.press(tab.id, 'U', { shiftKey: true });
|
||||
await new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
|
||||
tab = await tabs.get(tab.id);
|
||||
expect(tab.url).to.be.equal(CLIENT_URL + '/');
|
||||
});
|
||||
|
||||
it('goes back and forward in history', () => {
|
||||
let targetTab;
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '/#navigate').then((tab) => {
|
||||
targetTab = tab;
|
||||
return keys.press(targetTab.id, 'g');
|
||||
}).then(() => {
|
||||
return keys.press(targetTab.id, 'u');
|
||||
}).then(() => {
|
||||
return keys.press(targetTab.id, 'H', { shiftKey: true });
|
||||
}).then(() => {
|
||||
return new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
}).then(() => {
|
||||
return tabs.get(targetTab.id);
|
||||
}).then((tab) => {
|
||||
expect(tab.url, 'go back in history').to.be.equal(CLIENT_URL + '/#navigate');
|
||||
}).then(() => {
|
||||
return new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
}).then(() => {
|
||||
return keys.press(targetTab.id, 'L', { shiftKey: true });
|
||||
}).then(() => {
|
||||
return tabs.get(targetTab.id);
|
||||
}).then((tab) => {
|
||||
expect(tab.url, 'go next in history').to.be.equal(CLIENT_URL + '/#');
|
||||
});
|
||||
it('goes back and forward in history', async () => {
|
||||
let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/#navigate');
|
||||
await keys.press(tab.id, 'g');
|
||||
await keys.press(tab.id, 'u');
|
||||
await keys.press(tab.id, 'H', { shiftKey: true });
|
||||
await new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
|
||||
tab = await tabs.get(tab.id);
|
||||
expect(tab.url, 'go back in history').to.be.equal(CLIENT_URL + '/#navigate');
|
||||
await new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
await keys.press(tab.id, 'L', { shiftKey: true });
|
||||
|
||||
tab = await tabs.get(tab.id);
|
||||
expect(tab.url, 'go next in history').to.be.equal(CLIENT_URL + '/#');
|
||||
});
|
||||
|
||||
it('goes previous page by <a>', () => {
|
||||
let targetTab;
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '/a-pagenation?page=10').then((tab) => {
|
||||
targetTab = tab;
|
||||
return keys.press(targetTab.id, '[');
|
||||
}).then(() => {
|
||||
return keys.press(targetTab.id, '[');
|
||||
}).then(() => {
|
||||
return new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
}).then(() => {
|
||||
return tabs.get(targetTab.id);
|
||||
}).then((tab) => {
|
||||
expect(tab.url).to.be.equal(CLIENT_URL + '/a-pagenation?page=9');
|
||||
});
|
||||
it('goes previous page by <a>', async () => {
|
||||
let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/a-pagenation?page=10');
|
||||
await keys.press(tab.id, '[');
|
||||
await keys.press(tab.id, '[');
|
||||
await new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
|
||||
tab = await tabs.get(tab.id);
|
||||
expect(tab.url).to.be.equal(CLIENT_URL + '/a-pagenation?page=9');
|
||||
})
|
||||
|
||||
it('goes next page by <a>', () => {
|
||||
let targetTab;
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '/a-pagenation?page=10').then((tab) => {
|
||||
targetTab = tab;
|
||||
return keys.press(targetTab.id, ']');
|
||||
}).then(() => {
|
||||
return keys.press(targetTab.id, ']');
|
||||
}).then(() => {
|
||||
return new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
}).then(() => {
|
||||
return tabs.get(targetTab.id);
|
||||
}).then((tab) => {
|
||||
expect(tab.url).to.be.equal(CLIENT_URL + '/a-pagenation?page=11');
|
||||
});
|
||||
it('goes next page by <a>', async () => {
|
||||
let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/a-pagenation?page=10');
|
||||
await keys.press(tab.id, ']');
|
||||
await keys.press(tab.id, ']');
|
||||
await new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
|
||||
tab = await tabs.get(tab.id);
|
||||
expect(tab.url).to.be.equal(CLIENT_URL + '/a-pagenation?page=11');
|
||||
})
|
||||
|
||||
it('goes previous page by <link>', () => {
|
||||
let targetTab;
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '/link-pagenation?page=10').then((tab) => {
|
||||
targetTab = tab;
|
||||
return keys.press(targetTab.id, '[');
|
||||
}).then(() => {
|
||||
return keys.press(targetTab.id, '[');
|
||||
}).then(() => {
|
||||
return new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
}).then(() => {
|
||||
return tabs.get(targetTab.id);
|
||||
}).then((tab) => {
|
||||
expect(tab.url).to.be.equal(CLIENT_URL + '/link-pagenation?page=9');
|
||||
});
|
||||
it('goes previous page by <link>', async () => {
|
||||
let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/link-pagenation?page=10');
|
||||
await keys.press(tab.id, '[');
|
||||
await keys.press(tab.id, '[');
|
||||
await new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
|
||||
tab = await tabs.get(tab.id);
|
||||
expect(tab.url).to.be.equal(CLIENT_URL + '/link-pagenation?page=9');
|
||||
})
|
||||
|
||||
it('goes next page by <link>', () => {
|
||||
let targetTab;
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '/link-pagenation?page=10').then((tab) => {
|
||||
targetTab = tab;
|
||||
return keys.press(targetTab.id, ']');
|
||||
}).then(() => {
|
||||
return keys.press(targetTab.id, ']');
|
||||
}).then(() => {
|
||||
return new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
}).then(() => {
|
||||
return tabs.get(targetTab.id);
|
||||
}).then((tab) => {
|
||||
expect(tab.url).to.be.equal(CLIENT_URL + '/link-pagenation?page=11');
|
||||
});
|
||||
it('goes next page by <link>', async () => {
|
||||
let tab = await tabs.create(targetWindow.id, CLIENT_URL + '/link-pagenation?page=10');
|
||||
await keys.press(tab.id, ']');
|
||||
await keys.press(tab.id, ']');
|
||||
await new Promise(resolve => { setTimeout(() => resolve(), 10) });
|
||||
|
||||
tab = await tabs.get(tab.id);
|
||||
expect(tab.url).to.be.equal(CLIENT_URL + '/link-pagenation?page=11');
|
||||
})
|
||||
});
|
||||
|
|
|
@ -8,142 +8,99 @@ describe("scroll test", () => {
|
|||
let targetWindow;
|
||||
let targetTab;
|
||||
|
||||
before(() => {
|
||||
return windows.create().then((win) => {
|
||||
targetWindow = win;
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '/scroll');
|
||||
}).then((tab) => {
|
||||
targetTab = tab;
|
||||
});
|
||||
before(async () => {
|
||||
targetWindow = await windows.create();
|
||||
targetTab = await tabs.create(targetWindow.id, CLIENT_URL + '/scroll');
|
||||
});
|
||||
|
||||
after(() => {
|
||||
return windows.remove(targetWindow.id);
|
||||
after(async () => {
|
||||
await windows.remove(targetWindow.id);
|
||||
});
|
||||
|
||||
it('scrolls up by k', () => {
|
||||
let before
|
||||
return scrolls.set(targetTab.id, 100, 100).then((scroll) => {
|
||||
before = scroll;
|
||||
return keys.press(targetTab.id, 'k');
|
||||
}).then(() => {
|
||||
return scrolls.get(targetTab.id);
|
||||
}).then((actual) => {
|
||||
expect(actual.y).to.be.lessThan(before.y);
|
||||
});
|
||||
it('scrolls up by k', async () => {
|
||||
let before = await scrolls.set(targetTab.id, 100, 100);
|
||||
await keys.press(targetTab.id, 'k');
|
||||
|
||||
let actual = await scrolls.get(targetTab.id);
|
||||
expect(actual.y).to.be.lessThan(before.y);
|
||||
});
|
||||
|
||||
it('scrolls down by j', () => {
|
||||
let before
|
||||
return scrolls.set(targetTab.id, 100, 100).then((scroll) => {
|
||||
before = scroll;
|
||||
return keys.press(targetTab.id, 'j');
|
||||
}).then(() => {
|
||||
return scrolls.get(targetTab.id);
|
||||
}).then((actual) => {
|
||||
expect(actual.y).to.be.greaterThan(before.y);
|
||||
});
|
||||
it('scrolls down by j', async () => {
|
||||
let before = await scrolls.set(targetTab.id, 100, 100);
|
||||
await keys.press(targetTab.id, 'j');
|
||||
|
||||
let actual = await scrolls.get(targetTab.id);
|
||||
expect(actual.y).to.be.greaterThan(before.y);
|
||||
});
|
||||
|
||||
it('scrolls left by h', () => {
|
||||
let before
|
||||
return scrolls.set(targetTab.id, 100, 100).then((scroll) => {
|
||||
before = scroll;
|
||||
return keys.press(targetTab.id, 'h');
|
||||
}).then(() => {
|
||||
return scrolls.get(targetTab.id);
|
||||
}).then((actual) => {
|
||||
expect(actual.x).to.be.lessThan(before.x);
|
||||
});
|
||||
it('scrolls left by h', async () => {
|
||||
let before = await scrolls.set(targetTab.id, 100, 100)
|
||||
await keys.press(targetTab.id, 'h');
|
||||
|
||||
let actual = await scrolls.get(targetTab.id);
|
||||
expect(actual.x).to.be.lessThan(before.x);
|
||||
});
|
||||
|
||||
it('scrolls top by gg', () => {
|
||||
return scrolls.set(targetTab.id, 100, 100).then((scroll) => {
|
||||
return keys.press(targetTab.id, 'g');
|
||||
}).then(() => {
|
||||
return keys.press(targetTab.id, 'g');
|
||||
}).then(() => {
|
||||
return scrolls.get(targetTab.id);
|
||||
}).then((actual) => {
|
||||
expect(actual.y).to.be.equals(0);
|
||||
});
|
||||
it('scrolls top by gg', async () => {
|
||||
await scrolls.set(targetTab.id, 100, 100);
|
||||
await keys.press(targetTab.id, 'g');
|
||||
await keys.press(targetTab.id, 'g');
|
||||
let actual = await scrolls.get(targetTab.id);
|
||||
expect(actual.y).to.be.equals(0);
|
||||
});
|
||||
|
||||
it('scrolls bottom by G', () => {
|
||||
return scrolls.set(targetTab.id, 100, 100).then((scroll) => {
|
||||
return keys.press(targetTab.id, 'G', { shiftKey: true });
|
||||
}).then(() => {
|
||||
return scrolls.get(targetTab.id);
|
||||
}).then((actual) => {
|
||||
expect(actual.y).to.be.equals(actual.yMax);
|
||||
});
|
||||
it('scrolls bottom by G', async () => {
|
||||
await scrolls.set(targetTab.id, 100, 100);
|
||||
await keys.press(targetTab.id, 'G', { shiftKey: true });
|
||||
|
||||
let actual = await scrolls.get(targetTab.id);
|
||||
expect(actual.y).to.be.equals(actual.yMax);
|
||||
});
|
||||
|
||||
it('scrolls bottom by 0', () => {
|
||||
return scrolls.set(targetTab.id, 100, 100).then((scroll) => {
|
||||
return keys.press(targetTab.id, '0');
|
||||
}).then(() => {
|
||||
return scrolls.get(targetTab.id);
|
||||
}).then((actual) => {
|
||||
expect(actual.x).to.be.equals(0);
|
||||
});
|
||||
it('scrolls bottom by 0', async () => {
|
||||
await scrolls.set(targetTab.id, 100, 100);
|
||||
await keys.press(targetTab.id, '0');
|
||||
|
||||
let actual = await scrolls.get(targetTab.id);
|
||||
expect(actual.x).to.be.equals(0);
|
||||
});
|
||||
|
||||
it('scrolls bottom by $', () => {
|
||||
return scrolls.set(targetTab.id, 100, 100).then((scroll) => {
|
||||
return keys.press(targetTab.id, '$');
|
||||
}).then(() => {
|
||||
return scrolls.get(targetTab.id);
|
||||
}).then((actual) => {
|
||||
expect(actual.x).to.be.equals(actual.xMax);
|
||||
});
|
||||
it('scrolls bottom by $', async () => {
|
||||
await scrolls.set(targetTab.id, 100, 100);
|
||||
await keys.press(targetTab.id, '$');
|
||||
|
||||
let actual = await scrolls.get(targetTab.id);
|
||||
expect(actual.x).to.be.equals(actual.xMax);
|
||||
});
|
||||
|
||||
it('scrolls bottom by <C-U>', () => {
|
||||
let before
|
||||
return scrolls.set(targetTab.id, 5000, 5000).then((scroll) => {
|
||||
before = scroll;
|
||||
return keys.press(targetTab.id, 'u', { ctrlKey: true });
|
||||
}).then(() => {
|
||||
return scrolls.get(targetTab.id);
|
||||
}).then((actual) => {
|
||||
expect(actual.y).to.closeTo(before.y - before.frameHeight / 2, 1);
|
||||
});
|
||||
it('scrolls bottom by <C-U>', async () => {
|
||||
let before = await scrolls.set(targetTab.id, 5000, 5000);
|
||||
await keys.press(targetTab.id, 'u', { ctrlKey: true });
|
||||
|
||||
let actual = await scrolls.get(targetTab.id);
|
||||
expect(actual.y).to.closeTo(before.y - before.frameHeight / 2, 1);
|
||||
});
|
||||
|
||||
it('scrolls bottom by <C-D>', () => {
|
||||
let before
|
||||
return scrolls.set(targetTab.id, 5000, 5000).then((scroll) => {
|
||||
before = scroll;
|
||||
return keys.press(targetTab.id, 'd', { ctrlKey: true });
|
||||
}).then(() => {
|
||||
return scrolls.get(targetTab.id);
|
||||
}).then((actual) => {
|
||||
expect(actual.y).to.closeTo(before.y + before.frameHeight / 2, 1);
|
||||
});
|
||||
it('scrolls bottom by <C-D>', async () => {
|
||||
let before = await scrolls.set(targetTab.id, 5000, 5000);
|
||||
await keys.press(targetTab.id, 'd', { ctrlKey: true });
|
||||
|
||||
let actual = await scrolls.get(targetTab.id);
|
||||
expect(actual.y).to.closeTo(before.y + before.frameHeight / 2, 1);
|
||||
});
|
||||
|
||||
it('scrolls bottom by <C-B>', () => {
|
||||
let before
|
||||
return scrolls.set(targetTab.id, 5000, 5000).then((scroll) => {
|
||||
before = scroll;
|
||||
return keys.press(targetTab.id, 'b', { ctrlKey: true });
|
||||
}).then(() => {
|
||||
return scrolls.get(targetTab.id);
|
||||
}).then((actual) => {
|
||||
expect(actual.y).to.equals(before.y - before.frameHeight);
|
||||
});
|
||||
it('scrolls bottom by <C-B>', async () => {
|
||||
let before = await scrolls.set(targetTab.id, 5000, 5000);
|
||||
await keys.press(targetTab.id, 'b', { ctrlKey: true });
|
||||
|
||||
let actual = await await scrolls.get(targetTab.id);
|
||||
expect(actual.y).to.equals(before.y - before.frameHeight);
|
||||
});
|
||||
|
||||
it('scrolls bottom by <C-F>', () => {
|
||||
let before
|
||||
return scrolls.set(targetTab.id, 5000, 5000).then((scroll) => {
|
||||
before = scroll;
|
||||
return keys.press(targetTab.id, 'f', { ctrlKey: true });
|
||||
}).then(() => {
|
||||
return scrolls.get(targetTab.id);
|
||||
}).then((actual) => {
|
||||
expect(actual.y).to.equals(before.y + before.frameHeight);
|
||||
});
|
||||
it('scrolls bottom by <C-F>', async () => {
|
||||
let before = await scrolls.set(targetTab.id, 5000, 5000);
|
||||
await keys.press(targetTab.id, 'f', { ctrlKey: true });
|
||||
let actual = await scrolls.get(targetTab.id);
|
||||
expect(actual.y).to.equals(before.y + before.frameHeight);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -6,260 +6,161 @@ import { CLIENT_URL } from '../web-server/url';
|
|||
describe("tab test", () => {
|
||||
let targetWindow;
|
||||
|
||||
beforeEach(() => {
|
||||
return windows.create(CLIENT_URL).then((win) => {
|
||||
targetWindow = win;
|
||||
});
|
||||
beforeEach(async () => {
|
||||
targetWindow = await windows.create(CLIENT_URL);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
return windows.remove(targetWindow.id);
|
||||
afterEach(async () => {
|
||||
await windows.remove(targetWindow.id);
|
||||
});
|
||||
|
||||
it('deletes tab by d', () => {
|
||||
let before;
|
||||
let targetTab;
|
||||
return tabs.create(targetWindow.id, CLIENT_URL).then((tab) => {
|
||||
targetTab = tab;
|
||||
return windows.get(targetWindow.id);
|
||||
}).then((win) => {
|
||||
before = win;
|
||||
return keys.press(targetTab.id, 'd');
|
||||
}).then(() => {
|
||||
return windows.get(targetWindow.id);
|
||||
}).then((actual) => {
|
||||
expect(actual.tabs).to.have.lengthOf(before.tabs.length - 1);
|
||||
});
|
||||
it('deletes tab by d', async () => {
|
||||
let tab = await tabs.create(targetWindow.id, CLIENT_URL);
|
||||
let before = await windows.get(targetWindow.id);
|
||||
await keys.press(tab.id, 'd');
|
||||
|
||||
let actual = await windows.get(targetWindow.id);
|
||||
expect(actual.tabs).to.have.lengthOf(before.tabs.length - 1);
|
||||
});
|
||||
|
||||
it('duplicates tab by zd', () => {
|
||||
let before;
|
||||
let targetTab;
|
||||
return tabs.create(targetWindow.id, CLIENT_URL).then((tab) => {
|
||||
targetTab = tab;
|
||||
return windows.get(targetWindow.id)
|
||||
}).then((win) => {;
|
||||
before = win;
|
||||
return keys.press(targetTab.id, 'z');
|
||||
}).then(() => {
|
||||
return keys.press(targetTab.id, 'd');
|
||||
}).then(() => {
|
||||
return windows.get(targetWindow.id);
|
||||
}).then((actual) => {
|
||||
expect(actual.tabs).to.have.lengthOf(before.tabs.length + 1);
|
||||
});
|
||||
})
|
||||
it('duplicates tab by zd', async () => {
|
||||
let tab = await tabs.create(targetWindow.id, CLIENT_URL);
|
||||
let before = await windows.get(targetWindow.id)
|
||||
await keys.press(tab.id, 'z');
|
||||
await keys.press(tab.id, 'd');
|
||||
|
||||
it('makes pinned by zp', () => {
|
||||
let before;
|
||||
let targetTab;
|
||||
return tabs.create(targetWindow.id, CLIENT_URL).then((tab) => {
|
||||
targetTab = tab;
|
||||
return windows.get(targetWindow.id)
|
||||
}).then((win) => {;
|
||||
before = win;
|
||||
return keys.press(targetTab.id, 'z');
|
||||
}).then(() => {
|
||||
return keys.press(targetTab.id, 'p');
|
||||
}).then(() => {
|
||||
return windows.get(targetWindow.id);
|
||||
}).then((actual) => {
|
||||
expect(actual.tabs[0].pinned).to.be.true;
|
||||
});
|
||||
})
|
||||
|
||||
it('selects previous tab by K', () => {
|
||||
return Promise.resolve().then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '#1')
|
||||
}).then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '#2')
|
||||
}).then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_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;
|
||||
});
|
||||
let actual = await windows.get(targetWindow.id);
|
||||
expect(actual.tabs).to.have.lengthOf(before.tabs.length + 1);
|
||||
});
|
||||
|
||||
it('selects previous tab by K rotatory', () => {
|
||||
return Promise.resolve().then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '#1')
|
||||
}).then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '#2')
|
||||
}).then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_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('makes pinned by zp', async () => {
|
||||
let tab = await tabs.create(targetWindow.id, CLIENT_URL);
|
||||
let before = await windows.get(targetWindow.id);
|
||||
await keys.press(tab.id, 'z');
|
||||
await keys.press(tab.id, 'p');
|
||||
|
||||
let actual = await windows.get(targetWindow.id);
|
||||
expect(actual.tabs[0].pinned).to.be.true;
|
||||
});
|
||||
|
||||
it('selects next tab by J', () => {
|
||||
return Promise.resolve().then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '#1')
|
||||
}).then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '#2')
|
||||
}).then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_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 K', async () => {
|
||||
await tabs.create(targetWindow.id, CLIENT_URL + '#1');
|
||||
await tabs.create(targetWindow.id, CLIENT_URL + '#2');
|
||||
await tabs.create(targetWindow.id, CLIENT_URL + '#3');
|
||||
let tab = await tabs.selectAt(targetWindow.id, 2);
|
||||
await keys.press(tab.id, 'K', { shiftKey: true });
|
||||
|
||||
let win = await windows.get(targetWindow.id);
|
||||
expect(win.tabs[1].active).to.be.true;
|
||||
});
|
||||
|
||||
it('selects previous tab by J rotatory', () => {
|
||||
return Promise.resolve().then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '#1')
|
||||
}).then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '#2')
|
||||
}).then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_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 previous tab by K rotatory', async () => {
|
||||
await tabs.create(targetWindow.id, CLIENT_URL + '#1');
|
||||
await tabs.create(targetWindow.id, CLIENT_URL + '#2');
|
||||
await tabs.create(targetWindow.id, CLIENT_URL + '#3');
|
||||
let tab = await tabs.selectAt(targetWindow.id, 0);
|
||||
await keys.press(tab.id, 'K', { shiftKey: true });
|
||||
|
||||
let win = await windows.get(targetWindow.id);
|
||||
expect(win.tabs[3].active).to.be.true;
|
||||
});
|
||||
|
||||
it('selects first tab by g0', () => {
|
||||
return Promise.resolve().then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '#1')
|
||||
}).then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '#2')
|
||||
}).then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_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 next tab by J', async () => {
|
||||
await tabs.create(targetWindow.id, CLIENT_URL + '#1');
|
||||
await tabs.create(targetWindow.id, CLIENT_URL + '#2');
|
||||
await tabs.create(targetWindow.id, CLIENT_URL + '#3');
|
||||
let tab = await tabs.selectAt(targetWindow.id, 2);
|
||||
await keys.press(tab.id, 'J', { shiftKey: true });
|
||||
|
||||
let win = await windows.get(targetWindow.id);
|
||||
expect(win.tabs[3].active).to.be.true;
|
||||
});
|
||||
|
||||
it('selects last tab by g$', () => {
|
||||
return Promise.resolve().then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '#1')
|
||||
}).then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '#2')
|
||||
}).then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_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('selects previous tab by J rotatory', async () => {
|
||||
await tabs.create(targetWindow.id, CLIENT_URL + '#1');
|
||||
await tabs.create(targetWindow.id, CLIENT_URL + '#2');
|
||||
await tabs.create(targetWindow.id, CLIENT_URL + '#3');
|
||||
let tab = await tabs.selectAt(targetWindow.id, 3);
|
||||
await keys.press(tab.id, 'J', { shiftKey: true });
|
||||
|
||||
let win = await windows.get(targetWindow.id);
|
||||
expect(win.tabs[0].active).to.be.true;
|
||||
});
|
||||
|
||||
it('selects last selected tab by <C-6>', () => {
|
||||
return Promise.resolve().then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '#1')
|
||||
}).then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '#2')
|
||||
}).then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '#3');
|
||||
}).then(() => {
|
||||
return tabs.selectAt(targetWindow.id, 1);
|
||||
}).then(() => {
|
||||
return tabs.selectAt(targetWindow.id, 3);
|
||||
}).then((tab) => {
|
||||
return keys.press(tab.id, '6', { ctrlKey: true });
|
||||
}).then(() => {
|
||||
return windows.get(targetWindow.id);
|
||||
}).then((win) => {
|
||||
expect(win.tabs[1].active).to.be.true;
|
||||
});
|
||||
it('selects first tab by g0', async () => {
|
||||
await tabs.create(targetWindow.id, CLIENT_URL + '#1');
|
||||
await tabs.create(targetWindow.id, CLIENT_URL + '#2');
|
||||
await tabs.create(targetWindow.id, CLIENT_URL + '#3');
|
||||
let tab = await tabs.selectAt(targetWindow.id, 2);
|
||||
await keys.press(tab.id, 'g');
|
||||
await keys.press(tab.id, '0');
|
||||
|
||||
let win = await windows.get(targetWindow.id);
|
||||
expect(win.tabs[0].active).to.be.true;
|
||||
});
|
||||
|
||||
it('deletes tab by d', () => {
|
||||
return Promise.resolve().then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_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);
|
||||
});
|
||||
it('selects last tab by g$', async () => {
|
||||
await tabs.create(targetWindow.id, CLIENT_URL + '#1');
|
||||
await tabs.create(targetWindow.id, CLIENT_URL + '#2');
|
||||
await tabs.create(targetWindow.id, CLIENT_URL + '#3');
|
||||
let tab = await tabs.selectAt(targetWindow.id, 2);
|
||||
await keys.press(tab.id, 'g');
|
||||
await keys.press(tab.id, '$');
|
||||
|
||||
let win = await windows.get(targetWindow.id);
|
||||
expect(win.tabs[3].active).to.be.true;
|
||||
});
|
||||
|
||||
it('reopen tab by u', () => {
|
||||
return Promise.resolve().then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_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);
|
||||
return keys.press(win.tabs[0].id, 'u');
|
||||
}).then(() => {
|
||||
return new Promise((resolve) => setTimeout(resolve, 100));
|
||||
}).then(() => {
|
||||
return windows.get(targetWindow.id);
|
||||
}).then((win) => {
|
||||
expect(win.tabs).to.have.lengthOf(2);
|
||||
});
|
||||
it('selects last selected tab by <C-6>', async () => {
|
||||
await tabs.create(targetWindow.id, CLIENT_URL + '#1');
|
||||
await tabs.create(targetWindow.id, CLIENT_URL + '#2');
|
||||
await tabs.create(targetWindow.id, CLIENT_URL + '#3');
|
||||
await tabs.selectAt(targetWindow.id, 1);
|
||||
let tab = await tabs.selectAt(targetWindow.id, 3);
|
||||
await keys.press(tab.id, '6', { ctrlKey: true });
|
||||
|
||||
let win = await windows.get(targetWindow.id);
|
||||
expect(win.tabs[1].active).to.be.true;
|
||||
});
|
||||
|
||||
it('does not delete pinned tab by d', () => {
|
||||
return Promise.resolve().then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '#1');
|
||||
}).then((tab) => {
|
||||
return tabs.update(tab.id, { pinned: true });
|
||||
}).then((tab) => {
|
||||
return keys.press(tab.id, 'd');
|
||||
}).then(() => {
|
||||
return windows.get(targetWindow.id);
|
||||
}).then((win) => {
|
||||
expect(win.tabs).to.have.lengthOf(2);
|
||||
});
|
||||
it('deletes tab by d', async () => {
|
||||
let tab = await tabs.create(targetWindow.id, CLIENT_URL + '#1');
|
||||
await keys.press(tab.id, 'd');
|
||||
|
||||
let win = await windows.get(targetWindow.id);
|
||||
expect(win.tabs).to.have.lengthOf(1);
|
||||
});
|
||||
|
||||
it('deletes pinned tab by !d', () => {
|
||||
let target;
|
||||
return Promise.resolve().then(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_URL + '#1');
|
||||
}).then((tab) => {
|
||||
return tabs.update(tab.id, { pinned: true });
|
||||
}).then((tab) => {
|
||||
target = tab;
|
||||
return keys.press(target.id, '!');
|
||||
}).then(() => {
|
||||
return keys.press(target.id, 'd');
|
||||
}).then(() => {
|
||||
return windows.get(targetWindow.id);
|
||||
}).then((win) => {
|
||||
expect(win.tabs).to.have.lengthOf(1);
|
||||
});
|
||||
it('reopen tab by u', async () => {
|
||||
let tab = await tabs.create(targetWindow.id, CLIENT_URL + '#1');
|
||||
await keys.press(tab.id, 'd');
|
||||
|
||||
let win = await windows.get(targetWindow.id);
|
||||
expect(win.tabs).to.have.lengthOf(1);
|
||||
|
||||
await keys.press(win.tabs[0].id, 'u');
|
||||
await new Promise((resolve) => setTimeout(resolve, 100));
|
||||
|
||||
win = await windows.get(targetWindow.id);
|
||||
expect(win.tabs).to.have.lengthOf(2);
|
||||
});
|
||||
|
||||
it('does not delete pinned tab by d', async () => {
|
||||
let tab = await tabs.create(targetWindow.id, CLIENT_URL + '#1');
|
||||
tab = await tabs.update(tab.id, { pinned: true });
|
||||
await keys.press(tab.id, 'd');
|
||||
|
||||
let win = await windows.get(targetWindow.id);
|
||||
expect(win.tabs).to.have.lengthOf(2);
|
||||
});
|
||||
|
||||
it('deletes pinned tab by !d', async () => {
|
||||
let tab = await tabs.create(targetWindow.id, CLIENT_URL + '#1');
|
||||
tab = await tabs.update(tab.id, { pinned: true });
|
||||
await keys.press(tab.id, '!');
|
||||
await keys.press(tab.id, 'd');
|
||||
|
||||
let win = await windows.get(targetWindow.id);
|
||||
expect(win.tabs).to.have.lengthOf(1);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -7,64 +7,44 @@ describe("zoom test", () => {
|
|||
let targetWindow;
|
||||
let targetTab;
|
||||
|
||||
before(() => {
|
||||
return windows.create(CLIENT_URL).then((win) => {
|
||||
targetWindow = win;
|
||||
});
|
||||
before(async () => {
|
||||
targetWindow = await windows.create(CLIENT_URL);
|
||||
});
|
||||
|
||||
after(() => {
|
||||
return windows.remove(targetWindow.id);
|
||||
after(async () => {
|
||||
await windows.remove(targetWindow.id);
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
return tabs.create(targetWindow.id, CLIENT_URL).then((tab) => {
|
||||
targetTab = tab;
|
||||
});
|
||||
beforeEach(async () => {
|
||||
targetTab = await tabs.create(targetWindow.id, CLIENT_URL);
|
||||
});
|
||||
|
||||
it('zooms-in by zi', () => {
|
||||
let before;
|
||||
return tabs.getZoom(targetTab.id).then((zoom) => {
|
||||
before = zoom;
|
||||
return keys.press(targetTab.id, 'z');
|
||||
}).then(() => {
|
||||
return keys.press(targetTab.id, 'i');
|
||||
}).then(() => {
|
||||
return tabs.getZoom(targetTab.id);
|
||||
}).then((actual) => {
|
||||
expect(actual).to.be.greaterThan(before);
|
||||
});
|
||||
it('zooms-in by zi', async () => {
|
||||
let before = await tabs.getZoom(targetTab.id);
|
||||
await keys.press(targetTab.id, 'z');
|
||||
await keys.press(targetTab.id, 'i');
|
||||
|
||||
let actual = await tabs.getZoom(targetTab.id);
|
||||
expect(actual).to.be.greaterThan(before);
|
||||
});
|
||||
|
||||
it('zooms-in by zo', () => {
|
||||
let before;
|
||||
return tabs.getZoom(targetTab.id).then((zoom) => {
|
||||
before = zoom;
|
||||
return keys.press(targetTab.id, 'z');
|
||||
}).then(() => {
|
||||
return keys.press(targetTab.id, 'o');
|
||||
}).then(() => {
|
||||
return tabs.getZoom(targetTab.id);
|
||||
}).then((actual) => {
|
||||
expect(actual).to.be.lessThan(before);
|
||||
});
|
||||
it('zooms-in by zo', async () => {
|
||||
let before = await tabs.getZoom(targetTab.id);
|
||||
await keys.press(targetTab.id, 'z');
|
||||
await keys.press(targetTab.id, 'o');
|
||||
|
||||
let actual = await tabs.getZoom(targetTab.id);
|
||||
expect(actual).to.be.lessThan(before);
|
||||
});
|
||||
|
||||
it('zooms-in by zz', () => {
|
||||
let before;
|
||||
tabs.setZoom(targetTab.id, 1.5).then(() => {
|
||||
return tabs.getZoom(targetTab.id);
|
||||
}).then((zoom) => {
|
||||
before = zoom;
|
||||
return keys.press(targetTab.id, 'z');
|
||||
}).then(() => {
|
||||
return keys.press(targetTab.id, 'z');
|
||||
}).then(() => {
|
||||
return tabs.getZoom(targetTab.id);
|
||||
}).then((actual) => {
|
||||
expect(actual).to.be.lessThan(before);
|
||||
expect(actual).to.be.be(1);
|
||||
});
|
||||
it('zooms-in by zz', async () => {
|
||||
await tabs.setZoom(targetTab.id, 1.5);
|
||||
let before = await tabs.getZoom(targetTab.id);
|
||||
await keys.press(targetTab.id, 'z');
|
||||
await keys.press(targetTab.id, 'z');
|
||||
|
||||
let actual = await tabs.getZoom(targetTab.id);
|
||||
expect(actual).to.be.lessThan(before);
|
||||
expect(actual).to.equal(1);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -5,56 +5,63 @@ import * as bookmarks from '../shared/bookmarks';
|
|||
import * as parsers from 'shared/commands/parsers';
|
||||
import * as properties from 'shared/settings/properties';
|
||||
|
||||
const openCommand = (url) => {
|
||||
return browser.tabs.query({
|
||||
const openCommand = async(url) => {
|
||||
let got = await browser.tabs.query({
|
||||
active: true, currentWindow: true
|
||||
}).then((gotTabs) => {
|
||||
if (gotTabs.length > 0) {
|
||||
return browser.tabs.update(gotTabs[0].id, { url: url });
|
||||
}
|
||||
});
|
||||
if (got.length > 0) {
|
||||
return browser.tabs.update(got[0].id, { url: url });
|
||||
}
|
||||
};
|
||||
|
||||
const tabopenCommand = (url) => {
|
||||
return browser.tabs.create({ url: url });
|
||||
};
|
||||
|
||||
const tabcloseCommand = () => {
|
||||
return browser.tabs.query({
|
||||
const tabcloseCommand = async() => {
|
||||
let got = await browser.tabs.query({
|
||||
active: true, currentWindow: true
|
||||
}).then((tabList) => {
|
||||
return browser.tabs.remove(tabList.map(tab => tab.id));
|
||||
});
|
||||
return browser.tabs.remove(got.map(tab => tab.id));
|
||||
};
|
||||
|
||||
const winopenCommand = (url) => {
|
||||
return browser.windows.create({ url });
|
||||
};
|
||||
|
||||
const bufferCommand = (keywords) => {
|
||||
const bufferCommand = async(keywords) => {
|
||||
if (keywords.length === 0) {
|
||||
return Promise.resolve([]);
|
||||
}
|
||||
let keywordsStr = keywords.join(' ');
|
||||
return browser.tabs.query({
|
||||
let got = await browser.tabs.query({
|
||||
active: true, currentWindow: true
|
||||
}).then((gotTabs) => {
|
||||
if (gotTabs.length > 0) {
|
||||
if (isNaN(keywordsStr)) {
|
||||
return tabs.selectByKeyword(gotTabs[0], keywordsStr);
|
||||
}
|
||||
let index = parseInt(keywordsStr, 10) - 1;
|
||||
return tabs.selectAt(index);
|
||||
}
|
||||
});
|
||||
if (got.length === 0) {
|
||||
return;
|
||||
}
|
||||
if (isNaN(keywordsStr)) {
|
||||
return tabs.selectByKeyword(got[0], keywordsStr);
|
||||
}
|
||||
let index = parseInt(keywordsStr, 10) - 1;
|
||||
return tabs.selectAt(index);
|
||||
};
|
||||
|
||||
const addBookmarkCommand = (tab, args) => {
|
||||
const addbookmarkCommand = async(tab, args) => {
|
||||
if (!args[0]) {
|
||||
return Promise.resolve();
|
||||
return;
|
||||
}
|
||||
|
||||
return bookmarks.create(args.join(' '), tab.url);
|
||||
let item = await bookmarks.create(args.join(' '), tab.url);
|
||||
if (!item) {
|
||||
return browser.tabs.sendMessage(tab.id, {
|
||||
type: messages.CONSOLE_SHOW_ERROR,
|
||||
text: 'Could not create a bookmark',
|
||||
});
|
||||
}
|
||||
return browser.tabs.sendMessage(tab.id, {
|
||||
type: messages.CONSOLE_SHOW_INFO,
|
||||
text: 'Saved current page: ' + item.url,
|
||||
});
|
||||
};
|
||||
|
||||
const setCommand = (args) => {
|
||||
|
@ -100,18 +107,7 @@ const exec = (tab, line, settings) => {
|
|||
case 'bdeletes!':
|
||||
return tabs.closeTabsByKeywordsForce(args.join(' '));
|
||||
case 'addbookmark':
|
||||
return addBookmarkCommand(tab, args).then((item) => {
|
||||
if (!item) {
|
||||
return browser.tabs.sendMessage(tab.id, {
|
||||
type: messages.CONSOLE_SHOW_ERROR,
|
||||
text: 'Could not create a bookmark',
|
||||
});
|
||||
}
|
||||
return browser.tabs.sendMessage(tab.id, {
|
||||
type: messages.CONSOLE_SHOW_INFO,
|
||||
text: 'Saved current page: ' + item.url,
|
||||
});
|
||||
});
|
||||
return addbookmarkCommand(tab, args);
|
||||
case 'set':
|
||||
return setCommand(args);
|
||||
case 'q':
|
||||
|
|
|
@ -1,13 +1,12 @@
|
|||
import actions from '../actions';
|
||||
import * as settingsStorage from 'shared/settings/storage';
|
||||
|
||||
const load = () => {
|
||||
return settingsStorage.loadValue().then((value) => {
|
||||
return {
|
||||
type: actions.SETTING_SET_SETTINGS,
|
||||
value,
|
||||
};
|
||||
});
|
||||
const load = async() => {
|
||||
let value = await settingsStorage.loadValue();
|
||||
return {
|
||||
type: actions.SETTING_SET_SETTINGS,
|
||||
value,
|
||||
};
|
||||
};
|
||||
|
||||
const setProperty = (name, value) => {
|
||||
|
|
|
@ -1,19 +1,20 @@
|
|||
import actions from './index';
|
||||
|
||||
const openNewTab = (url, openerTabId, background = false, adjacent = false) => {
|
||||
if (adjacent) {
|
||||
return browser.tabs.query({
|
||||
active: true, currentWindow: true
|
||||
}).then((tabs) => {
|
||||
return browser.tabs.create({
|
||||
url,
|
||||
openerTabId,
|
||||
active: !background,
|
||||
index: tabs[0].index + 1
|
||||
});
|
||||
});
|
||||
const openNewTab = async(
|
||||
url, openerTabId, background = false, adjacent = false
|
||||
) => {
|
||||
if (!adjacent) {
|
||||
return browser.tabs.create({ url, active: !background });
|
||||
}
|
||||
return browser.tabs.create({ url, active: !background });
|
||||
let tabs = await browser.tabs.query({
|
||||
active: true, currentWindow: true
|
||||
});
|
||||
return browser.tabs.create({
|
||||
url,
|
||||
openerTabId,
|
||||
active: !background,
|
||||
index: tabs[0].index + 1
|
||||
});
|
||||
};
|
||||
|
||||
const openToTab = (url, tab) => {
|
||||
|
|
|
@ -56,13 +56,12 @@ export default class BackgroundComponent {
|
|||
}
|
||||
}
|
||||
|
||||
broadcastSettingsChanged() {
|
||||
return browser.tabs.query({}).then((tabs) => {
|
||||
for (let tab of tabs) {
|
||||
browser.tabs.sendMessage(tab.id, {
|
||||
type: messages.SETTINGS_CHANGED,
|
||||
});
|
||||
}
|
||||
});
|
||||
async broadcastSettingsChanged() {
|
||||
let tabs = await browser.tabs.query({});
|
||||
for (let tab of tabs) {
|
||||
browser.tabs.sendMessage(tab.id, {
|
||||
type: messages.SETTINGS_CHANGED,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,19 +8,17 @@ export default class IndicatorComponent {
|
|||
messages.onMessage(this.onMessage.bind(this));
|
||||
|
||||
browser.browserAction.onClicked.addListener(this.onClicked);
|
||||
browser.tabs.onActivated.addListener((info) => {
|
||||
return browser.tabs.query({ currentWindow: true }).then(() => {
|
||||
return this.onTabActivated(info);
|
||||
});
|
||||
browser.tabs.onActivated.addListener(async(info) => {
|
||||
await browser.tabs.query({ currentWindow: true });
|
||||
return this.onTabActivated(info);
|
||||
});
|
||||
}
|
||||
|
||||
onTabActivated(info) {
|
||||
return browser.tabs.sendMessage(info.tabId, {
|
||||
async onTabActivated(info) {
|
||||
let { enabled } = await browser.tabs.sendMessage(info.tabId, {
|
||||
type: messages.ADDON_ENABLED_QUERY,
|
||||
}).then((resp) => {
|
||||
return this.updateIndicator(resp.enabled);
|
||||
});
|
||||
return this.updateIndicator(enabled);
|
||||
}
|
||||
|
||||
onClicked(tab) {
|
||||
|
|
|
@ -4,10 +4,9 @@ export default class TabComponent {
|
|||
constructor(store) {
|
||||
this.store = store;
|
||||
|
||||
browser.tabs.onActivated.addListener((info) => {
|
||||
return browser.tabs.query({ currentWindow: true }).then(() => {
|
||||
return this.onTabActivated(info);
|
||||
});
|
||||
browser.tabs.onActivated.addListener(async(info) => {
|
||||
await browser.tabs.query({ currentWindow: true });
|
||||
return this.onTabActivated(info);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -18,6 +18,15 @@ const store = createStore(reducers, (e, sender) => {
|
|||
}
|
||||
});
|
||||
|
||||
const checkAndNotifyUpdated = async() => {
|
||||
let updated = await versions.checkUpdated();
|
||||
if (!updated) {
|
||||
return;
|
||||
}
|
||||
await versions.notify();
|
||||
await versions.commit();
|
||||
};
|
||||
|
||||
/* eslint-disable no-unused-vars */
|
||||
const backgroundComponent = new BackgroundComponent(store);
|
||||
const operationComponent = new OperationComponent(store);
|
||||
|
@ -27,11 +36,4 @@ const indicatorComponent = new IndicatorComponent(store);
|
|||
|
||||
store.dispatch(settingActions.load());
|
||||
|
||||
versions.checkUpdated().then((updated) => {
|
||||
if (!updated) {
|
||||
return;
|
||||
}
|
||||
return versions.notify();
|
||||
}).then(() => {
|
||||
return versions.commit();
|
||||
});
|
||||
checkAndNotifyUpdated();
|
||||
|
|
|
@ -1,15 +1,14 @@
|
|||
const getCompletions = (keywords) => {
|
||||
return browser.bookmarks.search({ query: keywords }).then((items) => {
|
||||
return items.filter((item) => {
|
||||
let url = undefined;
|
||||
try {
|
||||
url = new URL(item.url);
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
return item.type === 'bookmark' && url.protocol !== 'place:';
|
||||
}).slice(0, 10);
|
||||
});
|
||||
const getCompletions = async(keywords) => {
|
||||
let items = await browser.bookmarks.search({ query: keywords });
|
||||
return items.filter((item) => {
|
||||
let url = undefined;
|
||||
try {
|
||||
url = new URL(item.url);
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
return item.type === 'bookmark' && url.protocol !== 'place:';
|
||||
}).slice(0, 10);
|
||||
};
|
||||
|
||||
export { getCompletions };
|
||||
|
|
|
@ -61,23 +61,22 @@ const reduceByOrigin = (items, min) => {
|
|||
return filtered;
|
||||
};
|
||||
|
||||
const getCompletions = (keyword) => {
|
||||
return browser.history.search({
|
||||
const getCompletions = async(keyword) => {
|
||||
let historyItems = await browser.history.search({
|
||||
text: keyword,
|
||||
startTime: 0,
|
||||
}).then((historyItems) => {
|
||||
return [historyItems.map(item => [item, new URL(item.url)])]
|
||||
.map(filterEmptyTitle)
|
||||
.map(filterHttp)
|
||||
.map(filterClosedPath)
|
||||
.map(items => reduceByPathname(items, 10))
|
||||
.map(items => reduceByOrigin(items, 10))
|
||||
.map(items => items
|
||||
.sort((x, y) => x[0].visitCount < y[0].visitCount)
|
||||
.slice(0, 10)
|
||||
.map(item => item[0])
|
||||
)[0];
|
||||
});
|
||||
return [historyItems.map(item => [item, new URL(item.url)])]
|
||||
.map(filterEmptyTitle)
|
||||
.map(filterHttp)
|
||||
.map(filterClosedPath)
|
||||
.map(items => reduceByPathname(items, 10))
|
||||
.map(items => reduceByOrigin(items, 10))
|
||||
.map(items => items
|
||||
.sort((x, y) => x[0].visitCount < y[0].visitCount)
|
||||
.slice(0, 10)
|
||||
.map(item => item[0])
|
||||
)[0];
|
||||
};
|
||||
|
||||
export { getCompletions };
|
||||
|
|
|
@ -12,76 +12,66 @@ const getSearchCompletions = (command, keywords, searchConfig) => {
|
|||
return Promise.resolve(engineItems);
|
||||
};
|
||||
|
||||
const getHistoryCompletions = (command, keywords) => {
|
||||
return histories.getCompletions(keywords).then((pages) => {
|
||||
return pages.map((page) => {
|
||||
return {
|
||||
caption: page.title,
|
||||
content: command + ' ' + page.url,
|
||||
url: page.url
|
||||
};
|
||||
});
|
||||
const getHistoryCompletions = async(command, keywords) => {
|
||||
let items = await histories.getCompletions(keywords);
|
||||
return items.map((page) => {
|
||||
return {
|
||||
caption: page.title,
|
||||
content: command + ' ' + page.url,
|
||||
url: page.url
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
const getBookmarksCompletions = (command, keywords) => {
|
||||
return bookmarks.getCompletions(keywords).then((items) => {
|
||||
return items.map((item) => {
|
||||
return {
|
||||
caption: item.title,
|
||||
content: command + ' ' + item.url,
|
||||
url: item.url,
|
||||
};
|
||||
});
|
||||
});
|
||||
const getBookmarksCompletions = async(command, keywords) => {
|
||||
let items = await bookmarks.getCompletions(keywords);
|
||||
return items.map(item => ({
|
||||
caption: item.title,
|
||||
content: command + ' ' + item.url,
|
||||
url: item.url,
|
||||
}));
|
||||
};
|
||||
|
||||
const getOpenCompletions = (command, keywords, searchConfig) => {
|
||||
return Promise.all([
|
||||
getSearchCompletions(command, keywords, searchConfig),
|
||||
getHistoryCompletions(command, keywords),
|
||||
getBookmarksCompletions(command, keywords),
|
||||
]).then(([engineItems, historyItems, bookmarkItems]) => {
|
||||
let completions = [];
|
||||
if (engineItems.length > 0) {
|
||||
completions.push({
|
||||
name: 'Search Engines',
|
||||
items: engineItems
|
||||
});
|
||||
}
|
||||
if (historyItems.length > 0) {
|
||||
completions.push({
|
||||
name: 'History',
|
||||
items: historyItems
|
||||
});
|
||||
}
|
||||
if (bookmarkItems.length > 0) {
|
||||
completions.push({
|
||||
name: 'Bookmarks',
|
||||
items: bookmarkItems
|
||||
});
|
||||
}
|
||||
return completions;
|
||||
});
|
||||
const getOpenCompletions = async(command, keywords, searchConfig) => {
|
||||
let engineItems = await getSearchCompletions(command, keywords, searchConfig);
|
||||
let historyItems = await getHistoryCompletions(command, keywords);
|
||||
let bookmarkItems = await getBookmarksCompletions(command, keywords);
|
||||
let completions = [];
|
||||
if (engineItems.length > 0) {
|
||||
completions.push({
|
||||
name: 'Search Engines',
|
||||
items: engineItems
|
||||
});
|
||||
}
|
||||
if (historyItems.length > 0) {
|
||||
completions.push({
|
||||
name: 'History',
|
||||
items: historyItems
|
||||
});
|
||||
}
|
||||
if (bookmarkItems.length > 0) {
|
||||
completions.push({
|
||||
name: 'Bookmarks',
|
||||
items: bookmarkItems
|
||||
});
|
||||
}
|
||||
return completions;
|
||||
};
|
||||
|
||||
const getBufferCompletions = (command, keywords, excludePinned) => {
|
||||
return tabs.getCompletions(keywords, excludePinned).then((got) => {
|
||||
let items = got.map((tab) => {
|
||||
return {
|
||||
caption: tab.title,
|
||||
content: command + ' ' + tab.title,
|
||||
url: tab.url,
|
||||
icon: tab.favIconUrl
|
||||
};
|
||||
});
|
||||
return [
|
||||
{
|
||||
name: 'Buffers',
|
||||
items: items
|
||||
}
|
||||
];
|
||||
});
|
||||
const getBufferCompletions = async(command, keywords, excludePinned) => {
|
||||
let items = await tabs.getCompletions(keywords, excludePinned);
|
||||
items = items.map(tab => ({
|
||||
caption: tab.title,
|
||||
content: command + ' ' + tab.title,
|
||||
url: tab.url,
|
||||
icon: tab.favIconUrl
|
||||
}));
|
||||
return [
|
||||
{
|
||||
name: 'Buffers',
|
||||
items: items
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
const getCompletions = (line, settings) => {
|
||||
|
|
|
@ -1,143 +1,127 @@
|
|||
import * as tabCompletions from './completions/tabs';
|
||||
|
||||
const closeTab = (id) => {
|
||||
return browser.tabs.get(id).then((tab) => {
|
||||
if (!tab.pinned) {
|
||||
return browser.tabs.remove(id);
|
||||
}
|
||||
});
|
||||
const closeTab = async(id) => {
|
||||
let tab = await browser.tabs.get(id);
|
||||
if (!tab.pinned) {
|
||||
return browser.tabs.remove(id);
|
||||
}
|
||||
};
|
||||
|
||||
const closeTabForce = (id) => {
|
||||
return browser.tabs.remove(id);
|
||||
};
|
||||
|
||||
const queryByKeyword = (keyword, excludePinned = false) => {
|
||||
return browser.tabs.query({ currentWindow: true }).then((tabs) => {
|
||||
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);
|
||||
});
|
||||
const queryByKeyword = async(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);
|
||||
});
|
||||
};
|
||||
|
||||
const closeTabByKeywords = (keyword) => {
|
||||
return queryByKeyword(keyword, false).then((tabs) => {
|
||||
if (tabs.length === 0) {
|
||||
throw new Error('No matching buffer for ' + keyword);
|
||||
} else if (tabs.length > 1) {
|
||||
throw new Error('More than one match for ' + keyword);
|
||||
const closeTabByKeywords = async(keyword) => {
|
||||
let tabs = await queryByKeyword(keyword, false);
|
||||
if (tabs.length === 0) {
|
||||
throw new Error('No matching buffer for ' + keyword);
|
||||
} else if (tabs.length > 1) {
|
||||
throw new Error('More than one match for ' + keyword);
|
||||
}
|
||||
return browser.tabs.remove(tabs[0].id);
|
||||
};
|
||||
|
||||
const closeTabByKeywordsForce = async(keyword) => {
|
||||
let tabs = await queryByKeyword(keyword, true);
|
||||
if (tabs.length === 0) {
|
||||
throw new Error('No matching buffer for ' + keyword);
|
||||
} else if (tabs.length > 1) {
|
||||
throw new Error('More than one match for ' + keyword);
|
||||
}
|
||||
return browser.tabs.remove(tabs[0].id);
|
||||
};
|
||||
|
||||
const closeTabsByKeywords = async(keyword) => {
|
||||
let tabs = await tabCompletions.getCompletions(keyword);
|
||||
tabs = tabs.filter(tab => !tab.pinned);
|
||||
return browser.tabs.remove(tabs.map(tab => tab.id));
|
||||
};
|
||||
|
||||
const closeTabsByKeywordsForce = async(keyword) => {
|
||||
let tabs = await tabCompletions.getCompletions(keyword);
|
||||
return browser.tabs.remove(tabs.map(tab => tab.id));
|
||||
};
|
||||
|
||||
const reopenTab = async() => {
|
||||
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);
|
||||
};
|
||||
|
||||
const selectAt = async(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 });
|
||||
};
|
||||
|
||||
const selectByKeyword = async(current, keyword) => {
|
||||
let tabs = await queryByKeyword(keyword);
|
||||
if (tabs.length === 0) {
|
||||
throw new RangeError('No matching buffer for ' + keyword);
|
||||
}
|
||||
for (let tab of tabs) {
|
||||
if (tab.index > current.index) {
|
||||
return browser.tabs.update(tab.id, { active: true });
|
||||
}
|
||||
browser.tabs.remove(tabs[0].id);
|
||||
});
|
||||
}
|
||||
return browser.tabs.update(tabs[0].id, { active: true });
|
||||
};
|
||||
|
||||
const closeTabByKeywordsForce = (keyword) => {
|
||||
return queryByKeyword(keyword, true).then((tabs) => {
|
||||
if (tabs.length === 0) {
|
||||
throw new Error('No matching buffer for ' + keyword);
|
||||
} else if (tabs.length > 1) {
|
||||
throw new Error('More than one match for ' + keyword);
|
||||
}
|
||||
browser.tabs.remove(tabs[0].id);
|
||||
});
|
||||
const selectPrevTab = async(current, count) => {
|
||||
let tabs = await browser.tabs.query({ currentWindow: true });
|
||||
if (tabs.length < 2) {
|
||||
return;
|
||||
}
|
||||
let select = (current - count + tabs.length) % tabs.length;
|
||||
let id = tabs[select].id;
|
||||
return browser.tabs.update(id, { active: true });
|
||||
};
|
||||
|
||||
const closeTabsByKeywords = (keyword) => {
|
||||
tabCompletions.getCompletions(keyword).then((tabs) => {
|
||||
let tabs2 = tabs.filter(tab => !tab.pinned);
|
||||
browser.tabs.remove(tabs2.map(tab => tab.id));
|
||||
});
|
||||
const selectNextTab = async(current, count) => {
|
||||
let tabs = await browser.tabs.query({ currentWindow: true });
|
||||
if (tabs.length < 2) {
|
||||
return;
|
||||
}
|
||||
let select = (current + count) % tabs.length;
|
||||
let id = tabs[select].id;
|
||||
return browser.tabs.update(id, { active: true });
|
||||
};
|
||||
|
||||
const closeTabsByKeywordsForce = (keyword) => {
|
||||
tabCompletions.getCompletions(keyword).then((tabs) => {
|
||||
browser.tabs.remove(tabs.map(tab => tab.id));
|
||||
});
|
||||
const selectFirstTab = async() => {
|
||||
let tabs = await browser.tabs.query({ currentWindow: true });
|
||||
let id = tabs[0].id;
|
||||
return browser.tabs.update(id, { active: true });
|
||||
};
|
||||
|
||||
const reopenTab = () => {
|
||||
let window = null;
|
||||
return browser.windows.getCurrent().then().then((w) => {
|
||||
window = w;
|
||||
return browser.sessions.getRecentlyClosed();
|
||||
}).then((sessions) => {
|
||||
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);
|
||||
});
|
||||
};
|
||||
|
||||
const selectAt = (index) => {
|
||||
return browser.tabs.query({ currentWindow: true }).then((tabs) => {
|
||||
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 });
|
||||
});
|
||||
};
|
||||
|
||||
const selectByKeyword = (current, keyword) => {
|
||||
return queryByKeyword(keyword).then((tabs) => {
|
||||
if (tabs.length === 0) {
|
||||
throw new RangeError('No matching buffer for ' + keyword);
|
||||
}
|
||||
for (let tab of tabs) {
|
||||
if (tab.index > current.index) {
|
||||
return browser.tabs.update(tab.id, { active: true });
|
||||
}
|
||||
}
|
||||
return browser.tabs.update(tabs[0].id, { active: true });
|
||||
});
|
||||
};
|
||||
|
||||
const selectPrevTab = (current, count) => {
|
||||
return browser.tabs.query({ currentWindow: true }).then((tabs) => {
|
||||
if (tabs.length < 2) {
|
||||
return;
|
||||
}
|
||||
let select = (current - count + tabs.length) % tabs.length;
|
||||
let id = tabs[select].id;
|
||||
return browser.tabs.update(id, { active: true });
|
||||
});
|
||||
};
|
||||
|
||||
const selectNextTab = (current, count) => {
|
||||
return browser.tabs.query({ currentWindow: true }).then((tabs) => {
|
||||
if (tabs.length < 2) {
|
||||
return;
|
||||
}
|
||||
let select = (current + count) % tabs.length;
|
||||
let id = tabs[select].id;
|
||||
return browser.tabs.update(id, { active: true });
|
||||
});
|
||||
};
|
||||
|
||||
const selectFirstTab = () => {
|
||||
return browser.tabs.query({ currentWindow: true }).then((tabs) => {
|
||||
let id = tabs[0].id;
|
||||
return browser.tabs.update(id, { active: true });
|
||||
});
|
||||
};
|
||||
|
||||
const selectLastTab = () => {
|
||||
return browser.tabs.query({ currentWindow: true }).then((tabs) => {
|
||||
let id = tabs[tabs.length - 1].id;
|
||||
return browser.tabs.update(id, { active: true });
|
||||
});
|
||||
const selectLastTab = async() => {
|
||||
let tabs = await browser.tabs.query({ currentWindow: true });
|
||||
let id = tabs[tabs.length - 1].id;
|
||||
return browser.tabs.update(id, { active: true });
|
||||
};
|
||||
|
||||
const selectTab = (id) => {
|
||||
|
@ -152,14 +136,11 @@ const reload = (current, cache) => {
|
|||
};
|
||||
|
||||
const updateTabPinned = (current, pinned) => {
|
||||
return browser.tabs.query({ currentWindow: true, active: true })
|
||||
.then(() => {
|
||||
return browser.tabs.update(current.id, { pinned: pinned });
|
||||
});
|
||||
return browser.tabs.update(current.id, { pinned });
|
||||
};
|
||||
|
||||
const toggleTabPinned = (current) => {
|
||||
updateTabPinned(current, !current.pinned);
|
||||
return updateTabPinned(current, !current.pinned);
|
||||
};
|
||||
|
||||
const duplicate = (id) => {
|
||||
|
|
|
@ -9,26 +9,20 @@ const ZOOM_SETTINGS = [
|
|||
1.10, 1.25, 1.50, 1.75, 2.00, 2.50, 3.00
|
||||
];
|
||||
|
||||
const zoomIn = (tabId = undefined) => {
|
||||
return browser.tabs.getZoom(tabId).then((factor) => {
|
||||
for (let f of ZOOM_SETTINGS) {
|
||||
if (f > factor) {
|
||||
browser.tabs.setZoom(tabId, f);
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
const zoomIn = async(tabId = undefined) => {
|
||||
let current = await browser.tabs.getZoom(tabId);
|
||||
let factor = ZOOM_SETTINGS.find(f => f > current);
|
||||
if (factor) {
|
||||
return browser.tabs.setZoom(tabId, factor);
|
||||
}
|
||||
};
|
||||
|
||||
const zoomOut = (tabId = undefined) => {
|
||||
return browser.tabs.getZoom(tabId).then((factor) => {
|
||||
for (let f of [].concat(ZOOM_SETTINGS).reverse()) {
|
||||
if (f < factor) {
|
||||
browser.tabs.setZoom(tabId, f);
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
const zoomOut = async(tabId = undefined) => {
|
||||
let current = await browser.tabs.getZoom(tabId);
|
||||
let factor = [].concat(ZOOM_SETTINGS).reverse().find(f => f < current);
|
||||
if (factor) {
|
||||
return browser.tabs.setZoom(tabId, factor);
|
||||
}
|
||||
};
|
||||
|
||||
const neutral = (tabId = undefined) => {
|
||||
|
|
|
@ -107,16 +107,15 @@ export default class ConsoleComponent {
|
|||
}
|
||||
}
|
||||
|
||||
onInput(e) {
|
||||
async onInput(e) {
|
||||
this.store.dispatch(consoleActions.setConsoleText(e.target.value));
|
||||
|
||||
let source = e.target.value;
|
||||
return browser.runtime.sendMessage({
|
||||
let completions = await browser.runtime.sendMessage({
|
||||
type: messages.CONSOLE_QUERY_COMPLETIONS,
|
||||
text: source,
|
||||
}).then((completions) => {
|
||||
this.store.dispatch(consoleActions.setCompletions(source, completions));
|
||||
});
|
||||
this.store.dispatch(consoleActions.setCompletions(source, completions));
|
||||
}
|
||||
|
||||
onInputShown(state) {
|
||||
|
|
|
@ -35,47 +35,45 @@ const find = (string, backwards) => {
|
|||
|
||||
// NOTE: aWholeWord dows not implemented, and aSearchInFrames does not work
|
||||
// because of same origin policy
|
||||
let found = window.find(string, caseSensitive, backwards, wrapScan);
|
||||
if (found) {
|
||||
return found;
|
||||
}
|
||||
window.getSelection().removeAllRanges();
|
||||
return window.find(string, caseSensitive, backwards, wrapScan);
|
||||
};
|
||||
|
||||
const findNext = (currentKeyword, reset, backwards) => {
|
||||
const findNext = async(currentKeyword, reset, backwards) => {
|
||||
if (reset) {
|
||||
window.getSelection().removeAllRanges();
|
||||
}
|
||||
|
||||
let promise = Promise.resolve(currentKeyword);
|
||||
let keyword = currentKeyword;
|
||||
if (currentKeyword) {
|
||||
browser.runtime.sendMessage({
|
||||
type: messages.FIND_SET_KEYWORD,
|
||||
keyword: currentKeyword,
|
||||
});
|
||||
} else {
|
||||
promise = browser.runtime.sendMessage({
|
||||
keyword = await browser.runtime.sendMessage({
|
||||
type: messages.FIND_GET_KEYWORD,
|
||||
});
|
||||
}
|
||||
if (!keyword) {
|
||||
return postNoPrevious();
|
||||
}
|
||||
let found = find(keyword, backwards);
|
||||
if (found) {
|
||||
postPatternFound(keyword);
|
||||
} else {
|
||||
postPatternNotFound(keyword);
|
||||
}
|
||||
|
||||
return promise.then((keyword) => {
|
||||
if (!keyword) {
|
||||
return postNoPrevious();
|
||||
}
|
||||
let found = find(keyword, backwards);
|
||||
if (!found) {
|
||||
window.getSelection().removeAllRanges();
|
||||
found = find(keyword, backwards);
|
||||
}
|
||||
if (found) {
|
||||
postPatternFound(keyword);
|
||||
} else {
|
||||
postPatternNotFound(keyword);
|
||||
}
|
||||
|
||||
return {
|
||||
type: actions.FIND_SET_KEYWORD,
|
||||
keyword,
|
||||
found,
|
||||
};
|
||||
});
|
||||
return {
|
||||
type: actions.FIND_SET_KEYWORD,
|
||||
keyword,
|
||||
found,
|
||||
};
|
||||
};
|
||||
|
||||
const next = (currentKeyword, reset) => {
|
||||
|
|
|
@ -44,15 +44,16 @@ export default class Common {
|
|||
}
|
||||
}
|
||||
|
||||
reloadSettings() {
|
||||
browser.runtime.sendMessage({
|
||||
type: messages.SETTINGS_QUERY,
|
||||
}).then((settings) => {
|
||||
async reloadSettings() {
|
||||
try {
|
||||
let settings = await browser.runtime.sendMessage({
|
||||
type: messages.SETTINGS_QUERY,
|
||||
});
|
||||
this.store.dispatch(settingActions.set(settings));
|
||||
}).catch((e) => {
|
||||
} catch (e) {
|
||||
// Sometime sendMessage fails when background script is not ready.
|
||||
console.warn(e);
|
||||
setTimeout(() => this.reloadSettings(), 500);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,20 +4,17 @@ import DefaultSettings from 'shared/settings/default';
|
|||
import * as settingsStorage from 'shared/settings/storage';
|
||||
import * as settingsValues from 'shared/settings/values';
|
||||
|
||||
const load = () => {
|
||||
return settingsStorage.loadRaw().then((settings) => {
|
||||
return set(settings);
|
||||
});
|
||||
const load = async() => {
|
||||
let settings = await settingsStorage.loadRaw();
|
||||
return set(settings);
|
||||
};
|
||||
|
||||
const save = (settings) => {
|
||||
return settingsStorage.save(settings).then(() => {
|
||||
return browser.runtime.sendMessage({
|
||||
type: messages.SETTINGS_RELOAD
|
||||
});
|
||||
}).then(() => {
|
||||
return set(settings);
|
||||
const save = async(settings) => {
|
||||
await settingsStorage.save(settings);
|
||||
await browser.runtime.sendMessage({
|
||||
type: messages.SETTINGS_RELOAD
|
||||
});
|
||||
return set(settings);
|
||||
};
|
||||
|
||||
const set = (settings) => {
|
||||
|
|
|
@ -1,30 +1,28 @@
|
|||
import DefaultSettings from './default';
|
||||
import * as settingsValues from './values';
|
||||
|
||||
const loadRaw = () => {
|
||||
return browser.storage.local.get('settings').then(({ settings }) => {
|
||||
if (!settings) {
|
||||
return DefaultSettings;
|
||||
}
|
||||
return Object.assign({}, DefaultSettings, settings);
|
||||
});
|
||||
const loadRaw = async() => {
|
||||
let { settings } = await browser.storage.local.get('settings');
|
||||
if (!settings) {
|
||||
return DefaultSettings;
|
||||
}
|
||||
return Object.assign({}, DefaultSettings, settings);
|
||||
};
|
||||
|
||||
const loadValue = () => {
|
||||
return loadRaw().then((settings) => {
|
||||
let value = JSON.parse(DefaultSettings.json);
|
||||
if (settings.source === 'json') {
|
||||
value = settingsValues.valueFromJson(settings.json);
|
||||
} else if (settings.source === 'form') {
|
||||
value = settingsValues.valueFromForm(settings.form);
|
||||
}
|
||||
if (!value.properties) {
|
||||
value.properties = {};
|
||||
}
|
||||
return Object.assign({},
|
||||
settingsValues.valueFromJson(DefaultSettings.json),
|
||||
value);
|
||||
});
|
||||
const loadValue = async() => {
|
||||
let settings = await loadRaw();
|
||||
let value = JSON.parse(DefaultSettings.json);
|
||||
if (settings.source === 'json') {
|
||||
value = settingsValues.valueFromJson(settings.json);
|
||||
} else if (settings.source === 'form') {
|
||||
value = settingsValues.valueFromForm(settings.form);
|
||||
}
|
||||
if (!value.properties) {
|
||||
value.properties = {};
|
||||
}
|
||||
return Object.assign({},
|
||||
settingsValues.valueFromJson(DefaultSettings.json),
|
||||
value);
|
||||
};
|
||||
|
||||
const save = (settings) => {
|
||||
|
|
|
@ -13,13 +13,12 @@ const notificationClickListener = (id) => {
|
|||
browser.notifications.onClicked.removeListener(notificationClickListener);
|
||||
};
|
||||
|
||||
const checkUpdated = () => {
|
||||
return storage.load().then((prev) => {
|
||||
if (!prev) {
|
||||
return true;
|
||||
}
|
||||
return manifest.version !== prev;
|
||||
});
|
||||
const checkUpdated = async() => {
|
||||
let prev = await storage.load();
|
||||
if (!prev) {
|
||||
return true;
|
||||
}
|
||||
return manifest.version !== prev;
|
||||
};
|
||||
|
||||
const notify = () => {
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
const load = () => {
|
||||
return browser.storage.local.get('version').then(({ version }) => {
|
||||
return version;
|
||||
});
|
||||
const load = async() => {
|
||||
let { version } = await browser.storage.local.get('version');
|
||||
return version;
|
||||
};
|
||||
|
||||
const save = (version) => {
|
||||
|
|
|
@ -7,32 +7,21 @@ describe("shared/versions/storage", () => {
|
|||
return browser.storage.local.remove('version');
|
||||
});
|
||||
|
||||
it('return true if no previous versions', () => {
|
||||
return Promise.resolve().then(() => {
|
||||
return versions.checkUpdated();
|
||||
}).then((updated) => {
|
||||
expect(updated).to.be.true;
|
||||
});
|
||||
it('return true if no previous versions', async() => {
|
||||
let updated = await versions.checkUpdated();
|
||||
expect(updated).to.be.true;
|
||||
});
|
||||
|
||||
it('return true if updated', () => {
|
||||
return Promise.resolve().then(() => {
|
||||
return browser.storage.local.set({ version: '0.001' });
|
||||
}).then(() => {
|
||||
return versions.checkUpdated();
|
||||
}).then((updated) => {
|
||||
expect(updated).to.be.true;
|
||||
});
|
||||
it('return true if updated', async() => {
|
||||
await browser.storage.local.set({ version: '0.001' });
|
||||
let updated = await versions.checkUpdated();
|
||||
expect(updated).to.be.true;
|
||||
});
|
||||
|
||||
it('return false if not updated', () => {
|
||||
return Promise.resolve().then(() => {
|
||||
return browser.storage.local.set({ version: manifest.version });
|
||||
}).then(() => {
|
||||
return versions.checkUpdated();
|
||||
}).then((updated) => {
|
||||
expect(updated).to.be.false;
|
||||
});
|
||||
it('return false if not updated', async() => {
|
||||
await browser.storage.local.set({ version: manifest.version });
|
||||
let updated = await versions.checkUpdated();
|
||||
expect(updated).to.be.false;
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -41,15 +30,11 @@ describe("shared/versions/storage", () => {
|
|||
return browser.storage.local.remove('version');
|
||||
});
|
||||
|
||||
it('saves current version from manifest.json', () => {
|
||||
return Promise.resolve().then(() => {
|
||||
return versions.commit();
|
||||
}).then(() => {
|
||||
return browser.storage.local.get('version');
|
||||
}).then(({version}) => {
|
||||
expect(version).to.be.a('string');
|
||||
expect(version).to.equal(manifest.version);
|
||||
});
|
||||
it('saves current version from manifest.json', async() => {
|
||||
await versions.commit();
|
||||
let { version } = await browser.storage.local.get('version');
|
||||
expect(version).to.be.a('string');
|
||||
expect(version).to.equal(manifest.version);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -6,34 +6,23 @@ describe("shared/versions/storage", () => {
|
|||
return browser.storage.local.remove('version');
|
||||
});
|
||||
|
||||
it('loads saved version', () => {
|
||||
return Promise.resolve().then(() => {
|
||||
return browser.storage.local.set({ version: '1.2.3' });
|
||||
}).then(() => {
|
||||
return storage.load();
|
||||
}).then((version) => {
|
||||
expect(version).to.equal('1.2.3');
|
||||
});
|
||||
it('loads saved version', async() => {
|
||||
await browser.storage.local.set({ version: '1.2.3' });
|
||||
let version = await storage.load();
|
||||
expect(version).to.equal('1.2.3');
|
||||
});
|
||||
|
||||
it('returns undefined if no versions in storage', () => {
|
||||
return Promise.resolve().then(() => {
|
||||
return storage.load();
|
||||
}).then((version) => {
|
||||
expect(version).to.be.a('undefined');
|
||||
});
|
||||
it('returns undefined if no versions in storage', async() => {
|
||||
let version = await storage.load();
|
||||
expect(version).to.be.a('undefined');
|
||||
});
|
||||
});
|
||||
|
||||
describe('#save', () => {
|
||||
it('saves version string', () => {
|
||||
return Promise.resolve().then(() => {
|
||||
return storage.save('2.3.4');
|
||||
}).then(() => {
|
||||
return browser.storage.local.get('version');
|
||||
}).then(({version}) => {
|
||||
expect(version).to.equal('2.3.4');
|
||||
});
|
||||
it('saves version string', async() => {
|
||||
await storage.save('2.3.4');
|
||||
let { version } = await browser.storage.local.get('version');
|
||||
expect(version).to.equal('2.3.4');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
Reference in a new issue