diff options
Diffstat (limited to 'src/components')
| -rw-r--r-- | src/components/background-input.js | 55 | ||||
| -rw-r--r-- | src/components/background.js | 59 | 
2 files changed, 114 insertions, 0 deletions
| 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/components/background.js b/src/components/background.js new file mode 100644 index 0000000..4c5bb19 --- /dev/null +++ b/src/components/background.js @@ -0,0 +1,59 @@ +import messages from '../content/messages'; +import * as commandActions from '../actions/command'; +import * as consoleActions from '../actions/console'; +import * as inputActions from '../actions/input'; +import * as settingsActions from '../actions/setting'; +import * as tabActions from '../actions/tab'; + +export default class BackgroundComponent { +  constructor(store) { +    this.store = store; +    this.setting = {}; + +    browser.runtime.onMessage.addListener((message, sender) => { +      try { +        this.onMessage(message, sender); +      } catch (e) { +        this.store.dispatch(consoleActions.showError(e.message), sender); +      } +    }); +  } + +  update() { +    let state = this.store.getState(); +    this.updateSettings(state.setting); +  } + +  updateSettings(setting) { +    if (!setting.settings.json) { +      return; +    } +    this.settings = JSON.parse(setting.settings.json); +  } + +  onMessage(message, sender) { +    switch (message.type) { +    case messages.KEYDOWN: +      return this.store.dispatch( +        inputActions.keyPress(message.code, message.ctrl), sender); +    case messages.OPEN_URL: +      if (message.newTab) { +        return this.store.dispatch( +          tabActions.openNewTab(message.url), sender); +      } +      return this.store.dispatch( +        tabActions.openToTab(message.url, sender.tab), sender); +    case messages.CONSOLE_BLURRED: +      return this.store.dispatch( +        consoleActions.hide(), sender); +    case messages.CONSOLE_ENTERED: +      return this.store.dispatch( +        commandActions.exec(message.text, this.settings), sender); +    case messages.CONSOLE_CHANGEED: +      return this.store.dispatch( +        commandActions.complete(message.text, this.settings), sender); +    case messages.SETTINGS_RELOAD: +      this.store.dispatch(settingsActions.load()); +    } +  } +} | 
