aboutsummaryrefslogtreecommitdiff
path: root/src/content
diff options
context:
space:
mode:
Diffstat (limited to 'src/content')
-rw-r--r--src/content/Application.ts10
-rw-r--r--src/content/client/BackgroundClient.ts13
-rw-r--r--src/content/client/OperationClient.ts33
-rw-r--r--src/content/controllers/KeymapController.ts26
-rw-r--r--src/content/controllers/NavigateController.ts31
-rw-r--r--src/content/di.ts2
-rw-r--r--src/content/presenters/NavigationPresenter.ts27
-rw-r--r--src/content/usecases/ClipboardUseCase.ts10
-rw-r--r--src/content/usecases/NavigateUseCase.ts8
9 files changed, 87 insertions, 73 deletions
diff --git a/src/content/Application.ts b/src/content/Application.ts
index 470bf53..1677655 100644
--- a/src/content/Application.ts
+++ b/src/content/Application.ts
@@ -12,6 +12,7 @@ import MarkKeyController from './controllers/MarkKeyController';
import AddonEnabledController from './controllers/AddonEnabledController';
import SettingController from './controllers/SettingController';
import ConsoleFrameController from './controllers/ConsoleFrameController';
+import NavigateController from './controllers/NavigateController';
import * as messages from '../shared/messages';
type Message = messages.Message;
@@ -33,6 +34,7 @@ export default class Application {
private addonEnabledController: AddonEnabledController,
private settingController: SettingController,
private consoleFrameController: ConsoleFrameController,
+ private navigateController: NavigateController,
) {
}
@@ -98,6 +100,14 @@ export default class Application {
return this.settingController.reloadSettings(msg);
case messages.ADDON_TOGGLE_ENABLED:
return this.addonEnabledUseCase.toggle();
+ case messages.NAVIGATE_HISTORY_NEXT:
+ return this.navigateController.openHistoryNext(msg);
+ case messages.NAVIGATE_HISTORY_PREV:
+ return this.navigateController.openHistoryPrev(msg);
+ case messages.NAVIGATE_LINK_NEXT:
+ return this.navigateController.openLinkNext(msg);
+ case messages.NAVIGATE_LINK_PREV:
+ return this.navigateController.openLinkPrev(msg);
}
});
diff --git a/src/content/client/BackgroundClient.ts b/src/content/client/BackgroundClient.ts
deleted file mode 100644
index 4a41184..0000000
--- a/src/content/client/BackgroundClient.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { injectable } from 'tsyringe';
-import * as operations from '../../shared/operations';
-import * as messages from '../../shared/messages';
-
-@injectable()
-export default class BackgroundClient {
- execBackgroundOp(op: operations.Operation): Promise<void> {
- return browser.runtime.sendMessage({
- type: messages.BACKGROUND_OPERATION,
- operation: op,
- });
- }
-}
diff --git a/src/content/client/OperationClient.ts b/src/content/client/OperationClient.ts
new file mode 100644
index 0000000..5dbe555
--- /dev/null
+++ b/src/content/client/OperationClient.ts
@@ -0,0 +1,33 @@
+import * as operations from '../../shared/operations';
+import * as messages from '../../shared/messages';
+
+export default interface OperationClient {
+ execBackgroundOp(op: operations.Operation): Promise<void>;
+
+ internalOpenUrl(
+ url: string, newTab?: boolean, background?: boolean,
+ ): Promise<void>;
+}
+
+export class OperationClientImpl implements OperationClient {
+ execBackgroundOp(op: operations.Operation): Promise<void> {
+ return browser.runtime.sendMessage({
+ type: messages.BACKGROUND_OPERATION,
+ operation: op,
+ });
+ }
+
+ internalOpenUrl(
+ url: string, newTab?: boolean, background?: boolean,
+ ): Promise<void> {
+ return browser.runtime.sendMessage({
+ type: messages.BACKGROUND_OPERATION,
+ operation: {
+ type: operations.INTERNAL_OPEN_URL,
+ url,
+ newTab,
+ background,
+ },
+ });
+ }
+}
diff --git a/src/content/controllers/KeymapController.ts b/src/content/controllers/KeymapController.ts
index 1835546..fcfaff1 100644
--- a/src/content/controllers/KeymapController.ts
+++ b/src/content/controllers/KeymapController.ts
@@ -4,10 +4,9 @@ import KeymapUseCase from '../usecases/KeymapUseCase';
import AddonEnabledUseCase from '../usecases/AddonEnabledUseCase';
import FindSlaveUseCase from '../usecases/FindSlaveUseCase';
import ScrollUseCase from '../usecases/ScrollUseCase';
-import NavigateUseCase from '../usecases/NavigateUseCase';
import FocusUseCase from '../usecases/FocusUseCase';
import ClipboardUseCase from '../usecases/ClipboardUseCase';
-import BackgroundClient from '../client/BackgroundClient';
+import OperationClient from '../client/OperationClient';
import MarkKeyyUseCase from '../usecases/MarkKeyUseCase';
import FollowMasterClient from '../client/FollowMasterClient';
import Key from '../domains/Key';
@@ -19,12 +18,13 @@ export default class KeymapController {
private addonEnabledUseCase: AddonEnabledUseCase,
private findSlaveUseCase: FindSlaveUseCase,
private scrollUseCase: ScrollUseCase,
- private navigateUseCase: NavigateUseCase,
private focusUseCase: FocusUseCase,
private clipbaordUseCase: ClipboardUseCase,
- private backgroundClient: BackgroundClient,
private markKeyUseCase: MarkKeyyUseCase,
+ @inject('OperationClient')
+ private backgroundClient: OperationClient,
+
@inject('FollowMasterClient')
private followMasterClient: FollowMasterClient,
) {
@@ -84,24 +84,6 @@ export default class KeymapController {
case operations.MARK_JUMP_PREFIX:
this.markKeyUseCase.enableJumpMode();
break;
- case operations.NAVIGATE_HISTORY_PREV:
- this.navigateUseCase.openHistoryPrev();
- break;
- case operations.NAVIGATE_HISTORY_NEXT:
- this.navigateUseCase.openHistoryNext();
- break;
- case operations.NAVIGATE_LINK_PREV:
- this.navigateUseCase.openLinkPrev();
- break;
- case operations.NAVIGATE_LINK_NEXT:
- this.navigateUseCase.openLinkNext();
- break;
- case operations.NAVIGATE_PARENT:
- this.navigateUseCase.openParent();
- break;
- case operations.NAVIGATE_ROOT:
- this.navigateUseCase.openRoot();
- break;
case operations.FOCUS_INPUT:
this.focusUseCase.focusFirstInput();
break;
diff --git a/src/content/controllers/NavigateController.ts b/src/content/controllers/NavigateController.ts
new file mode 100644
index 0000000..3f2df7a
--- /dev/null
+++ b/src/content/controllers/NavigateController.ts
@@ -0,0 +1,31 @@
+import { injectable } from 'tsyringe';
+import { Message } from '../../shared/messages';
+import NavigateUseCase from '../usecases/NavigateUseCase';
+
+@injectable()
+export default class NavigateController {
+ constructor(
+ private navigateUseCase: NavigateUseCase,
+ ) {
+ }
+
+ openHistoryNext(_m: Message): Promise<void> {
+ this.navigateUseCase.openHistoryNext();
+ return Promise.resolve();
+ }
+
+ openHistoryPrev(_m: Message): Promise<void> {
+ this.navigateUseCase.openHistoryPrev();
+ return Promise.resolve();
+ }
+
+ openLinkNext(_m: Message): Promise<void> {
+ this.navigateUseCase.openLinkNext();
+ return Promise.resolve();
+ }
+
+ openLinkPrev(_m: Message): Promise<void> {
+ this.navigateUseCase.openLinkPrev();
+ return Promise.resolve();
+ }
+}
diff --git a/src/content/di.ts b/src/content/di.ts
index 23be027..e18806a 100644
--- a/src/content/di.ts
+++ b/src/content/di.ts
@@ -21,6 +21,7 @@ import { MarkClientImpl } from './client/MarkClient';
import { MarkKeyRepositoryImpl } from './repositories/MarkKeyRepository';
import { MarkRepositoryImpl } from './repositories/MarkRepository';
import { NavigationPresenterImpl } from './presenters/NavigationPresenter';
+import { OperationClientImpl } from './client/OperationClient';
import { ScrollPresenterImpl } from './presenters/ScrollPresenter';
import { SettingClientImpl } from './client/SettingClient';
import { SettingRepositoryImpl } from './repositories/SettingRepository';
@@ -48,6 +49,7 @@ container.register('MarkClient', { useClass: MarkClientImpl });
container.register('MarkKeyRepository', { useClass: MarkKeyRepositoryImpl });
container.register('MarkRepository', { useClass: MarkRepositoryImpl });
container.register('NavigationPresenter', { useClass: NavigationPresenterImpl });
+container.register('OperationClient', { useClass: OperationClientImpl });
container.register('ScrollPresenter', { useClass: ScrollPresenterImpl });
container.register('SettingClient', { useClass: SettingClientImpl });
container.register('SettingRepository', { useClass: SettingRepositoryImpl });
diff --git a/src/content/presenters/NavigationPresenter.ts b/src/content/presenters/NavigationPresenter.ts
index c141112..11d96ec 100644
--- a/src/content/presenters/NavigationPresenter.ts
+++ b/src/content/presenters/NavigationPresenter.ts
@@ -6,10 +6,6 @@ export default interface NavigationPresenter {
openLinkPrev(): void;
openLinkNext(): void;
-
- openParent(): void;
-
- openRoot(): void;
}
const REL_PATTERN: {[key: string]: RegExp} = {
@@ -51,29 +47,6 @@ export class NavigationPresenterImpl implements NavigationPresenter {
this.linkRel('next');
}
- openParent(): void {
- const loc = window.location;
- if (loc.hash !== '') {
- loc.hash = '';
- return;
- } else if (loc.search !== '') {
- loc.search = '';
- return;
- }
-
- const basenamePattern = /\/[^/]+$/;
- const lastDirPattern = /\/[^/]+\/$/;
- if (basenamePattern.test(loc.pathname)) {
- loc.pathname = loc.pathname.replace(basenamePattern, '/');
- } else if (lastDirPattern.test(loc.pathname)) {
- loc.pathname = loc.pathname.replace(lastDirPattern, '/');
- }
- }
-
- openRoot(): void {
- window.location.href = window.location.origin;
- }
-
// Code common to linkPrev and linkNext which navigates to the specified page.
private linkRel(rel: 'prev' | 'next'): void {
let link = selectLast<HTMLLinkElement>(`link[rel~=${rel}][href]`);
diff --git a/src/content/usecases/ClipboardUseCase.ts b/src/content/usecases/ClipboardUseCase.ts
index 8c4d621..c8fe719 100644
--- a/src/content/usecases/ClipboardUseCase.ts
+++ b/src/content/usecases/ClipboardUseCase.ts
@@ -2,16 +2,16 @@ import { injectable, inject } from 'tsyringe';
import * as urls from '../../shared/urls';
import ClipboardRepository from '../repositories/ClipboardRepository';
import SettingRepository from '../repositories/SettingRepository';
-import TabsClient from '../client/TabsClient';
import ConsoleClient from '../client/ConsoleClient';
+import OperationClient from '../client/OperationClient';
@injectable()
export default class ClipboardUseCase {
constructor(
@inject('ClipboardRepository') private repository: ClipboardRepository,
@inject('SettingRepository') private settingRepository: SettingRepository,
- @inject('TabsClient') private client: TabsClient,
@inject('ConsoleClient') private consoleClient: ConsoleClient,
+ @inject('OperationClient') private operationClinet: OperationClient,
) {
}
@@ -26,6 +26,10 @@ export default class ClipboardUseCase {
let search = this.settingRepository.get().search;
let text = this.repository.read();
let url = urls.searchUrl(text, search);
- await this.client.openUrl(url, newTab);
+
+ // TODO: Repeat pasting from clipboard instead of opening a certain url.
+ // 'Repeat last' command is implemented in the background script and cannot
+ // access to clipboard until Firefox 63.
+ await this.operationClinet.internalOpenUrl(url, newTab);
}
}
diff --git a/src/content/usecases/NavigateUseCase.ts b/src/content/usecases/NavigateUseCase.ts
index 4711c5e..7adccfd 100644
--- a/src/content/usecases/NavigateUseCase.ts
+++ b/src/content/usecases/NavigateUseCase.ts
@@ -24,12 +24,4 @@ export default class NavigateUseCase {
openLinkNext(): void {
this.navigationPresenter.openLinkNext();
}
-
- openParent(): void {
- this.navigationPresenter.openParent();
- }
-
- openRoot(): void {
- this.navigationPresenter.openRoot();
- }
}