aboutsummaryrefslogtreecommitdiff
path: root/src/content/Application.ts
blob: 470bf53a247bb48f93f2af3f912752f91a895c2e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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 * 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,
  ) {
  }

  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();
      }
    });

    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();
  }
}