aboutsummaryrefslogtreecommitdiff
path: root/src/background
diff options
context:
space:
mode:
authorShin'ya Ueoka <ueokande@i-beam.org>2019-05-25 21:33:33 +0900
committerShin'ya Ueoka <ueokande@i-beam.org>2019-05-25 21:33:33 +0900
commitccbe08cf66e16084c919f0b2fa2da81258c01d41 (patch)
tree3257d852aeae93e4dc84fd3cabb63ebeefef326d /src/background
parent03370301a7509af4bbc96d60269598bf89c71fe4 (diff)
Repeat last operation
Diffstat (limited to 'src/background')
-rw-r--r--src/background/controllers/OperationController.ts19
-rw-r--r--src/background/repositories/RepeatRepository.ts22
-rw-r--r--src/background/usecases/RepeatUseCase.ts49
3 files changed, 89 insertions, 1 deletions
diff --git a/src/background/controllers/OperationController.ts b/src/background/controllers/OperationController.ts
index 1e80f54..7233c0e 100644
--- a/src/background/controllers/OperationController.ts
+++ b/src/background/controllers/OperationController.ts
@@ -6,6 +6,7 @@ import TabUseCase from '../usecases/TabUseCase';
import TabSelectUseCase from '../usecases/TabSelectUseCase';
import ZoomUseCase from '../usecases/ZoomUseCase';
import NavigateUseCase from '../usecases/NavigateUseCase';
+import RepeatUseCase from '../usecases/RepeatUseCase';
@injectable()
export default class OperationController {
@@ -16,11 +17,19 @@ export default class OperationController {
private tabSelectUseCase: TabSelectUseCase,
private zoomUseCase: ZoomUseCase,
private navigateUseCase: NavigateUseCase,
+ private repeatUseCase: RepeatUseCase,
) {
}
+ async exec(op: operations.Operation): Promise<any> {
+ await this.doOperation(op);
+ if (this.repeatUseCase.isRepeatable(op)) {
+ this.repeatUseCase.storeLastOperation(op);
+ }
+ }
+
// eslint-disable-next-line complexity, max-lines-per-function
- exec(operation: operations.Operation): Promise<any> {
+ doOperation(operation: operations.Operation): Promise<any> {
switch (operation.type) {
case operations.TAB_CLOSE:
return this.tabUseCase.close(false);
@@ -88,6 +97,14 @@ export default class OperationController {
return this.navigateUseCase.openParent();
case operations.NAVIGATE_ROOT:
return this.navigateUseCase.openRoot();
+ case operations.REPEAT_LAST:
+ {
+ let last = this.repeatUseCase.getLastOperation();
+ if (typeof last !== 'undefined') {
+ return this.doOperation(last);
+ }
+ return Promise.resolve();
+ }
}
throw new Error('unknown operation: ' + operation.type);
}
diff --git a/src/background/repositories/RepeatRepository.ts b/src/background/repositories/RepeatRepository.ts
new file mode 100644
index 0000000..c7f7a71
--- /dev/null
+++ b/src/background/repositories/RepeatRepository.ts
@@ -0,0 +1,22 @@
+import { injectable } from 'tsyringe';
+import { Operation } from '../../shared/operations';
+import MemoryStorage from '../infrastructures/MemoryStorage';
+
+const REPEAT_KEY = 'repeat';
+
+@injectable()
+export default class RepeatRepository {
+ private cache: MemoryStorage;
+
+ constructor() {
+ this.cache = new MemoryStorage();
+ }
+
+ getLastOperation(): Operation | undefined {
+ return this.cache.get(REPEAT_KEY);
+ }
+
+ setLastOperation(op: Operation): void {
+ this.cache.set(REPEAT_KEY, op);
+ }
+}
diff --git a/src/background/usecases/RepeatUseCase.ts b/src/background/usecases/RepeatUseCase.ts
new file mode 100644
index 0000000..a005682
--- /dev/null
+++ b/src/background/usecases/RepeatUseCase.ts
@@ -0,0 +1,49 @@
+import { injectable } from 'tsyringe';
+import * as operations from '../../shared/operations';
+import RepeatRepository from '../repositories/RepeatRepository';
+
+type Operation = operations.Operation;
+
+@injectable()
+export default class RepeatUseCase {
+ constructor(
+ private repeatRepository: RepeatRepository,
+ ) {
+ }
+
+ storeLastOperation(op: Operation): void {
+ this.repeatRepository.setLastOperation(op);
+ }
+
+ getLastOperation(): operations.Operation | undefined {
+ return this.repeatRepository.getLastOperation();
+ }
+
+ // eslint-disable-next-line complexity
+ isRepeatable(op: Operation): boolean {
+ switch (op.type) {
+ case operations.NAVIGATE_HISTORY_PREV:
+ case operations.NAVIGATE_HISTORY_NEXT:
+ case operations.NAVIGATE_LINK_PREV:
+ case operations.NAVIGATE_LINK_NEXT:
+ case operations.NAVIGATE_PARENT:
+ case operations.NAVIGATE_ROOT:
+ case operations.PAGE_SOURCE:
+ case operations.PAGE_HOME:
+ case operations.TAB_CLOSE:
+ case operations.TAB_CLOSE_FORCE:
+ case operations.TAB_CLOSE_RIGHT:
+ case operations.TAB_REOPEN:
+ case operations.TAB_RELOAD:
+ case operations.TAB_PIN:
+ case operations.TAB_UNPIN:
+ case operations.TAB_TOGGLE_PINNED:
+ case operations.TAB_DUPLICATE:
+ case operations.ZOOM_IN:
+ case operations.ZOOM_OUT:
+ case operations.ZOOM_NEUTRAL:
+ return true;
+ }
+ return false;
+ }
+}