From 825bb6347623d998c671d3d42268230d1a783d76 Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Sun, 1 Oct 2017 17:04:26 +0900 Subject: BackgroundComponent --- src/background/index.js | 41 +++++------------------------------------ 1 file changed, 5 insertions(+), 36 deletions(-) (limited to 'src/background/index.js') diff --git a/src/background/index.js b/src/background/index.js index 040a2d5..bf89a33 100644 --- a/src/background/index.js +++ b/src/background/index.js @@ -1,10 +1,9 @@ import * as keys from './keys'; import * as inputActions from '../actions/input'; import * as operationActions from '../actions/operation'; -import * as commandActions from '../actions/command'; import * as consoleActions from '../actions/console'; import * as settingsActions from '../actions/setting'; -import * as tabActions from '../actions/tab'; +import BackgroundComponent from '../components/background'; import reducers from '../reducers'; import messages from '../content/messages'; import * as store from '../store'; @@ -18,6 +17,10 @@ const backgroundStore = store.createStore(reducers, (e, sender) => { backgroundStore.dispatch(consoleActions.showError(e.message), sender); } }); +const backgroundComponent = new BackgroundComponent(backgroundStore); +backgroundStore.subscribe((sender) => { + backgroundComponent.update(sender); +}); backgroundStore.subscribe((sender) => { let currentInput = backgroundStore.getState().input; if (JSON.stringify(prevInput) === JSON.stringify(currentInput)) { @@ -66,40 +69,6 @@ const keyQueueChanged = (state, sender) => { backgroundStore.dispatch(inputActions.clearKeys(), sender); }; -const handleMessage = (message, sender) => { - switch (message.type) { - case messages.KEYDOWN: - return backgroundStore.dispatch( - inputActions.keyPress(message.code, message.ctrl), sender); - case messages.OPEN_URL: - if (message.newTab) { - return backgroundStore.dispatch( - tabActions.openNewTab(message.url), sender); - } - return backgroundStore.dispatch( - tabActions.openToTab(message.url, sender.tab), sender); - case messages.CONSOLE_BLURRED: - return backgroundStore.dispatch( - consoleActions.hide(), sender); - case messages.CONSOLE_ENTERED: - return backgroundStore.dispatch( - commandActions.exec(message.text, settings), sender); - case messages.CONSOLE_CHANGEED: - return backgroundStore.dispatch( - commandActions.complete(message.text, settings), sender); - case messages.SETTINGS_RELOAD: - backgroundStore.dispatch(settingsActions.load()); - } -}; - -browser.runtime.onMessage.addListener((message, sender) => { - try { - handleMessage(message, sender); - } catch (e) { - backgroundStore.dispatch(consoleActions.showError(e.message), sender); - } -}); - const initializeSettings = () => { backgroundStore.dispatch(settingsActions.load()); }; -- cgit v1.2.3 From a74a8b537e8a82f1af63667fd73869b83d8b7d0d Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Sun, 1 Oct 2017 17:17:20 +0900 Subject: BackgroundInputComponent --- src/background/index.js | 54 +++---------------------------------- src/background/keys.js | 21 --------------- src/components/background-input.js | 55 ++++++++++++++++++++++++++++++++++++++ src/shared/keys.js | 21 +++++++++++++++ test/background/keys.test.js | 31 --------------------- test/shared/keys.test.js | 31 +++++++++++++++++++++ 6 files changed, 111 insertions(+), 102 deletions(-) delete mode 100644 src/background/keys.js create mode 100644 src/components/background-input.js create mode 100644 src/shared/keys.js delete mode 100644 test/background/keys.test.js create mode 100644 test/shared/keys.test.js (limited to 'src/background/index.js') diff --git a/src/background/index.js b/src/background/index.js index bf89a33..e968c82 100644 --- a/src/background/index.js +++ b/src/background/index.js @@ -1,16 +1,11 @@ -import * as keys from './keys'; -import * as inputActions from '../actions/input'; -import * as operationActions from '../actions/operation'; import * as consoleActions from '../actions/console'; import * as settingsActions from '../actions/setting'; import BackgroundComponent from '../components/background'; +import BackgroundInputComponent from '../components/background-input'; import reducers from '../reducers'; import messages from '../content/messages'; import * as store from '../store'; -let prevInput = []; -let settings = {}; - const backgroundStore = store.createStore(reducers, (e, sender) => { console.error('Vim-Vixen:', e); if (sender) { @@ -18,22 +13,10 @@ const backgroundStore = store.createStore(reducers, (e, sender) => { } }); const backgroundComponent = new BackgroundComponent(backgroundStore); +const backgroundInputComponent = new BackgroundInputComponent(backgroundStore); backgroundStore.subscribe((sender) => { backgroundComponent.update(sender); -}); -backgroundStore.subscribe((sender) => { - let currentInput = backgroundStore.getState().input; - if (JSON.stringify(prevInput) === JSON.stringify(currentInput)) { - return; - } - prevInput = currentInput; - - if (currentInput.keys.length === 0) { - return; - } - if (sender) { - return keyQueueChanged(backgroundStore.getState(), sender); - } + backgroundInputComponent.update(sender); }); backgroundStore.subscribe((sender) => { if (sender) { @@ -43,34 +26,5 @@ backgroundStore.subscribe((sender) => { }); } }); -backgroundStore.subscribe(() => { - let state = backgroundStore.getState().setting; - if (!state.settings.json) { - return; - } - settings = JSON.parse(backgroundStore.getState().setting.settings.json); -}); - -const keyQueueChanged = (state, sender) => { - let prefix = keys.asKeymapChars(state.input.keys); - let matched = Object.keys(settings.keymaps).filter((keyStr) => { - return keyStr.startsWith(prefix); - }); - if (matched.length === 0) { - backgroundStore.dispatch(inputActions.clearKeys(), sender); - return Promise.resolve(); - } else if (matched.length > 1 || - matched.length === 1 && prefix !== matched[0]) { - return Promise.resolve(); - } - let action = settings.keymaps[matched]; - backgroundStore.dispatch( - operationActions.exec(action, sender.tab, settings), sender); - backgroundStore.dispatch(inputActions.clearKeys(), sender); -}; - -const initializeSettings = () => { - backgroundStore.dispatch(settingsActions.load()); -}; -initializeSettings(); +backgroundStore.dispatch(settingsActions.load()); diff --git a/src/background/keys.js b/src/background/keys.js deleted file mode 100644 index aca050e..0000000 --- a/src/background/keys.js +++ /dev/null @@ -1,21 +0,0 @@ -const asKeymapChars = (keys) => { - return keys.map((k) => { - let c = String.fromCharCode(k.code); - if (k.ctrl) { - return ''; - } - return c; - }).join(''); -}; - -const asCaretChars = (keys) => { - return keys.map((k) => { - let c = String.fromCharCode(k.code); - if (k.ctrl) { - return '^' + c.toUpperCase(); - } - return c; - }).join(''); -}; - -export { asKeymapChars, asCaretChars }; diff --git a/src/components/background-input.js b/src/components/background-input.js new file mode 100644 index 0000000..9c6ef1c --- /dev/null +++ b/src/components/background-input.js @@ -0,0 +1,55 @@ +import * as inputActions from '../actions/input'; +import * as keys from '../shared/keys'; +import * as operationActions from '../actions/operation'; + +export default class BackgroundInputComponent { + constructor(store) { + this.store = store; + this.keymaps = {}; + this.prevInputs = []; + } + + update(sender) { + let state = this.store.getState(); + this.reloadSettings(state.setting); + this.handleKeyInputs(sender, state.input); + } + + reloadSettings(setting) { + if (!setting.settings.json) { + return; + } + this.keymaps = JSON.parse(setting.settings.json).keymaps; + } + + handleKeyInputs(sender, input) { + if (JSON.stringify(this.prevInputs) === JSON.stringify(input)) { + return; + } + this.prevInputs = input; + + if (input.keys.length === 0) { + return; + } + if (sender) { + return this.handleKeysChanged(sender, input); + } + } + + handleKeysChanged(sender, input) { + let prefix = keys.asKeymapChars(input.keys); + let matched = Object.keys(this.keymaps).filter((keyStr) => { + return keyStr.startsWith(prefix); + }); + if (matched.length === 0) { + this.store.dispatch(inputActions.clearKeys(), sender); + return Promise.resolve(); + } else if (matched.length > 1 || + matched.length === 1 && prefix !== matched[0]) { + return Promise.resolve(); + } + let operation = this.keymaps[matched]; + this.store.dispatch(operationActions.exec(operation, sender.tab), sender); + this.store.dispatch(inputActions.clearKeys(), sender); + } +} diff --git a/src/shared/keys.js b/src/shared/keys.js new file mode 100644 index 0000000..aca050e --- /dev/null +++ b/src/shared/keys.js @@ -0,0 +1,21 @@ +const asKeymapChars = (keys) => { + return keys.map((k) => { + let c = String.fromCharCode(k.code); + if (k.ctrl) { + return ''; + } + return c; + }).join(''); +}; + +const asCaretChars = (keys) => { + return keys.map((k) => { + let c = String.fromCharCode(k.code); + if (k.ctrl) { + return '^' + c.toUpperCase(); + } + return c; + }).join(''); +}; + +export { asKeymapChars, asCaretChars }; diff --git a/test/background/keys.test.js b/test/background/keys.test.js deleted file mode 100644 index 2cb9a3a..0000000 --- a/test/background/keys.test.js +++ /dev/null @@ -1,31 +0,0 @@ -import { expect } from "chai"; -import * as keys from '../../src/background/keys'; - -describe("keys", () => { - const KEYMAP = { - 'gGG': [], - 'gg': { type: 'scroll.top' }, - }; - - const g = 'g'.charCodeAt(0); - const G = 'G'.charCodeAt(0); - const x = 'x'.charCodeAt(0); - - describe('#asKeymapChars', () => { - let keySequence = [ - { code: g }, - { code: x, ctrl: true }, - { code: G } - ]; - expect(keys.asKeymapChars(keySequence)).to.equal('gG'); - }); - - describe('#asCaretChars', () => { - let keySequence = [ - { code: g }, - { code: x, ctrl: true }, - { code: G } - ]; - expect(keys.asCaretChars(keySequence)).to.equal('g^XG'); - }); -}); diff --git a/test/shared/keys.test.js b/test/shared/keys.test.js new file mode 100644 index 0000000..53c953d --- /dev/null +++ b/test/shared/keys.test.js @@ -0,0 +1,31 @@ +import { expect } from "chai"; +import * as keys from '../../src/shared/keys'; + +describe("keys", () => { + const KEYMAP = { + 'gGG': [], + 'gg': { type: 'scroll.top' }, + }; + + const g = 'g'.charCodeAt(0); + const G = 'G'.charCodeAt(0); + const x = 'x'.charCodeAt(0); + + describe('#asKeymapChars', () => { + let keySequence = [ + { code: g }, + { code: x, ctrl: true }, + { code: G } + ]; + expect(keys.asKeymapChars(keySequence)).to.equal('gG'); + }); + + describe('#asCaretChars', () => { + let keySequence = [ + { code: g }, + { code: x, ctrl: true }, + { code: G } + ]; + expect(keys.asCaretChars(keySequence)).to.equal('g^XG'); + }); +}); -- cgit v1.2.3