A fork of https://github.com/ueokande/vim-vixen
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
4.7 KiB
121 lines
4.7 KiB
import { injectable } from 'tsyringe'; |
|
import MessageListener from './MessageListener'; |
|
import FindController from './controllers/FindController'; |
|
import MarkController from './controllers/MarkController'; |
|
import FollowMasterController from './controllers/FollowMasterController'; |
|
import FollowSlaveController from './controllers/FollowSlaveController'; |
|
import FollowKeyController from './controllers/FollowKeyController'; |
|
import InputDriver from './InputDriver'; |
|
import KeymapController from './controllers/KeymapController'; |
|
import AddonEnabledUseCase from './usecases/AddonEnabledUseCase'; |
|
import MarkKeyController from './controllers/MarkKeyController'; |
|
import AddonEnabledController from './controllers/AddonEnabledController'; |
|
import SettingController from './controllers/SettingController'; |
|
import ConsoleFrameController from './controllers/ConsoleFrameController'; |
|
import NavigateController from './controllers/NavigateController'; |
|
import * as messages from '../shared/messages'; |
|
|
|
type Message = messages.Message; |
|
|
|
@injectable() |
|
export default class Application { |
|
|
|
// eslint-disable-next-line max-params |
|
constructor( |
|
private messageListener: MessageListener, |
|
private findController: FindController, |
|
private markController: MarkController, |
|
private followMasterController: FollowMasterController, |
|
private followSlaveController: FollowSlaveController, |
|
private followKeyController: FollowKeyController, |
|
private keymapController: KeymapController, |
|
private addonEnabledUseCase: AddonEnabledUseCase, |
|
private markKeyController: MarkKeyController, |
|
private addonEnabledController: AddonEnabledController, |
|
private settingController: SettingController, |
|
private consoleFrameController: ConsoleFrameController, |
|
private navigateController: NavigateController, |
|
) { |
|
} |
|
|
|
run() { |
|
this.routeCommonComponents(); |
|
if (window.self === window.top) { |
|
this.routeMasterComponents(); |
|
} |
|
} |
|
|
|
private routeMasterComponents() { |
|
this.messageListener.onWebMessage((msg: Message, sender: Window) => { |
|
switch (msg.type) { |
|
case messages.CONSOLE_ENTER_FIND: |
|
return this.findController.start(msg); |
|
case messages.FIND_NEXT: |
|
return this.findController.next(msg); |
|
case messages.FIND_PREV: |
|
return this.findController.prev(msg); |
|
case messages.CONSOLE_UNFOCUS: |
|
return this.consoleFrameController.unfocus(msg); |
|
case messages.FOLLOW_START: |
|
return this.followMasterController.followStart(msg); |
|
case messages.FOLLOW_RESPONSE_COUNT_TARGETS: |
|
return this.followMasterController.responseCountTargets(msg, sender); |
|
case messages.FOLLOW_KEY_PRESS: |
|
return this.followMasterController.keyPress(msg); |
|
} |
|
return undefined; |
|
}); |
|
|
|
this.messageListener.onBackgroundMessage((msg: Message) => { |
|
switch (msg.type) { |
|
case messages.ADDON_ENABLED_QUERY: |
|
return this.addonEnabledController.getAddonEnabled(msg); |
|
case messages.TAB_SCROLL_TO: |
|
return this.markController.scrollTo(msg); |
|
} |
|
return undefined; |
|
}); |
|
} |
|
|
|
private routeCommonComponents() { |
|
this.messageListener.onWebMessage((msg: Message) => { |
|
switch (msg.type) { |
|
case messages.FOLLOW_REQUEST_COUNT_TARGETS: |
|
return this.followSlaveController.countTargets(msg); |
|
case messages.FOLLOW_CREATE_HINTS: |
|
return this.followSlaveController.createHints(msg); |
|
case messages.FOLLOW_SHOW_HINTS: |
|
return this.followSlaveController.showHints(msg); |
|
case messages.FOLLOW_ACTIVATE: |
|
return this.followSlaveController.activate(msg); |
|
case messages.FOLLOW_REMOVE_HINTS: |
|
return this.followSlaveController.clear(msg); |
|
} |
|
return undefined; |
|
}); |
|
|
|
this.messageListener.onBackgroundMessage((msg: Message): any => { |
|
switch (msg.type) { |
|
case messages.SETTINGS_CHANGED: |
|
return this.settingController.reloadSettings(msg); |
|
case messages.ADDON_TOGGLE_ENABLED: |
|
return this.addonEnabledUseCase.toggle(); |
|
case messages.NAVIGATE_HISTORY_NEXT: |
|
return this.navigateController.openHistoryNext(msg); |
|
case messages.NAVIGATE_HISTORY_PREV: |
|
return this.navigateController.openHistoryPrev(msg); |
|
case messages.NAVIGATE_LINK_NEXT: |
|
return this.navigateController.openLinkNext(msg); |
|
case messages.NAVIGATE_LINK_PREV: |
|
return this.navigateController.openLinkPrev(msg); |
|
} |
|
}); |
|
|
|
let inputDriver = new InputDriver(window.document.body); |
|
inputDriver.onKey(key => this.followKeyController.press(key)); |
|
inputDriver.onKey(key => this.markKeyController.press(key)); |
|
inputDriver.onKey(key => this.keymapController.press(key)); |
|
|
|
this.settingController.initSettings(); |
|
} |
|
}
|
|
|