import messages from '../../shared/messages'; import CommandController from '../controllers/command'; import SettingController from '../controllers/setting'; import FindController from '../controllers/find'; import AddonEnabledController from '../controllers/addon-enabled'; import LinkController from '../controllers/link'; import OperationController from '../controllers/operation'; import MarkController from '../controllers/mark'; export default class ContentMessageListener { constructor() { this.settingController = new SettingController(); this.commandController = new CommandController(); this.findController = new FindController(); this.addonEnabledController = new AddonEnabledController(); this.linkController = new LinkController(); this.backgroundOperationController = new OperationController(); this.markController = new MarkController(); this.consolePorts = {}; } run() { browser.runtime.onMessage.addListener((message, sender) => { try { let ret = this.onMessage(message, sender); if (!(ret instanceof Promise)) { return {}; } return ret.catch((e) => { return browser.tabs.sendMessage(sender.tab.id, { type: messages.CONSOLE_SHOW_ERROR, text: e.message, }); }); } catch (e) { return browser.tabs.sendMessage(sender.tab.id, { type: messages.CONSOLE_SHOW_ERROR, text: e.message, }); } }); browser.runtime.onConnect.addListener(this.onConnected.bind(this)); } onMessage(message, sender) { switch (message.type) { case messages.CONSOLE_QUERY_COMPLETIONS: return this.onConsoleQueryCompletions(message.text); case messages.CONSOLE_ENTER_COMMAND: return this.onConsoleEnterCommand(message.text); case messages.SETTINGS_QUERY: return this.onSettingsQuery(); case messages.SETTINGS_RELOAD: return this.onSettingsReload(); case messages.FIND_GET_KEYWORD: return this.onFindGetKeyword(); case messages.FIND_SET_KEYWORD: return this.onFindSetKeyword(message.keyword); case messages.ADDON_ENABLED_RESPONSE: return this.onAddonEnabledResponse(message.enabled); case messages.OPEN_URL: return this.onOpenUrl( message.newTab, message.url, sender.tab.id, message.background); case messages.BACKGROUND_OPERATION: return this.onBackgroundOperation(message.operation); case messages.MARK_SET_GLOBAL: return this.onMarkSetGlobal(message.key, message.x, message.y); case messages.MARK_JUMP_GLOBAL: return this.onMarkJumpGlobal(message.key); case messages.CONSOLE_FRAME_MESSAGE: return this.onConsoleFrameMessage(sender.tab.id, message.message); } } async onConsoleQueryCompletions(line) { let completions = await this.commandController.getCompletions(line); return Promise.resolve(completions.serialize()); } onConsoleEnterCommand(text) { return this.commandController.exec(text); } onSettingsQuery() { return this.settingController.getSetting(); } onSettingsReload() { return this.settingController.reload(); } onFindGetKeyword() { return this.findController.getKeyword(); } onFindSetKeyword(keyword) { return this.findController.setKeyword(keyword); } onAddonEnabledResponse(enabled) { return this.addonEnabledController.indicate(enabled); } onOpenUrl(newTab, url, openerId, background) { if (newTab) { return this.linkController.openNewTab(url, openerId, background); } return this.linkController.openToTab(url, openerId); } onBackgroundOperation(operation) { return this.backgroundOperationController.exec(operation); } onMarkSetGlobal(key, x, y) { return this.markController.setGlobal(key, x, y); } onMarkJumpGlobal(key) { return this.markController.jumpGlobal(key); } onConsoleFrameMessage(tabId, message) { let port = this.consolePorts[tabId]; if (!port) { return; } port.postMessage(message); } onConnected(port) { if (port.name !== 'vimvixen-console') { return; } let id = port.sender.tab.id; this.consolePorts[id] = port; } }