aboutsummaryrefslogtreecommitdiff
path: root/src/background
diff options
context:
space:
mode:
Diffstat (limited to 'src/background')
-rw-r--r--src/background/index.js56
-rw-r--r--src/background/keys.js (renamed from src/background/key-queue.js)67
-rw-r--r--src/background/tabs.js4
3 files changed, 59 insertions, 68 deletions
diff --git a/src/background/index.js b/src/background/index.js
index 3fa8553..4d75b33 100644
--- a/src/background/index.js
+++ b/src/background/index.js
@@ -1,22 +1,10 @@
import * as tabs from './tabs';
-import KeyQueue from './key-queue';
+import * as keys from './keys';
+import * as inputActions from '../actions/input';
import backgroundReducers from '../reducers/background';
+import inputReducers from '../reducers/input';
-const queue = new KeyQueue();
-
-const keyPressHandle = (request, sender) => {
- let action = queue.push({
- code: request.code,
- ctrl: request.ctrl
- });
- if (!action) {
- return Promise.resolve();
- }
-
- return backgroundReducers(undefined, action, sender).then(() => {
- return browser.tabs.sendMessage(sender.tab.id, action);
- });
-};
+let inputState = inputReducers(undefined, {});
const normalizeUrl = (string) => {
try {
@@ -51,8 +39,6 @@ const cmdEnterHandle = (request, sender) => {
browser.runtime.onMessage.addListener((request, sender) => {
switch (request.type) {
- case 'event.keypress':
- return keyPressHandle(request, sender);
case 'event.cmd.enter':
return cmdEnterHandle(request, sender);
default:
@@ -60,6 +46,36 @@ browser.runtime.onMessage.addListener((request, sender) => {
}
});
-browser.runtime.onMessage.addListener((action, sender) => {
+const keyQueueChanged = (sender, prevState, state) => {
+ if (state.keys.length === 0) {
+ return Promise.resolve();
+ }
+
+ let prefix = keys.asKeymapChars(state.keys);
+ let matched = Object.keys(keys.defaultKeymap).filter((keys) => {
+ return keys.startsWith(prefix);
+ });
+ if (matched.length == 0) {
+ return handleMessage(inputActions.clearKeys(), sender);
+ } else if (matched.length > 1 || matched.length === 1 && prefix !== matched[0]) {
+ return Promise.resolve();
+ }
+ let action = keys.defaultKeymap[matched];
+ return handleMessage(inputActions.clearKeys(), sender).then(() => {
+ return backgroundReducers(undefined, action, sender).then(() => {
+ return browser.tabs.sendMessage(sender.tab.id, action);
+ });
+ });
+};
+
+const handleMessage = (action, sender) => {
+ let nextInputState = inputReducers(inputState, action);
+ if (JSON.stringify(nextInputState) !== JSON.stringify(inputState)) {
+ let prevState = inputState;
+ inputState = nextInputState;
+ return keyQueueChanged(sender, prevState, inputState);
+ }
return backgroundReducers(undefined, action, sender);
-});
+};
+
+browser.runtime.onMessage.addListener(handleMessage);
diff --git a/src/background/key-queue.js b/src/background/keys.js
index 924bf77..0ce53fa 100644
--- a/src/background/key-queue.js
+++ b/src/background/keys.js
@@ -1,6 +1,6 @@
import actions from '../actions';
-const DEFAULT_KEYMAP = {
+const defaultKeymap = {
':': { type: actions.CMD_OPEN },
'o': { type: actions.CMD_TABS_OPEN, alter: false },
'O': { type: actions.CMD_TABS_OPEN, alter: true },
@@ -32,51 +32,26 @@ const DEFAULT_KEYMAP = {
'L': { type: actions.HISTORY_NEXT },
}
-export default class KeyQueue {
-
- constructor(keymap = DEFAULT_KEYMAP) {
- this.data = [];
- this.keymap = keymap;
- }
-
- push(key) {
- this.data.push(key);
-
- let current = this.asKeymapChars();
- let filtered = Object.keys(this.keymap).filter((keys) => {
- return keys.startsWith(current);
- });
-
- if (filtered.length == 0) {
- this.data = [];
- return null;
- } else if (filtered.length === 1 && current === filtered[0]) {
- let action = this.keymap[filtered[0]];
- this.data = [];
- return action;
+const asKeymapChars = (keys) => {
+ return keys.map((k) => {
+ let c = String.fromCharCode(k.code);
+ if (k.ctrl) {
+ return '<C-' + c.toUpperCase() + '>';
+ } else {
+ return c
}
- return null;
- }
-
- asKeymapChars() {
- return this.data.map((k) => {
- let c = String.fromCharCode(k.code);
- if (k.ctrl) {
- return '<C-' + c.toUpperCase() + '>';
- } else {
- return c
- }
- }).join('');
- }
+ }).join('');
+}
- asCaretChars() {
- return this.data.map((k) => {
- let c = String.fromCharCode(k.code);
- if (k.ctrl) {
- return '^' + c.toUpperCase();
- } else {
- return c;
- }
- }).join('');
- }
+const asCaretChars = (keys) => {
+ return keys.map((k) => {
+ let c = String.fromCharCode(k.code);
+ if (k.ctrl) {
+ return '^' + c.toUpperCase();
+ } else {
+ return c;
+ }
+ }).join('');
}
+
+export { defaultKeymap, asKeymapChars, asCaretChars };
diff --git a/src/background/tabs.js b/src/background/tabs.js
index 111bbd9..bd69b4b 100644
--- a/src/background/tabs.js
+++ b/src/background/tabs.js
@@ -59,7 +59,7 @@ const getCompletions = (keyword) => {
};
const selectPrevTab = (current, count) => {
- return browser.tabs.query({ currentWindow: true }, (tabs) => {
+ return browser.tabs.query({ currentWindow: true }).then((tabs) => {
if (tabs.length < 2) {
return;
}
@@ -70,7 +70,7 @@ const selectPrevTab = (current, count) => {
};
const selectNextTab = (current, count) => {
- return browser.tabs.query({ currentWindow: true }, (tabs) => {
+ return browser.tabs.query({ currentWindow: true }).then((tabs) => {
if (tabs.length < 2) {
return;
}