Make routes
This commit is contained in:
		
							parent
							
								
									4be04628e1
								
							
						
					
					
						commit
						c81b82ee39
					
				
					 7 changed files with 201 additions and 127 deletions
				
			
		| 
						 | 
					@ -1,16 +0,0 @@
 | 
				
			||||||
const initialize = (doc: Document): HTMLIFrameElement => {
 | 
					 | 
				
			||||||
  let iframe = doc.createElement('iframe');
 | 
					 | 
				
			||||||
  iframe.src = browser.runtime.getURL('build/console.html');
 | 
					 | 
				
			||||||
  iframe.id = 'vimvixen-console-frame';
 | 
					 | 
				
			||||||
  iframe.className = 'vimvixen-console-frame';
 | 
					 | 
				
			||||||
  doc.body.append(iframe);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return iframe;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const blur = (doc: Document) => {
 | 
					 | 
				
			||||||
  let ele = doc.getElementById('vimvixen-console-frame') as HTMLIFrameElement;
 | 
					 | 
				
			||||||
  ele.blur();
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export { initialize, blur };
 | 
					 | 
				
			||||||
							
								
								
									
										16
									
								
								src/content/controllers/ConsoleFrameController.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/content/controllers/ConsoleFrameController.ts
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,16 @@
 | 
				
			||||||
 | 
					import ConsoleFrameUseCase from '../usecases/ConsoleFrameUseCase';
 | 
				
			||||||
 | 
					import * as messages from '../../shared/messages';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default class ConsoleFrameController {
 | 
				
			||||||
 | 
					  private consoleFrameUseCase: ConsoleFrameUseCase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  constructor({
 | 
				
			||||||
 | 
					    consoleFrameUseCase = new ConsoleFrameUseCase(),
 | 
				
			||||||
 | 
					  } = {}) {
 | 
				
			||||||
 | 
					    this.consoleFrameUseCase = consoleFrameUseCase;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  unfocus(_message: messages.Message) {
 | 
				
			||||||
 | 
					    this.consoleFrameUseCase.unfocus();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										41
									
								
								src/content/controllers/SettingController.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								src/content/controllers/SettingController.ts
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,41 @@
 | 
				
			||||||
 | 
					import AddonEnabledUseCase from '../usecases/AddonEnabledUseCase';
 | 
				
			||||||
 | 
					import SettingUseCase from '../usecases/SettingUseCase';
 | 
				
			||||||
 | 
					import * as blacklists from '../../shared/blacklists';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import * as messages from '../../shared/messages';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default class SettingController {
 | 
				
			||||||
 | 
					  private addonEnabledUseCase: AddonEnabledUseCase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private settingUseCase: SettingUseCase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  constructor({
 | 
				
			||||||
 | 
					    addonEnabledUseCase = new AddonEnabledUseCase(),
 | 
				
			||||||
 | 
					    settingUseCase = new SettingUseCase(),
 | 
				
			||||||
 | 
					  } = {}) {
 | 
				
			||||||
 | 
					    this.addonEnabledUseCase = addonEnabledUseCase;
 | 
				
			||||||
 | 
					    this.settingUseCase = settingUseCase;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  async initSettings(): Promise<void> {
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      let current = await this.settingUseCase.reload();
 | 
				
			||||||
 | 
					      let disabled = blacklists.includes(
 | 
				
			||||||
 | 
					        current.blacklist, window.location.href,
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					      if (disabled) {
 | 
				
			||||||
 | 
					        this.addonEnabledUseCase.disable();
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        this.addonEnabledUseCase.enable();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    } catch (e) {
 | 
				
			||||||
 | 
					      // Sometime sendMessage fails when background script is not ready.
 | 
				
			||||||
 | 
					      console.warn(e);
 | 
				
			||||||
 | 
					      setTimeout(() => this.initSettings(), 500);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  async reloadSettings(_message: messages.Message): Promise<void> {
 | 
				
			||||||
 | 
					    await this.settingUseCase.reload();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,122 +1,16 @@
 | 
				
			||||||
import * as consoleFrames from './console-frames';
 | 
					import { ConsoleFramePresenterImpl } from './presenters/ConsoleFramePresenter';
 | 
				
			||||||
import consoleFrameStyle from './site-style';
 | 
					import consoleFrameStyle from './site-style';
 | 
				
			||||||
import MessageListener from './MessageListener';
 | 
					import * as routes from './routes';
 | 
				
			||||||
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 * as messages from '../shared/messages';
 | 
					 | 
				
			||||||
import InputDriver from './InputDriver';
 | 
					 | 
				
			||||||
import KeymapController from './controllers/KeymapController';
 | 
					 | 
				
			||||||
import AddonEnabledUseCase from './usecases/AddonEnabledUseCase';
 | 
					 | 
				
			||||||
import SettingUseCase from './usecases/SettingUseCase';
 | 
					 | 
				
			||||||
import * as blacklists from '../shared/blacklists';
 | 
					 | 
				
			||||||
import MarkKeyController from './controllers/MarkKeyController';
 | 
					 | 
				
			||||||
import AddonEnabledController from './controllers/AddonEnabledController';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
let listener = new MessageListener();
 | 
					 | 
				
			||||||
if (window.self === window.top) {
 | 
					if (window.self === window.top) {
 | 
				
			||||||
  let findController = new FindController();
 | 
					  routes.routeMasterComponents();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  let followMasterController = new FollowMasterController();
 | 
					  new ConsoleFramePresenterImpl().initialize();
 | 
				
			||||||
  listener.onWebMessage((message: messages.Message, sender: Window) => {
 | 
					 | 
				
			||||||
    switch (message.type) {
 | 
					 | 
				
			||||||
    case messages.CONSOLE_ENTER_FIND:
 | 
					 | 
				
			||||||
      return findController.start(message);
 | 
					 | 
				
			||||||
    case messages.FIND_NEXT:
 | 
					 | 
				
			||||||
      return findController.next(message);
 | 
					 | 
				
			||||||
    case messages.FIND_PREV:
 | 
					 | 
				
			||||||
      return findController.prev(message);
 | 
					 | 
				
			||||||
    case messages.CONSOLE_UNFOCUS:
 | 
					 | 
				
			||||||
      window.focus();
 | 
					 | 
				
			||||||
      consoleFrames.blur(window.document);
 | 
					 | 
				
			||||||
      break;
 | 
					 | 
				
			||||||
    case messages.FOLLOW_START:
 | 
					 | 
				
			||||||
      return followMasterController.followStart(message);
 | 
					 | 
				
			||||||
    case messages.FOLLOW_RESPONSE_COUNT_TARGETS:
 | 
					 | 
				
			||||||
      return followMasterController.responseCountTargets(message, sender);
 | 
					 | 
				
			||||||
    case messages.FOLLOW_KEY_PRESS:
 | 
					 | 
				
			||||||
      return followMasterController.keyPress(message);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return undefined;
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  let markController = new MarkController();
 | 
					 | 
				
			||||||
  let addonEnabledController = new AddonEnabledController();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  new MessageListener().onBackgroundMessage((message: messages.Message) => {
 | 
					 | 
				
			||||||
    switch (message.type) {
 | 
					 | 
				
			||||||
    case messages.ADDON_ENABLED_QUERY:
 | 
					 | 
				
			||||||
      return addonEnabledController.getAddonEnabled(message);
 | 
					 | 
				
			||||||
    case messages.TAB_SCROLL_TO:
 | 
					 | 
				
			||||||
      return markController.scrollTo(message);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return undefined;
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  consoleFrames.initialize(window.document);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let followSlaveController = new FollowSlaveController();
 | 
					routes.routeComponents();
 | 
				
			||||||
listener.onWebMessage((message: messages.Message) => {
 | 
					 | 
				
			||||||
  switch (message.type) {
 | 
					 | 
				
			||||||
  case messages.FOLLOW_REQUEST_COUNT_TARGETS:
 | 
					 | 
				
			||||||
    return followSlaveController.countTargets(message);
 | 
					 | 
				
			||||||
  case messages.FOLLOW_CREATE_HINTS:
 | 
					 | 
				
			||||||
    return followSlaveController.createHints(message);
 | 
					 | 
				
			||||||
  case messages.FOLLOW_SHOW_HINTS:
 | 
					 | 
				
			||||||
    return followSlaveController.showHints(message);
 | 
					 | 
				
			||||||
  case messages.FOLLOW_ACTIVATE:
 | 
					 | 
				
			||||||
    return followSlaveController.activate(message);
 | 
					 | 
				
			||||||
  case messages.FOLLOW_REMOVE_HINTS:
 | 
					 | 
				
			||||||
    return followSlaveController.clear(message);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  return undefined;
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
let keymapController = new KeymapController();
 | 
					 | 
				
			||||||
let markKeyController = new MarkKeyController();
 | 
					 | 
				
			||||||
let followKeyController = new FollowKeyController();
 | 
					 | 
				
			||||||
let inputDriver = new InputDriver(document.body);
 | 
					 | 
				
			||||||
inputDriver.onKey(key => followKeyController.press(key));
 | 
					 | 
				
			||||||
inputDriver.onKey(key => markKeyController.press(key));
 | 
					 | 
				
			||||||
inputDriver.onKey(key => keymapController.press(key));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
let style = window.document.createElement('style');
 | 
					let style = window.document.createElement('style');
 | 
				
			||||||
style.textContent = consoleFrameStyle;
 | 
					style.textContent = consoleFrameStyle;
 | 
				
			||||||
window.document.head.appendChild(style);
 | 
					window.document.head.appendChild(style);
 | 
				
			||||||
 | 
					 | 
				
			||||||
// TODO move the following to a class
 | 
					 | 
				
			||||||
const reloadSettings = async() => {
 | 
					 | 
				
			||||||
  let addonEnabledUseCase = new AddonEnabledUseCase();
 | 
					 | 
				
			||||||
  let settingUseCase = new SettingUseCase();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  try {
 | 
					 | 
				
			||||||
    let current = await settingUseCase.reload();
 | 
					 | 
				
			||||||
    let disabled = blacklists.includes(
 | 
					 | 
				
			||||||
      current.blacklist, window.location.href,
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
    if (disabled) {
 | 
					 | 
				
			||||||
      addonEnabledUseCase.disable();
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      addonEnabledUseCase.enable();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  } catch (e) {
 | 
					 | 
				
			||||||
    // Sometime sendMessage fails when background script is not ready.
 | 
					 | 
				
			||||||
    console.warn(e);
 | 
					 | 
				
			||||||
    setTimeout(() => reloadSettings(), 500);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
reloadSettings();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
new MessageListener().onBackgroundMessage((message: messages.Message): any => {
 | 
					 | 
				
			||||||
  let addonEnabledUseCase = new AddonEnabledUseCase();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  switch (message.type) {
 | 
					 | 
				
			||||||
  case messages.SETTINGS_CHANGED:
 | 
					 | 
				
			||||||
    return reloadSettings();
 | 
					 | 
				
			||||||
  case messages.ADDON_TOGGLE_ENABLED:
 | 
					 | 
				
			||||||
    return addonEnabledUseCase.toggle();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										25
									
								
								src/content/presenters/ConsoleFramePresenter.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/content/presenters/ConsoleFramePresenter.ts
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,25 @@
 | 
				
			||||||
 | 
					export default interface ConsoleFramePresenter {
 | 
				
			||||||
 | 
					  initialize(): void;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  blur(): void;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // eslint-disable-next-line semi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export class ConsoleFramePresenterImpl implements ConsoleFramePresenter {
 | 
				
			||||||
 | 
					  initialize(): void {
 | 
				
			||||||
 | 
					    let iframe = document.createElement('iframe');
 | 
				
			||||||
 | 
					    iframe.src = browser.runtime.getURL('build/console.html');
 | 
				
			||||||
 | 
					    iframe.id = 'vimvixen-console-frame';
 | 
				
			||||||
 | 
					    iframe.className = 'vimvixen-console-frame';
 | 
				
			||||||
 | 
					    document.body.append(iframe);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  blur(): void {
 | 
				
			||||||
 | 
					    let ele = document.getElementById('vimvixen-console-frame');
 | 
				
			||||||
 | 
					    if (!ele) {
 | 
				
			||||||
 | 
					      throw new Error('console frame not created');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    ele.blur();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										97
									
								
								src/content/routes.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								src/content/routes.ts
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,97 @@
 | 
				
			||||||
 | 
					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';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const routeComponents = () => {
 | 
				
			||||||
 | 
					  let listener = new MessageListener();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let followSlaveController = new FollowSlaveController();
 | 
				
			||||||
 | 
					  listener.onWebMessage((message: messages.Message) => {
 | 
				
			||||||
 | 
					    switch (message.type) {
 | 
				
			||||||
 | 
					    case messages.FOLLOW_REQUEST_COUNT_TARGETS:
 | 
				
			||||||
 | 
					      return followSlaveController.countTargets(message);
 | 
				
			||||||
 | 
					    case messages.FOLLOW_CREATE_HINTS:
 | 
				
			||||||
 | 
					      return followSlaveController.createHints(message);
 | 
				
			||||||
 | 
					    case messages.FOLLOW_SHOW_HINTS:
 | 
				
			||||||
 | 
					      return followSlaveController.showHints(message);
 | 
				
			||||||
 | 
					    case messages.FOLLOW_ACTIVATE:
 | 
				
			||||||
 | 
					      return followSlaveController.activate(message);
 | 
				
			||||||
 | 
					    case messages.FOLLOW_REMOVE_HINTS:
 | 
				
			||||||
 | 
					      return followSlaveController.clear(message);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return undefined;
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let keymapController = new KeymapController();
 | 
				
			||||||
 | 
					  let markKeyController = new MarkKeyController();
 | 
				
			||||||
 | 
					  let followKeyController = new FollowKeyController();
 | 
				
			||||||
 | 
					  let inputDriver = new InputDriver(document.body);
 | 
				
			||||||
 | 
					  inputDriver.onKey(key => followKeyController.press(key));
 | 
				
			||||||
 | 
					  inputDriver.onKey(key => markKeyController.press(key));
 | 
				
			||||||
 | 
					  inputDriver.onKey(key => keymapController.press(key));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let settingController = new SettingController();
 | 
				
			||||||
 | 
					  settingController.initSettings();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  listener.onBackgroundMessage((message: messages.Message): any => {
 | 
				
			||||||
 | 
					    let addonEnabledUseCase = new AddonEnabledUseCase();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (message.type) {
 | 
				
			||||||
 | 
					    case messages.SETTINGS_CHANGED:
 | 
				
			||||||
 | 
					      return settingController.reloadSettings(message);
 | 
				
			||||||
 | 
					    case messages.ADDON_TOGGLE_ENABLED:
 | 
				
			||||||
 | 
					      return addonEnabledUseCase.toggle();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const routeMasterComponents = () => {
 | 
				
			||||||
 | 
					  let listener = new MessageListener();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let findController = new FindController();
 | 
				
			||||||
 | 
					  let followMasterController = new FollowMasterController();
 | 
				
			||||||
 | 
					  let markController = new MarkController();
 | 
				
			||||||
 | 
					  let addonEnabledController = new AddonEnabledController();
 | 
				
			||||||
 | 
					  let consoleFrameController = new ConsoleFrameController();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  listener.onWebMessage((message: messages.Message, sender: Window) => {
 | 
				
			||||||
 | 
					    switch (message.type) {
 | 
				
			||||||
 | 
					    case messages.CONSOLE_ENTER_FIND:
 | 
				
			||||||
 | 
					      return findController.start(message);
 | 
				
			||||||
 | 
					    case messages.FIND_NEXT:
 | 
				
			||||||
 | 
					      return findController.next(message);
 | 
				
			||||||
 | 
					    case messages.FIND_PREV:
 | 
				
			||||||
 | 
					      return findController.prev(message);
 | 
				
			||||||
 | 
					    case messages.CONSOLE_UNFOCUS:
 | 
				
			||||||
 | 
					      return consoleFrameController.unfocus(message);
 | 
				
			||||||
 | 
					    case messages.FOLLOW_START:
 | 
				
			||||||
 | 
					      return followMasterController.followStart(message);
 | 
				
			||||||
 | 
					    case messages.FOLLOW_RESPONSE_COUNT_TARGETS:
 | 
				
			||||||
 | 
					      return followMasterController.responseCountTargets(message, sender);
 | 
				
			||||||
 | 
					    case messages.FOLLOW_KEY_PRESS:
 | 
				
			||||||
 | 
					      return followMasterController.keyPress(message);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return undefined;
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  listener.onBackgroundMessage((message: messages.Message) => {
 | 
				
			||||||
 | 
					    switch (message.type) {
 | 
				
			||||||
 | 
					    case messages.ADDON_ENABLED_QUERY:
 | 
				
			||||||
 | 
					      return addonEnabledController.getAddonEnabled(message);
 | 
				
			||||||
 | 
					    case messages.TAB_SCROLL_TO:
 | 
				
			||||||
 | 
					      return markController.scrollTo(message);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return undefined;
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										17
									
								
								src/content/usecases/ConsoleFrameUseCase.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/content/usecases/ConsoleFrameUseCase.ts
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,17 @@
 | 
				
			||||||
 | 
					import ConsoleFramePresenter, { ConsoleFramePresenterImpl }
 | 
				
			||||||
 | 
					  from '../presenters/ConsoleFramePresenter';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default class ConsoleFrameUseCase {
 | 
				
			||||||
 | 
					  private consoleFramePresenter: ConsoleFramePresenter;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  constructor({
 | 
				
			||||||
 | 
					    consoleFramePresenter = new ConsoleFramePresenterImpl(),
 | 
				
			||||||
 | 
					  } = {}) {
 | 
				
			||||||
 | 
					    this.consoleFramePresenter = consoleFramePresenter;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  unfocus() {
 | 
				
			||||||
 | 
					    window.focus();
 | 
				
			||||||
 | 
					    this.consoleFramePresenter.blur();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in a new issue