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 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 * 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';
|
||||
import * as routes from './routes';
|
||||
|
||||
let listener = new MessageListener();
|
||||
if (window.self === window.top) {
|
||||
let findController = new FindController();
|
||||
routes.routeMasterComponents();
|
||||
|
||||
let followMasterController = new FollowMasterController();
|
||||
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);
|
||||
new ConsoleFramePresenterImpl().initialize();
|
||||
}
|
||||
|
||||
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;
|
||||
});
|
||||
routes.routeComponents();
|
||||
|
||||
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');
|
||||
style.textContent = consoleFrameStyle;
|
||||
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