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