commit
4f4396d0a6
64 changed files with 3904 additions and 3983 deletions
@ -1,77 +0,0 @@ |
||||
const express = require('express'); |
||||
const lanthan = require('lanthan'); |
||||
const path = require('path'); |
||||
const assert = require('assert'); |
||||
const settings = require('./settings'); |
||||
|
||||
const newApp = () => { |
||||
let app = express(); |
||||
app.get('/*', (req, res) => { |
||||
res.status(200).send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<body style="width:10000px; height:10000px"></body> |
||||
</html>`); |
||||
}); |
||||
return app; |
||||
}; |
||||
|
||||
describe("navigate test", () => { |
||||
|
||||
const port = 12321; |
||||
let http; |
||||
let firefox; |
||||
let session; |
||||
let browser; |
||||
|
||||
before(async() => { |
||||
http = newApp().listen(port); |
||||
|
||||
firefox = await lanthan.firefox({ |
||||
spy: path.join(__dirname, '..'), |
||||
builderf: (builder) => { |
||||
builder.addFile('build/settings.js'); |
||||
}, |
||||
}); |
||||
session = firefox.session; |
||||
browser = firefox.browser; |
||||
}); |
||||
|
||||
after(async() => { |
||||
if (firefox) { |
||||
await firefox.close(); |
||||
} |
||||
http.close(); |
||||
}); |
||||
|
||||
it('should disable add-on if the URL is in the blacklist', async () => { |
||||
await browser.storage.local.set({ |
||||
settings: { |
||||
source: 'json', |
||||
json: `{
|
||||
"keymaps": { |
||||
"j": { "type": "scroll.vertically", "count": 1 } |
||||
}, |
||||
"blacklist": [ "127.0.0.1:${port}/a" ] |
||||
}`,
|
||||
}, |
||||
}); |
||||
|
||||
await session.navigateTo(`http://127.0.0.1:${port}/a`); |
||||
|
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('j'); |
||||
|
||||
// not works
|
||||
let pageYOffset = await session.executeScript(() => window.pageYOffset); |
||||
assert.equal(pageYOffset, 0); |
||||
|
||||
await session.navigateTo(`http://127.0.0.1:${port}/ab`); |
||||
body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('j'); |
||||
|
||||
// works
|
||||
pageYOffset = await session.executeScript(() => window.pageYOffset); |
||||
assert.equal(pageYOffset, 64); |
||||
}); |
||||
}); |
||||
|
@ -0,0 +1,62 @@ |
||||
import * as path from 'path'; |
||||
import * as assert from 'assert'; |
||||
|
||||
import TestServer from './lib/TestServer'; |
||||
import { Builder, Lanthan } from 'lanthan'; |
||||
import { WebDriver } from 'selenium-webdriver'; |
||||
import Page from './lib/Page'; |
||||
|
||||
describe("blacklist test", () => { |
||||
let server = new TestServer().receiveContent('/*', |
||||
`<!DOCTYPE html><html lang="en"><body style="width:10000px; height:10000px"></body></html">`, |
||||
); |
||||
let lanthan: Lanthan; |
||||
let webdriver: WebDriver; |
||||
let browser: any; |
||||
|
||||
before(async() => { |
||||
lanthan = await Builder |
||||
.forBrowser('firefox') |
||||
.spyAddon(path.join(__dirname, '..')) |
||||
.build(); |
||||
webdriver = lanthan.getWebDriver(); |
||||
browser = lanthan.getWebExtBrowser(); |
||||
await server.start(); |
||||
|
||||
let url = server.url('/a').replace('http://', ''); |
||||
await browser.storage.local.set({ |
||||
settings: { |
||||
source: 'json', |
||||
json: `{
|
||||
"keymaps": { |
||||
"j": { "type": "scroll.vertically", "count": 1 } |
||||
}, |
||||
"blacklist": [ "${url}" ] |
||||
}`,
|
||||
}, |
||||
}); |
||||
}); |
||||
|
||||
after(async() => { |
||||
await server.stop(); |
||||
if (lanthan) { |
||||
await lanthan.quit(); |
||||
} |
||||
}); |
||||
|
||||
it('should disable add-on if the URL is in the blacklist', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url('/a')); |
||||
await page.sendKeys('j') |
||||
|
||||
let scrollY = await page.getScrollY(); |
||||
assert.strictEqual(scrollY, 0); |
||||
}); |
||||
|
||||
it('should enabled add-on if the URL is not in the blacklist', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url('/ab')); |
||||
await page.sendKeys('j'); |
||||
|
||||
let scrollY = await page.getScrollY(); |
||||
assert.strictEqual(scrollY, 64); |
||||
}); |
||||
}); |
@ -1,123 +0,0 @@ |
||||
const express = require('express'); |
||||
const lanthan = require('lanthan'); |
||||
const path = require('path'); |
||||
const assert = require('assert'); |
||||
const eventually = require('./eventually'); |
||||
const clipboard = require('./lib/clipboard'); |
||||
const settings = require('./settings'); |
||||
|
||||
const Key = lanthan.Key; |
||||
|
||||
const newApp = () => { |
||||
let app = express(); |
||||
app.get('/', (req, res) => { |
||||
res.status(200).send(`<html lang="en"></html">`); |
||||
}); |
||||
return app; |
||||
}; |
||||
|
||||
describe("navigate test", () => { |
||||
|
||||
const port = 12321; |
||||
let http; |
||||
let firefox; |
||||
let session; |
||||
let browser; |
||||
|
||||
before(async() => { |
||||
http = newApp().listen(port); |
||||
|
||||
firefox = await lanthan.firefox({ |
||||
spy: path.join(__dirname, '..'), |
||||
}); |
||||
session = firefox.session; |
||||
browser = firefox.browser; |
||||
|
||||
await browser.storage.local.set({ |
||||
settings, |
||||
}); |
||||
}); |
||||
|
||||
after(async() => { |
||||
if (firefox) { |
||||
await firefox.close(); |
||||
} |
||||
http.close(); |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
for (let tab of tabs.slice(1)) { |
||||
await browser.tabs.remove(tab.id); |
||||
} |
||||
}) |
||||
|
||||
it('should copy current URL by y', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/#should_copy_url`); |
||||
let body = await session.findElementByCSS('body'); |
||||
|
||||
await body.sendKeys('y'); |
||||
await eventually(async() => { |
||||
let data = await clipboard.read(); |
||||
assert.equal(data, `http://127.0.0.1:${port}/#should_copy_url`); |
||||
}); |
||||
}); |
||||
|
||||
it('should open an URL from clipboard by p', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/`); |
||||
let body = await session.findElementByCSS('body'); |
||||
|
||||
await clipboard.write(`http://127.0.0.1:${port}/#open_from_clipboard`); |
||||
await body.sendKeys('p'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }); |
||||
assert.equal(tabs[0].url, `http://127.0.0.1:${port}/#open_from_clipboard`); |
||||
}); |
||||
}); |
||||
|
||||
it('should open an URL from clipboard to new tab by P', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/`); |
||||
let body = await session.findElementByCSS('body'); |
||||
|
||||
await clipboard.write(`http://127.0.0.1:${port}/#open_to_new_tab`); |
||||
await body.sendKeys(Key.Shift, 'p'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.deepEqual(tabs.map(t => t.url), [ |
||||
`http://127.0.0.1:${port}/`, |
||||
`http://127.0.0.1:${port}/#open_to_new_tab`, |
||||
]); |
||||
}); |
||||
}); |
||||
|
||||
it('should open search result with keywords in clipboard by p', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/`); |
||||
let body = await session.findElementByCSS('body'); |
||||
|
||||
await clipboard.write(`an apple`); |
||||
await body.sendKeys('p'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.equal(tabs[0].url, `http://127.0.0.1:${port}/google?q=an%20apple`); |
||||
}); |
||||
}); |
||||
|
||||
it('should open search result with keywords in clipboard to new tabby P', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/`); |
||||
let body = await session.findElementByCSS('body'); |
||||
|
||||
await clipboard.write(`an apple`); |
||||
await body.sendKeys(Key.Shift, 'p'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.deepEqual(tabs.map(t => t.url), [ |
||||
`http://127.0.0.1:${port}/`, |
||||
`http://127.0.0.1:${port}/google?q=an%20apple`, |
||||
]); |
||||
}); |
||||
}); |
||||
}); |
@ -0,0 +1,110 @@ |
||||
import * as assert from 'assert'; |
||||
import * as path from 'path'; |
||||
|
||||
import TestServer from './lib/TestServer'; |
||||
import eventually from './eventually'; |
||||
import * as clipboard from './lib/clipboard'; |
||||
import settings from './settings'; |
||||
import { Builder, Lanthan } from 'lanthan'; |
||||
import { WebDriver, Key } from 'selenium-webdriver'; |
||||
import Page from './lib/Page'; |
||||
|
||||
describe("clipboard test", () => { |
||||
let server = new TestServer(12321).receiveContent('/happy', 'ok'); |
||||
let lanthan: Lanthan; |
||||
let webdriver: WebDriver; |
||||
let browser: any; |
||||
|
||||
before(async() => { |
||||
lanthan = await Builder |
||||
.forBrowser('firefox') |
||||
.spyAddon(path.join(__dirname, '..')) |
||||
.build(); |
||||
webdriver = lanthan.getWebDriver(); |
||||
browser = lanthan.getWebExtBrowser(); |
||||
|
||||
await browser.storage.local.set({ |
||||
settings, |
||||
}); |
||||
|
||||
await server.start(); |
||||
}); |
||||
|
||||
after(async() => { |
||||
await server.stop(); |
||||
if (lanthan) { |
||||
await lanthan.quit(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
for (let tab of tabs.slice(1)) { |
||||
await browser.tabs.remove(tab.id); |
||||
} |
||||
}) |
||||
|
||||
it('should copy current URL by y', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url('/#should_copy_url')); |
||||
await page.sendKeys('y'); |
||||
|
||||
await eventually(async() => { |
||||
let data = await clipboard.read(); |
||||
assert.strictEqual(data, server.url('/#should_copy_url')); |
||||
}); |
||||
}); |
||||
|
||||
it('should open an URL from clipboard by p', async () => { |
||||
await clipboard.write(server.url('/#open_from_clipboard')); |
||||
|
||||
let page = await Page.navigateTo(webdriver, server.url()); |
||||
await page.sendKeys('p'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }); |
||||
assert.strictEqual(tabs[0].url, server.url('/#open_from_clipboard')); |
||||
}); |
||||
}); |
||||
|
||||
it('should open an URL from clipboard to new tab by P', async () => { |
||||
await clipboard.write(server.url('/#open_to_new_tab')); |
||||
|
||||
let page = await Page.navigateTo(webdriver, server.url()); |
||||
await page.sendKeys(Key.SHIFT, 'p'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.deepStrictEqual(tabs.map((t: any) => t.url), [ |
||||
server.url(), |
||||
server.url('/#open_to_new_tab'), |
||||
]); |
||||
}); |
||||
}); |
||||
|
||||
it('should open search result with keywords in clipboard by p', async () => { |
||||
await clipboard.write(`an apple`); |
||||
|
||||
let page = await Page.navigateTo(webdriver, server.url()); |
||||
await page.sendKeys(Key.SHIFT, 'p'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }); |
||||
assert.strictEqual(tabs[0].url, server.url('/google?q=an%20apple')); |
||||
}); |
||||
}); |
||||
|
||||
it('should open search result with keywords in clipboard to new tabby P', async () => { |
||||
await clipboard.write(`an apple`); |
||||
|
||||
let page = await Page.navigateTo(webdriver, server.url()); |
||||
await page.sendKeys(Key.SHIFT, 'p'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.deepStrictEqual(tabs.map((t: any) => t.url), [ |
||||
server.url(), |
||||
server.url('/google?q=an%20apple'), |
||||
]); |
||||
}); |
||||
}); |
||||
}); |
@ -1,67 +0,0 @@ |
||||
const express = require('express'); |
||||
const lanthan = require('lanthan'); |
||||
const path = require('path'); |
||||
const assert = require('assert'); |
||||
const eventually = require('./eventually'); |
||||
|
||||
const Key = lanthan.Key; |
||||
|
||||
const newApp = () => { |
||||
let app = express(); |
||||
app.get('/happy', (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<head> |
||||
<title>how to be happy</title> |
||||
</head> |
||||
</html">`); |
||||
}); |
||||
return app; |
||||
}; |
||||
|
||||
describe('addbookmark command test', () => { |
||||
const port = 12321; |
||||
let http; |
||||
let firefox; |
||||
let session; |
||||
let browser; |
||||
|
||||
before(async() => { |
||||
http = newApp().listen(port); |
||||
|
||||
firefox = await lanthan.firefox({ |
||||
spy: path.join(__dirname, '..'), |
||||
builderf: (builder) => { |
||||
builder.addFile('build/settings.js'); |
||||
}, |
||||
}); |
||||
session = firefox.session; |
||||
browser = firefox.browser; |
||||
}); |
||||
|
||||
after(async() => { |
||||
http.close(); |
||||
if (firefox) { |
||||
await firefox.close(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/happy`); |
||||
}); |
||||
|
||||
it('should add a bookmark from the current page', async() => { |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
await input.sendKeys('addbookmark how to be happy', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
var bookmarks = await browser.bookmarks.search({ title: 'how to be happy' }); |
||||
assert.equal(bookmarks.length, 1); |
||||
assert.equal(bookmarks[0].url, `http://127.0.0.1:${port}/happy`); |
||||
}); |
||||
}); |
||||
}); |
@ -0,0 +1,51 @@ |
||||
import * as path from 'path'; |
||||
import * as assert from 'assert'; |
||||
|
||||
import TestServer from './lib/TestServer'; |
||||
import eventually from './eventually'; |
||||
import { Builder, Lanthan } from 'lanthan'; |
||||
import { WebDriver } from 'selenium-webdriver'; |
||||
import Page from './lib/Page'; |
||||
|
||||
describe('addbookmark command test', () => { |
||||
let server = new TestServer().receiveContent('/happy', ` |
||||
<!DOCTYPE html> |
||||
<html lang="en"><head><title>how to be happy</title></head></html">`, |
||||
); |
||||
let lanthan: Lanthan; |
||||
let webdriver: WebDriver; |
||||
let browser: any; |
||||
|
||||
before(async() => { |
||||
lanthan = await Builder |
||||
.forBrowser('firefox') |
||||
.spyAddon(path.join(__dirname, '..')) |
||||
.build(); |
||||
webdriver = lanthan.getWebDriver(); |
||||
browser = lanthan.getWebExtBrowser(); |
||||
await server.start(); |
||||
}); |
||||
|
||||
after(async() => { |
||||
await server.stop(); |
||||
if (lanthan) { |
||||
await lanthan.quit(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
await webdriver.navigate().to(server.url('/happy')); |
||||
}); |
||||
|
||||
it('should add a bookmark from the current page', async() => { |
||||
let page = await Page.currentContext(webdriver); |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('addbookmark how to be happy'); |
||||
|
||||
await eventually(async() => { |
||||
var bookmarks = await browser.bookmarks.search({ title: 'how to be happy' }); |
||||
assert.strictEqual(bookmarks.length, 1); |
||||
assert.strictEqual(bookmarks[0].url, server.url('/happy')); |
||||
}); |
||||
}); |
||||
}); |
@ -1,203 +0,0 @@ |
||||
const express = require('express'); |
||||
const lanthan = require('lanthan'); |
||||
const path = require('path'); |
||||
const assert = require('assert'); |
||||
const eventually = require('./eventually'); |
||||
|
||||
const Key = lanthan.Key; |
||||
|
||||
const newApp = () => { |
||||
let app = express(); |
||||
app.get('/*', (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<head> |
||||
<title>my_${req.path.slice(1)}</title> |
||||
</head> |
||||
<body><h1>${req.path}</h1></body> |
||||
</html">`); |
||||
}); |
||||
return app; |
||||
}; |
||||
|
||||
describe('bdelete/bdeletes command test', () => { |
||||
const port = 12321; |
||||
let http; |
||||
let firefox; |
||||
let session; |
||||
let browser; |
||||
|
||||
before(async() => { |
||||
http = newApp().listen(port); |
||||
|
||||
firefox = await lanthan.firefox({ |
||||
spy: path.join(__dirname, '..'), |
||||
builderf: (builder) => { |
||||
builder.addFile('build/settings.js'); |
||||
}, |
||||
}); |
||||
session = firefox.session; |
||||
browser = firefox.browser; |
||||
}); |
||||
|
||||
after(async() => { |
||||
http.close(); |
||||
if (firefox) { |
||||
await firefox.close(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
for (let tab of tabs.slice(1)) { |
||||
await browser.tabs.remove(tab.id); |
||||
} |
||||
await browser.tabs.update(tabs[0].id, { url: `http://127.0.0.1:${port}/site1`, pinned: true }); |
||||
await browser.tabs.create({ url: `http://127.0.0.1:${port}/site2`, pinned: true }) |
||||
await browser.tabs.create({ url: `http://127.0.0.1:${port}/site3`, pinned: true }) |
||||
await browser.tabs.create({ url: `http://127.0.0.1:${port}/site4` }) |
||||
await browser.tabs.create({ url: `http://127.0.0.1:${port}/site5` }) |
||||
|
||||
await eventually(async() => { |
||||
let handles = await session.getWindowHandles(); |
||||
assert.equal(handles.length, 5); |
||||
await session.switchToWindow(handles[2]); |
||||
await session.findElementByCSS('iframe'); |
||||
}); |
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 100)); |
||||
}); |
||||
|
||||
it('should delete an unpinned tab by bdelete command', async() => { |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
await input.sendKeys('bdelete site5', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.deepEqual(tabs.map(t => t.url), [ |
||||
`http://127.0.0.1:${port}/site1`, |
||||
`http://127.0.0.1:${port}/site2`, |
||||
`http://127.0.0.1:${port}/site3`, |
||||
`http://127.0.0.1:${port}/site4`, |
||||
]) |
||||
}); |
||||
}); |
||||
|
||||
it('should not delete an pinned tab by bdelete command by bdelete command', async() => { |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
await input.sendKeys('bdelete site1', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.equal(tabs.length, 5); |
||||
}); |
||||
}); |
||||
|
||||
it('should show an error when no tabs are matched by bdelete command', async() => { |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
await input.sendKeys('bdelete xyz', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let p = await session.findElementByCSS('.vimvixen-console-error'); |
||||
let text = await p.getText(); |
||||
assert.equal(text, 'No matching buffer for xyz'); |
||||
}); |
||||
}); |
||||
|
||||
it('should show an error when more than one tabs are matched by bdelete command', async() => { |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
await input.sendKeys('bdelete site', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let p = await session.findElementByCSS('.vimvixen-console-error'); |
||||
let text = await p.getText(); |
||||
assert.equal(text, 'More than one match for site'); |
||||
}); |
||||
}); |
||||
|
||||
it('should delete an unpinned tab by bdelete! command', async() => { |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
await input.sendKeys('bdelete! site5', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.deepEqual(tabs.map(t => t.url), [ |
||||
`http://127.0.0.1:${port}/site1`, |
||||
`http://127.0.0.1:${port}/site2`, |
||||
`http://127.0.0.1:${port}/site3`, |
||||
`http://127.0.0.1:${port}/site4`, |
||||
]) |
||||
}); |
||||
}); |
||||
|
||||
it('should delete an pinned tab by bdelete! command', async() => { |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
await input.sendKeys('bdelete! site1', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.deepEqual(tabs.map(t => t.url), [ |
||||
`http://127.0.0.1:${port}/site2`, |
||||
`http://127.0.0.1:${port}/site3`, |
||||
`http://127.0.0.1:${port}/site4`, |
||||
`http://127.0.0.1:${port}/site5`, |
||||
]) |
||||
}); |
||||
}); |
||||
|
||||
it('should delete unpinned tabs by bdeletes command', async() => { |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
await input.sendKeys('bdeletes site', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.deepEqual(tabs.map(t => t.url), [ |
||||
`http://127.0.0.1:${port}/site1`, |
||||
`http://127.0.0.1:${port}/site2`, |
||||
`http://127.0.0.1:${port}/site3`, |
||||
]) |
||||
}); |
||||
}); |
||||
|
||||
it('should delete both pinned and unpinned tabs by bdeletes! command', async() => { |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
await input.sendKeys('bdeletes! site', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.equal(tabs.length, 1); |
||||
}); |
||||
}); |
||||
}); |
@ -0,0 +1,157 @@ |
||||
import * as path from 'path'; |
||||
import * as assert from 'assert'; |
||||
|
||||
import TestServer from './lib/TestServer'; |
||||
import eventually from './eventually'; |
||||
import { Builder, Lanthan } from 'lanthan'; |
||||
import { WebDriver } from 'selenium-webdriver'; |
||||
import Page from './lib/Page'; |
||||
|
||||
describe('bdelete/bdeletes command test', () => { |
||||
let server = new TestServer().receiveContent('/*', 'ok'); |
||||
let lanthan: Lanthan; |
||||
let webdriver: WebDriver; |
||||
let browser: any; |
||||
|
||||
before(async() => { |
||||
lanthan = await Builder |
||||
.forBrowser('firefox') |
||||
.spyAddon(path.join(__dirname, '..')) |
||||
.build(); |
||||
webdriver = lanthan.getWebDriver(); |
||||
browser = lanthan.getWebExtBrowser(); |
||||
await server.start(); |
||||
}); |
||||
|
||||
after(async() => { |
||||
await server.stop(); |
||||
if (lanthan) { |
||||
await lanthan.quit(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
for (let tab of tabs.slice(1)) { |
||||
await browser.tabs.remove(tab.id); |
||||
} |
||||
await browser.tabs.update(tabs[0].id, { url: server.url('/site1'), pinned: true }); |
||||
await browser.tabs.create({ url: server.url('/site2'), pinned: true }) |
||||
await browser.tabs.create({ url: server.url('/site3'), pinned: true }) |
||||
await browser.tabs.create({ url: server.url('/site4'), }) |
||||
await browser.tabs.create({ url: server.url('/site5'), }) |
||||
|
||||
await eventually(async() => { |
||||
let handles = await webdriver.getAllWindowHandles(); |
||||
assert.strictEqual(handles.length, 5); |
||||
await webdriver.switchTo().window(handles[2]); |
||||
}); |
||||
}); |
||||
|
||||
it('should delete an unpinned tab by bdelete command', async() => { |
||||
let page = await Page.currentContext(webdriver); |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('bdelete site5'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.deepStrictEqual(tabs.map((t: any) => t.url), [ |
||||
server.url('/site1'), |
||||
server.url('/site2'), |
||||
server.url('/site3'), |
||||
server.url('/site4'), |
||||
]) |
||||
}); |
||||
}); |
||||
|
||||
it('should not delete an pinned tab by bdelete command by bdelete command', async() => { |
||||
let page = await Page.currentContext(webdriver); |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('bdelete site1'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.strictEqual(tabs.length, 5); |
||||
}); |
||||
}); |
||||
|
||||
it('should show an error when no tabs are matched by bdelete command', async() => { |
||||
let page = await Page.currentContext(webdriver); |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('bdelete xyz'); |
||||
|
||||
await eventually(async() => { |
||||
let text = await console.getErrorMessage(); |
||||
assert.strictEqual(text, 'No matching buffer for xyz'); |
||||
}); |
||||
}); |
||||
|
||||
it('should show an error when more than one tabs are matched by bdelete command', async() => { |
||||
let page = await Page.currentContext(webdriver); |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('bdelete site'); |
||||
|
||||
await eventually(async() => { |
||||
let text = await console.getErrorMessage(); |
||||
assert.strictEqual(text, 'More than one match for site'); |
||||
}); |
||||
}); |
||||
|
||||
it('should delete an unpinned tab by bdelete! command', async() => { |
||||
let page = await Page.currentContext(webdriver); |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('bdelete! site5'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.deepStrictEqual(tabs.map((t: any) => t.url), [ |
||||
server.url('/site1'), |
||||
server.url('/site2'), |
||||
server.url('/site3'), |
||||
server.url('/site4'), |
||||
]) |
||||
}); |
||||
}); |
||||
|
||||
it('should delete an pinned tab by bdelete! command', async() => { |
||||
let page = await Page.currentContext(webdriver); |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('bdelete! site1'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.deepStrictEqual(tabs.map((t: any) => t.url), [ |
||||
server.url('/site2'), |
||||
server.url('/site3'), |
||||
server.url('/site4'), |
||||
server.url('/site5'), |
||||
]) |
||||
}); |
||||
}); |
||||
|
||||
it('should delete unpinned tabs by bdeletes command', async() => { |
||||
let page = await Page.currentContext(webdriver); |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('bdeletes site'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.deepStrictEqual(tabs.map((t: any) => t.url), [ |
||||
server.url('/site1'), |
||||
server.url('/site2'), |
||||
server.url('/site3'), |
||||
]) |
||||
}); |
||||
}); |
||||
|
||||
it('should delete both pinned and unpinned tabs by bdeletes! command', async() => { |
||||
let page = await Page.currentContext(webdriver); |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('bdeletes! site'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.strictEqual(tabs.length, 1); |
||||
}); |
||||
}); |
||||
}); |
@ -1,202 +0,0 @@ |
||||
const express = require('express'); |
||||
const lanthan = require('lanthan'); |
||||
const path = require('path'); |
||||
const assert = require('assert'); |
||||
const eventually = require('./eventually'); |
||||
|
||||
const Key = lanthan.Key; |
||||
|
||||
const newApp = () => { |
||||
let app = express(); |
||||
app.get('/*', (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<head> |
||||
<title>my_${req.path.slice(1)}</title> |
||||
</head> |
||||
<body><h1>${req.path}</h1></body> |
||||
</html">`); |
||||
}); |
||||
return app; |
||||
}; |
||||
|
||||
describe('buffer command test', () => { |
||||
const port = 12321; |
||||
let http; |
||||
let firefox; |
||||
let session; |
||||
let browser; |
||||
|
||||
before(async() => { |
||||
http = newApp().listen(port); |
||||
|
||||
firefox = await lanthan.firefox({ |
||||
spy: path.join(__dirname, '..'), |
||||
builderf: (builder) => { |
||||
builder.addFile('build/settings.js'); |
||||
}, |
||||
}); |
||||
session = firefox.session; |
||||
browser = firefox.browser; |
||||
}); |
||||
|
||||
after(async() => { |
||||
http.close(); |
||||
if (firefox) { |
||||
await firefox.close(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
for (let tab of tabs.slice(1)) { |
||||
await browser.tabs.remove(tab.id); |
||||
} |
||||
await browser.tabs.update(tabs[0].id, { url: `http://127.0.0.1:${port}/site1` }); |
||||
for (let i = 2; i <= 5; ++i) { |
||||
await browser.tabs.create({ url: `http://127.0.0.1:${port}/site${i}`}) |
||||
} |
||||
|
||||
await eventually(async() => { |
||||
let handles = await session.getWindowHandles(); |
||||
assert.equal(handles.length, 5); |
||||
await session.switchToWindow(handles[2]); |
||||
await session.findElementByCSS('iframe'); |
||||
}); |
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 100)); |
||||
}); |
||||
|
||||
it('should do nothing by buffer command with no parameters', async() => { |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
await input.sendKeys('buffer', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }); |
||||
assert.equal(tabs[0].index, 2); |
||||
}); |
||||
}); |
||||
|
||||
it('should select a tab by buffer command with a number', async() => { |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
await input.sendKeys('buffer', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }); |
||||
assert.equal(tabs[0].index, 2); |
||||
}); |
||||
}); |
||||
|
||||
it('should should an out of range error by buffer commands', async() => { |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
await input.sendKeys('buffer 0', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let p = await session.findElementByCSS('.vimvixen-console-error'); |
||||
let text = await p.getText(); |
||||
assert.equal(text, 'tab 0 does not exist'); |
||||
}); |
||||
|
||||
await session.switchToParentFrame(); |
||||
body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
input = await session.findElementByCSS('input'); |
||||
await input.sendKeys('buffer 9', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let p = await session.findElementByCSS('.vimvixen-console-error'); |
||||
let text = await p.getText(); |
||||
assert.equal(text, 'tab 9 does not exist'); |
||||
}); |
||||
}); |
||||
|
||||
it('should select a tab by buffer command with a title', async() => { |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
await input.sendKeys('buffer my_site1', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }); |
||||
assert.equal(tabs[0].index, 0); |
||||
}); |
||||
}); |
||||
|
||||
it('should select a tab by buffer command with an URL', async() => { |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
await input.sendKeys('buffer /site1', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }); |
||||
assert.equal(tabs[0].index, 0); |
||||
}); |
||||
}); |
||||
|
||||
it('should select tabs rotately', async() => { |
||||
let handles = await session.getWindowHandles(); |
||||
await session.switchToWindow(handles[4]); |
||||
|
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
await input.sendKeys('buffer site', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }); |
||||
assert.equal(tabs[0].index, 0); |
||||
}); |
||||
}); |
||||
|
||||
it('should do nothing by ":buffer %"', async() => { |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
await input.sendKeys('buffer %', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }); |
||||
assert.equal(tabs[0].index, 2); |
||||
}); |
||||
}); |
||||
|
||||
it('should selects last selected tab by ":buffer #"', async() => { |
||||
let handles = await session.getWindowHandles(); |
||||
await session.switchToWindow(handles[1]); |
||||
|
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
await input.sendKeys('buffer #', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }); |
||||
assert.equal(tabs[0].index, 2); |
||||
}); |
||||
}); |
||||
}); |
@ -0,0 +1,162 @@ |
||||
import * as path from 'path'; |
||||
import * as assert from 'assert'; |
||||
import { Request, Response } from 'express'; |
||||
|
||||
import TestServer from './lib/TestServer'; |
||||
import eventually from './eventually'; |
||||
import { Builder, Lanthan } from 'lanthan'; |
||||
import { WebDriver } from 'selenium-webdriver'; |
||||
import Page from './lib/Page'; |
||||
|
||||
describe('buffer command test', () => { |
||||
let server = new TestServer().handle('/*', (req: Request, res: Response) => { |
||||
res.send(` |
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<title>my_${req.path.slice(1)}</title> |
||||
</head> |
||||
</html">`); |
||||
}); |
||||
let lanthan: Lanthan; |
||||
let webdriver: WebDriver; |
||||
let browser: any; |
||||
|
||||
before(async() => { |
||||
lanthan = await Builder |
||||
.forBrowser('firefox') |
||||
.spyAddon(path.join(__dirname, '..')) |
||||
.build(); |
||||
webdriver = lanthan.getWebDriver(); |
||||
browser = lanthan.getWebExtBrowser(); |
||||
await server.start(); |
||||
}); |
||||
|
||||
after(async() => { |
||||
await server.stop(); |
||||
if (lanthan) { |
||||
await lanthan.quit(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
for (let tab of tabs.slice(1)) { |
||||
await browser.tabs.remove(tab.id); |
||||
} |
||||
await browser.tabs.update(tabs[0].id, { url: server.url('/site1') }); |
||||
for (let i = 2; i <= 5; ++i) { |
||||
await browser.tabs.create({ url: server.url('/site' + i) }); |
||||
} |
||||
|
||||
await eventually(async() => { |
||||
let handles = await webdriver.getAllWindowHandles(); |
||||
assert.strictEqual(handles.length, 5); |
||||
await webdriver.switchTo().window(handles[2]); |
||||
}); |
||||
}); |
||||
|
||||
it('should do nothing by buffer command with no parameters', async() => { |
||||
let page = await Page.currentContext(webdriver); |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('buffer'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }); |
||||
assert.strictEqual(tabs[0].index, 2); |
||||
}); |
||||
}); |
||||
|
||||
it('should select a tab by buffer command with a number', async() => { |
||||
let page = await Page.currentContext(webdriver); |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('buffer 1'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }); |
||||
assert.strictEqual(tabs[0].index, 0); |
||||
}); |
||||
}); |
||||
|
||||
it('should should an out of range error by buffer commands', async() => { |
||||
let page = await Page.currentContext(webdriver); |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('buffer 0'); |
||||
|
||||
await eventually(async() => { |
||||
let text = await console.getErrorMessage(); |
||||
assert.strictEqual(text, 'tab 0 does not exist'); |
||||
}); |
||||
|
||||
await (webdriver.switchTo() as any).parentFrame(); |
||||
|
||||
console = await page.showConsole(); |
||||
await console.execCommand('buffer 9'); |
||||
|
||||
await eventually(async() => { |
||||
let text = await console.getErrorMessage(); |
||||
assert.strictEqual(text, 'tab 9 does not exist'); |
||||
}); |
||||
}); |
||||
|
||||
it('should select a tab by buffer command with a title', async() => { |
||||
let page = await Page.currentContext(webdriver); |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('buffer my_site1'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }); |
||||
assert.strictEqual(tabs[0].index, 0); |
||||
}); |
||||
}); |
||||
|
||||
it('should select a tab by buffer command with an URL', async() => { |
||||
let page = await Page.currentContext(webdriver); |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('buffer /site1'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }); |
||||
assert.strictEqual(tabs[0].index, 0); |
||||
}); |
||||
}); |
||||
|
||||
it('should select tabs rotately', async() => { |
||||
let handles = await webdriver.getAllWindowHandles(); |
||||
await webdriver.switchTo().window(handles[4]); |
||||
|
||||
let page = await Page.currentContext(webdriver); |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('buffer site'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }); |
||||
assert.strictEqual(tabs[0].index, 0); |
||||
}); |
||||
}); |
||||
|
||||
it('should do nothing by ":buffer %"', async() => { |
||||
let page = await Page.currentContext(webdriver); |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('buffer %'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }); |
||||
assert.strictEqual(tabs[0].index, 2); |
||||
}); |
||||
}); |
||||
|
||||
it('should selects last selected tab by ":buffer #"', async() => { |
||||
let handles = await webdriver.getAllWindowHandles(); |
||||
await webdriver.switchTo().window(handles[1]); |
||||
|
||||
let page = await Page.currentContext(webdriver); |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('buffer #'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }); |
||||
assert.strictEqual(tabs[0].index, 2); |
||||
}); |
||||
}); |
||||
}); |
@ -1,149 +0,0 @@ |
||||
const express = require('express'); |
||||
const lanthan = require('lanthan'); |
||||
const path = require('path'); |
||||
const assert = require('assert'); |
||||
const eventually = require('./eventually'); |
||||
const settings = require('./settings'); |
||||
|
||||
const Key = lanthan.Key; |
||||
|
||||
const newApp = () => { |
||||
|
||||
let app = express(); |
||||
for (let name of ['google', 'yahoo', 'bing', 'duckduckgo', 'twitter', 'wikipedia']) { |
||||
app.get('/' + name, (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<body><h1>${name.charAt(0).toUpperCase() + name.slice(1)}</h1></body> |
||||
</html">`); |
||||
}); |
||||
} |
||||
app.get('/', (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<body><h1>home</h1></body> |
||||
</html">`); |
||||
}); |
||||
return app; |
||||
}; |
||||
|
||||
describe("open command test", () => { |
||||
const port = 12321; |
||||
let http; |
||||
let firefox; |
||||
let session; |
||||
let browser; |
||||
let body; |
||||
|
||||
before(async() => { |
||||
firefox = await lanthan.firefox({ |
||||
spy: path.join(__dirname, '..'), |
||||
builderf: (builder) => { |
||||
builder.addFile('build/settings.js'); |
||||
}, |
||||
}); |
||||
session = firefox.session; |
||||
browser = firefox.browser; |
||||
http = newApp().listen(port); |
||||
|
||||
await browser.storage.local.set({ |
||||
settings, |
||||
}); |
||||
}); |
||||
|
||||
after(async() => { |
||||
http.close(); |
||||
if (firefox) { |
||||
await firefox.close(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}`); |
||||
body = await session.findElementByCSS('body'); |
||||
}) |
||||
|
||||
it('should open default search for keywords by open command ', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
input.sendKeys('open an apple', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }); |
||||
let url = new URL(tabs[0].url); |
||||
assert.equal(url.href, `http://127.0.0.1:${port}/google?q=an%20apple`) |
||||
}); |
||||
}); |
||||
|
||||
it('should open certain search page for keywords by open command ', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
input.sendKeys('open yahoo an apple', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }) |
||||
let url = new URL(tabs[0].url); |
||||
assert.equal(url.href, `http://127.0.0.1:${port}/yahoo?q=an%20apple`) |
||||
}); |
||||
}); |
||||
|
||||
it('should open default engine with empty keywords by open command ', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
input.sendKeys('open', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }) |
||||
let url = new URL(tabs[0].url); |
||||
assert.equal(url.href, `http://127.0.0.1:${port}/google?q=`) |
||||
}); |
||||
}); |
||||
|
||||
it('should open certain search page for empty keywords by open command ', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
input.sendKeys('open yahoo', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }) |
||||
let url = new URL(tabs[0].url); |
||||
assert.equal(url.href, `http://127.0.0.1:${port}/yahoo?q=`) |
||||
}); |
||||
}); |
||||
|
||||
it('should open a site with domain by open command ', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
input.sendKeys('open i-beam.org', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }) |
||||
let url = new URL(tabs[0].url); |
||||
assert.equal(url.href, 'https://i-beam.org/') |
||||
}); |
||||
}); |
||||
|
||||
it('should open a site with URL by open command ', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
input.sendKeys('open https://i-beam.org', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }) |
||||
let url = new URL(tabs[0].url); |
||||
assert.equal(url.href, 'https://i-beam.org/') |
||||
}); |
||||
}); |
||||
}); |
@ -0,0 +1,112 @@ |
||||
import * as path from 'path'; |
||||
import * as assert from 'assert'; |
||||
|
||||
import TestServer from './lib/TestServer'; |
||||
import settings from './settings'; |
||||
import eventually from './eventually'; |
||||
import { Builder, Lanthan } from 'lanthan'; |
||||
import { WebDriver } from 'selenium-webdriver'; |
||||
import Page from './lib/Page'; |
||||
|
||||
describe("open command test", () => { |
||||
let server = new TestServer(12321) |
||||
.receiveContent('/google', 'google') |
||||
.receiveContent('/yahoo', 'yahoo'); |
||||
let lanthan: Lanthan; |
||||
let webdriver: WebDriver; |
||||
let browser: any; |
||||
let page: Page; |
||||
|
||||
before(async() => { |
||||
lanthan = await Builder |
||||
.forBrowser('firefox') |
||||
.spyAddon(path.join(__dirname, '..')) |
||||
.build(); |
||||
webdriver = lanthan.getWebDriver(); |
||||
browser = lanthan.getWebExtBrowser(); |
||||
|
||||
await browser.storage.local.set({ |
||||
settings, |
||||
}); |
||||
|
||||
await server.start(); |
||||
}); |
||||
|
||||
after(async() => { |
||||
await server.stop(); |
||||
if (lanthan) { |
||||
await lanthan.quit(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
await webdriver.switchTo().defaultContent(); |
||||
page = await Page.navigateTo(webdriver, server.url()); |
||||
}) |
||||
|
||||
it('should open default search for keywords by open command ', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('open an apple'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }); |
||||
let url = new URL(tabs[0].url); |
||||
assert.strictEqual(url.href, server.url('/google?q=an%20apple')) |
||||
}); |
||||
}); |
||||
|
||||
it('should open certain search page for keywords by open command ', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('open yahoo an apple'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }) |
||||
let url = new URL(tabs[0].url); |
||||
assert.strictEqual(url.href, server.url('/yahoo?q=an%20apple')) |
||||
}); |
||||
}); |
||||
|
||||
it('should open default engine with empty keywords by open command ', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('open'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }) |
||||
let url = new URL(tabs[0].url); |
||||
assert.strictEqual(url.href, server.url('/google?q=')) |
||||
}); |
||||
}); |
||||
|
||||
it('should open certain search page for empty keywords by open command ', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('open yahoo'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }) |
||||
let url = new URL(tabs[0].url); |
||||
assert.strictEqual(url.href, server.url('/yahoo?q=')) |
||||
}); |
||||
}); |
||||
|
||||
it('should open a site with domain by open command ', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('open example.com'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }) |
||||
let url = new URL(tabs[0].url); |
||||
assert.strictEqual(url.href, 'http://example.com/') |
||||
}); |
||||
}); |
||||
|
||||
it('should open a site with URL by open command ', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('open https://example.com/'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({ active: true }) |
||||
let url = new URL(tabs[0].url); |
||||
assert.strictEqual(url.href, 'https://example.com/') |
||||
}); |
||||
}); |
||||
}); |
@ -1,125 +0,0 @@ |
||||
const express = require('express'); |
||||
const lanthan = require('lanthan'); |
||||
const path = require('path'); |
||||
const assert = require('assert'); |
||||
const eventually = require('./eventually'); |
||||
|
||||
const Key = lanthan.Key; |
||||
|
||||
const newApp = () => { |
||||
let app = express(); |
||||
app.get('/*', (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<head> |
||||
<title>my_${req.path.slice(1)}</title> |
||||
</head> |
||||
<body><h1>${req.path}</h1></body> |
||||
</html">`); |
||||
}); |
||||
return app; |
||||
}; |
||||
|
||||
describe('quit/quitall command test', () => { |
||||
const port = 12321; |
||||
let http; |
||||
let firefox; |
||||
let session; |
||||
let browser; |
||||
|
||||
before(async() => { |
||||
http = newApp().listen(port); |
||||
|
||||
firefox = await lanthan.firefox({ |
||||
spy: path.join(__dirname, '..'), |
||||
builderf: (builder) => { |
||||
builder.addFile('build/settings.js'); |
||||
}, |
||||
}); |
||||
session = firefox.session; |
||||
browser = firefox.browser; |
||||
}); |
||||
|
||||
after(async() => { |
||||
http.close(); |
||||
if (firefox) { |
||||
await firefox.close(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
for (let tab of tabs.slice(1)) { |
||||
await browser.tabs.remove(tab.id); |
||||
} |
||||
await browser.tabs.update(tabs[0].id, { url: `http://127.0.0.1:${port}/site1` }); |
||||
for (let i = 2; i <= 5; ++i) { |
||||
await browser.tabs.create({ url: `http://127.0.0.1:${port}/site${i}`}) |
||||
} |
||||
|
||||
await eventually(async() => { |
||||
let handles = await session.getWindowHandles(); |
||||
assert.equal(handles.length, 5); |
||||
await session.switchToWindow(handles[2]); |
||||
await session.findElementByCSS('iframe'); |
||||
}); |
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 100)); |
||||
}); |
||||
|
||||
it('should current tab by q command', async() => { |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
await input.sendKeys('q', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.equal(tabs.length, 4) |
||||
}); |
||||
}); |
||||
|
||||
it('should current tab by quit command', async() => { |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
await input.sendKeys('quit', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.equal(tabs.length, 4) |
||||
}); |
||||
}); |
||||
|
||||
it('should current tab by qa command', async() => { |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
await input.sendKeys('qa', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.equal(tabs.length, 1) |
||||
}); |
||||
}); |
||||
|
||||
it('should current tab by quitall command', async() => { |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
await input.sendKeys('quitall', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.equal(tabs.length, 1) |
||||
}); |
||||
}); |
||||
}); |
@ -0,0 +1,93 @@ |
||||
import * as path from 'path'; |
||||
import * as assert from 'assert'; |
||||
|
||||
import TestServer from './lib/TestServer'; |
||||
import eventually from './eventually'; |
||||
import { Builder, Lanthan } from 'lanthan'; |
||||
import { WebDriver } from 'selenium-webdriver'; |
||||
import Page from './lib/Page'; |
||||
|
||||
describe('quit/quitall command test', () => { |
||||
let server = new TestServer().receiveContent('/*', 'ok'); |
||||
let lanthan: Lanthan; |
||||
let webdriver: WebDriver; |
||||
let browser: any; |
||||
|
||||
before(async() => { |
||||
lanthan = await Builder |
||||
.forBrowser('firefox') |
||||
.spyAddon(path.join(__dirname, '..')) |
||||
.build(); |
||||
webdriver = lanthan.getWebDriver(); |
||||
browser = lanthan.getWebExtBrowser(); |
||||
await server.start(); |
||||
}); |
||||
|
||||
after(async() => { |
||||
await server.stop(); |
||||
if (lanthan) { |
||||
await lanthan.quit(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
for (let tab of tabs.slice(1)) { |
||||
await browser.tabs.remove(tab.id); |
||||
} |
||||
await browser.tabs.update(tabs[0].id, { url: server.url('/site1') }); |
||||
for (let i = 2; i <= 5; ++i) { |
||||
await browser.tabs.create({ url: server.url('/site' + i) }) |
||||
} |
||||
|
||||
await eventually(async() => { |
||||
let handles = await webdriver.getAllWindowHandles(); |
||||
assert.strictEqual(handles.length, 5); |
||||
await webdriver.switchTo().window(handles[2]); |
||||
}); |
||||
}); |
||||
|
||||
it('should current tab by q command', async() => { |
||||
let page = await Page.currentContext(webdriver); |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('q'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.strictEqual(tabs.length, 4) |
||||
}); |
||||
}); |
||||
|
||||
it('should current tab by quit command', async() => { |
||||
let page = await Page.currentContext(webdriver); |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('quit'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.strictEqual(tabs.length, 4) |
||||
}); |
||||
}); |
||||
|
||||
it('should current tab by qa command', async() => { |
||||
let page = await Page.currentContext(webdriver); |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('qa'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.strictEqual(tabs.length, 1) |
||||
}); |
||||
}); |
||||
|
||||
it('should current tab by quitall command', async() => { |
||||
let page = await Page.currentContext(webdriver); |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('quitall'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.strictEqual(tabs.length, 1) |
||||
}); |
||||
}); |
||||
}); |
@ -1,160 +0,0 @@ |
||||
const express = require('express'); |
||||
const lanthan = require('lanthan'); |
||||
const path = require('path'); |
||||
const assert = require('assert'); |
||||
const eventually = require('./eventually'); |
||||
const settings = require('./settings'); |
||||
|
||||
const Key = lanthan.Key; |
||||
|
||||
const newApp = () => { |
||||
|
||||
let app = express(); |
||||
for (let name of ['google', 'yahoo', 'bing', 'duckduckgo', 'twitter', 'wikipedia']) { |
||||
app.get('/' + name, (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<body><h1>${name.charAt(0).toUpperCase() + name.slice(1)}</h1></body> |
||||
</html">`); |
||||
}); |
||||
} |
||||
app.get('/', (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<body><h1>home</h1></body> |
||||
</html">`); |
||||
}); |
||||
return app; |
||||
}; |
||||
|
||||
describe("tabopen command test", () => { |
||||
const port = 12321; |
||||
let http; |
||||
let firefox; |
||||
let session; |
||||
let browser; |
||||
let body; |
||||
|
||||
before(async() => { |
||||
http = newApp().listen(port); |
||||
|
||||
firefox = await lanthan.firefox({ |
||||
spy: path.join(__dirname, '..'), |
||||
builderf: (builder) => { |
||||
builder.addFile('build/settings.js'); |
||||
}, |
||||
}); |
||||
session = firefox.session; |
||||
browser = firefox.browser; |
||||
await browser.storage.local.set({ |
||||
settings, |
||||
}); |
||||
}); |
||||
|
||||
after(async() => { |
||||
http.close(); |
||||
if (firefox) { |
||||
await firefox.close(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
for (let tab of tabs.slice(1)) { |
||||
await browser.tabs.remove(tab.id); |
||||
} |
||||
|
||||
await session.navigateTo(`http://127.0.0.1:${port}`); |
||||
body = await session.findElementByCSS('body'); |
||||
}) |
||||
|
||||
it('should open default search for keywords by tabopen command ', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
input.sendKeys('tabopen an apple', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.equal(tabs.length, 2); |
||||
let url = new URL(tabs[1].url); |
||||
assert.equal(url.href, `http://127.0.0.1:${port}/google?q=an%20apple`) |
||||
}); |
||||
}); |
||||
|
||||
it('should open certain search page for keywords by tabopen command ', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
input.sendKeys('tabopen yahoo an apple', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.equal(tabs.length, 2); |
||||
let url = new URL(tabs[1].url); |
||||
assert.equal(url.href, `http://127.0.0.1:${port}/yahoo?q=an%20apple`) |
||||
}); |
||||
}); |
||||
|
||||
it('should open default engine with empty keywords by tabopen command ', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
input.sendKeys('tabopen', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.equal(tabs.length, 2); |
||||
let url = new URL(tabs[1].url); |
||||
assert.equal(url.href, `http://127.0.0.1:${port}/google?q=`) |
||||
}); |
||||
}); |
||||
|
||||
it('should open certain search page for empty keywords by tabopen command ', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
input.sendKeys('tabopen yahoo', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.equal(tabs.length, 2); |
||||
let url = new URL(tabs[1].url); |
||||
assert.equal(url.href, `http://127.0.0.1:${port}/yahoo?q=`) |
||||
}); |
||||
}); |
||||
|
||||
it('should open a site with domain by tabopen command ', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
input.sendKeys('tabopen i-beam.org', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.equal(tabs.length, 2); |
||||
let url = new URL(tabs[1].url); |
||||
assert.equal(url.href, 'https://i-beam.org/') |
||||
}); |
||||
}); |
||||
|
||||
it('should open a site with URL by tabopen command ', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
input.sendKeys('tabopen https://i-beam.org', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.equal(tabs.length, 2); |
||||
let url = new URL(tabs[1].url); |
||||
assert.equal(url.href, 'https://i-beam.org/') |
||||
}); |
||||
}); |
||||
}); |
@ -0,0 +1,122 @@ |
||||
import * as path from 'path'; |
||||
import * as assert from 'assert'; |
||||
|
||||
import TestServer from './lib/TestServer'; |
||||
import settings from './settings'; |
||||
import eventually from './eventually'; |
||||
import { Builder, Lanthan } from 'lanthan'; |
||||
import { WebDriver } from 'selenium-webdriver'; |
||||
import Page from './lib/Page'; |
||||
|
||||
describe("tabopen command test", () => { |
||||
let server = new TestServer(12321) |
||||
.receiveContent('/google', 'google') |
||||
.receiveContent('/yahoo', 'yahoo'); |
||||
let lanthan: Lanthan; |
||||
let webdriver: WebDriver; |
||||
let browser: any; |
||||
let page: Page; |
||||
|
||||
before(async() => { |
||||
lanthan = await Builder |
||||
.forBrowser('firefox') |
||||
.spyAddon(path.join(__dirname, '..')) |
||||
.build(); |
||||
webdriver = lanthan.getWebDriver(); |
||||
browser = lanthan.getWebExtBrowser(); |
||||
|
||||
await browser.storage.local.set({ |
||||
settings, |
||||
}); |
||||
|
||||
await server.start(); |
||||
}); |
||||
|
||||
after(async() => { |
||||
await server.stop(); |
||||
if (lanthan) { |
||||
await lanthan.quit(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
for (let tab of tabs.slice(1)) { |
||||
await browser.tabs.remove(tab.id); |
||||
} |
||||
|
||||
page = await Page.navigateTo(webdriver, server.url()); |
||||
}) |
||||
|
||||
it('should open default search for keywords by tabopen command ', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('tabopen an apple'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.strictEqual(tabs.length, 2); |
||||
let url = new URL(tabs[1].url); |
||||
assert.strictEqual(url.href, server.url('/google?q=an%20apple') ) |
||||
}); |
||||
}); |
||||
|
||||
it('should open certain search page for keywords by tabopen command ', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('tabopen yahoo an apple'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.strictEqual(tabs.length, 2); |
||||
let url = new URL(tabs[1].url); |
||||
assert.strictEqual(url.href, server.url('/yahoo?q=an%20apple')) |
||||
}); |
||||
}); |
||||
|
||||
it('should open default engine with empty keywords by tabopen command ', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('tabopen'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.strictEqual(tabs.length, 2); |
||||
let url = new URL(tabs[1].url); |
||||
assert.strictEqual(url.href, server.url('/google?q=')) |
||||
}); |
||||
}); |
||||
|
||||
it('should open certain search page for empty keywords by tabopen command ', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('tabopen yahoo'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.strictEqual(tabs.length, 2); |
||||
let url = new URL(tabs[1].url); |
||||
assert.strictEqual(url.href, server.url('/yahoo?q=')) |
||||
}); |
||||
}); |
||||
|
||||
it('should open a site with domain by tabopen command ', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('tabopen example.com'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.strictEqual(tabs.length, 2); |
||||
let url = new URL(tabs[1].url); |
||||
assert.strictEqual(url.href, 'http://example.com/') |
||||
}); |
||||
}); |
||||
|
||||
it('should open a site with URL by tabopen command ', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('tabopen https://example.com/'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.strictEqual(tabs.length, 2); |
||||
let url = new URL(tabs[1].url); |
||||
assert.strictEqual(url.href, 'https://example.com/') |
||||
}); |
||||
}); |
||||
}); |
@ -1,172 +0,0 @@ |
||||
const express = require('express'); |
||||
const lanthan = require('lanthan'); |
||||
const path = require('path'); |
||||
const assert = require('assert'); |
||||
const eventually = require('./eventually'); |
||||
const settings = require('./settings'); |
||||
|
||||
const Key = lanthan.Key; |
||||
|
||||
const newApp = () => { |
||||
|
||||
let app = express(); |
||||
for (let name of ['google', 'yahoo', 'bing', 'duckduckgo', 'twitter', 'wikipedia']) { |
||||
app.get('/' + name, (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<body><h1>${name.charAt(0).toUpperCase() + name.slice(1)}</h1></body> |
||||
</html">`); |
||||
}); |
||||
} |
||||
app.get('/', (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<body><h1>home</h1></body> |
||||
</html">`); |
||||
}); |
||||
return app; |
||||
}; |
||||
|
||||
describe("winopen command test", () => { |
||||
const port = 12321; |
||||
let http; |
||||
let firefox; |
||||
let session; |
||||
let browser; |
||||
let body; |
||||
|
||||
before(async() => { |
||||
http = newApp().listen(port); |
||||
|
||||
firefox = await lanthan.firefox({ |
||||
spy: path.join(__dirname, '..'), |
||||
builderf: (builder) => { |
||||
builder.addFile('build/settings.js'); |
||||
}, |
||||
}); |
||||
session = firefox.session; |
||||
browser = firefox.browser; |
||||
await browser.storage.local.set({ |
||||
settings, |
||||
}); |
||||
}); |
||||
|
||||
after(async() => { |
||||
http.close(); |
||||
if (firefox) { |
||||
await firefox.close(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
let wins = await browser.windows.getAll(); |
||||
for (let win of wins.slice(1)) { |
||||
await browser.windows.remove(win.id); |
||||
} |
||||
|
||||
await session.navigateTo(`http://127.0.0.1:${port}`); |
||||
body = await session.findElementByCSS('body'); |
||||
}) |
||||
|
||||
it('should open default search for keywords by winopen command ', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
input.sendKeys('winopen an apple', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let wins = await browser.windows.getAll(); |
||||
assert.equal(wins.length, 2); |
||||
|
||||
let tabs = await browser.tabs.query({ windowId: wins[1].id }); |
||||
let url = new URL(tabs[0].url); |
||||
assert.equal(url.href, `http://127.0.0.1:${port}/google?q=an%20apple`) |
||||
}); |
||||
}); |
||||
|
||||
it('should open certain search page for keywords by winopen command ', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
input.sendKeys('winopen yahoo an apple', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let wins = await browser.windows.getAll(); |
||||
assert.equal(wins.length, 2); |
||||
|
||||
let tabs = await browser.tabs.query({ windowId: wins[1].id }); |
||||
let url = new URL(tabs[0].url); |
||||
assert.equal(url.href, `http://127.0.0.1:${port}/yahoo?q=an%20apple`) |
||||
}); |
||||
}); |
||||
|
||||
it('should open default engine with empty keywords by winopen command ', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
input.sendKeys('winopen', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let wins = await browser.windows.getAll(); |
||||
assert.equal(wins.length, 2); |
||||
|
||||
let tabs = await browser.tabs.query({ windowId: wins[1].id }); |
||||
let url = new URL(tabs[0].url); |
||||
assert.equal(url.href, `http://127.0.0.1:${port}/google?q=`) |
||||
}); |
||||
}); |
||||
|
||||
it('should open certain search page for empty keywords by winopen command ', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
input.sendKeys('winopen yahoo', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let wins = await browser.windows.getAll(); |
||||
assert.equal(wins.length, 2); |
||||
|
||||
let tabs = await browser.tabs.query({ windowId: wins[1].id }); |
||||
let url = new URL(tabs[0].url); |
||||
assert.equal(url.href, `http://127.0.0.1:${port}/yahoo?q=`) |
||||
}); |
||||
}); |
||||
|
||||
it('should open a site with domain by winopen command ', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
input.sendKeys('winopen i-beam.org', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let wins = await browser.windows.getAll(); |
||||
assert.equal(wins.length, 2); |
||||
|
||||
let tabs = await browser.tabs.query({ windowId: wins[1].id }); |
||||
let url = new URL(tabs[0].url); |
||||
assert.equal(url.href, 'https://i-beam.org/') |
||||
}); |
||||
}); |
||||
|
||||
it('should open a site with URL by winopen command ', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
input.sendKeys('winopen https://i-beam.org', Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let wins = await browser.windows.getAll(); |
||||
assert.equal(wins.length, 2); |
||||
|
||||
let tabs = await browser.tabs.query({ windowId: wins[1].id }); |
||||
let url = new URL(tabs[0].url); |
||||
assert.equal(url.href, 'https://i-beam.org/') |
||||
}); |
||||
}); |
||||
}); |
@ -0,0 +1,133 @@ |
||||
import * as path from 'path'; |
||||
import * as assert from 'assert'; |
||||
|
||||
import TestServer from './lib/TestServer'; |
||||
import settings from './settings'; |
||||
import eventually from './eventually'; |
||||
import { Builder, Lanthan } from 'lanthan'; |
||||
import { WebDriver } from 'selenium-webdriver'; |
||||
import Page from './lib/Page'; |
||||
|
||||
describe("winopen command test", () => { |
||||
let server = new TestServer(12321) |
||||
.receiveContent('/google', 'google') |
||||
.receiveContent('/yahoo', 'yahoo'); |
||||
let lanthan: Lanthan; |
||||
let webdriver: WebDriver; |
||||
let browser: any; |
||||
let page: Page; |
||||
|
||||
before(async() => { |
||||
lanthan = await Builder |
||||
.forBrowser('firefox') |
||||
.spyAddon(path.join(__dirname, '..')) |
||||
.build(); |
||||
webdriver = lanthan.getWebDriver(); |
||||
browser = lanthan.getWebExtBrowser(); |
||||
await browser.storage.local.set({ |
||||
settings, |
||||
}); |
||||
|
||||
await server.start(); |
||||
}); |
||||
|
||||
after(async() => { |
||||
await server.stop(); |
||||
if (lanthan) { |
||||
await lanthan.quit(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
let wins = await browser.windows.getAll(); |
||||
for (let win of wins.slice(1)) { |
||||
await browser.windows.remove(win.id); |
||||
} |
||||
|
||||
page = await Page.navigateTo(webdriver, server.url()); |
||||
}) |
||||
|
||||
it('should open default search for keywords by winopen command ', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('winopen an apple'); |
||||
|
||||
await eventually(async() => { |
||||
let wins = await browser.windows.getAll(); |
||||
assert.strictEqual(wins.length, 2); |
||||
|
||||
let tabs = await browser.tabs.query({ windowId: wins[1].id }); |
||||
let url = new URL(tabs[0].url); |
||||
assert.strictEqual(url.href, server.url('/google?q=an%20apple')) |
||||
}); |
||||
}); |
||||
|
||||
it('should open certain search page for keywords by winopen command ', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('winopen yahoo an apple'); |
||||
|
||||
await eventually(async() => { |
||||
let wins = await browser.windows.getAll(); |
||||
assert.strictEqual(wins.length, 2); |
||||
|
||||
let tabs = await browser.tabs.query({ windowId: wins[1].id }); |
||||
let url = new URL(tabs[0].url); |
||||
assert.strictEqual(url.href, server.url('/yahoo?q=an%20apple')) |
||||
}); |
||||
}); |
||||
|
||||
it('should open default engine with empty keywords by winopen command ', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('winopen'); |
||||
|
||||
await eventually(async() => { |
||||
let wins = await browser.windows.getAll(); |
||||
assert.strictEqual(wins.length, 2); |
||||
|
||||
let tabs = await browser.tabs.query({ windowId: wins[1].id }); |
||||
let url = new URL(tabs[0].url); |
||||
assert.strictEqual(url.href, server.url('/google?q=')) |
||||
}); |
||||
}); |
||||
|
||||
it('should open certain search page for empty keywords by winopen command ', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('winopen yahoo'); |
||||
|
||||
await eventually(async() => { |
||||
let wins = await browser.windows.getAll(); |
||||
assert.strictEqual(wins.length, 2); |
||||
|
||||
let tabs = await browser.tabs.query({ windowId: wins[1].id }); |
||||
let url = new URL(tabs[0].url); |
||||
assert.strictEqual(url.href, server.url('/yahoo?q=')) |
||||
}); |
||||
}); |
||||
|
||||
it('should open a site with domain by winopen command ', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('winopen example.com'); |
||||
|
||||
await eventually(async() => { |
||||
let wins = await browser.windows.getAll(); |
||||
assert.strictEqual(wins.length, 2); |
||||
|
||||
let tabs = await browser.tabs.query({ windowId: wins[1].id }); |
||||
let url = new URL(tabs[0].url); |
||||
assert.strictEqual(url.href, 'http://example.com/') |
||||
}); |
||||
}); |
||||
|
||||
it('should open a site with URL by winopen command ', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('winopen https://example.com/'); |
||||
|
||||
await eventually(async() => { |
||||
let wins = await browser.windows.getAll(); |
||||
assert.strictEqual(wins.length, 2); |
||||
|
||||
let tabs = await browser.tabs.query({ windowId: wins[1].id }); |
||||
let url = new URL(tabs[0].url); |
||||
assert.strictEqual(url.href, 'https://example.com/') |
||||
}); |
||||
}); |
||||
}); |
@ -1,136 +0,0 @@ |
||||
const express = require('express'); |
||||
const lanthan = require('lanthan'); |
||||
const path = require('path'); |
||||
const assert = require('assert'); |
||||
const eventually = require('./eventually'); |
||||
const settings = require('./settings'); |
||||
const Console = require('./lib/Console'); |
||||
|
||||
const Key = lanthan.Key; |
||||
|
||||
const newApp = () => { |
||||
let app = express(); |
||||
app.get('/', (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<body>ok</body> |
||||
</html">`); |
||||
}); |
||||
return app; |
||||
}; |
||||
|
||||
describe("general completion test", () => { |
||||
const port = 12321; |
||||
let http; |
||||
let firefox; |
||||
let session; |
||||
let browser; |
||||
let body; |
||||
|
||||
before(async() => { |
||||
firefox = await lanthan.firefox({ |
||||
spy: path.join(__dirname, '..'), |
||||
builderf: (builder) => { |
||||
builder.addFile('build/settings.js'); |
||||
}, |
||||
}); |
||||
session = firefox.session; |
||||
browser = firefox.browser; |
||||
http = newApp().listen(port); |
||||
|
||||
await browser.storage.local.set({ |
||||
settings, |
||||
}); |
||||
}); |
||||
|
||||
after(async() => { |
||||
http.close(); |
||||
if (firefox) { |
||||
await firefox.close(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}`); |
||||
body = await session.findElementByCSS('body'); |
||||
}); |
||||
|
||||
it('should all commands on empty line', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let c = new Console(session); |
||||
|
||||
await eventually(async() => { |
||||
let items = await c.getCompletions(); |
||||
assert.equal(items.length, 10); |
||||
assert.deepEqual(items[0], { type: 'title', text: 'Console Command' }); |
||||
assert(items[1].text.startsWith('set')) |
||||
assert(items[2].text.startsWith('open')) |
||||
assert(items[3].text.startsWith('tabopen')) |
||||
}); |
||||
}); |
||||
|
||||
it('should only commands filtered by prefix', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let c = new Console(session); |
||||
await c.sendKeys('b'); |
||||
|
||||
await eventually(async() => { |
||||
let items = await c.getCompletions(); |
||||
assert.equal(items.length, 4); |
||||
assert.deepEqual(items[0], { type: 'title', text: 'Console Command' }); |
||||
assert(items[1].text.startsWith('buffer')) |
||||
assert(items[2].text.startsWith('bdelete')) |
||||
assert(items[3].text.startsWith('bdeletes')) |
||||
}); |
||||
}); |
||||
|
||||
it('selects completion items by <Tab>/<S-Tab> keys', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let c = new Console(session); |
||||
await c.sendKeys('b'); |
||||
|
||||
await eventually(async() => { |
||||
let items = await c.getCompletions(); |
||||
assert.equal(items.length, 4); |
||||
}); |
||||
|
||||
await c.sendKeys(Key.Tab); |
||||
await eventually(async() => { |
||||
let items = await c.getCompletions(); |
||||
assert(items[1].highlight) |
||||
|
||||
let v = await c.currentValue(); |
||||
assert.equal(v, 'buffer'); |
||||
}); |
||||
|
||||
await c.sendKeys(Key.Tab, Key.Tab); |
||||
await eventually(async() => { |
||||
let items = await c.getCompletions(); |
||||
assert(items[3].highlight) |
||||
|
||||
let v = await c.currentValue(); |
||||
assert.equal(v, 'bdeletes'); |
||||
}); |
||||
|
||||
await c.sendKeys(Key.Tab); |
||||
await eventually(async() => { |
||||
let v = await c.currentValue(); |
||||
assert.equal(v, 'b'); |
||||
}); |
||||
|
||||
await c.sendKeys(Key.Shift, Key.Tab); |
||||
await eventually(async() => { |
||||
let items = await c.getCompletions(); |
||||
assert(items[3].highlight) |
||||
|
||||
let v = await c.currentValue(); |
||||
assert.equal(v, 'bdeletes'); |
||||
}); |
||||
}); |
||||
}); |
@ -0,0 +1,100 @@ |
||||
import * as path from 'path'; |
||||
import * as assert from 'assert'; |
||||
|
||||
import eventually from './eventually'; |
||||
import settings from './settings'; |
||||
import { Builder, Lanthan } from 'lanthan'; |
||||
import { WebDriver, Key } from 'selenium-webdriver'; |
||||
import Page from './lib/Page'; |
||||
|
||||
describe("general completion test", () => { |
||||
let lanthan: Lanthan; |
||||
let webdriver: WebDriver; |
||||
let browser: any; |
||||
let page: Page; |
||||
|
||||
before(async() => { |
||||
lanthan = await Builder |
||||
.forBrowser('firefox') |
||||
.spyAddon(path.join(__dirname, '..')) |
||||
.build(); |
||||
webdriver = lanthan.getWebDriver(); |
||||
browser = lanthan.getWebExtBrowser(); |
||||
|
||||
await browser.storage.local.set({ |
||||
settings, |
||||
}); |
||||
}); |
||||
|
||||
after(async() => { |
||||
if (lanthan) { |
||||
await lanthan.quit(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
page = await Page.navigateTo(webdriver, 'about:blank'); |
||||
}); |
||||
|
||||
it('should all commands on empty line', async() => { |
||||
let console = await page.showConsole(); |
||||
|
||||
let items = await console.getCompletions(); |
||||
assert.strictEqual(items.length, 10); |
||||
assert.deepStrictEqual(items[0], { type: 'title', text: 'Console Command' }); |
||||
assert.ok(items[1].text.startsWith('set')) |
||||
assert.ok(items[2].text.startsWith('open')) |
||||
assert.ok(items[3].text.startsWith('tabopen')) |
||||
}); |
||||
|
||||
it('should only commands filtered by prefix', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.inputKeys('b'); |
||||
|
||||
let items = await console.getCompletions(); |
||||
assert.strictEqual(items.length, 4); |
||||
assert.deepStrictEqual(items[0], { type: 'title', text: 'Console Command' }); |
||||
assert.ok(items[1].text.startsWith('buffer')) |
||||
assert.ok(items[2].text.startsWith('bdelete')) |
||||
assert.ok(items[3].text.startsWith('bdeletes')) |
||||
}); |
||||
|
||||
// > byffer
|
||||
// > bdelete
|
||||
// > bdeletes
|
||||
// : b
|
||||
it('selects completion items by <Tab>/<S-Tab> keys', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.inputKeys('b'); |
||||
await eventually(async() => { |
||||
let items = await console.getCompletions(); |
||||
assert.strictEqual(items.length, 4); |
||||
}); |
||||
|
||||
await console.sendKeys(Key.TAB); |
||||
await eventually(async() => { |
||||
let items = await console.getCompletions(); |
||||
assert.ok(items[1].highlight) |
||||
assert.strictEqual(await console.currentValue(), 'buffer'); |
||||
}); |
||||
|
||||
await console.sendKeys(Key.TAB, Key.TAB); |
||||
await eventually(async() => { |
||||
let items = await console.getCompletions(); |
||||
assert.ok(items[3].highlight) |
||||
assert.strictEqual(await console.currentValue(), 'bdeletes'); |
||||
}); |
||||
|
||||
await console.sendKeys(Key.TAB); |
||||
await eventually(async() => { |
||||
assert.strictEqual(await console.currentValue(), 'b'); |
||||
}); |
||||
|
||||
await console.sendKeys(Key.SHIFT, Key.TAB); |
||||
await eventually(async() => { |
||||
let items = await console.getCompletions(); |
||||
assert.ok(items[3].highlight) |
||||
assert.strictEqual(await console.currentValue(), 'bdeletes'); |
||||
}); |
||||
}); |
||||
}); |
@ -1,214 +0,0 @@ |
||||
const express = require('express'); |
||||
const lanthan = require('lanthan'); |
||||
const path = require('path'); |
||||
const assert = require('assert'); |
||||
const eventually = require('./eventually'); |
||||
const settings = require('./settings'); |
||||
const Console = require('./lib/Console'); |
||||
|
||||
const Key = lanthan.Key; |
||||
|
||||
const newApp = () => { |
||||
|
||||
let app = express(); |
||||
app.get('/*', (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<head> |
||||
<title>title_${req.path.slice(1)}</title> |
||||
</head> |
||||
<body><h1>home</h1></body> |
||||
</html">`); |
||||
}); |
||||
return app; |
||||
}; |
||||
|
||||
describe("completion on buffer/bdelete/bdeletes", () => { |
||||
const port = 12321; |
||||
let http; |
||||
let firefox; |
||||
let session; |
||||
let browser; |
||||
let body; |
||||
|
||||
before(async() => { |
||||
firefox = await lanthan.firefox({ |
||||
spy: path.join(__dirname, '..'), |
||||
builderf: (builder) => { |
||||
builder.addFile('build/settings.js'); |
||||
}, |
||||
}); |
||||
session = firefox.session; |
||||
browser = firefox.browser; |
||||
http = newApp().listen(port); |
||||
|
||||
await browser.storage.local.set({ |
||||
settings, |
||||
}); |
||||
}); |
||||
|
||||
after(async() => { |
||||
http.close(); |
||||
if (firefox) { |
||||
await firefox.close(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
for (let tab of tabs.slice(1)) { |
||||
await browser.tabs.remove(tab.id); |
||||
} |
||||
|
||||
await browser.tabs.update(tabs[0].id, { url: `http://127.0.0.1:${port}/site1`, pinned: true }); |
||||
await browser.tabs.create({ url: `http://127.0.0.1:${port}/site2`, pinned: true }) |
||||
for (let i = 3; i <= 5; ++i) { |
||||
await browser.tabs.create({ url: `http://127.0.0.1:${port}/site${i}` }) |
||||
} |
||||
|
||||
await eventually(async() => { |
||||
let handles = await session.getWindowHandles(); |
||||
assert.equal(handles.length, 5); |
||||
await session.switchToWindow(handles[2]); |
||||
await session.findElementByCSS('iframe'); |
||||
}); |
||||
body = await session.findElementByCSS('body'); |
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 100)); |
||||
}); |
||||
|
||||
it('should all tabs by "buffer" command with empty params', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let c = new Console(session); |
||||
await c.sendKeys('buffer '); |
||||
|
||||
await eventually(async() => { |
||||
let items = await c.getCompletions(); |
||||
assert.equal(items.length, 6); |
||||
assert.deepEqual(items[0], { type: 'title', text: 'Buffers' }); |
||||
assert(items[1].text.startsWith('1:')); |
||||
assert(items[2].text.startsWith('2:')); |
||||
assert(items[3].text.startsWith('3:')); |
||||
assert(items[4].text.startsWith('4:')); |
||||
assert(items[5].text.startsWith('5:')); |
||||
|
||||
assert(items[3].text.includes('%')); |
||||
assert(items[5].text.includes('#')); |
||||
}); |
||||
}) |
||||
|
||||
it('should filter items with URLs by keywords on "buffer" command', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let c = new Console(session); |
||||
await c.sendKeys('buffer title_site2'); |
||||
|
||||
await eventually(async() => { |
||||
let items = await c.getCompletions(); |
||||
assert.deepEqual(items[0], { type: 'title', text: 'Buffers' }); |
||||
assert(items[1].text.startsWith('2:')); |
||||
assert(items[1].text.includes('title_site2')); |
||||
assert(items[1].text.includes(`http://127.0.0.1:${port}/site2`)); |
||||
}); |
||||
}) |
||||
|
||||
it('should filter items with titles by keywords on "buffer" command', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let c = new Console(session); |
||||
await c.sendKeys('buffer /site2'); |
||||
|
||||
await eventually(async() => { |
||||
let items = await c.getCompletions(); |
||||
assert.deepEqual(items[0], { type: 'title', text: 'Buffers' }); |
||||
assert(items[1].text.startsWith('2:')); |
||||
}); |
||||
}) |
||||
|
||||
it('should show one item by number on "buffer" command', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let c = new Console(session); |
||||
await c.sendKeys('buffer 2'); |
||||
|
||||
await eventually(async() => { |
||||
let items = await c.getCompletions(); |
||||
assert.equal(items.length, 2); |
||||
assert.deepEqual(items[0], { type: 'title', text: 'Buffers' }); |
||||
assert(items[1].text.startsWith('2:')); |
||||
}); |
||||
}) |
||||
|
||||
it('should show unpinned tabs "bdelete" command', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let c = new Console(session); |
||||
await c.sendKeys('bdelete site'); |
||||
|
||||
await eventually(async() => { |
||||
let items = await c.getCompletions(); |
||||
assert.equal(items.length, 4); |
||||
assert(items[1].text.includes('site3')); |
||||
assert(items[2].text.includes('site4')); |
||||
assert(items[3].text.includes('site5')); |
||||
}); |
||||
}) |
||||
|
||||
it('should show unpinned tabs "bdeletes" command', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let c = new Console(session); |
||||
await c.sendKeys('bdelete site'); |
||||
|
||||
await eventually(async() => { |
||||
let items = await c.getCompletions(); |
||||
assert.equal(items.length, 4); |
||||
assert(items[1].text.includes('site3')); |
||||
assert(items[2].text.includes('site4')); |
||||
assert(items[3].text.includes('site5')); |
||||
}); |
||||
}) |
||||
|
||||
it('should show both pinned and unpinned tabs "bdelete!" command', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let c = new Console(session); |
||||
await c.sendKeys('bdelete! site'); |
||||
|
||||
await eventually(async() => { |
||||
let items = await c.getCompletions(); |
||||
assert.equal(items.length, 6); |
||||
assert(items[1].text.includes('site1')); |
||||
assert(items[2].text.includes('site2')); |
||||
assert(items[3].text.includes('site3')); |
||||
assert(items[4].text.includes('site4')); |
||||
assert(items[5].text.includes('site5')); |
||||
}); |
||||
}) |
||||
|
||||
it('should show both pinned and unpinned tabs "bdeletes!" command', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let c = new Console(session); |
||||
await c.sendKeys('bdeletes! site'); |
||||
|
||||
await eventually(async() => { |
||||
let items = await c.getCompletions(); |
||||
assert.equal(items.length, 6); |
||||
assert(items[1].text.includes('site1')); |
||||
assert(items[2].text.includes('site2')); |
||||
assert(items[3].text.includes('site3')); |
||||
assert(items[4].text.includes('site4')); |
||||
assert(items[5].text.includes('site5')); |
||||
}); |
||||
}) |
||||
}); |
@ -0,0 +1,180 @@ |
||||
import * as assert from 'assert'; |
||||
import * as path from 'path'; |
||||
|
||||
import { Request, Response } from 'express' |
||||
import TestServer from './lib/TestServer'; |
||||
import settings from './settings'; |
||||
import eventually from './eventually'; |
||||
import { Builder, Lanthan } from 'lanthan'; |
||||
import { WebDriver } from 'selenium-webdriver'; |
||||
import Page from './lib/Page'; |
||||
|
||||
describe("completion on buffer/bdelete/bdeletes", () => { |
||||
let server = new TestServer().handle('/*', (req: Request, res: Response) => { |
||||
res.send(` |
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<title>title_${req.path.slice(1)}</title> |
||||
</head> |
||||
</html">`); |
||||
}); |
||||
let lanthan: Lanthan; |
||||
let webdriver: WebDriver; |
||||
let browser: any; |
||||
let page: Page; |
||||
|
||||
before(async() => { |
||||
lanthan = await Builder |
||||
.forBrowser('firefox') |
||||
.spyAddon(path.join(__dirname, '..')) |
||||
.build(); |
||||
webdriver = lanthan.getWebDriver(); |
||||
browser = lanthan.getWebExtBrowser(); |
||||
|
||||
await browser.storage.local.set({ |
||||
settings, |
||||
}); |
||||
|
||||
await server.start(); |
||||
}); |
||||
|
||||
after(async() => { |
||||
await server.stop(); |
||||
if (lanthan) { |
||||
await lanthan.quit(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
for (let tab of tabs.slice(1)) { |
||||
await browser.tabs.remove(tab.id); |
||||
} |
||||
|
||||
await browser.tabs.update(tabs[0].id, { url: server.url('/site1'), pinned: true }); |
||||
await browser.tabs.create({ url:server.url('/site2'), pinned: true }) |
||||
for (let i = 3; i <= 5; ++i) { |
||||
await browser.tabs.create({ url: server.url('/site' + i) }); |
||||
} |
||||
|
||||
await eventually(async() => { |
||||
let handles = await webdriver.getAllWindowHandles(); |
||||
assert.strictEqual(handles.length, 5); |
||||
await webdriver.switchTo().window(handles[2]); |
||||
}); |
||||
|
||||
page = await Page.currentContext(webdriver); |
||||
}); |
||||
|
||||
it('should all tabs by "buffer" command with empty params', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.inputKeys('buffer '); |
||||
|
||||
await eventually(async() => { |
||||
let items = await console.getCompletions(); |
||||
assert.strictEqual(items.length, 6); |
||||
assert.deepStrictEqual(items[0], { type: 'title', text: 'Buffers' }); |
||||
assert.ok(items[1].text.startsWith('1:')); |
||||
assert.ok(items[2].text.startsWith('2:')); |
||||
assert.ok(items[3].text.startsWith('3:')); |
||||
assert.ok(items[4].text.startsWith('4:')); |
||||
assert.ok(items[5].text.startsWith('5:')); |
||||
|
||||
assert.ok(items[3].text.includes('%')); |
||||
assert.ok(items[5].text.includes('#')); |
||||
}); |
||||
}) |
||||
|
||||
it('should filter items with URLs by keywords on "buffer" command', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.inputKeys('buffer title_site2'); |
||||
|
||||
await eventually(async() => { |
||||
let items = await console.getCompletions(); |
||||
assert.deepStrictEqual(items[0], { type: 'title', text: 'Buffers' }); |
||||
assert.ok(items[1].text.startsWith('2:')); |
||||
assert.ok(items[1].text.includes('title_site2')); |
||||
assert.ok(items[1].text.includes(server.url('/site2'))); |
||||
}); |
||||
}) |
||||
|
||||
it('should filter items with titles by keywords on "buffer" command', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.inputKeys('buffer /site2'); |
||||
|
||||
await eventually(async() => { |
||||
let items = await console.getCompletions(); |
||||
assert.deepStrictEqual(items[0], { type: 'title', text: 'Buffers' }); |
||||
assert.ok(items[1].text.startsWith('2:')); |
||||
}); |
||||
}) |
||||
|
||||
it('should show one item by number on "buffer" command', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.inputKeys('buffer 2'); |
||||
|
||||
await eventually(async() => { |
||||
let items = await console.getCompletions(); |
||||
assert.strictEqual(items.length, 2); |
||||
assert.deepStrictEqual(items[0], { type: 'title', text: 'Buffers' }); |
||||
assert.ok(items[1].text.startsWith('2:')); |
||||
}); |
||||
}) |
||||
|
||||
it('should show unpinned tabs "bdelete" command', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.inputKeys('bdelete site'); |
||||
|
||||
await eventually(async() => { |
||||
let items = await console.getCompletions(); |
||||
assert.strictEqual(items.length, 4); |
||||
assert.ok(items[1].text.includes('site3')); |
||||
assert.ok(items[2].text.includes('site4')); |
||||
assert.ok(items[3].text.includes('site5')); |
||||
}); |
||||
}) |
||||
|
||||
it('should show unpinned tabs "bdeletes" command', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.inputKeys('bdeletes site'); |
||||
|
||||
await eventually(async() => { |
||||
let items = await console.getCompletions(); |
||||
assert.strictEqual(items.length, 4); |
||||
assert.ok(items[1].text.includes('site3')); |
||||
assert.ok(items[2].text.includes('site4')); |
||||
assert.ok(items[3].text.includes('site5')); |
||||
}); |
||||
}) |
||||
|
||||
it('should show both pinned and unpinned tabs "bdelete!" command', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.inputKeys('bdelete! site'); |
||||
|
||||
await eventually(async() => { |
||||
let items = await console.getCompletions(); |
||||
assert.strictEqual(items.length, 6); |
||||
assert.ok(items[1].text.includes('site1')); |
||||
assert.ok(items[2].text.includes('site2')); |
||||
assert.ok(items[3].text.includes('site3')); |
||||
assert.ok(items[4].text.includes('site4')); |
||||
assert.ok(items[5].text.includes('site5')); |
||||
}); |
||||
}) |
||||
|
||||
it('should show both pinned and unpinned tabs "bdeletes!" command', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.inputKeys('bdeletes! site'); |
||||
|
||||
await eventually(async() => { |
||||
let items = await console.getCompletions(); |
||||
assert.strictEqual(items.length, 6); |
||||
assert.ok(items[1].text.includes('site1')); |
||||
assert.ok(items[2].text.includes('site2')); |
||||
assert.ok(items[3].text.includes('site3')); |
||||
assert.ok(items[4].text.includes('site4')); |
||||
assert.ok(items[5].text.includes('site5')); |
||||
}); |
||||
}) |
||||
}); |
@ -1,255 +0,0 @@ |
||||
const express = require('express'); |
||||
const lanthan = require('lanthan'); |
||||
const path = require('path'); |
||||
const assert = require('assert'); |
||||
const eventually = require('./eventually'); |
||||
const settings = require('./settings'); |
||||
const Console = require('./lib/Console'); |
||||
|
||||
const Key = lanthan.Key; |
||||
|
||||
const newApp = () => { |
||||
|
||||
let app = express(); |
||||
app.get('/', (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<body>ok</body> |
||||
</html">`); |
||||
}); |
||||
return app; |
||||
}; |
||||
|
||||
describe("completion on open/tabopen/winopen commands", () => { |
||||
const port = 12321; |
||||
let http; |
||||
let firefox; |
||||
let session; |
||||
let browser; |
||||
let body; |
||||
|
||||
before(async() => { |
||||
firefox = await lanthan.firefox({ |
||||
spy: path.join(__dirname, '..'), |
||||
builderf: (builder) => { |
||||
builder.addFile('build/settings.js'); |
||||
}, |
||||
}); |
||||
session = firefox.session; |
||||
browser = firefox.browser; |
||||
http = newApp().listen(port); |
||||
|
||||
await browser.storage.local.set({ |
||||
settings, |
||||
}); |
||||
|
||||
// Add item into hitories
|
||||
await session.navigateTo(`https://i-beam.org/404`); |
||||
}); |
||||
|
||||
after(async() => { |
||||
http.close(); |
||||
if (firefox) { |
||||
await firefox.close(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}`); |
||||
body = await session.findElementByCSS('body'); |
||||
}); |
||||
|
||||
it('should show completions from search engines, bookmarks, and histories by "open" command', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let c = new Console(session); |
||||
await c.sendKeys('open '); |
||||
|
||||
await eventually(async() => { |
||||
let completions = await c.getCompletions(); |
||||
assert(completions.find(x => x.type === 'title' && x.text === 'Search Engines')); |
||||
assert(completions.find(x => x.type === 'title' && x.text === 'Bookmarks')); |
||||
assert(completions.find(x => x.type === 'title' && x.text === 'History')); |
||||
}); |
||||
}); |
||||
|
||||
it('should filter items with URLs by keywords on "open" command', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let c = new Console(session); |
||||
await c.sendKeys('open https://'); |
||||
|
||||
await eventually(async() => { |
||||
let completions = await c.getCompletions(); |
||||
let items = completions.filter(x => x.type === 'item').map(x => x.text); |
||||
assert(items.every(x => x.includes('https://'))); |
||||
}); |
||||
}) |
||||
|
||||
it('should filter items with titles by keywords on "open" command', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let c = new Console(session); |
||||
await c.sendKeys('open getting'); |
||||
|
||||
await eventually(async() => { |
||||
let completions = await c.getCompletions(); |
||||
let items = completions.filter(x => x.type === 'item').map(x => x.text); |
||||
assert(items.every(x => x.toLowerCase().includes('getting'))); |
||||
}); |
||||
}) |
||||
|
||||
it('should filter items with titles by keywords on "tabopen" command', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let c = new Console(session); |
||||
await c.sendKeys('tabopen https://'); |
||||
|
||||
await eventually(async() => { |
||||
let completions = await c.getCompletions(); |
||||
let items = completions.filter(x => x.type === 'item').map(x => x.text); |
||||
assert(items.every(x => x.includes('https://'))); |
||||
}); |
||||
}) |
||||
|
||||
it('should filter items with titles by keywords on "winopen" command', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let c = new Console(session); |
||||
await c.sendKeys('winopen https://'); |
||||
|
||||
await eventually(async() => { |
||||
let completions = await c.getCompletions(); |
||||
let items = completions.filter(x => x.type === 'item').map(x => x.text); |
||||
assert(items.every(x => x.includes('https://'))); |
||||
}); |
||||
}) |
||||
|
||||
it('should display only specified items in "complete" property by set command', async() => { |
||||
let c = new Console(session); |
||||
|
||||
const execCommand = async(line) => { |
||||
await body.sendKeys(':'); |
||||
await session.switchToFrame(0); |
||||
await c.sendKeys(line, Key.Enter); |
||||
await session.switchToParentFrame(); |
||||
} |
||||
|
||||
const typeCommand = async(...keys) => { |
||||
await body.sendKeys(':'); |
||||
await session.switchToFrame(0); |
||||
await c.sendKeys(...keys); |
||||
} |
||||
|
||||
const cancel = async() => { |
||||
await c.sendKeys(Key.Escape); |
||||
await session.switchToParentFrame(); |
||||
} |
||||
|
||||
await execCommand('set complete=sbh'); |
||||
await typeCommand('open '); |
||||
|
||||
await eventually(async() => { |
||||
let completions = await c.getCompletions(); |
||||
let titles = completions.filter(x => x.type === 'title').map(x => x.text); |
||||
assert.deepEqual(titles, ['Search Engines', 'Bookmarks', 'History']) |
||||
}); |
||||
|
||||
await cancel(); |
||||
await execCommand('set complete=bss'); |
||||
await typeCommand('open '); |
||||
|
||||
await eventually(async() => { |
||||
let completions = await c.getCompletions(); |
||||
let titles = completions.filter(x => x.type === 'title').map(x => x.text); |
||||
assert.deepEqual(titles, ['Bookmarks', 'Search Engines', 'Search Engines']) |
||||
}); |
||||
}) |
||||
|
||||
it('should display only specified items in "complete" property by setting', async() => { |
||||
const settings = { |
||||
source: 'json', |
||||
json: `{
|
||||
"keymaps": { |
||||
":": { "type": "command.show" } |
||||
}, |
||||
"search": { |
||||
"default": "google", |
||||
"engines": { "google": "https://google.com/search?q={}" } |
||||
}, |
||||
"properties": { |
||||
"complete": "sbh" |
||||
} |
||||
}`,
|
||||
}; |
||||
await browser.storage.local.set({ settings, }); |
||||
|
||||
let c = new Console(session); |
||||
|
||||
const typeCommand = async(...keys) => { |
||||
await body.sendKeys(':'); |
||||
await session.switchToFrame(0); |
||||
await c.sendKeys(...keys); |
||||
} |
||||
|
||||
const cancel = async() => { |
||||
await c.sendKeys(Key.Escape); |
||||
await session.switchToParentFrame(); |
||||
} |
||||
|
||||
await browser.storage.local.set({ settings: { |
||||
source: 'json', |
||||
json: `{
|
||||
"keymaps": { |
||||
":": { "type": "command.show" } |
||||
}, |
||||
"search": { |
||||
"default": "google", |
||||
"engines": { "google": "https://google.com/search?q={}" } |
||||
}, |
||||
"properties": { |
||||
"complete": "sbh" |
||||
} |
||||
}`,
|
||||
}}); |
||||
await typeCommand('open '); |
||||
|
||||
await eventually(async() => { |
||||
let completions = await c.getCompletions(); |
||||
let titles = completions.filter(x => x.type === 'title').map(x => x.text); |
||||
assert.deepEqual(titles, ['Search Engines', 'Bookmarks', 'History']) |
||||
}); |
||||
|
||||
await cancel(); |
||||
|
||||
await browser.storage.local.set({ settings: { |
||||
source: 'json', |
||||
json: `{
|
||||
"keymaps": { |
||||
":": { "type": "command.show" } |
||||
}, |
||||
"search": { |
||||
"default": "google", |
||||
"engines": { "google": "https://google.com/search?q={}" } |
||||
}, |
||||
"properties": { |
||||
"complete": "bss" |
||||
} |
||||
}`,
|
||||
}}); |
||||
await typeCommand('open '); |
||||
|
||||
await eventually(async() => { |
||||
let completions = await c.getCompletions(); |
||||
let titles = completions.filter(x => x.type === 'title').map(x => x.text); |
||||
assert.deepEqual(titles, ['Bookmarks', 'Search Engines', 'Search Engines']) |
||||
}); |
||||
|
||||
|
||||
}) |
||||
}); |
@ -0,0 +1,186 @@ |
||||
import * as path from 'path'; |
||||
import * as assert from 'assert'; |
||||
|
||||
import TestServer from './lib/TestServer'; |
||||
import settings from './settings'; |
||||
import eventually from './eventually'; |
||||
import { Builder, Lanthan } from 'lanthan'; |
||||
import { WebDriver } from 'selenium-webdriver'; |
||||
import Page from './lib/Page'; |
||||
|
||||
describe("completion on open/tabopen/winopen commands", () => { |
||||
let server = new TestServer().receiveContent('/*', 'ok'); |
||||
let lanthan: Lanthan; |
||||
let webdriver: WebDriver; |
||||
let browser: any; |
||||
let page: Page; |
||||
|
||||
before(async() => { |
||||
await server.start(); |
||||
|
||||
lanthan = await Builder |
||||
.forBrowser('firefox') |
||||
.spyAddon(path.join(__dirname, '..')) |
||||
.build(); |
||||
webdriver = lanthan.getWebDriver(); |
||||
browser = lanthan.getWebExtBrowser(); |
||||
|
||||
await browser.storage.local.set({ |
||||
settings, |
||||
}); |
||||
|
||||
// Add item into hitories
|
||||
await webdriver.navigate().to(('https://i-beam.org/404')); |
||||
}); |
||||
|
||||
after(async() => { |
||||
await server.stop(); |
||||
if (lanthan) { |
||||
await lanthan.quit(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
page = await Page.navigateTo(webdriver, server.url()); |
||||
}); |
||||
|
||||
it('should show completions from search engines, bookmarks, and histories by "open" command', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.inputKeys('open '); |
||||
|
||||
await eventually(async() => { |
||||
let completions = await console.getCompletions(); |
||||
assert.ok(completions.find(x => x.type === 'title' && x.text === 'Search Engines')); |
||||
assert.ok(completions.find(x => x.type === 'title' && x.text === 'Bookmarks')); |
||||
assert.ok(completions.find(x => x.type === 'title' && x.text === 'History')); |
||||
}); |
||||
}); |
||||
|
||||
it('should filter items with URLs by keywords on "open" command', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.inputKeys('open https://'); |
||||
|
||||
await eventually(async() => { |
||||
let completions = await console.getCompletions(); |
||||
let items = completions.filter(x => x.type === 'item').map(x => x.text); |
||||
assert.ok(items.every(x => x.includes('https://'))); |
||||
}); |
||||
}) |
||||
|
||||
it('should filter items with titles by keywords on "open" command', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.inputKeys('open getting'); |
||||
|
||||
await eventually(async() => { |
||||
let completions = await console.getCompletions(); |
||||
let items = completions.filter(x => x.type === 'item').map(x => x.text); |
||||
assert.ok(items.every(x => x.toLowerCase().includes('getting'))); |
||||
}); |
||||
}) |
||||
|
||||
it('should filter items with titles by keywords on "tabopen" command', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.inputKeys('tabopen getting'); |
||||
|
||||
await eventually(async() => { |
||||
let completions = await console.getCompletions(); |
||||
let items = completions.filter(x => x.type === 'item').map(x => x.text); |
||||
assert.ok(items.every(x => x.includes('https://'))); |
||||
}); |
||||
}) |
||||
|
||||
it('should filter items with titles by keywords on "winopen" command', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.inputKeys('winopen https://'); |
||||
|
||||
await eventually(async() => { |
||||
let completions = await console.getCompletions(); |
||||
let items = completions.filter(x => x.type === 'item').map(x => x.text); |
||||
assert.ok(items.every(x => x.includes('https://'))); |
||||
}); |
||||
}) |
||||
|
||||
it('should display only specified items in "complete" property by set command', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('set complete=sbh'); |
||||
await (webdriver.switchTo() as any).parentFrame(); |
||||
|
||||
console = await page.showConsole(); |
||||
await console.inputKeys('open '); |
||||
|
||||
await eventually(async() => { |
||||
let completions = await console.getCompletions(); |
||||
let titles = completions.filter(x => x.type === 'title').map(x => x.text); |
||||
assert.deepStrictEqual(titles, ['Search Engines', 'Bookmarks', 'History']) |
||||
}); |
||||
|
||||
await console.close(); |
||||
console = await page.showConsole(); |
||||
await console.execCommand('set complete=bss'); |
||||
await (webdriver.switchTo() as any).parentFrame(); |
||||
|
||||
console = await page.showConsole(); |
||||
await console.inputKeys('open '); |
||||
|
||||
await eventually(async() => { |
||||
let completions = await console.getCompletions(); |
||||
let titles = completions.filter(x => x.type === 'title').map(x => x.text); |
||||
assert.deepStrictEqual(titles, ['Bookmarks', 'Search Engines', 'Search Engines']) |
||||
}); |
||||
}) |
||||
|
||||
it('should display only specified items in "complete" property by setting', async() => { |
||||
await browser.storage.local.set({ settings: { |
||||
source: 'json', |
||||
json: `{
|
||||
"keymaps": { |
||||
":": { "type": "command.show" } |
||||
}, |
||||
"search": { |
||||
"default": "google", |
||||
"engines": { "google": "https://google.com/search?q={}" } |
||||
}, |
||||
"properties": { |
||||
"complete": "sbh" |
||||
} |
||||
}`,
|
||||
}}); |
||||
|
||||
let console = await page.showConsole(); |
||||
await console.inputKeys('open '); |
||||
|
||||
await eventually(async() => { |
||||
let completions = await console.getCompletions(); |
||||
let titles = completions.filter(x => x.type === 'title').map(x => x.text); |
||||
assert.deepStrictEqual(titles, ['Search Engines', 'Bookmarks', 'History']) |
||||
}); |
||||
|
||||
await console.close(); |
||||
await (webdriver.switchTo() as any).parentFrame(); |
||||
|
||||
await browser.storage.local.set({ settings: { |
||||
source: 'json', |
||||
json: `{
|
||||
"keymaps": { |
||||
":": { "type": "command.show" } |
||||
}, |
||||
"search": { |
||||
"default": "google", |
||||
"engines": { "google": "https://google.com/search?q={}" } |
||||
}, |
||||
"properties": { |
||||
"complete": "bss" |
||||
} |
||||
}`,
|
||||
}}); |
||||
|
||||
console = await page.showConsole(); |
||||
await console.inputKeys('open '); |
||||
|
||||
await eventually(async() => { |
||||
let completions = await console.getCompletions(); |
||||
let titles = completions.filter(x => x.type === 'title').map(x => x.text); |
||||
assert.deepStrictEqual(titles, ['Bookmarks', 'Search Engines', 'Search Engines']) |
||||
}); |
||||
}) |
||||
}); |
@ -1,75 +0,0 @@ |
||||
const express = require('express'); |
||||
const lanthan = require('lanthan'); |
||||
const path = require('path'); |
||||
const assert = require('assert'); |
||||
const eventually = require('./eventually'); |
||||
const settings = require('./settings'); |
||||
const Console = require('./lib/Console'); |
||||
|
||||
const Key = lanthan.Key; |
||||
|
||||
describe("completion on set commands", () => { |
||||
const port = 12321; |
||||
let firefox; |
||||
let session; |
||||
let browser; |
||||
let body; |
||||
|
||||
before(async() => { |
||||
firefox = await lanthan.firefox({ |
||||
spy: path.join(__dirname, '..'), |
||||
builderf: (builder) => { |
||||
builder.addFile('build/settings.js'); |
||||
}, |
||||
}); |
||||
session = firefox.session; |
||||
browser = firefox.browser; |
||||
|
||||
await browser.storage.local.set({ |
||||
settings, |
||||
}); |
||||
}); |
||||
|
||||
after(async() => { |
||||
if (firefox) { |
||||
await firefox.close(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
await session.navigateTo(`about:blank`); |
||||
body = await session.findElementByCSS('body'); |
||||
}); |
||||
|
||||
it('should show all property names by "set" command with empty params', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let c = new Console(session); |
||||
await c.sendKeys('set '); |
||||
|
||||
await eventually(async() => { |
||||
let items = await c.getCompletions(); |
||||
assert.equal(items.length, 5); |
||||
assert.deepEqual(items[0], { type: 'title', text: 'Properties' }); |
||||
assert(items[1].text.startsWith('hintchars')) |
||||
assert(items[2].text.startsWith('smoothscroll')) |
||||
assert(items[3].text.startsWith('nosmoothscroll')) |
||||
assert(items[4].text.startsWith('complete')) |
||||
}); |
||||
}); |
||||
|
||||
it('should show filtered property names by "set" command', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let c = new Console(session); |
||||
await c.sendKeys('set no'); |
||||
|
||||
await eventually(async() => { |
||||
let items = await c.getCompletions(); |
||||
assert.equal(items.length, 2); |
||||
assert(items[1].text.includes('nosmoothscroll')) |
||||
}); |
||||
}); |
||||
}); |
@ -0,0 +1,64 @@ |
||||
import * as path from 'path'; |
||||
import * as assert from 'assert'; |
||||
|
||||
import settings from './settings'; |
||||
import eventually from './eventually'; |
||||
import { Builder, Lanthan } from 'lanthan'; |
||||
import { WebDriver } from 'selenium-webdriver'; |
||||
import Page from './lib/Page'; |
||||
|
||||
describe("completion on set commands", () => { |
||||
let lanthan: Lanthan; |
||||
let webdriver: WebDriver; |
||||
let browser: any; |
||||
let page: Page; |
||||
|
||||
before(async() => { |
||||
lanthan = await Builder |
||||
.forBrowser('firefox') |
||||
.spyAddon(path.join(__dirname, '..')) |
||||
.build(); |
||||
webdriver = lanthan.getWebDriver(); |
||||
browser = lanthan.getWebExtBrowser(); |
||||
|
||||
await browser.storage.local.set({ |
||||
settings, |
||||
}); |
||||
}); |
||||
|
||||
after(async() => { |
||||
if (lanthan) { |
||||
await lanthan.quit(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
page = await Page.navigateTo(webdriver, `about:blank`); |
||||
}); |
||||
|
||||
it('should show all property names by "set" command with empty params', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.inputKeys('set '); |
||||
|
||||
await eventually(async() => { |
||||
let items = await console.getCompletions(); |
||||
assert.strictEqual(items.length, 5); |
||||
assert.deepStrictEqual(items[0], { type: 'title', text: 'Properties' }); |
||||
assert.ok(items[1].text.startsWith('hintchars')) |
||||
assert.ok(items[2].text.startsWith('smoothscroll')) |
||||
assert.ok(items[3].text.startsWith('nosmoothscroll')) |
||||
assert.ok(items[4].text.startsWith('complete')) |
||||
}); |
||||
}); |
||||
|
||||
it('should show filtered property names by "set" command', async() => { |
||||
let console = await page.showConsole(); |
||||
await console.inputKeys('set no'); |
||||
|
||||
await eventually(async() => { |
||||
let items = await console.getCompletions(); |
||||
assert.strictEqual(items.length, 2); |
||||
assert.ok(items[1].text.includes('nosmoothscroll')) |
||||
}); |
||||
}); |
||||
}); |
@ -1,125 +0,0 @@ |
||||
const express = require('express'); |
||||
const lanthan = require('lanthan'); |
||||
const path = require('path'); |
||||
const assert = require('assert'); |
||||
const eventually = require('./eventually'); |
||||
|
||||
const Key = lanthan.Key; |
||||
|
||||
const newApp = () => { |
||||
let app = express(); |
||||
app.get('/', (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<head> |
||||
<title>Hello, world!</title> |
||||
</head> |
||||
</html">`); |
||||
}); |
||||
return app; |
||||
}; |
||||
|
||||
|
||||
describe("console test", () => { |
||||
const port = 12321; |
||||
let http; |
||||
let firefox; |
||||
let session; |
||||
let browser; |
||||
let tab; |
||||
let body; |
||||
|
||||
before(async() => { |
||||
firefox = await lanthan.firefox(); |
||||
await firefox.session.installAddonFromPath(path.join(__dirname, '..')); |
||||
session = firefox.session; |
||||
browser = firefox.browser; |
||||
http = newApp().listen(port); |
||||
}); |
||||
|
||||
after(async() => { |
||||
http.close(); |
||||
if (firefox) { |
||||
await firefox.close(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}`); |
||||
body = await session.findElementByCSS('body'); |
||||
}); |
||||
|
||||
it('open console with :', async() => { |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
|
||||
let input = await session.findElementByCSS('input'); |
||||
assert.equal(await input.isDisplayed(), true); |
||||
}); |
||||
|
||||
it('open console with open command by o', async() => { |
||||
await body.sendKeys('o'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let value = await session.executeScript(() => document.querySelector('input').value); |
||||
assert.equal(value, 'open '); |
||||
}); |
||||
|
||||
it('open console with open command and current URL by O', async() => { |
||||
await body.sendKeys(Key.Shift, 'o'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let value = await session.executeScript(() => document.querySelector('input').value); |
||||
assert.equal(value, `open http://127.0.0.1:${port}/`); |
||||
}); |
||||
|
||||
it('open console with tabopen command by t', async() => { |
||||
await body.sendKeys('t'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let value = await session.executeScript(() => document.querySelector('input').value); |
||||
assert.equal(value, 'tabopen '); |
||||
}); |
||||
|
||||
it('open console with tabopen command and current URL by T', async() => { |
||||
await body.sendKeys(Key.Shift, 't'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let value = await session.executeScript(() => document.querySelector('input').value); |
||||
assert.equal(value, `tabopen http://127.0.0.1:${port}/`); |
||||
}); |
||||
|
||||
it('open console with winopen command by w', async() => { |
||||
await body.sendKeys('w'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let value = await session.executeScript(() => document.querySelector('input').value); |
||||
assert.equal(value, 'winopen '); |
||||
}); |
||||
|
||||
it('open console with winopen command and current URL by W', async() => { |
||||
await body.sendKeys(Key.Shift, 'W'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let value = await session.executeScript(() => document.querySelector('input').value); |
||||
assert.equal(value, `winopen http://127.0.0.1:${port}/`); |
||||
}); |
||||
|
||||
it('open console with buffer command by b', async() => { |
||||
await body.sendKeys('b'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let value = await session.executeScript(() => document.querySelector('input').value); |
||||
assert.equal(value, `buffer `); |
||||
}); |
||||
|
||||
it('open console with addbookmark command with title by a', async() => { |
||||
await body.sendKeys('a'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let value = await session.executeScript(() => document.querySelector('input').value); |
||||
assert.equal(value, `addbookmark Hello, world!`); |
||||
}); |
||||
}); |
||||
|
@ -0,0 +1,90 @@ |
||||
import * as path from 'path'; |
||||
import * as assert from 'assert'; |
||||
|
||||
import TestServer from './lib/TestServer'; |
||||
import { Builder, Lanthan } from 'lanthan'; |
||||
import { WebDriver, Key } from 'selenium-webdriver'; |
||||
import Page from './lib/Page'; |
||||
|
||||
describe("console test", () => { |
||||
let server = new TestServer().receiveContent('/',
|
||||
`<!DOCTYPE html><html lang="en"><head><title>Hello, world!</title></head></html">`, |
||||
); |
||||
let lanthan: Lanthan; |
||||
let webdriver: WebDriver; |
||||
let page: Page; |
||||
|
||||
before(async() => { |
||||
lanthan = await Builder |
||||
.forBrowser('firefox') |
||||
.spyAddon(path.join(__dirname, '..')) |
||||
.build(); |
||||
webdriver = lanthan.getWebDriver(); |
||||
await server.start(); |
||||
}); |
||||
|
||||
after(async() => { |
||||
await server.stop(); |
||||
if (lanthan) { |
||||
await lanthan.quit(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
page = await Page.navigateTo(webdriver, server.url()); |
||||
}); |
||||
|
||||
it('open console with :', async() => { |
||||
await page.sendKeys(':'); |
||||
let console = await page.getConsole(); |
||||
assert.strictEqual(await console.currentValue(), ''); |
||||
}); |
||||
|
||||
it('open console with open command by o', async() => { |
||||
await page.sendKeys('o'); |
||||
let console = await page.getConsole(); |
||||
assert.strictEqual(await console.currentValue(), 'open '); |
||||
}); |
||||
|
||||
it('open console with open command and current URL by O', async() => { |
||||
await page.sendKeys(Key.SHIFT, 'o'); |
||||
let console = await page.getConsole(); |
||||
assert.strictEqual(await console.currentValue(), `open ${server.url()}`); |
||||
}); |
||||
|
||||
it('open console with tabopen command by t', async() => { |
||||
await page.sendKeys('t'); |
||||
let console = await page.getConsole(); |
||||
assert.strictEqual(await console.currentValue(), 'tabopen '); |
||||
}); |
||||
|
||||
it('open console with tabopen command and current URL by T', async() => { |
||||
await page.sendKeys(Key.SHIFT, 't'); |
||||
let console = await page.getConsole(); |
||||
assert.strictEqual(await console.currentValue(), `tabopen ${server.url()}`); |
||||
}); |
||||
|
||||
it('open console with winopen command by w', async() => { |
||||
await page.sendKeys('w'); |
||||
let console = await page.getConsole(); |
||||
assert.strictEqual(await console.currentValue(), `winopen `); |
||||
}); |
||||
|
||||
it('open console with winopen command and current URL by W', async() => { |
||||
await page.sendKeys(Key.SHIFT, 'W'); |
||||
let console = await page.getConsole(); |
||||
assert.strictEqual(await console.currentValue(), `winopen ${server.url()}`); |
||||
}); |
||||
|
||||
it('open console with buffer command by b', async() => { |
||||
await page.sendKeys('b'); |
||||
let console = await page.getConsole(); |
||||
assert.strictEqual(await console.currentValue(), `buffer `); |
||||
}); |
||||
|
||||
it('open console with addbookmark command with title by a', async() => { |
||||
await page.sendKeys('a'); |
||||
let console = await page.getConsole(); |
||||
assert.strictEqual(await console.currentValue(), `addbookmark Hello, world!`); |
||||
}); |
||||
}); |
@ -1,23 +0,0 @@ |
||||
let defaultInterval = 100; |
||||
let defaultTimeout = 2000; |
||||
|
||||
function sleep(ms) { |
||||
return new Promise(resolve => setTimeout(resolve, ms)); |
||||
} |
||||
|
||||
const eventually = async (fn, timeout = defaultTimeout, interval = defaultInterval) => { |
||||
let start = Date.now(); |
||||
let loop = async() => { |
||||
try { |
||||
await fn(); |
||||
} catch (err) { |
||||
if (Date.now() - start > timeout) { |
||||
throw err; |
||||
} |
||||
await new Promise((resolve) => setTimeout(resolve, interval)) |
||||
await loop(); |
||||
} |
||||
}; |
||||
await loop(); |
||||
}; |
||||
module.exports = eventually; |
@ -0,0 +1,30 @@ |
||||
const defaultInterval = 100; |
||||
const defaultTimeout = 2000; |
||||
|
||||
type Handler = () => void |
||||
|
||||
const sleep = (ms: number): Promise<void> => { |
||||
return new Promise(resolve => setTimeout(resolve, ms)); |
||||
} |
||||
|
||||
const eventually = async ( |
||||
fn: Handler, |
||||
timeout = defaultTimeout, |
||||
interval = defaultInterval, |
||||
): Promise<void> => { |
||||
let start = Date.now(); |
||||
let loop = async() => { |
||||
try { |
||||
await fn(); |
||||
} catch (err) { |
||||
if (Date.now() - start > timeout) { |
||||
throw err; |
||||
} |
||||
await sleep(interval); |
||||
await loop(); |
||||
} |
||||
}; |
||||
await loop(); |
||||
}; |
||||
|
||||
export default eventually; |
@ -1,257 +0,0 @@ |
||||
const express = require('express'); |
||||
const lanthan = require('lanthan'); |
||||
const path = require('path'); |
||||
const assert = require('assert'); |
||||
const eventually = require('./eventually'); |
||||
|
||||
const Key = lanthan.Key; |
||||
|
||||
const newApp = () => { |
||||
let app = express(); |
||||
|
||||
app.get('/', (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<body><a href="hello">hello</a></body> |
||||
</html">`); |
||||
}); |
||||
|
||||
app.get('/follow-input', (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<body><input></body> |
||||
</html">`); |
||||
}); |
||||
|
||||
app.get('/area', (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<body> |
||||
<img |
||||
width="256" height="256" usemap="#map" |
||||
src="data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=" |
||||
> |
||||
<map name="map"> |
||||
<area shape="rect" coords="0,0,64,64" href="/"> |
||||
<area shape="rect" coords="64,64,64,64" href="/"> |
||||
<area shape="rect" coords="128,128,64,64" href="/"> |
||||
</map> |
||||
</body> |
||||
</html">`); |
||||
}); |
||||
|
||||
/* |
||||
* test case: link2 is out of the viewport |
||||
* +-----------------+ |
||||
* | [link1] |<--- window |
||||
* | | |
||||
* |=================|<--- viewport |
||||
* | [link2] | |
||||
* | | |
||||
* +-----------------+ |
||||
*/ |
||||
app.get('/test1', (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<body> |
||||
<div><a href="link1">link1</a></div> |
||||
<div style="min-height:3000px"></div> |
||||
<div><a href="link2">link2</a></div> |
||||
</body> |
||||
</html">`); |
||||
}); |
||||
|
||||
/* |
||||
* test case 2: link2 and link3 are out of window of the frame |
||||
* +-----------------+ |
||||
* | +-----------+ | |
||||
* | | [link1] | | |
||||
* |=================| |
||||
* | | [link2] | | |
||||
* | +-----------+ | |
||||
* | | |
||||
* +-----------------+ |
||||
*/ |
||||
app.get('/test2', (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<body><iframe height="5000" src='/test2-frame'></body> |
||||
</html">`); |
||||
}); |
||||
app.get('/test2-frame', (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<body> |
||||
<div><a href="link1">link1</a></div> |
||||
<div style="min-height:3000px"></div> |
||||
<div><a href="link2">link2</a></div> |
||||
</body> |
||||
</html">`); |
||||
}); |
||||
|
||||
/* test case 3: link2 is out of window of the frame |
||||
* +-----------------+ |
||||
* | +-----------+ | |
||||
* | | [link1] | | |
||||
* | +-----------+ | |
||||
* | : [link2] : | |
||||
* | + - - - - - + | |
||||
* | | |
||||
* +-----------------+ |
||||
*/ |
||||
app.get('/test3', (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<body><iframe src='/test3-frame'></body> |
||||
</html">`); |
||||
}); |
||||
app.get('/test3-frame', (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<body> |
||||
<div><a href="link1">link1</a></div> |
||||
<div style="min-height:3000px"></div> |
||||
<div><a href="link2">link2</a></div> |
||||
</body> |
||||
</html">`); |
||||
}); |
||||
|
||||
return app; |
||||
}; |
||||
|
||||
const waitForHints = async(session) => { |
||||
await eventually(async() => { |
||||
let hints = await session.findElementsByCSS('.vimvixen-hint'); |
||||
assert(hints.length > 0); |
||||
}); |
||||
}; |
||||
|
||||
describe('follow test', () => { |
||||
|
||||
const port = 12321; |
||||
let http; |
||||
let firefox; |
||||
let session; |
||||
let browser; |
||||
|
||||
before(async() => { |
||||
http = newApp().listen(port); |
||||
|
||||
firefox = await lanthan.firefox(); |
||||
await firefox.session.installAddonFromPath(path.join(__dirname, '..')); |
||||
session = firefox.session; |
||||
browser = firefox.browser; |
||||
}); |
||||
|
||||
after(async() => { |
||||
if (firefox) { |
||||
await firefox.close(); |
||||
} |
||||
http.close(); |
||||
}); |
||||
|
||||
afterEach(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
for (let tab of tabs.slice(1)) { |
||||
await browser.tabs.remove(tab.id); |
||||
} |
||||
}); |
||||
|
||||
it('should focus an input by f', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/follow-input`); |
||||
|
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('f'); |
||||
await waitForHints(session); |
||||
await body.sendKeys('a'); |
||||
|
||||
let tagName = await session.executeScript(() => document.activeElement.tagName); |
||||
assert.equal(tagName.toLowerCase(), 'input'); |
||||
}); |
||||
|
||||
it('should open a link by f', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/`); |
||||
|
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('f', 'a'); |
||||
|
||||
let hash = await session.executeScript('location.pathname'); |
||||
await body.sendKeys(hash, '/hello'); |
||||
}); |
||||
|
||||
it('should focus an input by F', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/follow-input`); |
||||
|
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(Key.Shift, 'f'); |
||||
await waitForHints(session); |
||||
await body.sendKeys('a'); |
||||
|
||||
let tagName = await session.executeScript(() => document.activeElement.tagName); |
||||
assert.equal(tagName.toLowerCase(), 'input'); |
||||
}); |
||||
|
||||
it('should open a link to new tab by F', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/`); |
||||
|
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(Key.Shift, 'f'); |
||||
await waitForHints(session); |
||||
await body.sendKeys('a'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.equal(tabs.length, 2); |
||||
assert.equal(new URL(tabs[1].url).pathname, '/hello'); |
||||
assert.equal(tabs[1].openerTabId, tabs[0].id); |
||||
}); |
||||
}); |
||||
|
||||
it('should show hints of links in area', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/area`); |
||||
|
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(Key.Shift, 'f'); |
||||
await eventually(async() => { |
||||
let hints = await session.findElementsByCSS('.vimvixen-hint'); |
||||
assert.equal(hints.length, 3); |
||||
}); |
||||
}); |
||||
|
||||
it('should shows hints only in viewport', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/test1`); |
||||
|
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(Key.Shift, 'f'); |
||||
await eventually(async() => { |
||||
let hints = await session.findElementsByCSS('.vimvixen-hint'); |
||||
assert.equal(hints.length, 1); |
||||
}); |
||||
}); |
||||
|
||||
it('should shows hints only in window of the frame', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/test2`); |
||||
|
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(Key.Shift, 'f'); |
||||
|
||||
await session.switchToFrame(0); |
||||
await eventually(async() => { |
||||
let hints = await session.findElementsByCSS('.vimvixen-hint'); |
||||
assert.equal(hints.length, 1); |
||||
}); |
||||
}); |
||||
|
||||
it('should shows hints only in the frame', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/test3`); |
||||
|
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(Key.Shift, 'f'); |
||||
|
||||
await session.switchToFrame(0); |
||||
await eventually(async() => { |
||||
let hints = await session.findElementsByCSS('.vimvixen-hint'); |
||||
assert.equal(hints.length, 1); |
||||
}); |
||||
}); |
||||
}); |
@ -0,0 +1,216 @@ |
||||
import * as path from 'path'; |
||||
import * as assert from 'assert'; |
||||
|
||||
import TestServer from './lib/TestServer'; |
||||
import eventually from './eventually'; |
||||
import { Builder, Lanthan } from 'lanthan'; |
||||
import { WebDriver, Key } from 'selenium-webdriver'; |
||||
import Page from './lib/Page'; |
||||
|
||||
const newApp = () => { |
||||
let server = new TestServer(); |
||||
|
||||
server.receiveContent('/', ` |
||||
<!DOCTYPE html> |
||||
<html lang="en"><body> |
||||
<a href="hello">hello</a> |
||||
</body></html">`); |
||||
|
||||
server.receiveContent('/follow-input', ` |
||||
<!DOCTYPE html> |
||||
<html lang="en"><body> |
||||
<input> |
||||
</body></html">`); |
||||
|
||||
server.receiveContent('/area', ` |
||||
<!DOCTYPE html> |
||||
<html lang="en"><body> |
||||
<img |
||||
width="256" height="256" usemap="#map" |
||||
src="data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=" |
||||
> |
||||
<map name="map"> |
||||
<area shape="rect" coords="0,0,64,64" href="/"> |
||||
<area shape="rect" coords="64,64,64,64" href="/"> |
||||
<area shape="rect" coords="128,128,64,64" href="/"> |
||||
</map> |
||||
</body></html">`); |
||||
|
||||
/* |
||||
* test case: link2 is out of the viewport |
||||
* +-----------------+ |
||||
* | [link1] |<--- window |
||||
* | | |
||||
* |=================|<--- viewport |
||||
* | [link2] | |
||||
* | | |
||||
* +-----------------+ |
||||
*/ |
||||
server.receiveContent('/test1', ` |
||||
<!DOCTYPE html> |
||||
<html lang="en"><body> |
||||
<div><a href="link1">link1</a></div> |
||||
<div style="min-height:3000px"></div> |
||||
<div><a href="link2">link2</a></div> |
||||
</body></html">`); |
||||
|
||||
/* |
||||
* test case 2: link2 and link3 are out of window of the frame |
||||
* +-----------------+ |
||||
* | +-----------+ | |
||||
* | | [link1] | | |
||||
* |=================| |
||||
* | | [link2] | | |
||||
* | +-----------+ | |
||||
* | | |
||||
* +-----------------+ |
||||
*/ |
||||
server.receiveContent('/test2', ` |
||||
<!DOCTYPE html> |
||||
<html lang="en"><body> |
||||
<iframe height="5000" src='/test2-frame'> |
||||
</body></html">`); |
||||
server.receiveContent('/test2-frame', ` |
||||
<!DOCTYPE html> |
||||
<html lang="en"><body> |
||||
<div><a href="link1">link1</a></div> |
||||
<div style="min-height:3000px"></div> |
||||
<div><a href="link2">link2</a></div> |
||||
</body></html">`); |
||||
|
||||
/* test case 3: link2 is out of window of the frame |
||||
* +-----------------+ |
||||
* | +-----------+ | |
||||
* | | [link1] | | |
||||
* | +-----------+ | |
||||
* | : [link2] : | |
||||
* | + - - - - - + | |
||||
* | | |
||||
* +-----------------+ |
||||
*/ |
||||
server.receiveContent('/test3', ` |
||||
<!DOCTYPE html> |
||||
<html lang="en"><body> |
||||
<iframe src='/test3-frame'> |
||||
</body></html">`); |
||||
server.receiveContent('/test3-frame', ` |
||||
<!DOCTYPE html> |
||||
<html lang="en"><body> |
||||
<div><a href="link1">link1</a></div> |
||||
<div style="min-height:3000px"></div> |
||||
<div><a href="link2">link2</a></div> |
||||
</body></html">`); |
||||
|
||||
return server; |
||||
}; |
||||
|
||||
describe('follow test', () => { |
||||
let server = newApp(); |
||||
let lanthan: Lanthan; |
||||
let webdriver: WebDriver; |
||||
let browser: any; |
||||
|
||||
before(async() => { |
||||
lanthan = await Builder |
||||
.forBrowser('firefox') |
||||
.spyAddon(path.join(__dirname, '..')) |
||||
.build(); |
||||
webdriver = lanthan.getWebDriver(); |
||||
browser = lanthan.getWebExtBrowser(); |
||||
await server.start(); |
||||
}); |
||||
|
||||
after(async() => { |
||||
await server.stop(); |
||||
if (lanthan) { |
||||
await lanthan.quit(); |
||||
} |
||||
}); |
||||
|
||||
afterEach(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
for (let tab of tabs.slice(1)) { |
||||
await browser.tabs.remove(tab.id); |
||||
} |
||||
}); |
||||
|
||||
it('should focus an input by f', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url('/follow-input')); |
||||
await page.sendKeys('f'); |
||||
await page.waitAndGetHints(); |
||||
await page.sendKeys('a'); |
||||
|
||||
let tagName = await webdriver.executeScript(() => document.activeElement!!.tagName) as string; |
||||
assert.strictEqual(tagName.toLowerCase(), 'input'); |
||||
}); |
||||
|
||||
it('should open a link by f', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url()); |
||||
await page.sendKeys('f'); |
||||
await page.waitAndGetHints(); |
||||
await page.sendKeys('a'); |
||||
|
||||
await eventually(async() => { |
||||
let hash = await webdriver.executeScript('return location.pathname'); |
||||
assert.strictEqual(hash, '/hello'); |
||||
}); |
||||
}); |
||||
|
||||
it('should focus an input by F', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url('/follow-input')); |
||||
await page.sendKeys(Key.SHIFT, 'f'); |
||||
await page.waitAndGetHints(); |
||||
await page.sendKeys('a'); |
||||
|
||||
let tagName = await webdriver.executeScript(() => document.activeElement!!.tagName) as string; |
||||
assert.strictEqual(tagName.toLowerCase(), 'input'); |
||||
}); |
||||
|
||||
it('should open a link to new tab by F', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url()); |
||||
await page.sendKeys(Key.SHIFT, 'f'); |
||||
await page.waitAndGetHints(); |
||||
await page.sendKeys('a'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.strictEqual(tabs.length, 2); |
||||
assert.strictEqual(new URL(tabs[1].url).pathname, '/hello'); |
||||
assert.strictEqual(tabs[1].openerTabId, tabs[0].id); |
||||
}); |
||||
}); |
||||
|
||||
it('should show hints of links in area', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url('/area')); |
||||
await page.sendKeys(Key.SHIFT, 'f'); |
||||
|
||||
let hints = await page.waitAndGetHints(); |
||||
assert.strictEqual(hints.length, 3); |
||||
}); |
||||
|
||||
it('should shows hints only in viewport', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url('/test1')); |
||||
await page.sendKeys(Key.SHIFT, 'f'); |
||||
|
||||
let hints = await page.waitAndGetHints(); |
||||
assert.strictEqual(hints.length, 1); |
||||
}); |
||||
|
||||
it('should shows hints only in window of the frame', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url('/test2')); |
||||
await page.sendKeys(Key.SHIFT, 'f'); |
||||
|
||||
await webdriver.switchTo().frame(0); |
||||
let hints = await page.waitAndGetHints(); |
||||
assert.strictEqual(hints.length, 1); |
||||
}); |
||||
|
||||
it('should shows hints only in the frame', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url('/test3')); |
||||
await page.sendKeys(Key.SHIFT, 'f'); |
||||
|
||||
await webdriver.switchTo().frame(0); |
||||
let hints = await page.waitAndGetHints(); |
||||
assert.strictEqual(hints.length, 1); |
||||
}); |
||||
}); |
@ -1,182 +0,0 @@ |
||||
const express = require('express'); |
||||
const lanthan = require('lanthan'); |
||||
const path = require('path'); |
||||
const assert = require('assert'); |
||||
const eventually = require('./eventually'); |
||||
const Console = require('./lib/Console'); |
||||
|
||||
const Key = lanthan.Key; |
||||
|
||||
const newApp = () => { |
||||
let app = express(); |
||||
|
||||
app.get('/', (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<body> |
||||
<a href="/">link1</a> |
||||
<a href="/">link2</a> |
||||
<a href="/">link3</a> |
||||
<a href="/">link4</a> |
||||
<a href="/">link5</a> |
||||
</body> |
||||
</html">`); |
||||
}); |
||||
return app; |
||||
}; |
||||
|
||||
const waitForHints = async(session) => { |
||||
await eventually(async() => { |
||||
let hints = await session.findElementsByCSS('.vimvixen-hint'); |
||||
assert(hints.length > 0); |
||||
}); |
||||
}; |
||||
|
||||
describe('follow properties test', () => { |
||||
|
||||
const port = 12321; |
||||
let http; |
||||
let firefox; |
||||
let session; |
||||
let browser; |
||||
let body; |
||||
|
||||
before(async() => { |
||||
http = newApp().listen(port); |
||||
|
||||
firefox = await lanthan.firefox({ |
||||
spy: path.join(__dirname, '..'), |
||||
builderf: (builder) => { |
||||
builder.addFile('build/settings.js'); |
||||
}, |
||||
}); |
||||
session = firefox.session; |
||||
browser = firefox.browser; |
||||
|
||||
await browser.storage.local.set({ settings: { |
||||
source: 'json', |
||||
json: `{
|
||||
"keymaps": { |
||||
":": { "type": "command.show" }, |
||||
"f": { "type": "follow.start", "newTab": false }, |
||||
"F": { "type": "follow.start", "newTab": true, "background": false }, |
||||
"<C-F>": { "type": "follow.start", "newTab": true, "background": true } |
||||
}, |
||||
"search": { |
||||
"default": "google", |
||||
"engines": { "google": "https://google.com/search?q={}" } |
||||
}, |
||||
"properties": { |
||||
"hintchars": "jk" |
||||
} |
||||
}`,
|
||||
}}); |
||||
}); |
||||
|
||||
after(async() => { |
||||
if (firefox) { |
||||
await firefox.close(); |
||||
} |
||||
http.close(); |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/`); |
||||
body = await session.findElementByCSS('body'); |
||||
}); |
||||
|
||||
afterEach(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
for (let tab of tabs.slice(1)) { |
||||
await browser.tabs.remove(tab.id); |
||||
} |
||||
}); |
||||
|
||||
it('should show hints with hintchars by settings', async () => { |
||||
await body.sendKeys('f'); |
||||
await eventually(async() => { |
||||
let hints = await session.findElementsByCSS('.vimvixen-hint'); |
||||
assert.equal(hints.length, 5); |
||||
|
||||
assert.equal(await hints[0].getText(), 'J'); |
||||
assert.equal(await hints[1].getText(), 'K'); |
||||
assert.equal(await hints[2].getText(), 'JJ'); |
||||
assert.equal(await hints[3].getText(), 'JK'); |
||||
assert.equal(await hints[4].getText(), 'KJ'); |
||||
}); |
||||
|
||||
await body.sendKeys('j'); |
||||
|
||||
await eventually(async() => { |
||||
let hints = await session.findElementsByCSS('.vimvixen-hint'); |
||||
|
||||
assert.equal(await hints[0].getStyle('display'), 'block'); |
||||
assert.equal(await hints[1].getStyle('display'), 'none'); |
||||
assert.equal(await hints[2].getStyle('display'), 'block'); |
||||
assert.equal(await hints[3].getStyle('display'), 'block'); |
||||
assert.equal(await hints[4].getStyle('display'), 'none'); |
||||
}); |
||||
}); |
||||
|
||||
it('should open tab in background by background:false', async () => { |
||||
await body.sendKeys(Key.Shift, 'f'); |
||||
await eventually(async() => { |
||||
let hints = await session.findElementsByCSS('.vimvixen-hint'); |
||||
assert.equal(hints.length, 5); |
||||
}); |
||||
await body.sendKeys('jj'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.equal(tabs[0].active, false); |
||||
assert.equal(tabs[1].active, true); |
||||
}); |
||||
}); |
||||
|
||||
it('should open tab in background by background:true', async () => { |
||||
await body.sendKeys(Key.Control, 'f'); |
||||
await eventually(async() => { |
||||
let hints = await session.findElementsByCSS('.vimvixen-hint'); |
||||
assert.equal(hints.length, 5); |
||||
}); |
||||
await body.sendKeys('jj'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.equal(tabs[0].active, true); |
||||
assert.equal(tabs[1].active, false); |
||||
}); |
||||
}); |
||||
|
||||
it('should show hints with hintchars by settings', async () => { |
||||
let c = new Console(session); |
||||
|
||||
await body.sendKeys(':'); |
||||
await session.switchToFrame(0); |
||||
await c.sendKeys('set hintchars=abc', Key.Enter); |
||||
await session.switchToParentFrame(); |
||||
|
||||
await body.sendKeys('f'); |
||||
await eventually(async() => { |
||||
let hints = await session.findElementsByCSS('.vimvixen-hint'); |
||||
assert.equal(hints.length, 5); |
||||
|
||||
assert.equal(await hints[0].getText(), 'A'); |
||||
assert.equal(await hints[1].getText(), 'B'); |
||||
assert.equal(await hints[2].getText(), 'C'); |
||||
assert.equal(await hints[3].getText(), 'AA'); |
||||
assert.equal(await hints[4].getText(), 'AB'); |
||||
}); |
||||
|
||||
await body.sendKeys('a'); |
||||
await eventually(async() => { |
||||
let hints = await session.findElementsByCSS('.vimvixen-hint'); |
||||
|
||||
assert.equal(await hints[0].getStyle('display'), 'block'); |
||||
assert.equal(await hints[1].getStyle('display'), 'none'); |
||||
assert.equal(await hints[2].getStyle('display'), 'none'); |
||||
assert.equal(await hints[3].getStyle('display'), 'block'); |
||||
assert.equal(await hints[4].getStyle('display'), 'block'); |
||||
}); |
||||
}); |
||||
}); |
@ -0,0 +1,142 @@ |
||||
import * as path from 'path'; |
||||
import * as assert from 'assert'; |
||||
|
||||
import TestServer from './lib/TestServer'; |
||||
import eventually from './eventually'; |
||||
import { Builder, Lanthan } from 'lanthan'; |
||||
import { WebDriver, Key } from 'selenium-webdriver'; |
||||
import Page from './lib/Page'; |
||||
|
||||
describe('follow properties test', () => { |
||||
let server = new TestServer().receiveContent('/', ` |
||||
<!DOCTYPE html> |
||||
<html lang="en"><body> |
||||
<a href="/">link1</a> |
||||
<a href="/">link2</a> |
||||
<a href="/">link3</a> |
||||
<a href="/">link4</a> |
||||
<a href="/">link5</a> |
||||
</body></html">`); |
||||
|
||||
let lanthan: Lanthan; |
||||
let webdriver: WebDriver; |
||||
let browser: any; |
||||
let page: Page; |
||||
|
||||
before(async() => { |
||||
lanthan = await Builder |
||||
.forBrowser('firefox') |
||||
.spyAddon(path.join(__dirname, '..')) |
||||
.build(); |
||||
webdriver = lanthan.getWebDriver(); |
||||
browser = lanthan.getWebExtBrowser(); |
||||
|
||||
await browser.storage.local.set({ settings: { |
||||
source: 'json', |
||||
json: `{
|
||||
"keymaps": { |
||||
":": { "type": "command.show" }, |
||||
"f": { "type": "follow.start", "newTab": false }, |
||||
"F": { "type": "follow.start", "newTab": true, "background": false }, |
||||
"<C-F>": { "type": "follow.start", "newTab": true, "background": true } |
||||
}, |
||||
"search": { |
||||
"default": "google", |
||||
"engines": { "google": "https://google.com/search?q={}" } |
||||
}, |
||||
"properties": { |
||||
"hintchars": "jk" |
||||
} |
||||
}`,
|
||||
}}); |
||||
|
||||
await server.start(); |
||||
}); |
||||
|
||||
after(async() => { |
||||
await server.stop(); |
||||
if (lanthan) { |
||||
await lanthan.quit(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
page = await Page.navigateTo(webdriver, server.url()); |
||||
}); |
||||
|
||||
afterEach(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
for (let tab of tabs.slice(1)) { |
||||
await browser.tabs.remove(tab.id); |
||||
} |
||||
}); |
||||
|
||||
it('should show hints with hintchars by settings', async () => { |
||||
await page.sendKeys('f'); |
||||
|
||||
let hints = await page.waitAndGetHints(); |
||||
assert.strictEqual(hints.length, 5); |
||||
|
||||
assert.strictEqual(hints[0].text, 'J'); |
||||
assert.strictEqual(hints[1].text, 'K'); |
||||
assert.strictEqual(hints[2].text, 'JJ'); |
||||
assert.strictEqual(hints[3].text, 'JK'); |
||||
assert.strictEqual(hints[4].text, 'KJ'); |
||||
|
||||
await page.sendKeys('j'); |
||||
hints = await page.waitAndGetHints(); |
||||
|
||||
assert.strictEqual(hints[0].displayed, true); |
||||
assert.strictEqual(hints[1].displayed, false); |
||||
assert.strictEqual(hints[2].displayed, true); |
||||
assert.strictEqual(hints[3].displayed, true); |
||||
assert.strictEqual(hints[4].displayed, false); |
||||
}); |
||||
|
||||
it('should open tab in background by background:false', async () => { |
||||
await page.sendKeys(Key.SHIFT, 'f'); |
||||
await page.waitAndGetHints(); |
||||
await page.sendKeys('jj'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.strictEqual(tabs[0].active, false); |
||||
assert.strictEqual(tabs[1].active, true); |
||||
}); |
||||
}); |
||||
|
||||
it('should open tab in background by background:true', async () => { |
||||
await page.sendKeys(Key.CONTROL, 'f'); |
||||
await page.waitAndGetHints(); |
||||
await page.sendKeys('jj'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.strictEqual(tabs[0].active, true); |
||||
assert.strictEqual(tabs[1].active, false); |
||||
}); |
||||
}); |
||||
|
||||
it('should show hints with hintchars by settings', async () => { |
||||
let console = await page.showConsole(); |
||||
await console.execCommand('set hintchars=abc'); |
||||
await (webdriver.switchTo() as any).parentFrame(); |
||||
|
||||
await page.sendKeys('f'); |
||||
let hints = await page.waitAndGetHints(); |
||||
assert.strictEqual(hints.length, 5); |
||||
assert.strictEqual(hints[0].text, 'A'); |
||||
assert.strictEqual(hints[1].text, 'B'); |
||||
assert.strictEqual(hints[2].text, 'C'); |
||||
assert.strictEqual(hints[3].text, 'AA'); |
||||
assert.strictEqual(hints[4].text, 'AB'); |
||||
|
||||
await page.sendKeys('a'); |
||||
hints = await page.waitAndGetHints(); |
||||
assert.strictEqual(hints[0].displayed, true); |
||||
assert.strictEqual(hints[1].displayed, false); |
||||
assert.strictEqual(hints[2].displayed, false); |
||||
assert.strictEqual(hints[3].displayed, true); |
||||
assert.strictEqual(hints[4].displayed, true); |
||||
}); |
||||
}); |
@ -1,41 +0,0 @@ |
||||
class Console { |
||||
constructor(session) { |
||||
this.session = session; |
||||
} |
||||
|
||||
async sendKeys(...keys) { |
||||
let input = await this.session.findElementByCSS('input'); |
||||
input.sendKeys(...keys); |
||||
} |
||||
|
||||
async currentValue() { |
||||
return await this.session.executeScript(() => { |
||||
let input = document.querySelector('input'); |
||||
return input.value; |
||||
}); |
||||
} |
||||
|
||||
async getCompletions() { |
||||
return await this.session.executeScript(() => { |
||||
let items = document.querySelectorAll('.vimvixen-console-completion > li'); |
||||
if (items.length === 0) { |
||||
throw new Error('completion items not found'); |
||||
} |
||||
|
||||
let objs = []; |
||||
for (let li of items) { |
||||
if (li.classList.contains('vimvixen-console-completion-title')) { |
||||
objs.push({ type: 'title', text: li.textContent.trim() }); |
||||
} else if ('vimvixen-console-completion-item') { |
||||
let highlight = li.classList.contains('vimvixen-completion-selected'); |
||||
objs.push({ type: 'item', text: li.textContent.trim(), highlight }); |
||||
} else { |
||||
throw new Error(`unexpected class: ${li.className}`); |
||||
} |
||||
} |
||||
return objs; |
||||
}); |
||||
} |
||||
} |
||||
|
||||
module.exports = Console; |
@ -0,0 +1,72 @@ |
||||
import { WebDriver, By, Key } from 'selenium-webdriver'; |
||||
|
||||
export type CompletionItem = { |
||||
type: string; |
||||
text: string; |
||||
highlight: boolean; |
||||
} |
||||
|
||||
export class Console { |
||||
constructor(private webdriver: WebDriver) { |
||||
} |
||||
|
||||
async sendKeys(...keys: string[]) { |
||||
let input = await this.webdriver.findElement(By.css('input')); |
||||
input.sendKeys(...keys); |
||||
} |
||||
|
||||
async currentValue() { |
||||
return await this.webdriver.executeScript(() => { |
||||
let input = document.querySelector('input'); |
||||
if (input === null) { |
||||
throw new Error('could not find input element'); |
||||
} |
||||
return input.value; |
||||
}); |
||||
} |
||||
|
||||
async execCommand(command: string): Promise<void> { |
||||
let input = await this.webdriver.findElement(By.css('input.vimvixen-console-command-input')); |
||||
await input.sendKeys(command, Key.ENTER); |
||||
} |
||||
|
||||
async getErrorMessage(): Promise<string> { |
||||
let p = await this.webdriver.findElement(By.css('.vimvixen-console-error')); |
||||
return p.getText(); |
||||
} |
||||
|
||||
async inputKeys(...keys: string[]) { |
||||
let input = await this.webdriver.findElement(By.css('input')); |
||||
await input.sendKeys(...keys); |
||||
} |
||||
|
||||
getCompletions(): Promise<CompletionItem[]> { |
||||
return this.webdriver.executeScript(() => { |
||||
let items = document.querySelectorAll('.vimvixen-console-completion > li'); |
||||
if (items.length === 0) { |
||||
throw new Error('completion items not found'); |
||||
} |
||||
|
||||
let objs = []; |
||||
for (let li of Array.from(items)) { |
||||
if (li.classList.contains('vimvixen-console-completion-title')) { |
||||
objs.push({ type: 'title', text: li.textContent!!.trim() }); |
||||
} else if ('vimvixen-console-completion-item') { |
||||
let highlight = li.classList.contains('vimvixen-completion-selected'); |
||||
objs.push({ type: 'item', text: li.textContent!!.trim(), highlight }); |
||||
} else { |
||||
throw new Error(`unexpected class: ${li.className}`); |
||||
} |
||||
} |
||||
return objs; |
||||
}); |
||||
} |
||||
|
||||
async close(): Promise<void> { |
||||
let input = await this.webdriver.findElement(By.css('input')); |
||||
await input.sendKeys(Key.ESCAPE); |
||||
// TODO remove sleep
|
||||
await new Promise(resolve => setTimeout(resolve, 100)); |
||||
await (this.webdriver.switchTo() as any).parentFrame(); |
||||
} |
||||
} |
@ -0,0 +1,68 @@ |
||||
import { Lanthan } from 'lanthan'; |
||||
import { WebDriver, By, until } from 'selenium-webdriver'; |
||||
|
||||
export default class FormOptionPage { |
||||
private webdriver: WebDriver; |
||||
|
||||
constructor(lanthan: Lanthan) { |
||||
this.webdriver = lanthan.getWebDriver(); |
||||
} |
||||
|
||||
async setBlacklist(nth: number, value: string): Promise<void> { |
||||
let selector = '.form-blacklist-form-row > .column-url'; |
||||
let inputs = await this.webdriver.findElements(By.css(selector)); |
||||
if (inputs.length <= nth) { |
||||
throw new RangeError('Index out of range to set a blacklist') |
||||
} |
||||
await inputs[nth].sendKeys(value); |
||||
await this.webdriver.executeScript(`document.querySelectorAll('${selector}')[${nth}].blur()`); |
||||
} |
||||
|
||||
async setSearchEngine(nth: number, name: string, url: string) { |
||||
let selector = '.form-search-form-row > .column-name'; |
||||
let inputs = await this.webdriver.findElements(By.css(selector)); |
||||
if (inputs.length <= nth) { |
||||
throw new RangeError('Index out of range to set a search engine') |
||||
} |
||||
await inputs[nth].sendKeys(name); |
||||
await this.webdriver.executeScript(`document.querySelectorAll('${selector}')[${nth}].blur()`); |
||||
|
||||
selector = '.form-search-form-row > .column-url'; |
||||
inputs = await this.webdriver.findElements(By.css(selector)); |
||||
if (inputs.length <= nth) { |
||||
throw new RangeError('Index out of range to set a search engine') |
||||
} |
||||
await inputs[nth].sendKeys(url); |
||||
await this.webdriver.executeScript(`document.querySelectorAll('${selector}')[${nth}].blur()`); |
||||
} |
||||
|
||||
async addBlacklist(): Promise<void> { |
||||
let rows = await this.webdriver.findElements(By.css(`.form-blacklist-form-row`)); |
||||
let button = await this.webdriver.findElement(By.css('.form-blacklist-form .ui-add-button')) |
||||
await button.click(); |
||||
await this.webdriver.wait(until.elementLocated(By.css(`.form-blacklist-form-row:nth-child(${rows.length + 1})`))); |
||||
} |
||||
|
||||
async removeBlackList(nth: number): Promise<void> { |
||||
let buttons = await this.webdriver.findElements(By.css('.form-blacklist-form-row .ui-delete-button')); |
||||
if (buttons.length <= nth) { |
||||
throw new RangeError('Index out of range to remove blacklist') |
||||
} |
||||
await buttons[nth].click() |
||||
} |
||||
|
||||
async addSearchEngine(): Promise<void> { |
||||
let rows = await this.webdriver.findElements(By.css(`.form-search-form-row > .column-name`)); |
||||
let button = await this.webdriver.findElement(By.css('.form-search-form > .ui-add-button')) |
||||
await button.click(); |
||||
await this.webdriver.wait(until.elementLocated(By.css(`.form-search-form-row:nth-child(${rows.length + 1})`))); |
||||
} |
||||
|
||||
async setDefaultSearchEngine(nth: number): Promise<void> { |
||||
let radios = await this.webdriver.findElements(By.css('.form-search-form-row input[type=radio]')); |
||||
if (radios.length <= nth) { |
||||
throw new RangeError('Index out of range to set a default search engine'); |
||||
} |
||||
await radios[nth].click(); |
||||
} |
||||
} |
@ -0,0 +1,22 @@ |
||||
import { Lanthan } from 'lanthan'; |
||||
import { WebDriver, By } from 'selenium-webdriver'; |
||||
|
||||
export default class JSONOptionPage { |
||||
private webdriver: WebDriver; |
||||
|
||||
constructor(lanthan: Lanthan) { |
||||
this.webdriver = lanthan.getWebDriver(); |
||||
} |
||||
|
||||
async updateSettings(value: string): Promise<void> { |
||||
let textarea = await this.webdriver.findElement(By.css('textarea')); |
||||
await this.webdriver.executeScript(`document.querySelector('textarea').value = '${value}'`) |
||||
await textarea.sendKeys(' '); |
||||
await this.webdriver.executeScript(() => document.querySelector('textarea')!!.blur()); |
||||
} |
||||
|
||||
async getErrorMessage(): Promise<string> { |
||||
let error = await this.webdriver.findElement(By.css('.settings-ui-input-error')); |
||||
return error.getText(); |
||||
} |
||||
} |
@ -0,0 +1,39 @@ |
||||
import { Lanthan } from 'lanthan'; |
||||
import { WebDriver, By } from 'selenium-webdriver'; |
||||
import JSONOptionPage from './JSONOptionPage'; |
||||
import FormOptionPage from './FormOptionPage'; |
||||
|
||||
export default class OptionPage { |
||||
private webdriver: WebDriver; |
||||
|
||||
constructor(private lanthan: Lanthan) { |
||||
this.webdriver = lanthan.getWebDriver(); |
||||
} |
||||
|
||||
static async open(lanthan: Lanthan) { |
||||
let url = await lanthan.getWebExtBrowser().runtime.getURL("build/settings.html") |
||||
await lanthan.getWebDriver().navigate().to(url); |
||||
return new OptionPage(lanthan); |
||||
} |
||||
|
||||
async switchToForm(): Promise<FormOptionPage> { |
||||
let useFormInput = await this.webdriver.findElement(By.css('#setting-source-form')); |
||||
await useFormInput.click(); |
||||
await this.webdriver.switchTo().alert().accept(); |
||||
return new FormOptionPage(this.lanthan); |
||||
} |
||||
|
||||
async asFormOptionPage(): Promise<FormOptionPage> { |
||||
// TODO validate current page
|
||||
return new FormOptionPage(this.lanthan); |
||||
} |
||||
|
||||
async asJSONOptionPage(): Promise<JSONOptionPage> { |
||||
// TODO validate current page
|
||||
return new JSONOptionPage(this.lanthan); |
||||
} |
||||
|
||||
scrollTo(x: number, y: number): Promise<void> { |
||||
return this.webdriver.executeScript(`window.scrollTo(${x}, ${y})`); |
||||
} |
||||
} |
@ -0,0 +1,93 @@ |
||||
import { WebDriver, By, until } from 'selenium-webdriver'; |
||||
import { Console } from './Console'; |
||||
|
||||
type Hint = { |
||||
displayed: boolean, |
||||
text: string, |
||||
}; |
||||
|
||||
export default class Page { |
||||
private constructor(private webdriver: WebDriver) { |
||||
} |
||||
|
||||
static async currentContext(webdriver: WebDriver): Promise<Page> { |
||||
await Page.waitForConsoleLoaded(webdriver); |
||||
return new Page(webdriver); |
||||
} |
||||
|
||||
static async navigateTo(webdriver: WebDriver, url: string): Promise<Page> { |
||||
await webdriver.navigate().to(url); |
||||
await Page.waitForConsoleLoaded(webdriver); |
||||
return new Page(webdriver); |
||||
} |
||||
|
||||
async sendKeys(...keys: Array<string|number|Promise<string|number>>): Promise<void> { |
||||
let body = await this.webdriver.findElement(By.css('body')); |
||||
await body.sendKeys(...keys); |
||||
} |
||||
|
||||
async navigateTo(url: string): Promise<Page> { |
||||
await this.webdriver.navigate().to(url); |
||||
await Page.waitForConsoleLoaded(this.webdriver); |
||||
return new Page(this.webdriver); |
||||
} |
||||
|
||||
async showConsole(): Promise<Console> { |
||||
let iframe = this.webdriver.findElement(By.css('#vimvixen-console-frame')); |
||||
|
||||
await this.sendKeys(':'); |
||||
await this.webdriver.wait(until.elementIsVisible(iframe)); |
||||
await this.webdriver.switchTo().frame(0); |
||||
await this.webdriver.wait(until.elementLocated(By.css('input.vimvixen-console-command-input'))); |
||||
return new Console(this.webdriver); |
||||
} |
||||
|
||||
async getConsole(): Promise<Console> { |
||||
let iframe = this.webdriver.findElement(By.css('#vimvixen-console-frame')); |
||||
|
||||
await this.webdriver.wait(until.elementIsVisible(iframe)); |
||||
await this.webdriver.switchTo().frame(0); |
||||
return new Console(this.webdriver); |
||||
} |
||||
|
||||
async getScrollX(): Promise<number> { |
||||
return await this.webdriver.executeScript(() => window.pageXOffset); |
||||
} |
||||
|
||||
getScrollY(): Promise<number> { |
||||
return this.webdriver.executeScript(() => window.pageYOffset); |
||||
} |
||||
|
||||
scrollTo(x: number, y: number): Promise<void> { |
||||
return this.webdriver.executeScript(`window.scrollTo(${x}, ${y})`); |
||||
} |
||||
|
||||
pageHeight(): Promise<number> { |
||||
return this.webdriver.executeScript(() => window.document.documentElement.clientHeight); |
||||
} |
||||
|
||||
async waitAndGetHints(): Promise<Hint[]> { |
||||
await this.webdriver.wait(until.elementsLocated(By.css('.vimvixen-hint'))); |
||||
|
||||
let elements = await this.webdriver.findElements(By.css(`.vimvixen-hint`)); |
||||
let hints = []; |
||||
for (let e of elements) { |
||||
let display = await e.getCssValue('display'); |
||||
let text = await e.getText(); |
||||
hints.push({ |
||||
displayed: display !== 'none', |
||||
text: text, |
||||
}); |
||||
} |
||||
return hints; |
||||
} |
||||
|
||||
private static async waitForConsoleLoaded(webdriver: WebDriver) { |
||||
let topFrame = await webdriver.executeScript(() => window.top === window); |
||||
if (!topFrame) { |
||||
return; |
||||
} |
||||
await webdriver.wait(until.elementLocated(By.css('iframe.vimvixen-console-frame'))); |
||||
await new Promise(resolve => setTimeout(resolve, 100)); |
||||
} |
||||
} |
@ -0,0 +1,64 @@ |
||||
import * as http from 'http'; |
||||
import * as net from 'net' |
||||
import express from 'express'; |
||||
|
||||
type HandlerFunc = (req: express.Request, res: express.Response) => void; |
||||
|
||||
export default class TestServer { |
||||
private http?: http.Server; |
||||
|
||||
private app: express.Application; |
||||
|
||||
constructor( |
||||
private port = 0, |
||||
private address = '127.0.0.1', |
||||
){ |
||||
this.app = express(); |
||||
} |
||||
|
||||
handle(path: string, f: HandlerFunc): TestServer { |
||||
this.app.get(path, f); |
||||
return this; |
||||
} |
||||
|
||||
receiveContent(path: string, content: string): TestServer { |
||||
this.app.get(path, (_req: express.Request, res: express.Response) => { |
||||
res.status(200).send(content) |
||||
}); |
||||
return this; |
||||
} |
||||
|
||||
url(path: string = '/'): string { |
||||
if (!this.http) { |
||||
throw new Error('http server not started'); |
||||
} |
||||
|
||||
let addr = this.http.address() as net.AddressInfo; |
||||
return `http://${addr.address}:${addr.port}${path}` |
||||
} |
||||
|
||||
start(): Promise<void> { |
||||
if (this.http) { |
||||
throw new Error('http server already started'); |
||||
} |
||||
|
||||
this.http = http.createServer(this.app) |
||||
return new Promise((resolve) => { |
||||
this.http!!.listen(this.port, this.address, () => { |
||||
resolve(); |
||||
}) |
||||
}); |
||||
} |
||||
|
||||
stop(): Promise<void> { |
||||
if (!this.http) { |
||||
return Promise.resolve(); |
||||
} |
||||
return new Promise((resolve) => { |
||||
this.http!!.close(() => { |
||||
this.http = undefined; |
||||
resolve(); |
||||
}); |
||||
}) |
||||
} |
||||
} |
@ -1,63 +0,0 @@ |
||||
'use strict'; |
||||
|
||||
const { spawn } = require('child_process'); |
||||
|
||||
const readLinux = () => { |
||||
let stdout = '', stderr = ''; |
||||
return new Promise((resolve, reject) => { |
||||
let xsel = spawn('xsel', ['--clipboard', '--output']); |
||||
xsel.stdout.on('data', (data) => { |
||||
stdout += data; |
||||
}); |
||||
xsel.stderr.on('data', (data) => { |
||||
stderr += data; |
||||
}); |
||||
xsel.on('close', (code) => { |
||||
if (code !== 0) { |
||||
throw new Error(`xsel returns ${code}: ${stderr}`) |
||||
} |
||||
resolve(stdout); |
||||
}); |
||||
}); |
||||
}; |
||||
|
||||
const writeLinux = (data) => { |
||||
let stdout = '', stderr = ''; |
||||
return new Promise((resolve, reject) => { |
||||
let xsel = spawn('xsel', ['--clipboard', '--input']); |
||||
xsel.stderr.on('data', (data) => { |
||||
stderr += data; |
||||
}); |
||||
xsel.on('close', (code) => { |
||||
if (code !== 0) { |
||||
throw new Error(`xsel returns ${code}: ${stderr}`) |
||||
} |
||||
resolve(); |
||||
}); |
||||
xsel.stdin.write(data); |
||||
xsel.stdin.end(); |
||||
}); |
||||
}; |
||||
|
||||
const unsupported = (os) => { |
||||
return () => { |
||||
throw new Error(`Unsupported os: ${os}`); |
||||
}; |
||||
}; |
||||
|
||||
const detect = () => { |
||||
switch (process.platform) { |
||||
case 'linux': |
||||
return { |
||||
read: readLinux, |
||||
write: writeLinux, |
||||
}; |
||||
default: |
||||
return { |
||||
read: unsupported(process.platform), |
||||
write: unsupported(process.platform), |
||||
}; |
||||
} |
||||
} |
||||
|
||||
module.exports = detect(); |
@ -0,0 +1,107 @@ |
||||
import { spawn } from 'child_process'; |
||||
|
||||
const readLinux = (): Promise<string> => { |
||||
let stdout = '', stderr = ''; |
||||
return new Promise((resolve) => { |
||||
let xsel = spawn('xsel', ['--clipboard', '--output']); |
||||
xsel.stdout.on('data', (data) => { |
||||
stdout += data; |
||||
}); |
||||
xsel.stderr.on('data', (data) => { |
||||
stderr += data; |
||||
}); |
||||
xsel.on('close', (code) => { |
||||
if (code !== 0) { |
||||
throw new Error(`xsel returns ${code}: ${stderr}`) |
||||
} |
||||
resolve(stdout); |
||||
}); |
||||
}); |
||||
}; |
||||
|
||||
const writeLinux = (data: string): Promise<string> => { |
||||
let stderr = ''; |
||||
return new Promise((resolve) => { |
||||
let xsel = spawn('xsel', ['--clipboard', '--input']); |
||||
xsel.stderr.on('data', (data) => { |
||||
stderr += data; |
||||
}); |
||||
xsel.on('close', (code) => { |
||||
if (code !== 0) { |
||||
throw new Error(`xsel returns ${code}: ${stderr}`) |
||||
} |
||||
resolve(); |
||||
}); |
||||
xsel.stdin.write(data); |
||||
xsel.stdin.end(); |
||||
}); |
||||
}; |
||||
|
||||
const readDarwin = (): Promise<string> => { |
||||
let stdout = '', stderr = ''; |
||||
return new Promise((resolve) => { |
||||
let pbpaste = spawn('pbpaste'); |
||||
pbpaste.stdout.on('data', (data) => { |
||||
stdout += data; |
||||
}); |
||||
pbpaste.stderr.on('data', (data) => { |
||||
stderr += data; |
||||
}); |
||||
pbpaste.on('close', (code) => { |
||||
if (code !== 0) { |
||||
throw new Error(`pbpaste returns ${code}: ${stderr}`) |
||||
} |
||||
resolve(stdout); |
||||
}); |
||||
}); |
||||
}; |
||||
|
||||
const writeDarwin = (data: string): Promise<string> => { |
||||
let stderr = ''; |
||||
return new Promise((resolve) => { |
||||
let pbcopy = spawn('pbcopy'); |
||||
pbcopy.stderr.on('data', (data) => { |
||||
stderr += data; |
||||
}); |
||||
pbcopy.on('close', (code) => { |
||||
if (code !== 0) { |
||||
throw new Error(`pbcopy returns ${code}: ${stderr}`) |
||||
} |
||||
resolve(); |
||||
}); |
||||
pbcopy.stdin.write(data); |
||||
pbcopy.stdin.end(); |
||||
}); |
||||
}; |
||||
|
||||
class UnsupportedError extends Error { |
||||
constructor(platform: string) { |
||||
super(); |
||||
this.message = `Unsupported platform: ${platform}`; |
||||
} |
||||
} |
||||
|
||||
const read = () => { |
||||
switch (process.platform) { |
||||
case 'linux': |
||||
return readLinux(); |
||||
case 'darwin': |
||||
return readDarwin(); |
||||
} |
||||
throw new UnsupportedError(process.platform); |
||||
} |
||||
|
||||
const write = (data: string) => { |
||||
switch (process.platform) { |
||||
case 'linux': |
||||
return writeLinux(data); |
||||
case 'darwin': |
||||
return writeDarwin(data); |
||||
} |
||||
throw new UnsupportedError(process.platform); |
||||
} |
||||
|
||||
export { |
||||
read, |
||||
write, |
||||
}; |
@ -1,121 +0,0 @@ |
||||
const express = require('express'); |
||||
const lanthan = require('lanthan'); |
||||
const path = require('path'); |
||||
const assert = require('assert'); |
||||
const eventually = require('./eventually'); |
||||
|
||||
const Key = lanthan.Key; |
||||
|
||||
const newApp = () => { |
||||
let app = express(); |
||||
app.get('/', (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<body style="width:10000px; height:10000px"></body> |
||||
</html">`); |
||||
}); |
||||
return app; |
||||
}; |
||||
|
||||
describe("mark test", () => { |
||||
|
||||
const port = 12321; |
||||
let http; |
||||
let firefox; |
||||
let session; |
||||
let browser; |
||||
|
||||
before(async() => { |
||||
http = newApp().listen(port); |
||||
|
||||
firefox = await lanthan.firefox(); |
||||
await firefox.session.installAddonFromPath(path.join(__dirname, '..')); |
||||
session = firefox.session; |
||||
browser = firefox.browser; |
||||
}); |
||||
|
||||
after(async() => { |
||||
if (firefox) { |
||||
await firefox.close(); |
||||
} |
||||
http.close(); |
||||
}); |
||||
|
||||
it('should set a local mark and jump to it', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}`); |
||||
let body = await session.findElementByCSS('body'); |
||||
|
||||
await session.executeScript(() => window.scrollTo(200, 200)); |
||||
await body.sendKeys('m', 'a'); |
||||
await session.executeScript(() => window.scrollTo(500, 500)); |
||||
await body.sendKeys('\'', 'a'); |
||||
|
||||
await eventually(async() => { |
||||
let pageXOffset = await session.executeScript(() => window.pageXOffset); |
||||
let pageYOffset = await session.executeScript(() => window.pageYOffset); |
||||
assert.equal(pageXOffset, 200); |
||||
assert.equal(pageYOffset, 200); |
||||
}); |
||||
}); |
||||
|
||||
it('should set a global mark and jump to it', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}#first`); |
||||
let body = await session.findElementByCSS('body'); |
||||
|
||||
await session.executeScript(() => window.scrollTo(200, 200)); |
||||
await body.sendKeys('m', 'A'); |
||||
await session.executeScript(() => window.scrollTo(500, 500)); |
||||
await body.sendKeys('\'', 'A'); |
||||
|
||||
await eventually(async() => { |
||||
let pageXOffset = await session.executeScript(() => window.pageXOffset); |
||||
let pageYOffset = await session.executeScript(() => window.pageYOffset); |
||||
assert.equal(pageXOffset, 200); |
||||
assert.equal(pageYOffset, 200); |
||||
}); |
||||
|
||||
await browser.tabs.create({ url: `http://127.0.0.1:${port}#second` }); |
||||
body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('\'', 'A'); |
||||
|
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({ active: true }))[0]; |
||||
let url = new URL(tab.url); |
||||
assert.equal(url.hash, '#first'); |
||||
|
||||
let pageXOffset = await session.executeScript(() => window.pageXOffset); |
||||
let pageYOffset = await session.executeScript(() => window.pageYOffset); |
||||
assert.equal(pageXOffset, 200); |
||||
assert.equal(pageYOffset, 200); |
||||
}); |
||||
}); |
||||
|
||||
it('set a global mark and creates new tab from gone', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}#first`); |
||||
await session.executeScript(() => window.scrollTo(500, 500)); |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('m', 'A'); |
||||
|
||||
let tab = (await browser.tabs.query({ active: true }))[0]; |
||||
await browser.tabs.create({ url: `http://127.0.0.1:${port}#second` }); |
||||
await browser.tabs.remove(tab.id); |
||||
|
||||
let handles; |
||||
await eventually(async() => { |
||||
handles = await session.getWindowHandles(); |
||||
assert.equal(handles.length, 2); |
||||
}); |
||||
await session.switchToWindow(handles[0]); |
||||
await session.navigateTo(`http://127.0.0.1:${port}#second`); |
||||
body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('\'', 'A'); |
||||
|
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({ active: true }))[0]; |
||||
let url = new URL(tab.url); |
||||
assert.equal(url.hash, '#first'); |
||||
}); |
||||
}); |
||||
}); |
||||
|
||||
|
@ -0,0 +1,102 @@ |
||||
import * as path from 'path'; |
||||
import * as assert from 'assert'; |
||||
|
||||
import TestServer from './lib/TestServer'; |
||||
import eventually from './eventually'; |
||||
import { Builder, Lanthan } from 'lanthan'; |
||||
import { WebDriver } from 'selenium-webdriver'; |
||||
import Page from './lib/Page'; |
||||
|
||||
describe("mark test", () => { |
||||
let server = new TestServer().receiveContent('/', |
||||
`<!DOCTYPE html><html lang="en"><body style="width:10000px; height:10000px"></body></html">`, |
||||
); |
||||
let lanthan: Lanthan; |
||||
let webdriver: WebDriver; |
||||
let browser: any; |
||||
|
||||
before(async() => { |
||||
lanthan = await Builder |
||||
.forBrowser('firefox') |
||||
.spyAddon(path.join(__dirname, '..')) |
||||
.build(); |
||||
webdriver = lanthan.getWebDriver(); |
||||
browser = lanthan.getWebExtBrowser(); |
||||
|
||||
await server.start() |
||||
}); |
||||
|
||||
after(async() => { |
||||
await server.stop(); |
||||
if (lanthan) { |
||||
await lanthan.quit(); |
||||
} |
||||
}); |
||||
|
||||
it('should set a local mark and jump to it', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url()); |
||||
await page.scrollTo(200, 200); |
||||
await page.sendKeys('m', 'a'); |
||||
await page.scrollTo(500, 500); |
||||
await page.sendKeys('\'', 'a'); |
||||
|
||||
await eventually(async() => { |
||||
assert.strictEqual(await page.getScrollX(), 200); |
||||
assert.strictEqual(await page.getScrollY(), 200); |
||||
}); |
||||
}); |
||||
|
||||
it('should set a global mark and jump to it', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url('/#first')); |
||||
await page.scrollTo(200, 200); |
||||
await page.sendKeys('m', 'A'); |
||||
await page.scrollTo(500, 500); |
||||
await page.sendKeys('\'', 'A'); |
||||
|
||||
await eventually(async() => { |
||||
assert.strictEqual(await page.getScrollX(), 200); |
||||
assert.strictEqual(await page.getScrollY(), 200); |
||||
}); |
||||
|
||||
await browser.tabs.create({ url: server.url('/#second') }); |
||||
page = await Page.currentContext(webdriver); |
||||
await page.sendKeys('\'', 'A'); |
||||
|
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({ active: true }))[0]; |
||||
let url = new URL(tab.url); |
||||
assert.strictEqual(url.hash, '#first'); |
||||
|
||||
assert.strictEqual(await page.getScrollX(), 200); |
||||
assert.strictEqual(await page.getScrollY(), 200); |
||||
}); |
||||
}); |
||||
|
||||
it('set a global mark and creates new tab from gone', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url('/#first')); |
||||
await page.scrollTo(500, 500); |
||||
await page.sendKeys('m', 'A'); |
||||
|
||||
let tab = (await browser.tabs.query({ active: true }))[0]; |
||||
await browser.tabs.create({ url: server.url('/#second') }); |
||||
await browser.tabs.remove(tab.id); |
||||
|
||||
let handles: string[]; |
||||
await eventually(async() => { |
||||
handles = await webdriver.getAllWindowHandles(); |
||||
assert.strictEqual(handles.length, 2); |
||||
}); |
||||
await webdriver.switchTo().window(handles!![0]); |
||||
|
||||
page = await Page.navigateTo(webdriver, server.url('/#second')); |
||||
await page.sendKeys('\'', 'A'); |
||||
|
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({ active: true }))[0]; |
||||
let url = new URL(tab.url); |
||||
assert.strictEqual(url.hash, '#first'); |
||||
}); |
||||
}); |
||||
}); |
||||
|
||||
|
@ -1,274 +0,0 @@ |
||||
const express = require('express'); |
||||
const lanthan = require('lanthan'); |
||||
const path = require('path'); |
||||
const assert = require('assert'); |
||||
const eventually = require('./eventually'); |
||||
|
||||
const Key = lanthan.Key; |
||||
|
||||
const newApp = () => { |
||||
let app = express(); |
||||
app.get('/pagenation-a/:page', (req, res) => { |
||||
res.status(200).send(` |
||||
<html lang="en"> |
||||
<a href="/pagenation-a/${Number(req.params.page) - 1}">prev</a> |
||||
<a href="/pagenation-a/${Number(req.params.page) + 1}">next</a> |
||||
</html">`); |
||||
}); |
||||
app.get('/pagenation-link/:page', (req, res) => { |
||||
res.status(200).send(` |
||||
<html lang="en"> |
||||
<head> |
||||
<link rel="prev" href="/pagenation-link/${Number(req.params.page) - 1}"></link> |
||||
<link rel="next" href="/pagenation-link/${Number(req.params.page) + 1}"></link> |
||||
</head> |
||||
</html">`); |
||||
}); |
||||
app.get('/reload', (req, res) => { |
||||
res.status(200).send(` |
||||
<html lang="en"> |
||||
<head> |
||||
<script>window.location.hash = Date.now()</script> |
||||
</head> |
||||
<body style="width:10000px; height:10000px"></body> |
||||
</html">`); |
||||
}); |
||||
|
||||
app.get('/*', (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
${req.path} |
||||
</html">`); |
||||
}); |
||||
return app; |
||||
}; |
||||
|
||||
describe("navigate test", () => { |
||||
|
||||
const port = 12321; |
||||
let http; |
||||
let firefox; |
||||
let session; |
||||
let browser; |
||||
|
||||
before(async() => { |
||||
http = newApp().listen(port); |
||||
|
||||
firefox = await lanthan.firefox({ |
||||
prefs: { |
||||
'browser.startup.homepage': `http://127.0.0.1:${port}#home`, |
||||
} |
||||
}); |
||||
await firefox.session.installAddonFromPath(path.join(__dirname, '..')); |
||||
session = firefox.session; |
||||
browser = firefox.browser; |
||||
}); |
||||
|
||||
after(async() => { |
||||
if (firefox) { |
||||
await firefox.close(); |
||||
} |
||||
http.close(); |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
for (let tab of tabs.slice(1)) { |
||||
await browser.tabs.remove(tab.id); |
||||
} |
||||
}) |
||||
|
||||
it('should go to parent path without hash by gu', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/a/b/c`); |
||||
let body = await session.findElementByCSS('body'); |
||||
|
||||
await body.sendKeys('g', 'u'); |
||||
|
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
let url = new URL(tab.url); |
||||
assert.equal(url.pathname, `/a/b/`) |
||||
}); |
||||
}); |
||||
|
||||
it('should remove hash by gu', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/a/b/c#hash`); |
||||
let body = await session.findElementByCSS('body'); |
||||
|
||||
await body.sendKeys('g', 'u'); |
||||
|
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
let url = new URL(tab.url); |
||||
assert.equal(url.hash, '') |
||||
assert.equal(url.pathname, `/a/b/c`) |
||||
}); |
||||
}); |
||||
|
||||
it('should go to root path by gU', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/a/b/c#hash`); |
||||
let body = await session.findElementByCSS('body'); |
||||
|
||||
await body.sendKeys('g', Key.Shift, 'u'); |
||||
|
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
let url = new URL(tab.url); |
||||
assert.equal(url.pathname, `/`) |
||||
}); |
||||
}); |
||||
|
||||
it('should go back and forward in history by H and L', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/first`); |
||||
await session.navigateTo(`http://127.0.0.1:${port}/second`); |
||||
let body = await session.findElementByCSS('body'); |
||||
|
||||
await body.sendKeys(Key.Shift, 'h'); |
||||
|
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
let url = new URL(tab.url); |
||||
assert.equal(url.pathname, `/first`) |
||||
}); |
||||
|
||||
body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(Key.Shift, 'l'); |
||||
|
||||
await eventually(async() => { |
||||
tab = (await browser.tabs.query({}))[0]; |
||||
url = new URL(tab.url); |
||||
assert.equal(url.pathname, `/second`) |
||||
}); |
||||
}); |
||||
|
||||
it('should go previous and next page in <a> by [[ and ]]', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/pagenation-a/10`); |
||||
|
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('[', '['); |
||||
|
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
let url = new URL(tab.url); |
||||
assert.equal(url.pathname, '/pagenation-a/9'); |
||||
}); |
||||
}); |
||||
|
||||
it('should go next page in <a> by ]]', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/pagenation-a/10`); |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(']', ']'); |
||||
|
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
let url = new URL(tab.url); |
||||
assert.equal(url.pathname, '/pagenation-a/11'); |
||||
}); |
||||
}); |
||||
|
||||
it('should go previous page in <link> by ]]', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/pagenation-link/10`); |
||||
|
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('[', '['); |
||||
|
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
let url = new URL(tab.url); |
||||
assert.equal(url.pathname, '/pagenation-link/9'); |
||||
}); |
||||
}); |
||||
|
||||
it('should go next page by in <link> by [[', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/pagenation-link/10`); |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(']', ']'); |
||||
|
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
let url = new URL(tab.url); |
||||
assert.equal(url.pathname, '/pagenation-link/11'); |
||||
}); |
||||
}); |
||||
|
||||
it('should go to home page into current tab by gh', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}`); |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('g', 'h'); |
||||
|
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
let url = new URL(tab.url); |
||||
assert.equal(url.hash, '#home'); |
||||
}); |
||||
}); |
||||
|
||||
it('should go to home page into current tab by gH', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}`); |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('g', Key.Shift, 'H'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.equal(tabs.length, 2); |
||||
assert.equal(new URL(tabs[0].url).hash, ''); |
||||
assert.equal(new URL(tabs[1].url).hash, '#home'); |
||||
assert.equal(tabs[1].active, true); |
||||
}); |
||||
}); |
||||
|
||||
it('should reload current tab by r', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/reload`); |
||||
await session.executeScript(() => window.scrollTo(500, 500)); |
||||
let before |
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
before = Number(new URL(tab.url).hash.split('#')[1]); |
||||
assert(before > 0); |
||||
}); |
||||
|
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('r'); |
||||
|
||||
let after |
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
after = Number(new URL(tab.url).hash.split('#')[1]); |
||||
assert(after > before); |
||||
}); |
||||
|
||||
await eventually(async() => { |
||||
let pageYOffset = await session.executeScript(() => window.pageYOffset); |
||||
assert.equal(pageYOffset, 500); |
||||
}); |
||||
}); |
||||
|
||||
it('should reload current tab without cache by R', async () => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}/reload`); |
||||
await session.executeScript(() => window.scrollTo(500, 500)); |
||||
let before |
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
before = Number(new URL(tab.url).hash.split('#')[1]); |
||||
assert(before > 0); |
||||
}); |
||||
|
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(Key.Shift, 'R'); |
||||
|
||||
let after |
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
after = Number(new URL(tab.url).hash.split('#')[1]); |
||||
assert(after > before); |
||||
}); |
||||
|
||||
// assert that the page offset is reset to 0, and 'eventually' is timed-out.
|
||||
await assert.rejects(async () => { |
||||
await eventually(async() => { |
||||
let pageYOffset = await session.executeScript(() => window.pageYOffset); |
||||
assert.equal(pageYOffset, 500); |
||||
}); |
||||
}); |
||||
}); |
||||
}); |
@ -0,0 +1,254 @@ |
||||
import * as path from 'path'; |
||||
import * as assert from 'assert'; |
||||
|
||||
import TestServer from './lib/TestServer'; |
||||
import eventually from './eventually'; |
||||
import { Builder, Lanthan } from 'lanthan'; |
||||
import { WebDriver, Key } from 'selenium-webdriver'; |
||||
import { Options as FirefoxOptions } from 'selenium-webdriver/firefox'; |
||||
import Page from './lib/Page'; |
||||
|
||||
const newApp = () => { |
||||
let server = new TestServer(); |
||||
server.handle('/pagenation-a/:page', (req, res) => { |
||||
res.status(200).send(` |
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<a href="/pagenation-a/${Number(req.params.page) - 1}">prev</a> |
||||
<a href="/pagenation-a/${Number(req.params.page) + 1}">next</a> |
||||
</html">`); |
||||
}); |
||||
|
||||
server.handle('/pagenation-link/:page', (req, res) => { |
||||
res.status(200).send(` |
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<link rel="prev" href="/pagenation-link/${Number(req.params.page) - 1}"></link> |
||||
<link rel="next" href="/pagenation-link/${Number(req.params.page) + 1}"></link> |
||||
</head> |
||||
</html">`); |
||||
}); |
||||
server.receiveContent('/reload', ` |
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<script>window.location.hash = Date.now()</script> |
||||
</head> |
||||
<body style="width:10000px; height:10000px"></body> |
||||
</html">`); |
||||
|
||||
server.receiveContent('/*', `ok`); |
||||
|
||||
return server; |
||||
}; |
||||
|
||||
describe("navigate test", () => { |
||||
let server = newApp(); |
||||
let lanthan: Lanthan; |
||||
let webdriver: WebDriver; |
||||
let browser: any; |
||||
|
||||
before(async() => { |
||||
await server.start(); |
||||
|
||||
let opts = (new FirefoxOptions() as any) |
||||
.setPreference('browser.startup.homepage', server.url('/#home')); |
||||
lanthan = await Builder |
||||
.forBrowser('firefox') |
||||
.setOptions(opts) |
||||
.spyAddon(path.join(__dirname, '..')) |
||||
.build(); |
||||
webdriver = lanthan.getWebDriver(); |
||||
browser = lanthan.getWebExtBrowser(); |
||||
}); |
||||
|
||||
after(async() => { |
||||
await server.stop(); |
||||
if (lanthan) { |
||||
await lanthan.quit(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
for (let tab of tabs.slice(1)) { |
||||
await browser.tabs.remove(tab.id); |
||||
} |
||||
}) |
||||
|
||||
it('should go to parent path without hash by gu', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url('/a/b/c')); |
||||
await page.sendKeys('g', 'u'); |
||||
|
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
let url = new URL(tab.url); |
||||
assert.strictEqual(url.pathname, `/a/b/`) |
||||
}); |
||||
}); |
||||
|
||||
it('should remove hash by gu', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url('/a/b/c#hash')); |
||||
await page.sendKeys('g', 'u'); |
||||
|
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
let url = new URL(tab.url); |
||||
assert.strictEqual(url.hash, '') |
||||
assert.strictEqual(url.pathname, `/a/b/c`) |
||||
}); |
||||
}); |
||||
|
||||
it('should go to root path by gU', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url('/a/b/c#hash')); |
||||
await page.sendKeys('g', Key.SHIFT, 'u'); |
||||
|
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
let url = new URL(tab.url); |
||||
assert.strictEqual(url.pathname, `/`) |
||||
}); |
||||
}); |
||||
|
||||
it('should go back and forward in history by H and L', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url('/first')); |
||||
await page.navigateTo(server.url('/second')); |
||||
await page.sendKeys(Key.SHIFT, 'h'); |
||||
|
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
let url = new URL(tab.url); |
||||
assert.strictEqual(url.pathname, `/first`) |
||||
}); |
||||
|
||||
page = await Page.currentContext(webdriver); |
||||
page.sendKeys(Key.SHIFT, 'l'); |
||||
|
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
let url = new URL(tab.url); |
||||
assert.strictEqual(url.pathname, `/second`) |
||||
}); |
||||
}); |
||||
|
||||
it('should go previous and next page in <a> by [[ and ]]', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url('/pagenation-a/10')); |
||||
await page.sendKeys('[', '['); |
||||
|
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
let url = new URL(tab.url); |
||||
assert.strictEqual(url.pathname, '/pagenation-a/9'); |
||||
}); |
||||
}); |
||||
|
||||
it('should go next page in <a> by ]]', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url('/pagenation-a/10')); |
||||
await page.sendKeys(']', ']'); |
||||
|
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
let url = new URL(tab.url); |
||||
assert.strictEqual(url.pathname, '/pagenation-a/11'); |
||||
}); |
||||
}); |
||||
|
||||
it('should go previous page in <link> by ]]', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url('/pagenation-link/10')); |
||||
await page.sendKeys('[', '['); |
||||
|
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
let url = new URL(tab.url); |
||||
assert.strictEqual(url.pathname, '/pagenation-link/9'); |
||||
}); |
||||
}); |
||||
|
||||
it('should go next page by in <link> by [[', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url('/pagenation-link/10')); |
||||
await page.sendKeys(']', ']'); |
||||
|
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
let url = new URL(tab.url); |
||||
assert.strictEqual(url.pathname, '/pagenation-link/11'); |
||||
}); |
||||
}); |
||||
|
||||
it('should go to home page into current tab by gh', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url()); |
||||
await page.sendKeys('g', 'h'); |
||||
|
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
let url = new URL(tab.url); |
||||
assert.strictEqual(url.hash, '#home'); |
||||
}); |
||||
}); |
||||
|
||||
it('should go to home page into current tab by gH', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url()); |
||||
await page.sendKeys('g', Key.SHIFT, 'H'); |
||||
|
||||
await eventually(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
assert.strictEqual(tabs.length, 2); |
||||
assert.strictEqual(new URL(tabs[0].url).hash, ''); |
||||
assert.strictEqual(new URL(tabs[1].url).hash, '#home'); |
||||
assert.strictEqual(tabs[1].active, true); |
||||
}); |
||||
}); |
||||
|
||||
it('should reload current tab by r', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url('/reload')); |
||||
await page.scrollTo(500, 500); |
||||
|
||||
let before: number; |
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
before = Number(new URL(tab.url).hash.split('#')[1]); |
||||
assert.ok(before > 0); |
||||
}); |
||||
|
||||
await page.sendKeys('r'); |
||||
|
||||
let after |
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
after = Number(new URL(tab.url).hash.split('#')[1]); |
||||
assert.ok(after > before); |
||||
}); |
||||
|
||||
await eventually(async() => { |
||||
let page = await Page.currentContext(webdriver); |
||||
assert.strictEqual(await page.getScrollX(), 500); |
||||
}); |
||||
}); |
||||
|
||||
it('should reload current tab without cache by R', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url('/reload')); |
||||
await page.scrollTo(500, 500); |
||||
|
||||
let before: number; |
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
before = Number(new URL(tab.url).hash.split('#')[1]); |
||||
assert.ok(before > 0); |
||||
}); |
||||
|
||||
await page.sendKeys(Key.SHIFT, 'R'); |
||||
|
||||
let after |
||||
await eventually(async() => { |
||||
let tab = (await browser.tabs.query({}))[0]; |
||||
after = Number(new URL(tab.url).hash.split('#')[1]); |
||||
assert.ok(after > before); |
||||
}); |
||||
|
||||
await eventually(async() => { |
||||
let page = await Page.currentContext(webdriver); |
||||
assert.strictEqual(await page.getScrollY(), 0); |
||||
}); |
||||
}); |
||||
}); |
@ -1,99 +0,0 @@ |
||||
const express = require('express'); |
||||
const lanthan = require('lanthan'); |
||||
const path = require('path'); |
||||
const assert = require('assert'); |
||||
const eventually = require('./eventually'); |
||||
|
||||
const newApp = () => { |
||||
let app = express(); |
||||
app.get('/', (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<body style="width:10000px; height:10000px"></body> |
||||
</html">`); |
||||
}); |
||||
return app; |
||||
}; |
||||
|
||||
describe("options page", () => { |
||||
const port = 12321; |
||||
let http; |
||||
let firefox; |
||||
let session; |
||||
let browser; |
||||
|
||||
before(async() => { |
||||
http = newApp().listen(port); |
||||
|
||||
firefox = await lanthan.firefox({ |
||||
spy: path.join(__dirname, '..'), |
||||
builderf: (builder) => { |
||||
builder.addFile('build/settings.js'); |
||||
builder.addFile('build/settings.html'); |
||||
}, |
||||
}); |
||||
await firefox.session.installAddonFromPath(path.join(__dirname, '..')); |
||||
session = firefox.session; |
||||
browser = firefox.browser; |
||||
}); |
||||
|
||||
after(async() => { |
||||
if (firefox) { |
||||
await firefox.close(); |
||||
} |
||||
|
||||
http.close(); |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
for (let tab of tabs.slice(1)) { |
||||
await browser.tabs.remove(tab.id); |
||||
} |
||||
}) |
||||
|
||||
const updateTextarea = async(value) => { |
||||
let textarea = await session.findElementByCSS('textarea'); |
||||
await session.executeScript(`document.querySelector('textarea').value = '${value}'`) |
||||
await textarea.sendKeys(' '); |
||||
await session.executeScript(() => document.querySelector('textarea').blur()); |
||||
} |
||||
|
||||
it('saves current config on blur', async () => { |
||||
let url = await browser.runtime.getURL("build/settings.html") |
||||
await session.navigateTo(url); |
||||
|
||||
await updateTextarea(`{ "blacklist": [ "https://example.com" ] }`); |
||||
|
||||
let { settings } = await browser.storage.local.get('settings'); |
||||
assert.equal(settings.source, 'json') |
||||
assert.equal(settings.json, '{ "blacklist": [ "https://example.com" ] } ') |
||||
|
||||
await updateTextarea(`invalid json`); |
||||
|
||||
settings = (await browser.storage.local.get('settings')).settings; |
||||
assert.equal(settings.source, 'json') |
||||
assert.equal(settings.json, '{ "blacklist": [ "https://example.com" ] } ') |
||||
|
||||
let error = await session.findElementByCSS('.settings-ui-input-error'); |
||||
let text = await error.getText(); |
||||
assert.ok(text.startsWith('SyntaxError:')) |
||||
}); |
||||
|
||||
it('updates keymaps without reloading', async () => { |
||||
await browser.tabs.create({ url: `http://127.0.0.1:${port}`, active: false }); |
||||
let url = await browser.runtime.getURL("build/settings.html") |
||||
await session.navigateTo(url); |
||||
|
||||
let handles = await session.getWindowHandles(); |
||||
await updateTextarea(`{ "keymaps": { "zz": { "type": "scroll.vertically", "count": 10 } } }`); |
||||
|
||||
await session.switchToWindow(handles[1]); |
||||
|
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('zz') |
||||
|
||||
let y = await session.executeScript(() => window.pageYOffset); |
||||
assert.equal(y, 640); |
||||
}) |
||||
}); |
@ -0,0 +1,81 @@ |
||||
import * as path from 'path'; |
||||
import * as assert from 'assert'; |
||||
|
||||
import TestServer from './lib/TestServer'; |
||||
import eventually from './eventually'; |
||||
import { Builder, Lanthan } from 'lanthan'; |
||||
import { WebDriver } from 'selenium-webdriver'; |
||||
import Page from './lib/Page'; |
||||
import OptionPage from './lib/OptionPage'; |
||||
|
||||
describe("options page", () => { |
||||
let server = new TestServer().receiveContent('/', |
||||
`<!DOCTYPE html><html lang="en"><body style="width:10000px; height:10000px"></body></html">`, |
||||
); |
||||
let lanthan: Lanthan; |
||||
let webdriver: WebDriver; |
||||
let browser: any; |
||||
|
||||
before(async() => { |
||||
lanthan = await Builder |
||||
.forBrowser('firefox') |
||||
.spyAddon(path.join(__dirname, '..')) |
||||
.build(); |
||||
webdriver = lanthan.getWebDriver(); |
||||
browser = lanthan.getWebExtBrowser(); |
||||
|
||||
await server.start(); |
||||
}); |
||||
|
||||
after(async() => { |
||||
if (lanthan) { |
||||
await lanthan.quit(); |
||||
} |
||||
await server.stop(); |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
let tabs = await browser.tabs.query({}); |
||||
for (let tab of tabs.slice(1)) { |
||||
await browser.tabs.remove(tab.id); |
||||
} |
||||
}) |
||||
|
||||
it('saves current config on blur', async () => { |
||||
let page = await OptionPage.open(lanthan); |
||||
let jsonPage = await page.asJSONOptionPage(); |
||||
await jsonPage.updateSettings(`{ "blacklist": [ "https://example.com" ] }`) |
||||
|
||||
let { settings } = await browser.storage.local.get('settings'); |
||||
assert.strictEqual(settings.source, 'json') |
||||
assert.strictEqual(settings.json, '{ "blacklist": [ "https://example.com" ] } ') |
||||
|
||||
await jsonPage.updateSettings(`invalid json`); |
||||
|
||||
settings = (await browser.storage.local.get('settings')).settings; |
||||
assert.strictEqual(settings.source, 'json') |
||||
assert.strictEqual(settings.json, '{ "blacklist": [ "https://example.com" ] } ') |
||||
|
||||
let message = await jsonPage.getErrorMessage(); |
||||
assert.ok(message.startsWith('SyntaxError:')) |
||||
}); |
||||
|
||||
it('updates keymaps without reloading', async () => { |
||||
let optionPage = await OptionPage.open(lanthan); |
||||
let jsonPage = await optionPage.asJSONOptionPage(); |
||||
await jsonPage.updateSettings(`{ "keymaps": { "zz": { "type": "scroll.vertically", "count": 10 } } }`); |
||||
|
||||
await browser.tabs.create({ url: server.url(), active: false }); |
||||
await new Promise((resolve) => setTimeout(resolve, 100)); |
||||
let handles = await webdriver.getAllWindowHandles(); |
||||
await webdriver.switchTo().window(handles[1]); |
||||
|
||||
let page = await Page.currentContext(webdriver); |
||||
await page.sendKeys('zz'); |
||||
|
||||
await eventually(async() => { |
||||
let y = await page.getScrollY(); |
||||
assert.strictEqual(y, 640); |
||||
}); |
||||
}) |
||||
}); |
@ -1,125 +0,0 @@ |
||||
const lanthan = require('lanthan'); |
||||
const path = require('path'); |
||||
const assert = require('assert'); |
||||
|
||||
describe("options form page", () => { |
||||
let firefox; |
||||
let session; |
||||
let browser; |
||||
|
||||
beforeEach(async() => { |
||||
firefox = await lanthan.firefox({ |
||||
spy: path.join(__dirname, '..'), |
||||
builderf: (builder) => { |
||||
builder.addFile('build/settings.js'); |
||||
builder.addFile('build/settings.html'); |
||||
}, |
||||
}); |
||||
await firefox.session.installAddonFromPath(path.join(__dirname, '..')); |
||||
session = firefox.session; |
||||
browser = firefox.browser; |
||||
|
||||
let tabs = await browser.tabs.query({}); |
||||
for (let tab of tabs.slice(1)) { |
||||
await browser.tabs.remove(tab.id); |
||||
} |
||||
}) |
||||
|
||||
afterEach(async() => { |
||||
if (firefox) { |
||||
await firefox.close(); |
||||
} |
||||
}) |
||||
|
||||
const setBlacklistValue = async(nth, value) => { |
||||
let selector = '.form-blacklist-form .column-url'; |
||||
let input = (await session.findElementsByCSS(selector))[nth]; |
||||
await input.sendKeys(value); |
||||
await session.executeScript(`document.querySelectorAll('${selector}')[${nth}].blur()`); |
||||
} |
||||
|
||||
const setSearchEngineValue = async(nth, name, url) => { |
||||
let selector = '.form-search-form input.column-name'; |
||||
let input = (await session.findElementsByCSS(selector))[nth]; |
||||
await input.sendKeys(name); |
||||
await session.executeScript(`document.querySelectorAll('${selector}')[${nth}].blur()`); |
||||
|
||||
selector = '.form-search-form input.column-url'; |
||||
input = (await session.findElementsByCSS(selector))[nth]; |
||||
await input.sendKeys(url); |
||||
await session.executeScript(`document.querySelectorAll('${selector}')[${nth}].blur()`); |
||||
} |
||||
|
||||
it('switch to form settings', async () => { |
||||
let url = await browser.runtime.getURL("build/settings.html") |
||||
await session.navigateTo(url); |
||||
|
||||
let useFormInput = await session.findElementByCSS('#setting-source-form'); |
||||
await useFormInput.click(); |
||||
await session.acceptAlert(); |
||||
|
||||
let { settings } = await browser.storage.local.get('settings'); |
||||
assert.equal(settings.source, 'form') |
||||
}) |
||||
|
||||
it('add blacklist', async () => { |
||||
let url = await browser.runtime.getURL("build/settings.html") |
||||
await session.navigateTo(url); |
||||
|
||||
let useFormInput = await session.findElementByCSS('#setting-source-form'); |
||||
await useFormInput.click(); |
||||
await session.acceptAlert(); |
||||
await session.executeScript(() => window.scrollBy(0, 1000)); |
||||
|
||||
// assert default
|
||||
let settings = (await browser.storage.local.get('settings')).settings; |
||||
assert.deepEqual(settings.form.blacklist, []) |
||||
|
||||
// add blacklist items
|
||||
let addButton = await session.findElementByCSS('.form-blacklist-form .ui-add-button'); |
||||
await addButton.click(); |
||||
await setBlacklistValue(0, 'google.com') |
||||
|
||||
settings = (await browser.storage.local.get('settings')).settings; |
||||
assert.deepEqual(settings.form.blacklist, ['google.com']) |
||||
|
||||
await addButton.click(); |
||||
await setBlacklistValue(1, 'yahoo.com') |
||||
|
||||
settings = (await browser.storage.local.get('settings')).settings; |
||||
assert.deepEqual(settings.form.blacklist, ['google.com', 'yahoo.com']) |
||||
|
||||
// delete first item
|
||||
let deleteButton = (await session.findElementsByCSS('.form-blacklist-form .ui-delete-button'))[0]; |
||||
await deleteButton.click() |
||||
|
||||
settings = (await browser.storage.local.get('settings')).settings; |
||||
assert.deepEqual(settings.form.blacklist, ['yahoo.com']) |
||||
}); |
||||
|
||||
it('add search engines', async () => { |
||||
let url = await browser.runtime.getURL("build/settings.html") |
||||
await session.navigateTo(url); |
||||
|
||||
let useFormInput = await session.findElementByCSS('#setting-source-form'); |
||||
await useFormInput.click(); |
||||
await session.acceptAlert(); |
||||
|
||||
// assert default
|
||||
let settings = (await browser.storage.local.get('settings')).settings; |
||||
assert.deepEqual(settings.form.search.default, 'google'); |
||||
|
||||
// change default
|
||||
let radio = (await session.findElementsByCSS('.form-search-form input[type=radio]'))[2]; |
||||
await radio.click(); |
||||
settings = (await browser.storage.local.get('settings')).settings; |
||||
assert.deepEqual(settings.form.search.default, 'bing'); |
||||
|
||||
let addButton = await session.findElementByCSS('.form-search-form .ui-add-button'); |
||||
await addButton.click(); |
||||
await setSearchEngineValue(6, 'yippy', 'https://www.yippy.com/search?query={}'); |
||||
|
||||
settings = (await browser.storage.local.get('settings')).settings; |
||||
assert.deepEqual(settings.form.search.engines[6], ['yippy', 'https://www.yippy.com/search?query={}']); |
||||
}); |
||||
}); |
@ -0,0 +1,86 @@ |
||||
import * as path from 'path'; |
||||
import * as assert from 'assert'; |
||||
|
||||
import { Builder, Lanthan } from 'lanthan'; |
||||
import OptionPage from './lib/OptionPage'; |
||||
|
||||
describe("options form page", () => { |
||||
let lanthan: Lanthan; |
||||
let browser: any; |
||||
|
||||
beforeEach(async() => { |
||||
lanthan = await Builder |
||||
.forBrowser('firefox') |
||||
.spyAddon(path.join(__dirname, '..')) |
||||
.build(); |
||||
browser = lanthan.getWebExtBrowser(); |
||||
|
||||
let tabs = await browser.tabs.query({}); |
||||
for (let tab of tabs.slice(1)) { |
||||
await browser.tabs.remove(tab.id); |
||||
} |
||||
}) |
||||
|
||||
afterEach(async() => { |
||||
if (lanthan) { |
||||
await lanthan.quit(); |
||||
} |
||||
}) |
||||
|
||||
it('switch to form settings', async () => { |
||||
let page = await OptionPage.open(lanthan); |
||||
await page.switchToForm(); |
||||
|
||||
let { settings } = await browser.storage.local.get('settings'); |
||||
assert.strictEqual(settings.source, 'form') |
||||
}) |
||||
|
||||
it('add blacklist', async () => { |
||||
let page = await OptionPage.open(lanthan); |
||||
let forms = await page.switchToForm(); |
||||
// Scroll is required to click a button on Firefox 60
|
||||
await page.scrollTo(0, 1000); |
||||
|
||||
// assert default
|
||||
let settings = (await browser.storage.local.get('settings')).settings; |
||||
assert.deepStrictEqual(settings.form.blacklist, []) |
||||
|
||||
// add blacklist items
|
||||
await forms.addBlacklist(); |
||||
await forms.setBlacklist(0, 'google.com') |
||||
|
||||
settings = (await browser.storage.local.get('settings')).settings; |
||||
assert.deepStrictEqual(settings.form.blacklist, ['google.com']) |
||||
|
||||
await forms.addBlacklist(); |
||||
await forms.setBlacklist(1, 'yahoo.com') |
||||
|
||||
settings = (await browser.storage.local.get('settings')).settings; |
||||
assert.deepStrictEqual(settings.form.blacklist, ['google.com', 'yahoo.com']) |
||||
|
||||
// delete first item
|
||||
await forms.removeBlackList(0); |
||||
settings = (await browser.storage.local.get('settings')).settings; |
||||
assert.deepStrictEqual(settings.form.blacklist, ['yahoo.com']) |
||||
}); |
||||
|
||||
it('add search engines', async () => { |
||||
let page = await OptionPage.open(lanthan); |
||||
let forms = await page.switchToForm(); |
||||
|
||||
// assert default
|
||||
let settings = (await browser.storage.local.get('settings')).settings; |
||||
assert.deepStrictEqual(settings.form.search.default, 'google'); |
||||
|
||||
// change default
|
||||
await forms.setDefaultSearchEngine(2); |
||||
settings = (await browser.storage.local.get('settings')).settings; |
||||
assert.deepStrictEqual(settings.form.search.default, 'bing'); |
||||
|
||||
await forms.addSearchEngine(); |
||||
await forms.setSearchEngine(6, 'yippy', 'https://www.yippy.com/search?query={}'); |
||||
|
||||
settings = (await browser.storage.local.get('settings')).settings; |
||||
assert.deepStrictEqual(settings.form.search.engines[6], ['yippy', 'https://www.yippy.com/search?query={}']); |
||||
}); |
||||
}); |
@ -1,92 +0,0 @@ |
||||
const express = require('express'); |
||||
const lanthan = require('lanthan'); |
||||
const path = require('path'); |
||||
const assert = require('assert'); |
||||
const eventually = require('./eventually'); |
||||
|
||||
const Key = lanthan.Key; |
||||
|
||||
const newApp = () => { |
||||
let app = express(); |
||||
app.get('/', (req, res) => { |
||||
res.send('ok'); |
||||
}); |
||||
return app; |
||||
}; |
||||
|
||||
describe("tab test", () => { |
||||
|
||||
const port = 12321; |
||||
const url = `http://127.0.0.1:${port}/`; |
||||
|
||||
let http; |
||||
let firefox; |
||||
let session; |
||||
let browser; |
||||
let tabs; |
||||
|
||||
before(async() => { |
||||
firefox = await lanthan.firefox(); |
||||
await firefox.session.installAddonFromPath(path.join(__dirname, '..')); |
||||
session = firefox.session; |
||||
browser = firefox.browser; |
||||
http = newApp().listen(port); |
||||
|
||||
await session.navigateTo(`${url}`); |
||||
}); |
||||
|
||||
after(async() => { |
||||
http.close(); |
||||
if (firefox) { |
||||
await firefox.close(); |
||||
} |
||||
}); |
||||
|
||||
it('repeats last operation', async () => { |
||||
let before = await browser.tabs.query({}); |
||||
|
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(':'); |
||||
|
||||
await session.switchToFrame(0); |
||||
let input = await session.findElementByCSS('input'); |
||||
input.sendKeys(`tabopen ${url}newtab`, Key.Enter); |
||||
|
||||
await eventually(async() => { |
||||
let current = await browser.tabs.query({ url: `*://*/newtab` }); |
||||
assert.equal(current.length, 1); |
||||
}); |
||||
|
||||
body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('.'); |
||||
|
||||
await eventually(async() => { |
||||
let current = await browser.tabs.query({ url: `*://*/newtab` }); |
||||
assert.equal(current.length, 2); |
||||
}); |
||||
}); |
||||
|
||||
it('repeats last operation', async () => { |
||||
for (let i = 1; i < 5; ++i) { |
||||
await browser.tabs.create({ url: `${url}#${i}` }); |
||||
} |
||||
let before = await browser.tabs.query({}); |
||||
|
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('d'); |
||||
|
||||
await eventually(async() => { |
||||
let current = await browser.tabs.query({}); |
||||
assert.equal(current.length, before.length - 1); |
||||
}); |
||||
|
||||
await browser.tabs.update(before[2].id, { active: true }); |
||||
body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('.'); |
||||
|
||||
await eventually(async() => { |
||||
let current = await browser.tabs.query({}); |
||||
assert.equal(current.length, before.length - 2); |
||||
}); |
||||
}); |
||||
}); |
@ -0,0 +1,75 @@ |
||||
import * as path from 'path'; |
||||
import * as assert from 'assert'; |
||||
|
||||
import TestServer from './lib/TestServer'; |
||||
import eventually from './eventually'; |
||||
import { Builder, Lanthan } from 'lanthan'; |
||||
import { WebDriver } from 'selenium-webdriver'; |
||||
import Page from './lib/Page'; |
||||
|
||||
describe("tab test", () => { |
||||
let server = new TestServer().receiveContent('/*', 'ok'); |
||||
let lanthan: Lanthan; |
||||
let webdriver: WebDriver; |
||||
let browser: any; |
||||
|
||||
before(async() => { |
||||
lanthan = await Builder |
||||
.forBrowser('firefox') |
||||
.spyAddon(path.join(__dirname, '..')) |
||||
.build(); |
||||
webdriver = lanthan.getWebDriver(); |
||||
browser = lanthan.getWebExtBrowser(); |
||||
await server.start(); |
||||
}); |
||||
|
||||
after(async() => { |
||||
await server.stop(); |
||||
if (lanthan) { |
||||
await lanthan.quit(); |
||||
} |
||||
}); |
||||
|
||||
it('repeats last command', async () => { |
||||
let page = await Page.navigateTo(webdriver, server.url()); |
||||
let console = await page.showConsole(); |
||||
await console.execCommand(`tabopen ${server.url('/newtab')}`); |
||||
|
||||
await eventually(async() => { |
||||
let current = await browser.tabs.query({ url: `*://*/newtab` }); |
||||
assert.strictEqual(current.length, 1); |
||||
}); |
||||
|
||||
page = await Page.currentContext(webdriver); |
||||
await page.sendKeys('.'); |
||||
|
||||
await eventually(async() => { |
||||
let current = await browser.tabs.query({ url: `*://*/newtab` }); |
||||
assert.strictEqual(current.length, 2); |
||||
}); |
||||
}); |
||||
|
||||
it('repeats last operation', async () => { |
||||
for (let i = 1; i < 5; ++i) { |
||||
await browser.tabs.create({ url: server.url('/#' + i) }); |
||||
} |
||||
let before = await browser.tabs.query({}); |
||||
|
||||
let page = await Page.currentContext(webdriver); |
||||
await page.sendKeys('d'); |
||||
|
||||
await eventually(async() => { |
||||
let current = await browser.tabs.query({}); |
||||
assert.strictEqual(current.length, before.length - 1); |
||||
}); |
||||
|
||||
await browser.tabs.update(before[2].id, { active: true }); |
||||
page = await Page.currentContext(webdriver); |
||||
await page.sendKeys('.'); |
||||
|
||||
await eventually(async() => { |
||||
let current = await browser.tabs.query({}); |
||||
assert.strictEqual(current.length, before.length - 2); |
||||
}); |
||||
}); |
||||
}); |
@ -1,150 +0,0 @@ |
||||
const express = require('express'); |
||||
const lanthan = require('lanthan'); |
||||
const path = require('path'); |
||||
const assert = require('assert'); |
||||
|
||||
const Key = lanthan.Key; |
||||
|
||||
const newApp = () => { |
||||
let app = express(); |
||||
app.get('/', (req, res) => { |
||||
res.send(`<!DOCTYPEhtml>
|
||||
<html lang="en"> |
||||
<body style="width:10000px; height:10000px"></body> |
||||
</html">`); |
||||
}); |
||||
return app; |
||||
}; |
||||
|
||||
describe("scroll test", () => { |
||||
|
||||
const port = 12321; |
||||
let http; |
||||
let firefox; |
||||
let session; |
||||
let body; |
||||
|
||||
before(async() => { |
||||
http = newApp().listen(port); |
||||
|
||||
firefox = await lanthan.firefox(); |
||||
await firefox.session.installAddonFromPath(path.join(__dirname, '..')); |
||||
session = firefox.session; |
||||
}); |
||||
|
||||
after(async() => { |
||||
if (firefox) { |
||||
await firefox.close(); |
||||
} |
||||
http.close(); |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
await session.navigateTo(`http://127.0.0.1:${port}`); |
||||
body = await session.findElementByCSS('body'); |
||||
}); |
||||
|
||||
|
||||
it('scrolls up by k', async () => { |
||||
await body.sendKeys('j'); |
||||
|
||||
let pageYOffset = await session.executeScript(() => window.pageYOffset); |
||||
assert.equal(pageYOffset, 64); |
||||
}); |
||||
|
||||
it('scrolls down by j', async () => { |
||||
await session.executeScript(() => window.scrollTo(0, 200)); |
||||
await body.sendKeys('k'); |
||||
|
||||
let pageYOffset = await session.executeScript(() => window.pageYOffset); |
||||
assert.equal(pageYOffset, 136); |
||||
}); |
||||
|
||||
it('scrolls left by h', async () => { |
||||
await session.executeScript(() => window.scrollTo(100, 100)); |
||||
await body.sendKeys('h'); |
||||
|
||||
let pageXOffset = await session.executeScript(() => window.pageXOffset); |
||||
assert.equal(pageXOffset, 36); |
||||
}); |
||||
|
||||
it('scrolls left by l', async () => { |
||||
await session.executeScript(() => window.scrollTo(100, 100)); |
||||
await body.sendKeys('l'); |
||||
|
||||
let pageXOffset = await session.executeScript(() => window.pageXOffset); |
||||
assert.equal(pageXOffset, 164); |
||||
}); |
||||
|
||||
it('scrolls top by gg', async () => { |
||||
await session.executeScript(() => window.scrollTo(0, 100)); |
||||
await body.sendKeys('g', 'g'); |
||||
|
||||
let pageYOffset = await session.executeScript(() => window.pageYOffset); |
||||
assert.equal(pageYOffset, 0); |
||||
}); |
||||
|
||||
it('scrolls bottom by G', async () => { |
||||
await session.executeScript(() => window.scrollTo(0, 100)); |
||||
await body.sendKeys(Key.Shift, 'g'); |
||||
|
||||
let pageYOffset = await session.executeScript(() => window.pageYOffset); |
||||
assert(pageYOffset > 5000); |
||||
}); |
||||
|
||||
it('scrolls bottom by 0', async () => { |
||||
await session.executeScript(() => window.scrollTo(0, 100)); |
||||
await body.sendKeys(Key.Shift, '0'); |
||||
|
||||
let pageXOffset = await session.executeScript(() => window.pageXOffset); |
||||
assert(pageXOffset === 0); |
||||
}); |
||||
|
||||
it('scrolls bottom by $', async () => { |
||||
await session.executeScript(() => window.scrollTo(0, 100)); |
||||
await body.sendKeys(Key.Shift, '$'); |
||||
|
||||
let pageXOffset = await session.executeScript(() => window.pageXOffset); |
||||
assert(pageXOffset > 5000); |
||||
}); |
||||
|
||||
it('scrolls bottom by <C-U>', async () => { |
||||
await session.executeScript(() => window.scrollTo(0, 1000)); |
||||
await body.sendKeys(Key.Control, 'u'); |
||||
|
||||
let pageHeight =
|
||||
await session.executeScript(() => window.document.documentElement.clientHeight); |
||||
let pageYOffset = await session.executeScript(() => window.pageYOffset); |
||||
assert(Math.abs(pageYOffset - (1000 - Math.floor(pageHeight / 2))) < 5); |
||||
}); |
||||
|
||||
it('scrolls bottom by <C-D>', async () => { |
||||
await session.executeScript(() => window.scrollTo(0, 1000)); |
||||
await body.sendKeys(Key.Control, 'd'); |
||||
|
||||
let pageHeight =
|
||||
await session.executeScript(() => window.document.documentElement.clientHeight); |
||||
let pageYOffset = await session.executeScript(() => window.pageYOffset); |
||||
assert(Math.abs(pageYOffset - (1000 + Math.floor(pageHeight / 2))) < 5); |
||||
}); |
||||
|
||||
it('scrolls bottom by <C-B>', async () => { |
||||
await session.executeScript(() => window.scrollTo(0, 1000)); |
||||
await body.sendKeys(Key.Control, 'b'); |
||||
|
||||
let pageHeight =
|
||||
await session.executeScript(() => window.document.documentElement.clientHeight); |
||||
let pageYOffset = await session.executeScript(() => window.pageYOffset); |
||||
assert(Math.abs(pageYOffset - (1000 - pageHeight)) < 5); |
||||
}); |
||||
|
||||
it('scrolls bottom by <C-F>', async () => { |
||||
await session.executeScript(() => window.scrollTo(0, 1000)); |
||||
await body.sendKeys(Key.Control, 'f'); |
||||
|
||||
let pageHeight =
|
||||
await session.executeScript(() => window.document.documentElement.clientHeight); |
||||
let pageYOffset = await session.executeScript(() => window.pageYOffset); |
||||
assert(Math.abs(pageYOffset - (1000 + pageHeight)) < 5); |
||||
}); |
||||
}); |
@ -0,0 +1,137 @@ |
||||
import * as path from 'path'; |
||||
import * as assert from 'assert'; |
||||
|
||||
import TestServer from './lib/TestServer'; |
||||
import { Builder, Lanthan } from 'lanthan'; |
||||
import { WebDriver, Key } from 'selenium-webdriver'; |
||||
import Page from './lib/Page'; |
||||
|
||||
describe("scroll test", () => { |
||||
let server = new TestServer().receiveContent('/', |
||||
`<!DOCTYPE html><html lang="en"><body style="width:10000px; height:10000px"></body></html>`, |
||||
); |
||||
let lanthan: Lanthan; |
||||
let webdriver: WebDriver; |
||||
let page: Page; |
||||
|
||||
before(async() => { |
||||
lanthan = await Builder |
||||
.forBrowser('firefox') |
||||
.spyAddon(path.join(__dirname, '..')) |
||||
.build(); |
||||
webdriver = lanthan.getWebDriver(); |
||||
await server.start(); |
||||
}); |
||||
|
||||
after(async() => { |
||||
await server.stop(); |
||||
if (lanthan) { |
||||
await lanthan.quit(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
await webdriver.navigate().to(server.url()); |
||||
page = await Page.currentContext(webdriver); |
||||
}); |
||||
|
||||
|
||||
it('scrolls up by j', async () => { |
||||
await page.sendKeys('j'); |
||||
|
||||
let scrollY = await page.getScrollY(); |
||||
assert.strictEqual(scrollY, 64); |
||||
}); |
||||
|
||||
it('scrolls down by k', async () => { |
||||
await webdriver.executeScript(() => window.scrollTo(0, 200)); |
||||
await page.sendKeys('k'); |
||||
|
||||
let scrollY = await page.getScrollY(); |
||||
assert.strictEqual(scrollY, 136); |
||||
}); |
||||
|
||||
it('scrolls left by h', async () => { |
||||
await webdriver.executeScript(() => window.scrollTo(100, 100)); |
||||
await page.sendKeys('h'); |
||||
|
||||
let pageXOffset = await webdriver.executeScript(() => window.pageXOffset) as number; |
||||
assert.strictEqual(pageXOffset, 36); |
||||
}); |
||||
|
||||
it('scrolls left by l', async () => { |
||||
await webdriver.executeScript(() => window.scrollTo(100, 100)); |
||||
await page.sendKeys('l'); |
||||
|
||||
let pageXOffset = await webdriver.executeScript(() => window.pageXOffset) as number; |
||||
assert.strictEqual(pageXOffset, 164); |
||||
}); |
||||
|
||||
it('scrolls top by gg', async () => { |
||||
await webdriver.executeScript(() => window.scrollTo(0, 100)); |
||||
await page.sendKeys('g', 'g'); |
||||
|
||||
let scrollY = await page.getScrollY(); |
||||
assert.strictEqual(scrollY, 0); |
||||
}); |
||||
|
||||
it('scrolls bottom by G', async () => { |
||||
await webdriver.executeScript(() => window.scrollTo(0, 100)); |
||||
await page.sendKeys(Key.SHIFT, 'g'); |
||||
|
||||
let scrollY = await page.getScrollY(); |
||||
assert.ok(scrollY > 5000); |
||||
}); |
||||
|
||||
it('scrolls bottom by 0', async () => { |
||||
await webdriver.executeScript(() => window.scrollTo(0, 100)); |
||||
await page.sendKeys(Key.SHIFT, '0'); |
||||
|
||||
let pageXOffset = await webdriver.executeScript(() => window.pageXOffset) as number; |
||||
assert.ok(pageXOffset === 0); |
||||
}); |
||||
|
||||
it('scrolls bottom by $', async () => { |
||||
await webdriver.executeScript(() => window.scrollTo(0, 100)); |
||||
await page.sendKeys(Key.SHIFT, '$'); |
||||
|
||||
let pageXOffset = await webdriver.executeScript(() => window.pageXOffset) as number; |
||||
assert.ok(pageXOffset > 5000); |
||||
}); |
||||
|
||||
it('scrolls bottom by <C-U>', async () => { |
||||
await webdriver.executeScript(() => window.scrollTo(0, 1000)); |
||||
await page.sendKeys(Key.CONTROL, 'u'); |
||||
|
||||
let pageHeight = await page.pageHeight(); |
||||
let scrollY = await page.getScrollY(); |
||||
assert.ok(Math.abs(scrollY - (1000 - Math.floor(pageHeight / 2))) < 5); |
||||
}); |
||||
|
||||
it('scrolls bottom by <C-D>', async () => { |
||||
await webdriver.executeScript(() => window.scrollTo(0, 1000)); |
||||
await page.sendKeys(Key.CONTROL, 'd'); |
||||
|
||||
let pageHeight = await page.pageHeight(); |
||||
let scrollY = await page.getScrollY(); |
||||
assert.ok(Math.abs(scrollY - (1000 + Math.floor(pageHeight / 2))) < 5); |
||||
}); |
||||
|
||||
it('scrolls bottom by <C-B>', async () => { |
||||
await webdriver.executeScript(() => window.scrollTo(0, 1000)); |
||||
await page.sendKeys(Key.CONTROL, 'b'); |
||||
|
||||
let pageHeight = await page.pageHeight(); |
||||
let scrollY = await page.getScrollY(); |
||||
assert.ok(Math.abs(scrollY - (1000 - pageHeight)) < 5); |
||||
}); |
||||
|
||||
it('scrolls bottom by <C-F>', async () => { |
||||
await webdriver.executeScript(() => window.scrollTo(0, 1000)); |
||||
await page.sendKeys(Key.CONTROL, 'f'); |
||||
|
||||
let pageHeight = await page.pageHeight(); |
||||
let scrollY = await page.getScrollY(); |
||||
assert.ok(Math.abs(scrollY - (1000 + pageHeight)) < 5); |
||||
}); |
||||
}); |
@ -1,218 +0,0 @@ |
||||
const express = require('express'); |
||||
const lanthan = require('lanthan'); |
||||
const path = require('path'); |
||||
const assert = require('assert'); |
||||
const eventually = require('./eventually'); |
||||
|
||||
const Key = lanthan.Key; |
||||
|
||||
const newApp = () => { |
||||
let app = express(); |
||||
app.get('/', (req, res) => { |
||||
res.send('ok'); |
||||
}); |
||||
return app; |
||||
}; |
||||
|
||||
describe("tab test", () => { |
||||
|
||||
const port = 12321; |
||||
const url = `http://127.0.0.1:${port}/`; |
||||
|
||||
let http; |
||||
let firefox; |
||||
let session; |
||||
let browser; |
||||
let win; |
||||
let tabs; |
||||
|
||||
before(async() => { |
||||
firefox = await lanthan.firefox(); |
||||
await firefox.session.installAddonFromPath(path.join(__dirname, '..')); |
||||
session = firefox.session; |
||||
browser = firefox.browser; |
||||
http = newApp().listen(port); |
||||
}); |
||||
|
||||
after(async() => { |
||||
http.close(); |
||||
if (firefox) { |
||||
await firefox.close(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
win = await browser.windows.create({ url: `${url}#0` }); |
||||
for (let i = 1; i < 5; ++i) { |
||||
await browser.tabs.create({ url: `${url}#${i}`, windowId: win.id }); |
||||
await session.navigateTo(`${url}#${i}`); |
||||
} |
||||
tabs = await browser.tabs.query({ windowId: win.id }); |
||||
tabs.sort((t1, t2) => t1.index - t2.index); |
||||
}); |
||||
|
||||
afterEach(async() => { |
||||
await browser.windows.remove(win.id); |
||||
}); |
||||
|
||||
it('deletes tab and selects right by d', async () => { |
||||
await browser.tabs.update(tabs[3].id, { active: true }); |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('d'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert(current.length === tabs.length - 1); |
||||
assert(current[3].active); |
||||
assert(current[3].url === tabs[4].url); |
||||
}); |
||||
|
||||
it('deletes tab and selects left by D', async () => { |
||||
await browser.tabs.update(tabs[3].id, { active: true }); |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(Key.Shift, 'D'); |
||||
|
||||
await eventually(async() => { |
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert(current.length === tabs.length - 1); |
||||
assert(current[2].active); |
||||
assert(current[2].url === tabs[2].url); |
||||
}) |
||||
}); |
||||
|
||||
it('deletes all tabs to the right by x$', async () => { |
||||
await browser.tabs.update(tabs[1].id, { active: true }); |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('x', '$'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert(current.length === 2); |
||||
}); |
||||
|
||||
it('duplicates tab by zd', async () => { |
||||
await browser.tabs.update(tabs[0].id, { active: true }); |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('z', 'd'); |
||||
|
||||
await eventually(async() => { |
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
current.sort((t1, t2) => t1.index - t2.index); |
||||
assert(current.length === tabs.length + 1); |
||||
assert(current[0].url === current[1].url); |
||||
}); |
||||
}); |
||||
|
||||
it('makes pinned by zp', async () => { |
||||
await browser.tabs.update(tabs[0].id, { active: true }); |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('z', 'p'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert(current[0].pinned); |
||||
}); |
||||
|
||||
it('selects previous tab by K', async () => { |
||||
await browser.tabs.update(tabs[2].id, { active: true }); |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(Key.Shift, 'K'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert(current[1].active); |
||||
}); |
||||
|
||||
it('selects previous tab by K rotatory', async () => { |
||||
await browser.tabs.update(tabs[0].id, { active: true }); |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(Key.Shift, 'K'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert(current[current.length - 1].active) |
||||
}); |
||||
|
||||
it('selects next tab by J', async () => { |
||||
await browser.tabs.update(tabs[2].id, { active: true }); |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(Key.Shift, 'J'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert(current[3].active); |
||||
}); |
||||
|
||||
it('selects previous tab by J rotatory', async () => { |
||||
await browser.tabs.update(tabs[tabs.length - 1].id, { active: true }); |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(Key.Shift, 'J'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert(current[0].active) |
||||
}); |
||||
|
||||
it('selects first tab by g0', async () => { |
||||
await browser.tabs.update(tabs[2].id, { active: true }); |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('g', '0'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert(current[0].active) |
||||
}); |
||||
|
||||
it('selects last tab by g$', async () => { |
||||
await browser.tabs.update(tabs[2].id, { active: true }); |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('g', '$'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert(current[current.length - 1].active) |
||||
}); |
||||
|
||||
it('selects last selected tab by <C-6>', async () => { |
||||
await browser.tabs.update(tabs[1].id, { active: true }); |
||||
await browser.tabs.update(tabs[4].id, { active: true }); |
||||
|
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys(Key.Control, '6'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert(current[1].active) |
||||
}); |
||||
|
||||
// browser.sessions.getRecentlyClosed() sometime throws "An unexpected error occurred"
|
||||
// This might be a bug in Firefox.
|
||||
it.skip('reopen tab by u', async () => { |
||||
await browser.tabs.remove(tabs[1].id); |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('u'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert(current.length === tabs.length); |
||||
}); |
||||
|
||||
it('does not delete pinned tab by d', async () => { |
||||
await browser.tabs.update(tabs[0].id, { active: true, pinned: true }); |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('d'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert(current.length === tabs.length); |
||||
}); |
||||
|
||||
it('deletes pinned tab by !d', async () => { |
||||
await browser.tabs.update(tabs[0].id, { active: true, pinned: true }); |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('!', 'd'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert(current.length === tabs.length - 1); |
||||
}); |
||||
|
||||
it('opens view-source by gf', async () => { |
||||
await browser.tabs.update(tabs[0].id, { active: true }); |
||||
let body = await session.findElementByCSS('body'); |
||||
await body.sendKeys('g', 'f'); |
||||
|
||||
await eventually(async() => { |
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert(current.length === tabs.length + 1); |
||||
assert(current[current.length - 1].url === `view-source:${url}#0`); |
||||
}); |
||||
}); |
||||
}); |
@ -0,0 +1,211 @@ |
||||
import * as path from 'path'; |
||||
import * as assert from 'assert'; |
||||
|
||||
import TestServer from './lib/TestServer'; |
||||
import eventually from './eventually'; |
||||
import { Builder, Lanthan } from 'lanthan'; |
||||
import { WebDriver, Key } from 'selenium-webdriver'; |
||||
import Page from './lib/Page'; |
||||
|
||||
describe("tab test", () => { |
||||
let server = new TestServer().receiveContent('/*', 'ok'); |
||||
let lanthan: Lanthan; |
||||
let webdriver: WebDriver; |
||||
let browser: any; |
||||
let win: any; |
||||
let tabs: any[]; |
||||
|
||||
before(async() => { |
||||
lanthan = await Builder |
||||
.forBrowser('firefox') |
||||
.spyAddon(path.join(__dirname, '..')) |
||||
.build(); |
||||
webdriver = lanthan.getWebDriver(); |
||||
browser = lanthan.getWebExtBrowser(); |
||||
await server.start(); |
||||
}); |
||||
|
||||
after(async() => { |
||||
await server.stop(); |
||||
if (lanthan) { |
||||
await lanthan.quit(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
win = await browser.windows.create({ url: server.url('/#0') }); |
||||
for (let i = 1; i < 5; ++i) { |
||||
await browser.tabs.create({ url: server.url('/#' + i), windowId: win.id }); |
||||
await webdriver.navigate().to(server.url('/#' + i)); |
||||
} |
||||
tabs = await browser.tabs.query({ windowId: win.id }); |
||||
tabs.sort((t1: any, t2: any) => t1.index - t2.index); |
||||
}); |
||||
|
||||
afterEach(async() => { |
||||
await browser.windows.remove(win.id); |
||||
}); |
||||
|
||||
it('deletes tab and selects right by d', async () => { |
||||
await browser.tabs.update(tabs[3].id, { active: true }); |
||||
let page = await Page.currentContext(webdriver); |
||||
await page.sendKeys('d'); |
||||
|
||||
await eventually(async() => { |
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert.strictEqual(current.length, tabs.length - 1); |
||||
assert.strictEqual(current[3].active, true); |
||||
assert.strictEqual(current[3].id, tabs[4].id); |
||||
}); |
||||
}); |
||||
|
||||
it('deletes tab and selects left by D', async () => { |
||||
await browser.tabs.update(tabs[3].id, { active: true }); |
||||
let page = await Page.currentContext(webdriver); |
||||
await page.sendKeys(Key.SHIFT, 'D'); |
||||
|
||||
await eventually(async() => { |
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert.strictEqual(current.length, tabs.length - 1); |
||||
assert.strictEqual(current[2].active, true); |
||||
assert.strictEqual(current[2].id, tabs[2].id); |
||||
}) |
||||
}); |
||||
|
||||
it('deletes all tabs to the right by x$', async () => { |
||||
await browser.tabs.update(tabs[1].id, { active: true }); |
||||
let page = await Page.currentContext(webdriver); |
||||
await page.sendKeys('x', '$'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert.strictEqual(current.length, 2); |
||||
}); |
||||
|
||||
it('duplicates tab by zd', async () => { |
||||
await browser.tabs.update(tabs[0].id, { active: true }); |
||||
let page = await Page.currentContext(webdriver); |
||||
await page.sendKeys('z', 'd'); |
||||
|
||||
await eventually(async() => { |
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
current.sort((t1: any, t2: any) => t1.index - t2.index); |
||||
assert.strictEqual(current.length, tabs.length + 1); |
||||
assert.strictEqual(current[0].url, current[1].url); |
||||
}); |
||||
}); |
||||
|
||||
it('makes pinned by zp', async () => { |
||||
await browser.tabs.update(tabs[0].id, { active: true }); |
||||
let page = await Page.currentContext(webdriver); |
||||
await page.sendKeys('z', 'p'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert.strictEqual(current[0].pinned, true); |
||||
}); |
||||
|
||||
it('selects previous tab by K', async () => { |
||||
await browser.tabs.update(tabs[2].id, { active: true }); |
||||
let page = await Page.currentContext(webdriver); |
||||
await page.sendKeys(Key.SHIFT, 'K'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert.strictEqual(current[1].active, true); |
||||
}); |
||||
|
||||
it('selects previous tab by K rotatory', async () => { |
||||
await browser.tabs.update(tabs[0].id, { active: true }); |
||||
let page = await Page.currentContext(webdriver); |
||||
await page.sendKeys(Key.SHIFT, 'K'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert.strictEqual(current[current.length - 1].active, true) |
||||
}); |
||||
|
||||
it('selects next tab by J', async () => { |
||||
await browser.tabs.update(tabs[2].id, { active: true }); |
||||
let page = await Page.currentContext(webdriver); |
||||
await page.sendKeys(Key.SHIFT, 'J'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert.strictEqual(current[3].active, true); |
||||
}); |
||||
|
||||
it('selects previous tab by J rotatory', async () => { |
||||
await browser.tabs.update(tabs[tabs.length - 1].id, { active: true }); |
||||
let page = await Page.currentContext(webdriver); |
||||
await page.sendKeys(Key.SHIFT, 'J'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert.strictEqual(current[0].active, true) |
||||
}); |
||||
|
||||
it('selects first tab by g0', async () => { |
||||
await browser.tabs.update(tabs[2].id, { active: true }); |
||||
let page = await Page.currentContext(webdriver); |
||||
await page.sendKeys('g', '0'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert.strictEqual(current[0].active, true) |
||||
}); |
||||
|
||||
it('selects last tab by g$', async () => { |
||||
await browser.tabs.update(tabs[2].id, { active: true }); |
||||
let page = await Page.currentContext(webdriver); |
||||
await page.sendKeys('g', '$'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert.strictEqual(current[current.length - 1].active, true) |
||||
}); |
||||
|
||||
it('selects last selected tab by <C-6>', async () => { |
||||
await browser.tabs.update(tabs[1].id, { active: true }); |
||||
await browser.tabs.update(tabs[4].id, { active: true }); |
||||
|
||||
let page = await Page.currentContext(webdriver); |
||||
await page.sendKeys(Key.CONTROL, '6'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert.strictEqual(current[1].active, true) |
||||
}); |
||||
|
||||
// browser.sessions.getRecentlyClosed() sometime throws "An unexpected error occurred"
|
||||
// This might be a bug in Firefox.
|
||||
it.skip('reopen tab by u', async () => { |
||||
await browser.tabs.remove(tabs[1].id); |
||||
let page = await Page.currentContext(webdriver); |
||||
await page.sendKeys('u'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert.strictEqual(current.length, tabs.length); |
||||
}); |
||||
|
||||
it('does not delete pinned tab by d', async () => { |
||||
await browser.tabs.update(tabs[0].id, { active: true, pinned: true }); |
||||
let page = await Page.currentContext(webdriver); |
||||
await page.sendKeys('d'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert.strictEqual(current.length, tabs.length); |
||||
}); |
||||
|
||||
it('deletes pinned tab by !d', async () => { |
||||
await browser.tabs.update(tabs[0].id, { active: true, pinned: true }); |
||||
let page = await Page.currentContext(webdriver); |
||||
await page.sendKeys('!', 'd'); |
||||
|
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert.strictEqual(current.length, tabs.length - 1); |
||||
}); |
||||
|
||||
it('opens view-source by gf', async () => { |
||||
await browser.tabs.update(tabs[0].id, { active: true }); |
||||
let page = await Page.currentContext(webdriver); |
||||
await page.sendKeys('g', 'f'); |
||||
|
||||
await eventually(async() => { |
||||
let current = await browser.tabs.query({ windowId: win.id }); |
||||
assert.strictEqual(current.length, tabs.length + 1); |
||||
assert.strictEqual(current[current.length - 1].url, `view-source:${server.url('/#0')}`); |
||||
}); |
||||
}); |
||||
}); |
@ -1,66 +0,0 @@ |
||||
const express = require('express'); |
||||
const lanthan = require('lanthan'); |
||||
const path = require('path'); |
||||
const assert = require('assert'); |
||||
const eventually = require('./eventually'); |
||||
|
||||
const Key = lanthan.Key; |
||||
|
||||
describe("zoom test", () => { |
||||
|
||||
let firefox; |
||||
let session; |
||||
let browser; |
||||
let tab; |
||||
let body; |
||||
|
||||
before(async() => { |
||||
firefox = await lanthan.firefox(); |
||||
await firefox.session.installAddonFromPath(path.join(__dirname, '..')); |
||||
session = firefox.session; |
||||
browser = firefox.browser; |
||||
tab = (await browser.tabs.query({}))[0] |
||||
}); |
||||
|
||||
after(async() => { |
||||
if (firefox) { |
||||
await firefox.close(); |
||||
} |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
await session.navigateTo('about:blank'); |
||||
body = await session.findElementByCSS('body'); |
||||
}); |
||||
|
||||
it('should zoom in by zi', async () => { |
||||
let before = await browser.tabs.getZoom(tab.id); |
||||
await body.sendKeys('z', 'i'); |
||||
|
||||
await eventually(async() => { |
||||
let actual = await browser.tabs.getZoom(tab.id); |
||||
assert(before < actual); |
||||
}); |
||||
}); |
||||
|
||||
it('should zoom out by zo', async () => { |
||||
let before = await browser.tabs.getZoom(tab.id); |
||||
await body.sendKeys('z', 'o'); |
||||
|
||||
await eventually(async() => { |
||||
let actual = await browser.tabs.getZoom(tab.id); |
||||
assert(before > actual); |
||||
}); |
||||
}); |
||||
|
||||
it('scrolls left by h', async () => { |
||||
await browser.tabs.setZoom(tab.id, 2); |
||||
await body.sendKeys('z', 'z'); |
||||
|
||||
await eventually(async() => { |
||||
let actual = await browser.tabs.getZoom(tab.id); |
||||
assert(actual === 1); |
||||
}); |
||||
}); |
||||
}); |
||||
|
@ -0,0 +1,65 @@ |
||||
import * as path from 'path'; |
||||
import * as assert from 'assert'; |
||||
|
||||
import eventually from './eventually'; |
||||
import { Builder, Lanthan } from 'lanthan'; |
||||
import { WebDriver } from 'selenium-webdriver'; |
||||
import Page from './lib/Page'; |
||||
|
||||
describe("zoom test", () => { |
||||
let lanthan: Lanthan; |
||||
let webdriver: WebDriver; |
||||
let browser: any; |
||||
let tab: any; |
||||
let page: Page; |
||||
|
||||
before(async() => { |
||||
lanthan = await Builder |
||||
.forBrowser('firefox') |
||||
.spyAddon(path.join(__dirname, '..')) |
||||
.build(); |
||||
webdriver = lanthan.getWebDriver(); |
||||
browser = lanthan.getWebExtBrowser(); |
||||
tab = (await browser.tabs.query({}))[0] |
||||
page = await Page.currentContext(webdriver); |
||||
}); |
||||
|
||||
after(async() => { |
||||
await lanthan.quit(); |
||||
}); |
||||
|
||||
beforeEach(async() => { |
||||
await webdriver.navigate().to('about:blank'); |
||||
}); |
||||
|
||||
it('should zoom in by zi', async () => { |
||||
let before = await browser.tabs.getZoom(tab.id); |
||||
await page.sendKeys('zi'); |
||||
|
||||
await eventually(async() => { |
||||
let actual = await browser.tabs.getZoom(tab.id); |
||||
assert.ok(before < actual); |
||||
}); |
||||
}); |
||||
|
||||
it('should zoom out by zo', async () => { |
||||
let before = await browser.tabs.getZoom(tab.id); |
||||
await page.sendKeys('zo'); |
||||
|
||||
await eventually(async() => { |
||||
let actual = await browser.tabs.getZoom(tab.id); |
||||
assert.ok(before > actual); |
||||
}); |
||||
}); |
||||
|
||||
it('should reset zoom by zz', async () => { |
||||
await browser.tabs.setZoom(tab.id, 2); |
||||
await page.sendKeys('zz'); |
||||
|
||||
await eventually(async() => { |
||||
let actual = await browser.tabs.getZoom(tab.id); |
||||
assert.strictEqual(actual, 1); |
||||
}); |
||||
}); |
||||
}); |
||||
|
Reference in new issue