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