FollowSlaveClient as a factory pattern

jh-changes
Shin'ya Ueoka 5 years ago
parent 1666e626b0
commit b60a085a2c
  1. 13
      src/content/client/FollowSlaveClientFactory.ts
  2. 32
      src/content/di.ts
  3. 17
      src/content/usecases/FollowMasterUseCase.ts

@ -0,0 +1,13 @@
import FollowSlaveClient, { FollowSlaveClientImpl } from './FollowSlaveClient';
export default interface FollowSlaveClientFactory {
create(window: Window): FollowSlaveClient;
// eslint-disable-next-line semi
}
export class FollowSlaveClientFactoryImpl implements FollowSlaveClientFactory {
create(window: Window): FollowSlaveClient {
return new FollowSlaveClientImpl(window);
}
}

@ -1,52 +1,54 @@
/* eslint-disable max-len */
import { FollowMasterClientImpl } from './client/FollowMasterClient';
import { AddonIndicatorClientImpl } from './client/AddonIndicatorClient';
import { AddonEnabledRepositoryImpl } from './repositories/AddonEnabledRepository';
import { AddonIndicatorClientImpl } from './client/AddonIndicatorClient';
import { ClipboardRepositoryImpl } from './repositories/ClipboardRepository';
import { SettingRepositoryImpl } from './repositories/SettingRepository';
import { TabsClientImpl } from './client/TabsClient';
import { ConsoleClientImpl } from './client/ConsoleClient';
import { ConsoleFramePresenterImpl } from './presenters/ConsoleFramePresenter';
import { FindClientImpl } from './client/FindClient';
import { FindMasterClientImpl } from './client/FindMasterClient';
import { FindPresenterImpl } from './presenters/FindPresenter';
import { FindRepositoryImpl } from './repositories/FindRepository';
import { FindClientImpl } from './client/FindClient';
import { FocusPresenterImpl } from './presenters/FocusPresenter';
import { FollowKeyRepositoryImpl } from './repositories/FollowKeyRepository';
import { FollowMasterClientImpl } from './client/FollowMasterClient';
import { FollowMasterRepositoryImpl } from './repositories/FollowMasterRepository';
import { FollowSlaveRepositoryImpl } from './repositories/FollowSlaveRepository';
import { FollowPresenterImpl } from './presenters/FollowPresenter';
import { FollowSlaveClientFactoryImpl } from './client/FollowSlaveClientFactory';
import { FollowSlaveRepositoryImpl } from './repositories/FollowSlaveRepository';
import { KeymapRepositoryImpl } from './repositories/KeymapRepository';
import { MarkKeyRepositoryImpl } from './repositories/MarkKeyRepository';
import { ScrollPresenterImpl } from './presenters/ScrollPresenter';
import { MarkClientImpl } from './client/MarkClient';
import { MarkKeyRepositoryImpl } from './repositories/MarkKeyRepository';
import { MarkRepositoryImpl } from './repositories/MarkRepository';
import { NavigationPresenterImpl } from './presenters/NavigationPresenter';
import { ScrollPresenterImpl } from './presenters/ScrollPresenter';
import { SettingClientImpl } from './client/SettingClient';
import { SettingRepositoryImpl } from './repositories/SettingRepository';
import { TabsClientImpl } from './client/TabsClient';
import { container } from 'tsyringe';
container.register('FollowMasterClient', { useValue: new FollowMasterClientImpl(window.top) });
container.register('AddonIndicatorClient', { useClass: AddonIndicatorClientImpl });
container.register('AddonEnabledRepository', { useClass: AddonEnabledRepositoryImpl });
container.register('AddonIndicatorClient', { useClass: AddonIndicatorClientImpl });
container.register('ClipboardRepository', { useClass: ClipboardRepositoryImpl });
container.register('SettingRepository', { useClass: SettingRepositoryImpl });
container.register('TabsClient', { useClass: TabsClientImpl });
container.register('ConsoleClient', { useClass: ConsoleClientImpl });
container.register('ConsoleFramePresenter', { useClass: ConsoleFramePresenterImpl });
container.register('FindClient', { useClass: FindClientImpl });
container.register('FindMasterClient', { useClass: FindMasterClientImpl });
container.register('FindPresenter', { useClass: FindPresenterImpl });
container.register('FindRepository', { useClass: FindRepositoryImpl });
container.register('FindClient', { useClass: FindClientImpl });
container.register('FocusPresenter', { useClass: FocusPresenterImpl });
container.register('FollowKeyRepository', { useClass: FollowKeyRepositoryImpl });
container.register('FollowMasterRepository', { useClass: FollowMasterRepositoryImpl });
container.register('FollowSlaveRepository', { useClass: FollowSlaveRepositoryImpl });
container.register('FollowPresenter', { useClass: FollowPresenterImpl });
container.register('FollowSlaveClientFactory', { useClass: FollowSlaveClientFactoryImpl });
container.register('FollowSlaveRepository', { useClass: FollowSlaveRepositoryImpl });
container.register('KeymapRepository', { useClass: KeymapRepositoryImpl });
container.register('MarkKeyRepository', { useClass: MarkKeyRepositoryImpl });
container.register('ScrollPresenter', { useClass: ScrollPresenterImpl });
container.register('MarkClient', { useClass: MarkClientImpl });
container.register('MarkKeyRepository', { useClass: MarkKeyRepositoryImpl });
container.register('MarkRepository', { useClass: MarkRepositoryImpl });
container.register('NavigationPresenter', { useClass: NavigationPresenterImpl });
container.register('ScrollPresenter', { useClass: ScrollPresenterImpl });
container.register('SettingClient', { useClass: SettingClientImpl });
container.register('SettingRepository', { useClass: SettingRepositoryImpl });
container.register('TabsClient', { useClass: TabsClientImpl });

