commit
9f1da8b9e4
10 changed files with 279 additions and 61 deletions
@ -1,29 +1,31 @@ |
|||||||
import { EVENT_KEYPRESS, EVENT_KEYDOWN, EVENT_KEYUP } from '../shared/messages'; |
import { EVENT_KEYPRESS, EVENT_KEYDOWN, EVENT_KEYUP } from '../shared/messages'; |
||||||
import * as ipc from './ipc'; |
import * as ipc from './ipc'; |
||||||
|
|
||||||
const press = (tabId, key) => { |
const NEUTRAL_MODIFIERS = { shiftKey: false, altKey: false, ctrlKey: false }; |
||||||
return ipc.send({ |
|
||||||
|
const press = (tabId, key, modifiers = NEUTRAL_MODIFIERS) => { |
||||||
|
return ipc.send(Object.assign({}, modifiers, { |
||||||
type: EVENT_KEYPRESS, |
type: EVENT_KEYPRESS, |
||||||
tabId, |
tabId, |
||||||
key, |
key, |
||||||
}); |
})); |
||||||
}; |
}; |
||||||
|
|
||||||
const down = (tabId, key) => { |
const down = (tabId, key, modifiers = NEUTRAL_MODIFIERS) => { |
||||||
return ipc.send({ |
return ipc.send(Object.assign({}, modifiers, { |
||||||
type: EVENT_KEYDOWN, |
type: EVENT_KEYDOWN, |
||||||
tabId, |
tabId, |
||||||
key, |
key, |
||||||
}); |
})); |
||||||
}; |
}; |
||||||
|
|
||||||
|
|
||||||
const up = (tabId, key) => { |
const up = (tabId, key, modifiers = NEUTRAL_MODIFIERS) => { |
||||||
return ipc.send({ |
return ipc.send(Object.assign({}, modifiers, { |
||||||
type: EVENT_KEYUP, |
type: EVENT_KEYUP, |
||||||
tabId, |
tabId, |
||||||
key, |
key, |
||||||
}); |
})); |
||||||
}; |
}; |
||||||
|
|
||||||
export { press, down, up }; |
export { press, down, up }; |
||||||
|
@ -0,0 +1,20 @@ |
|||||||
|
import { SCROLL_GET, SCROLL_SET } from '../shared/messages'; |
||||||
|
import * as ipc from './ipc'; |
||||||
|
|
||||||
|
const get = (tabId) => { |
||||||
|
return ipc.send({ |
||||||
|
type: SCROLL_GET, |
||||||
|
tabId, |
||||||
|
}); |
||||||
|
}; |
||||||
|
|
||||||
|
const set = (tabId, x, y) => { |
||||||
|
return ipc.send({ |
||||||
|
type: SCROLL_SET, |
||||||
|
tabId, |
||||||
|
x, |
||||||
|
y, |
||||||
|
}); |
||||||
|
}; |
||||||
|
|
||||||
|
export { get, set }; |
@ -0,0 +1,31 @@ |
|||||||
|
const keypress = (opts) => { |
||||||
|
let event = new KeyboardEvent('keypress', { |
||||||
|
key: opts.key, |
||||||
|
altKey: opts.altKey, |
||||||
|
shiftKey: opts.shiftKey, |
||||||
|
ctrlKey: opts.ctrlKey |
||||||
|
}); |
||||||
|
document.body.dispatchEvent(event); |
||||||
|
}; |
||||||
|
|
||||||
|
const keydown = (opts) => { |
||||||
|
let event = new KeyboardEvent('keydown', { |
||||||
|
key: opts.key, |
||||||
|
altKey: opts.altKey, |
||||||
|
shiftKey: opts.shiftKey, |
||||||
|
ctrlKey: opts.ctrlKey |
||||||
|
}); |
||||||
|
document.body.dispatchEvent(event); |
||||||
|
}; |
||||||
|
|
||||||
|
const keyup = (opts) => { |
||||||
|
let event = new KeyboardEvent('keyup', { |
||||||
|
key: opts.key, |
||||||
|
altKey: opts.altKey, |
||||||
|
shiftKey: opts.shiftKey, |
||||||
|
ctrlKey: opts.ctrlKey |
||||||
|
}); |
||||||
|
document.body.dispatchEvent(event); |
||||||
|
}; |
||||||
|
|
||||||
|
export { keypress, keydown, keyup }; |
@ -1,37 +1,30 @@ |
|||||||
import { |
import { |
||||||
WINDOWS_CREATE, WINDOWS_REMOVE, WINDOWS_GET, |
|
||||||
TABS_CREATE, |
|
||||||
EVENT_KEYPRESS, EVENT_KEYDOWN, EVENT_KEYUP, |
EVENT_KEYPRESS, EVENT_KEYDOWN, EVENT_KEYUP, |
||||||
|
SCROLL_GET, SCROLL_SET, |
||||||
} from '../shared/messages'; |
} from '../shared/messages'; |
||||||
import * as ipc from './ipc'; |
import * as ipc from './ipc'; |
||||||
|
import * as events from './events'; |
||||||
|
import * as scrolls from './scrolls'; |
||||||
|
|
||||||
ipc.receivePageMessage((message) => { |
ipc.receivePageMessage((message) => { |
||||||
switch (message.type) { |
|
||||||
case WINDOWS_CREATE: |
|
||||||
case WINDOWS_REMOVE: |
|
||||||
case WINDOWS_GET: |
|
||||||
case TABS_CREATE: |
|
||||||
case EVENT_KEYPRESS: |
|
||||||
case EVENT_KEYDOWN: |
|
||||||
case EVENT_KEYUP: |
|
||||||
return ipc.sendToBackground(message); |
return ipc.sendToBackground(message); |
||||||
} |
|
||||||
}); |
}); |
||||||
|
|
||||||
ipc.receiveBackgroundMesssage((message) => { |
ipc.receiveBackgroundMesssage((message) => { |
||||||
switch (message.type) { |
switch (message.type) { |
||||||
case EVENT_KEYPRESS: |
case EVENT_KEYPRESS: |
||||||
document.body.dispatchEvent( |
events.keypress(message); |
||||||
new KeyboardEvent('keypress', { 'key': message.key })); |
|
||||||
break; |
break; |
||||||
case EVENT_KEYDOWN: |
case EVENT_KEYDOWN: |
||||||
document.body.dispatchEvent( |
events.keydown(message); |
||||||
new KeyboardEvent('keydown', { 'key': message.key })); |
|
||||||
break; |
break; |
||||||
case EVENT_KEYUP: |
case EVENT_KEYUP: |
||||||
document.body.dispatchEvent( |
events.keyup(message); |
||||||
new KeyboardEvent('keyup', { 'key': message.key })); |
|
||||||
break; |
break; |
||||||
|
case SCROLL_GET: |
||||||
|
return Promise.resolve(scrolls.get()); |
||||||
|
case SCROLL_SET: |
||||||
|
return Promise.resolve(scrolls.set(message.x, message.y)); |
||||||
} |
} |
||||||
return Promise.resolve({}); |
return Promise.resolve({}); |
||||||
}); |
}); |
||||||
|
@ -0,0 +1,20 @@ |
|||||||
|
const get = () => { |
||||||
|
let element = document.documentElement; |
||||||
|
return { |
||||||
|
xMax: element.scrollWidth - element.clientWidth, |
||||||
|
yMax: element.scrollHeight - element.clientHeight, |
||||||
|
x: element.scrollLeft, |
||||||
|
y: element.scrollTop, |
||||||
|
frameWidth: element.clientWidth, |
||||||
|
frameHeight: element.clientHeight, |
||||||
|
}; |
||||||
|
}; |
||||||
|
|
||||||
|
const set = (x, y) => { |
||||||
|
let element = document.documentElement; |
||||||
|
element.scrollLeft = x; |
||||||
|
element.scrollTop = y; |
||||||
|
return get(); |
||||||
|
}; |
||||||
|
|
||||||
|
export { get, set }; |
@ -0,0 +1,151 @@ |
|||||||
|
import { expect } from "chai"; |
||||||
|
import * as windows from "../ambassador/src/client/windows"; |
||||||
|
import * as tabs from "../ambassador/src/client/tabs"; |
||||||
|
import * as keys from "../ambassador/src/client/keys"; |
||||||
|
import * as scrolls from "../ambassador/src/client/scrolls"; |
||||||
|
|
||||||
|
const SERVER_URL = "localhost:11111"; |
||||||
|
|
||||||
|
describe("scroll test", () => { |
||||||
|
let targetWindow; |
||||||
|
let targetTab; |
||||||
|
|
||||||
|
before(() => { |
||||||
|
return windows.create().then((win) => { |
||||||
|
targetWindow = win; |
||||||
|
return tabs.create(targetWindow.id, SERVER_URL); |
||||||
|
}).then((tab) => { |
||||||
|
targetTab = tab; |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
after(() => { |
||||||
|
return windows.remove(targetWindow.id); |
||||||
|
}); |
||||||
|
|
||||||
|
it('scrolls up by k', () => { |
||||||
|
let before |
||||||
|
return scrolls.set(targetTab.id, 100, 100).then((scroll) => { |
||||||
|
before = scroll; |
||||||
|
return keys.press(targetTab.id, 'k'); |
||||||
|
}).then(() => { |
||||||
|
return scrolls.get(targetTab.id); |
||||||
|
}).then((actual) => { |
||||||
|
expect(actual.y).to.be.lessThan(before.y); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('scrolls down by j', () => { |
||||||
|
let before |
||||||
|
return scrolls.set(targetTab.id, 100, 100).then((scroll) => { |
||||||
|
before = scroll; |
||||||
|
return keys.press(targetTab.id, 'j'); |
||||||
|
}).then(() => { |
||||||
|
return scrolls.get(targetTab.id); |
||||||
|
}).then((actual) => { |
||||||
|
expect(actual.y).to.be.greaterThan(before.y); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('scrolls left by h', () => { |
||||||
|
let before |
||||||
|
return scrolls.set(targetTab.id, 100, 100).then((scroll) => { |
||||||
|
before = scroll; |
||||||
|
return keys.press(targetTab.id, 'h'); |
||||||
|
}).then(() => { |
||||||
|
return scrolls.get(targetTab.id); |
||||||
|
}).then((actual) => { |
||||||
|
expect(actual.x).to.be.lessThan(before.x); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('scrolls top by gg', () => { |
||||||
|
return scrolls.set(targetTab.id, 100, 100).then((scroll) => { |
||||||
|
return keys.press(targetTab.id, 'g'); |
||||||
|
}).then(() => { |
||||||
|
return keys.press(targetTab.id, 'g'); |
||||||
|
}).then(() => { |
||||||
|
return scrolls.get(targetTab.id); |
||||||
|
}).then((actual) => { |
||||||
|
expect(actual.y).to.be.equals(0); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('scrolls bottom by G', () => { |
||||||
|
return scrolls.set(targetTab.id, 100, 100).then((scroll) => { |
||||||
|
return keys.press(targetTab.id, 'G', { shiftKey: true }); |
||||||
|
}).then(() => { |
||||||
|
return scrolls.get(targetTab.id); |
||||||
|
}).then((actual) => { |
||||||
|
expect(actual.y).to.be.equals(actual.yMax); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('scrolls bottom by 0', () => { |
||||||
|
return scrolls.set(targetTab.id, 100, 100).then((scroll) => { |
||||||
|
return keys.press(targetTab.id, '0'); |
||||||
|
}).then(() => { |
||||||
|
return scrolls.get(targetTab.id); |
||||||
|
}).then((actual) => { |
||||||
|
expect(actual.x).to.be.equals(0); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('scrolls bottom by $', () => { |
||||||
|
return scrolls.set(targetTab.id, 100, 100).then((scroll) => { |
||||||
|
return keys.press(targetTab.id, '$'); |
||||||
|
}).then(() => { |
||||||
|
return scrolls.get(targetTab.id); |
||||||
|
}).then((actual) => { |
||||||
|
expect(actual.x).to.be.equals(actual.xMax); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('scrolls bottom by <C-U>', () => { |
||||||
|
let before |
||||||
|
return scrolls.set(targetTab.id, 5000, 5000).then((scroll) => { |
||||||
|
before = scroll; |
||||||
|
return keys.press(targetTab.id, 'u', { ctrlKey: true }); |
||||||
|
}).then(() => { |
||||||
|
return scrolls.get(targetTab.id); |
||||||
|
}).then((actual) => { |
||||||
|
expect(actual.y).to.closeTo(before.y - before.frameHeight / 2, 1); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('scrolls bottom by <C-D>', () => { |
||||||
|
let before |
||||||
|
return scrolls.set(targetTab.id, 5000, 5000).then((scroll) => { |
||||||
|
before = scroll; |
||||||
|
return keys.press(targetTab.id, 'd', { ctrlKey: true }); |
||||||
|
}).then(() => { |
||||||
|
return scrolls.get(targetTab.id); |
||||||
|
}).then((actual) => { |
||||||
|
expect(actual.y).to.closeTo(before.y + before.frameHeight / 2, 1); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('scrolls bottom by <C-B>', () => { |
||||||
|
let before |
||||||
|
return scrolls.set(targetTab.id, 5000, 5000).then((scroll) => { |
||||||
|
before = scroll; |
||||||
|
return keys.press(targetTab.id, 'b', { ctrlKey: true }); |
||||||
|
}).then(() => { |
||||||
|
return scrolls.get(targetTab.id); |
||||||
|
}).then((actual) => { |
||||||
|
expect(actual.y).to.equals(before.y - before.frameHeight); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
it('scrolls bottom by <C-F>', () => { |
||||||
|
let before |
||||||
|
return scrolls.set(targetTab.id, 5000, 5000).then((scroll) => { |
||||||
|
before = scroll; |
||||||
|
return keys.press(targetTab.id, 'f', { ctrlKey: true }); |
||||||
|
}).then(() => { |
||||||
|
return scrolls.get(targetTab.id); |
||||||
|
}).then((actual) => { |
||||||
|
expect(actual.y).to.equals(before.y + before.frameHeight); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
Reference in new issue