parent
ab29706348
commit
66c23423f9
7 changed files with 318 additions and 3 deletions
@ -0,0 +1,65 @@ |
|||||||
|
import operations from '../../shared/operations'; |
||||||
|
import OperationInteractor from '../usecases/operation'; |
||||||
|
|
||||||
|
export default class OperationController { |
||||||
|
constructor() { |
||||||
|
this.operationInteractor = new OperationInteractor(); |
||||||
|
} |
||||||
|
|
||||||
|
// eslint-disable-next-line complexity, max-lines-per-function
|
||||||
|
exec(operation) { |
||||||
|
switch (operation.type) { |
||||||
|
case operations.TAB_CLOSE: |
||||||
|
return this.operationInteractor.close(false); |
||||||
|
case operations.TAB_CLOSE_FORCE: |
||||||
|
return this.operationInteractor.close(true); |
||||||
|
case operations.TAB_REOPEN: |
||||||
|
return this.operationInteractor.reopen(); |
||||||
|
case operations.TAB_PREV: |
||||||
|
return this.operationInteractor.selectPrev(1); |
||||||
|
case operations.TAB_NEXT: |
||||||
|
return this.operationInteractor.selectNext(1); |
||||||
|
case operations.TAB_FIRST: |
||||||
|
return this.operationInteractor.selectFirst(); |
||||||
|
case operations.TAB_LAST: |
||||||
|
return this.operationInteractor.selectLast(); |
||||||
|
case operations.TAB_PREV_SEL: |
||||||
|
return this.operationInteractor.selectPrevSelected(); |
||||||
|
case operations.TAB_RELOAD: |
||||||
|
return this.operationInteractor.reload(operation.cache); |
||||||
|
case operations.TAB_PIN: |
||||||
|
return this.operationInteractor.setPinned(true); |
||||||
|
case operations.TAB_UNPIN: |
||||||
|
return this.operationInteractor.setPinned(false); |
||||||
|
case operations.TAB_TOGGLE_PINNED: |
||||||
|
return this.operationInteractor.togglePinned(); |
||||||
|
case operations.TAB_DUPLICATE: |
||||||
|
return this.operationInteractor.duplicate(); |
||||||
|
case operations.PAGE_SOURCE: |
||||||
|
return this.operationInteractor.openPageSource(); |
||||||
|
case operations.ZOOM_IN: |
||||||
|
return this.operationInteractor.zoomIn(); |
||||||
|
case operations.ZOOM_OUT: |
||||||
|
return this.operationInteractor.zoomOut(); |
||||||
|
case operations.ZOOM_NEUTRAL: |
||||||
|
return this.operationInteractor.zoomNutoral(); |
||||||
|
case operations.COMMAND_SHOW: |
||||||
|
return this.operationInteractor.showCommand(); |
||||||
|
case operations.COMMAND_SHOW_OPEN: |
||||||
|
return this.operationInteractor.showOpenCommand(operation.alter); |
||||||
|
case operations.COMMAND_SHOW_TABOPEN: |
||||||
|
return this.operationInteractor.showTabopenCommand(operation.alter); |
||||||
|
case operations.COMMAND_SHOW_WINOPEN: |
||||||
|
return this.operationInteractor.showWinopenCommand(operation.alter); |
||||||
|
case operations.COMMAND_SHOW_BUFFER: |
||||||
|
return this.operationInteractor.showBufferCommand(); |
||||||
|
case operations.COMMAND_SHOW_ADDBOOKMARK: |
||||||
|
return this.operationInteractor.showAddbookmarkCommand(operation.alter); |
||||||
|
case operations.FIND_START: |
||||||
|
return this.operationInteractor.findStart(); |
||||||
|
case operations.CANCEL: |
||||||
|
return this.operationInteractor.hideConsole(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
@ -1,16 +1,36 @@ |
|||||||
import messages from '../../shared/messages'; |
import messages from '../../shared/messages'; |
||||||
|
|
||||||
export default class ConsolePresenter { |
export default class ConsolePresenter { |
||||||
|
showCommand(tabId, command) { |
||||||
|
return browser.tabs.sendMessage(tabId, { |
||||||
|
type: messages.CONSOLE_SHOW_COMMAND, |
||||||
|
command, |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
showFind(tabId) { |
||||||
|
return browser.tabs.sendMessage(tabId, { |
||||||
|
type: messages.CONSOLE_SHOW_FIND |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
showInfo(tabId, message) { |
showInfo(tabId, message) { |
||||||
return browser.tabs.sendMessage(tabId, { |
return browser.tabs.sendMessage(tabId, { |
||||||
type: messages.CONSOLE_SHOW_INFO, |
type: messages.CONSOLE_SHOW_INFO, |
||||||
text: message, |
text: message, |
||||||
}); |
}); |
||||||
} |
} |
||||||
|
|
||||||
showError(tabId, message) { |
showError(tabId, message) { |
||||||
return browser.tabs.sendMessage(tabId, { |
return browser.tabs.sendMessage(tabId, { |
||||||
type: messages.CONSOLE_SHOW_ERROR, |
type: messages.CONSOLE_SHOW_ERROR, |
||||||
text: message, |
text: message, |
||||||
}); |
}); |
||||||
} |
} |
||||||
|
|
||||||
|
hide(tabId) { |
||||||
|
return browser.tabs.sendMessage(tabId, { |
||||||
|
type: messages.CONSOLE_HIDE, |
||||||
|
}); |
||||||
|
} |
||||||
} |
} |
||||||
|
@ -0,0 +1,190 @@ |
|||||||
|
import MemoryStorage from '../infrastructures/memory-storage'; |
||||||
|
import TabPresenter from '../presenters/tab'; |
||||||
|
import ConsolePresenter from '../presenters/console'; |
||||||
|
|
||||||
|
const CURRENT_SELECTED_KEY = 'tabs.current.selected'; |
||||||
|
const LAST_SELECTED_KEY = 'tabs.last.selected'; |
||||||
|
|
||||||
|
const ZOOM_SETTINGS = [ |
||||||
|
0.33, 0.50, 0.66, 0.75, 0.80, 0.90, 1.00, |
||||||
|
1.10, 1.25, 1.50, 1.75, 2.00, 2.50, 3.00 |
||||||
|
]; |
||||||
|
|
||||||
|
export default class OperationInteractor { |
||||||
|
constructor() { |
||||||
|
this.tabPresenter = new TabPresenter(); |
||||||
|
this.tabPresenter.onSelected(info => this.onTabSelected(info.tabId)); |
||||||
|
|
||||||
|
this.consolePresenter = new ConsolePresenter(); |
||||||
|
|
||||||
|
this.cache = new MemoryStorage(); |
||||||
|
} |
||||||
|
|
||||||
|
async close(force) { |
||||||
|
let tab = await this.tabPresenter.getCurrent(); |
||||||
|
if (!force && tab.pinned) { |
||||||
|
return; |
||||||
|
} |
||||||
|
return this.tabPresenter.remove([tab.id]); |
||||||
|
} |
||||||
|
|
||||||
|
reopen() { |
||||||
|
return this.tabPresenter.reopen(); |
||||||
|
} |
||||||
|
|
||||||
|
async selectPrev(count) { |
||||||
|
let tabs = await this.tabPresenter.getAll(); |
||||||
|
if (tabs.length < 2) { |
||||||
|
return; |
||||||
|
} |
||||||
|
let tab = tabs.find(t => t.active); |
||||||
|
if (!tab) { |
||||||
|
return; |
||||||
|
} |
||||||
|
let select = (tab.index - count + tabs.length) % tabs.length; |
||||||
|
return this.tabPresenter.select(tabs[select].id); |
||||||
|
} |
||||||
|
|
||||||
|
async selectNext(count) { |
||||||
|
let tabs = await this.tabPresenter.getAll(); |
||||||
|
if (tabs.length < 2) { |
||||||
|
return; |
||||||
|
} |
||||||
|
let tab = tabs.find(t => t.active); |
||||||
|
if (!tab) { |
||||||
|
return; |
||||||
|
} |
||||||
|
let select = (tab.index + count) % tabs.length; |
||||||
|
return this.tabPresenter.select(tabs[select].id); |
||||||
|
} |
||||||
|
|
||||||
|
async selectFirst() { |
||||||
|
let tabs = await this.tabPresenter.getAll(); |
||||||
|
return this.tabPresenter.select(tabs[0].id); |
||||||
|
} |
||||||
|
|
||||||
|
async selectLast() { |
||||||
|
let tabs = await this.tabPresenter.getAll(); |
||||||
|
return this.tabPresenter.select(tabs[tabs.length - 1].id); |
||||||
|
} |
||||||
|
|
||||||
|
async selectPrevSelected() { |
||||||
|
let tabId = await this.cache.get(LAST_SELECTED_KEY); |
||||||
|
if (tabId === null || typeof tabId === 'undefined') { |
||||||
|
return; |
||||||
|
} |
||||||
|
this.tabPresenter.select(tabId); |
||||||
|
} |
||||||
|
|
||||||
|
async reload(cache) { |
||||||
|
let tab = await this.tabPresenter.getCurrent(); |
||||||
|
return this.tabPresenter.reload(tab.id, cache); |
||||||
|
} |
||||||
|
|
||||||
|
async setPinned(pinned) { |
||||||
|
let tab = await this.tabPresenter.getCurrent(); |
||||||
|
return this.tabPresenter.setPinned(tab.id, pinned); |
||||||
|
} |
||||||
|
|
||||||
|
async togglePinned() { |
||||||
|
let tab = await this.tabPresenter.getCurrent(); |
||||||
|
return this.tabPresenter.setPinned(tab.id, !tab.pinned); |
||||||
|
} |
||||||
|
|
||||||
|
async duplicate() { |
||||||
|
let tab = await this.tabPresenter.getCurrent(); |
||||||
|
return this.tabPresenter.duplicate(tab.id); |
||||||
|
} |
||||||
|
|
||||||
|
async openPageSource() { |
||||||
|
let tab = await this.tabPresenter.getCurrent(); |
||||||
|
let url = 'view-source:' + tab.url; |
||||||
|
return this.tabPresenter.create(url); |
||||||
|
} |
||||||
|
|
||||||
|
async zoomIn(tabId) { |
||||||
|
let tab = await this.tabPresenter.getCurrent(); |
||||||
|
let current = await this.tabPresenter.getZoom(tab.id); |
||||||
|
let factor = ZOOM_SETTINGS.find(f => f > current); |
||||||
|
if (factor) { |
||||||
|
return this.tabPresenter.setZoom(tabId, factor); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
async zoomOut(tabId) { |
||||||
|
let tab = await this.tabPresenter.getCurrent(); |
||||||
|
let current = await this.tabPresenter.getZoom(tab.id); |
||||||
|
let factor = [].concat(ZOOM_SETTINGS).reverse().find(f => f < current); |
||||||
|
if (factor) { |
||||||
|
return this.tabPresenter.setZoom(tabId, factor); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
zoomNutoral(tabId) { |
||||||
|
return this.tabPresenter.setZoom(tabId, 1); |
||||||
|
} |
||||||
|
|
||||||
|
async showCommand() { |
||||||
|
let tab = await this.tabPresenter.getCurrent(); |
||||||
|
this.consolePresenter.showCommand(tab.id, ''); |
||||||
|
} |
||||||
|
|
||||||
|
async showOpenCommand(alter) { |
||||||
|
let tab = await this.tabPresenter.getCurrent(); |
||||||
|
let command = 'open '; |
||||||
|
if (alter) { |
||||||
|
command += tab.url; |
||||||
|
} |
||||||
|
return this.consolePresenter.showCommand(tab.id, command); |
||||||
|
} |
||||||
|
|
||||||
|
async showTabopenCommand(alter) { |
||||||
|
let tab = await this.tabPresenter.getCurrent(); |
||||||
|
let command = 'tabopen '; |
||||||
|
if (alter) { |
||||||
|
command += tab.url; |
||||||
|
} |
||||||
|
return this.consolePresenter.showCommand(tab.id, command); |
||||||
|
} |
||||||
|
|
||||||
|
async showWinopenCommand(alter) { |
||||||
|
let tab = await this.tabPresenter.getCurrent(); |
||||||
|
let command = 'winopen '; |
||||||
|
if (alter) { |
||||||
|
command += tab.url; |
||||||
|
} |
||||||
|
return this.consolePresenter.showCommand(tab.id, command); |
||||||
|
} |
||||||
|
|
||||||
|
async showBufferCommand() { |
||||||
|
let tab = await this.tabPresenter.getCurrent(); |
||||||
|
let command = 'buffer '; |
||||||
|
return this.consolePresenter.showCommand(tab.id, command); |
||||||
|
} |
||||||
|
|
||||||
|
async showAddbookmarkCommand(alter) { |
||||||
|
let tab = await this.tabPresenter.getCurrent(); |
||||||
|
let command = 'addbookmark '; |
||||||
|
if (alter) { |
||||||
|
command += tab.title; |
||||||
|
} |
||||||
|
return this.consolePresenter.showCommand(tab.id, command); |
||||||
|
} |
||||||
|
|
||||||
|
async findStart() { |
||||||
|
let tab = await this.tabPresenter.getCurrent(); |
||||||
|
this.consolePresenter.showFind(tab.id); |
||||||
|
} |
||||||
|
|
||||||
|
async hideConsole() { |
||||||
|
let tab = await this.tabPresenter.getCurrent(); |
||||||
|
this.consolePresenter.hide(tab.id); |
||||||
|
} |
||||||
|
|
||||||
|
onTabSelected(tabId) { |
||||||
|
let lastId = this.cache.get(CURRENT_SELECTED_KEY); |
||||||
|
this.cache.set(LAST_SELECTED_KEY, lastId); |
||||||
|
this.cache.set(CURRENT_SELECTED_KEY, tabId); |
||||||
|
} |
||||||
|
} |
||||||
|
|
Reference in new issue