@ -1,8 +1,8 @@
import { injectable, inject } from 'tsyringe';
import FollowKeyRepository from '../repositories/FollowKeyRepository';
import FollowMasterRepository from '../repositories/FollowMasterRepository';
import FollowSlaveClient, { FollowSlaveClientImpl }
from '../client/FollowSlaveClient';
import FollowSlaveClient from '../client/FollowSlaveClient';
import FollowSlaveClientFactory from '../client/FollowSlaveClientFactory';
import SettingRepository from '../repositories/SettingRepository';
import HintKeyProducer from './HintKeyProducer';
@ -20,6 +20,9 @@ export default class FollowMasterUseCase {
@inject('SettingRepository')
private settingRepository: SettingRepository,
@inject('FollowSlaveClientFactory')
private followSlaveClientFactory: FollowSlaveClientFactory,
) {
this.producer = null;
}
@ -33,7 +36,7 @@ export default class FollowMasterUseCase {
let viewWidth = window.top.innerWidth;
let viewHeight = window.top.innerHeight;
new FollowSlaveClientImpl(window.top).requestHintCount(
this.followSlaveClientFactory.create(window.top).requestHintCount(
{ width: viewWidth, height: viewHeight },
{ x: 0, y: 0 },
);
@ -42,7 +45,8 @@ export default class FollowMasterUseCase {
for (let i = 0; i < frameElements.length; ++i) {
let ele = frameElements[i] as HTMLFrameElement | HTMLIFrameElement;
let { left: frameX, top: frameY } = ele.getBoundingClientRect();
new FollowSlaveClientImpl(ele.contentWindow!!).requestHintCount(
let client = this.followSlaveClientFactory.create(ele.contentWindow!!);
client.requestHintCount(
{ width: viewWidth, height: viewHeight },
{ x: frameX, y: frameY },
);
@ -72,7 +76,8 @@ export default class FollowMasterUseCase {
let { left: frameX, top: frameY } = ele.getBoundingClientRect();
pos = { x: frameX, y: frameY };
}
new FollowSlaveClientImpl(sender).createHints(
let client = this.followSlaveClientFactory.create(sender);
client.createHints(
{ width: viewWidth, height: viewHeight },
pos,
produced,
@ -133,7 +138,7 @@ export default class FollowMasterUseCase {
private broadcastToSlaves(handler: (client: FollowSlaveClient) => void) {
let allFrames = [window.self].concat(Array.from(window.frames as any));
let clients = allFrames.map(frame => new FollowSlaveClientImpl(frame));
let clients = allFrames.map(w => this.followSlaveClientFactory.create(w));
for (let client of clients) {
handler(client);
}