From 42d902982a1d2edbca8ca2edb5fb25e642794e2a Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Sun, 22 Jul 2018 15:39:23 +0900 Subject: [PATCH] Indicator as Clean Architecture --- src/background/controllers/addon-enabled.js | 11 +++++++ src/background/index.js | 2 -- .../infrastructures/content-message-client.js | 13 +++++++++ .../content-message-listener.js | 8 +++++ src/background/presenters/indicator.js | 12 ++++++++ src/background/presenters/tab.js | 4 +++ src/background/usecases/addon-enabled.js | 29 +++++++++++++++++++ 7 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 src/background/controllers/addon-enabled.js create mode 100644 src/background/presenters/indicator.js create mode 100644 src/background/usecases/addon-enabled.js diff --git a/src/background/controllers/addon-enabled.js b/src/background/controllers/addon-enabled.js new file mode 100644 index 0000000..0f5d801 --- /dev/null +++ b/src/background/controllers/addon-enabled.js @@ -0,0 +1,11 @@ +import AddonEnabledInteractor from '../usecases/addon-enabled'; + +export default class AddonEnabledController { + constructor() { + this.addonEnabledInteractor = new AddonEnabledInteractor(); + } + + indicate(enabled) { + this.addonEnabledInteractor.indicate(enabled); + } +} diff --git a/src/background/index.js b/src/background/index.js index e753c48..70d514f 100644 --- a/src/background/index.js +++ b/src/background/index.js @@ -1,7 +1,6 @@ import BackgroundComponent from 'background/components/background'; import OperationComponent from 'background/components/operation'; import TabComponent from 'background/components/tab'; -import IndicatorComponent from 'background/components/indicator'; import reducers from 'background/reducers'; import { createStore, applyMiddleware } from 'redux'; import promise from 'redux-promise'; @@ -19,7 +18,6 @@ const store = createStore( const backgroundComponent = new BackgroundComponent(store); const operationComponent = new OperationComponent(store); const tabComponent = new TabComponent(store); -const indicatorComponent = new IndicatorComponent(store); /* eslint-enable no-unused-vars */ new SettingController().reload(); diff --git a/src/background/infrastructures/content-message-client.js b/src/background/infrastructures/content-message-client.js index b3b37b4..d659560 100644 --- a/src/background/infrastructures/content-message-client.js +++ b/src/background/infrastructures/content-message-client.js @@ -9,4 +9,17 @@ export default class ContentMessageClient { }); } } + + async getAddonEnabled(tabId) { + let { enabled } = await browser.tabs.sendMessage(tabId, { + type: messages.ADDON_ENABLED_QUERY, + }); + return enabled; + } + + toggleAddonEnabled(tabId) { + return browser.tabs.sendMessage(tabId, { + type: messages.ADDON_TOGGLE_ENABLED, + }); + } } diff --git a/src/background/infrastructures/content-message-listener.js b/src/background/infrastructures/content-message-listener.js index 00dba51..8a361c1 100644 --- a/src/background/infrastructures/content-message-listener.js +++ b/src/background/infrastructures/content-message-listener.js @@ -2,12 +2,14 @@ import messages from '../../shared/messages'; import CompletionsController from '../controllers/completions'; import SettingController from '../controllers/setting'; import FindController from '../controllers/find'; +import AddonEnabledController from '../controllers/addon-enabled'; export default class ContentMessageListener { constructor() { this.settingController = new SettingController(); this.completionsController = new CompletionsController(); this.findController = new FindController(); + this.addonEnabledController = new AddonEnabledController(); } run() { @@ -35,6 +37,8 @@ export default class ContentMessageListener { return this.onFindGetKeyword(); case messages.FIND_SET_KEYWORD: return this.onFindSetKeyword(message.keyword); + case messages.ADDON_ENABLED_RESPONSE: + return this.onAddonEnabledResponse(message.enabled); } } @@ -58,4 +62,8 @@ export default class ContentMessageListener { onFindSetKeyword(keyword) { return this.findController.setKeyword(keyword); } + + onAddonEnabledResponse(enabled) { + return this.addonEnabledController.indicate(enabled); + } } diff --git a/src/background/presenters/indicator.js b/src/background/presenters/indicator.js new file mode 100644 index 0000000..5737519 --- /dev/null +++ b/src/background/presenters/indicator.js @@ -0,0 +1,12 @@ +export default class IndicatorPresenter { + indicate(enabled) { + let path = enabled + ? 'resources/enabled_32x32.png' + : 'resources/disabled_32x32.png'; + return browser.browserAction.setIcon({ path }); + } + + onClick(listener) { + browser.browserAction.onClicked.addListener(listener); + } +} diff --git a/src/background/presenters/tab.js b/src/background/presenters/tab.js index 8f60535..6120f6e 100644 --- a/src/background/presenters/tab.js +++ b/src/background/presenters/tab.js @@ -2,4 +2,8 @@ export default class TabPresenter { create(url) { browser.tabs.create({ url, }); } + + onSelected(listener) { + browser.tabs.onActivated.addListener(listener); + } } diff --git a/src/background/usecases/addon-enabled.js b/src/background/usecases/addon-enabled.js new file mode 100644 index 0000000..37eb1c2 --- /dev/null +++ b/src/background/usecases/addon-enabled.js @@ -0,0 +1,29 @@ +import IndicatorPresenter from '../presenters/indicator'; +import TabPresenter from '../presenters/tab'; +import ContentMessageClient from '../infrastructures/content-message-client'; + +export default class AddonEnabledInteractor { + constructor() { + this.indicatorPresentor = new IndicatorPresenter(); + + this.indicatorPresentor.onClick(tab => this.onIndicatorClick(tab.id)); + + this.tabPresenter = new TabPresenter(); + this.tabPresenter.onSelected(info => this.onTabSelected(info.tabId)); + + this.contentMessageClient = new ContentMessageClient(); + } + + indicate(enabled) { + this.indicatorPresentor.indicate(enabled); + } + + onIndicatorClick(tabId) { + return this.contentMessageClient.toggleAddonEnabled(tabId); + } + + async onTabSelected(tabId) { + let enabled = await this.contentMessageClient.getAddonEnabled(tabId); + return this.indicatorPresentor.indicate(enabled); + } +}