From 129aae38df1a17a5850898d5832bb8112ead3cbb Mon Sep 17 00:00:00 2001 From: Shin'ya Ueoka Date: Sun, 6 May 2018 22:30:04 +0900 Subject: [PATCH] Indicator shows the add-on enabled --- manifest.json | 6 ++++ resources/disabled_32x32.png | Bin 0 -> 1426 bytes resources/enabled_32x32.png | Bin 0 -> 1504 bytes src/background/components/indicator.js | 38 ++++++++++++++++++++ src/background/index.js | 8 +++-- src/background/shared/indicators.js | 13 +++++++ src/content/components/common/index.js | 14 ++++++++ src/content/components/top-content/index.js | 7 ++++ src/shared/messages.js | 3 ++ 9 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 resources/disabled_32x32.png create mode 100644 resources/enabled_32x32.png create mode 100644 src/background/components/indicator.js create mode 100644 src/background/shared/indicators.js diff --git a/manifest.json b/manifest.json index 4c43b64..39d14f4 100644 --- a/manifest.json +++ b/manifest.json @@ -40,5 +40,11 @@ ], "options_ui": { "page": "build/settings.html" + }, + "browser_action": { + "default_icon": { + "32": "resources/enabled_32x32.png" + }, + "default_title": "Vim Vixen" } } diff --git a/resources/disabled_32x32.png b/resources/disabled_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..d3b88db809fc3fde05057fe81245afabff11cd1b GIT binary patch literal 1426 zcmV;D1#S9?P)_2000McNliru;spf_Ckex+_W1w+1s_R7 zK~z}7wUPIuinwwy*$=|`j{X)H$|!1PiCRis+3siIzyN<%qN zaX?6D4;+vX2N1b&qoPs}k$M0jfl4W~Avm^5P%4^B;*i93Y|ByYwX@0E!vWj1-Pn!W zG_h#RWDFArAUUOexUuYinyS34*W~2n1f;OUFK+&oDMNc5`!c^V4`d?qrNP$~pr8P)cIp%gbh~)%ug)?|*ZTqUK#L*SxOluRM70fRv`UY5*8xaR3Ye^7%YgR#vFpZol@d z5W!%O7X;xx$8krZ(P*`5y#`=rW<~>$C{LzRDP%GkBFpkOfk0sNY17X0{9k6Xxo2r< z35>C7^}jU$CHbe?A{vc?Qflbz?40uZ{hn3<91h3rj*gBa@pv4ns@CWjWA~p3plKSC z$s~+MBemIVw*rBHtA*5mZL`@%ip3&gvDi)~j{`8qBK1~lYij@iK@bE{6z`rrd$#>a z&d;4Y_mLz?7XTocOk!(mtKMWW6bhxw1FlLjQ*Wth8Xi7;2(#G?Q50>uu7?2}86O`X z0Wd@e=_$c40f@xoahD`X3L*a=_CzA_7$9Tp&+2gnAeYPi-QM1=0;q{Hkx0O7HUj`U zIy#=ebm>xt5F%FFlpWgbc1B8rd_MnJ?Mt?QRF5kqn4h07>{NzyI*mf1@MwX-AT~;W z**O4YGMPqZGdlt_DuX0Rpp>@!8A_6b?(XjT>1|5s-G%^!klWQ`x7!W3+x=8ch!BGA z?(UlPjIr?a^mM)<0AuWD02%-|ole;8_GfOzcDo%;r?Wi#p5V6j-5?kWfZ1VI4L^EiC?FuJ z78e%_xm=DCLe2xYPD+RG+KCeV!Z literal 0 HcmV?d00001 diff --git a/resources/enabled_32x32.png b/resources/enabled_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..eaf286262f6b2121c694eb22d81e4ad5563c1ff3 GIT binary patch literal 1504 zcmV<61t0o}P))y)j-W5wk@D7Z8mmA~HnBHV8q7D1*U(u`jlD zr5|tKs>=bX3a92J1q$epv!aigea<&!z%T`*V%i>}sF4r{a-Wb*@91zi-X4NI0~+`})OV z9a)r2jR2U01`rL0xYpj9o0mWD$D;QG&&-B*XU4V#-YZ0DU8yNL*L6WPW|dsKbS5PuZ>0l#Oa$mo2K&1^7#{2u4wv`q zqCJ(H|Cf6m%AJCOv)OqCzN`PXBBh>^6j##$M%0$t|JtRqsH#D6IE%k?eXuexQ~&vn zwT-rXcS+BUON4@b=}DanQvyW7LHfF{U@*>6?RL-cqCEl6bj`hctG>!}%&U^R&dtuh z#;J&n10ZS1EbF>@0gz;wv&}i#_A`aMms_VYFW$TAU3;N#J3w#uWnz(VW=T7r(VuJ> zQWC#sRz|`>h6ZktV=KgxW4CKsw7CmP$`3qSr7L>50zLp8E-Sjy($&@Gam@AB2{H1q z_ugzDODOpxwK)pV9XrQd<1mmm%f7BFF&30G|>Bjyno{6c(4 zgaGA>FTAd(>g-QH2?47v#*D9K#74CI%jc}BL2CyJ?iWBpy-|baJ73!ngp?IfjIoy| zHJ4yHt7Ez@CoC~_N-Ssf(IawvIkMvF3wM1179QP@C8XFnSuaDM#M-K3ZP6#Jv9{<~ zTXhWmlM_fO-duQeLlz|Ng4_Yy6B1mLb<*sDV6}>7pSUKtTEWl@=v&vrlGd@ZEaW;LT&{Pi^RuwaFcy?$0q0M9RkrIgg7asypmXO!{)c|i* zR#v_@opGmq=*7JN literal 0 HcmV?d00001 diff --git a/src/background/components/indicator.js b/src/background/components/indicator.js new file mode 100644 index 0000000..ccdcc74 --- /dev/null +++ b/src/background/components/indicator.js @@ -0,0 +1,38 @@ +import * as indicators from '../shared/indicators'; +import messages from 'shared/messages'; + +export default class IndicatorComponent { + constructor(store) { + this.store = store; + + messages.onMessage(this.onMessage.bind(this)); + + browser.tabs.onActivated.addListener((info) => { + return browser.tabs.query({ currentWindow: true }).then(() => { + return this.onTabActivated(info); + }); + }); + } + + onTabActivated(info) { + return browser.tabs.sendMessage(info.tabId, { + type: messages.ADDON_ENABLED_QUERY, + }).then((resp) => { + return this.updateIndicator(resp.enabled); + }); + } + + onMessage(message) { + switch (message.type) { + case messages.ADDON_ENABLED_RESPONSE: + return this.updateIndicator(message.enabled); + } + } + + updateIndicator(enabled) { + if (enabled) { + return indicators.enable(); + } + return indicators.disable(); + } +} diff --git a/src/background/index.js b/src/background/index.js index be042ce..3f1013c 100644 --- a/src/background/index.js +++ b/src/background/index.js @@ -3,6 +3,7 @@ import messages from 'shared/messages'; 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 } from 'shared/store'; import * as versions from 'shared/versions'; @@ -16,12 +17,13 @@ const store = createStore(reducers, (e, sender) => { }); } }); -// eslint-disable-next-line no-unused-vars + +/* eslint-disable no-unused-vars */ const backgroundComponent = new BackgroundComponent(store); -// eslint-disable-next-line no-unused-vars const operationComponent = new OperationComponent(store); -// eslint-disable-next-line no-unused-vars const tabComponent = new TabComponent(store); +const indicatorComponent = new IndicatorComponent(store); +/* eslint-enable no-unused-vars */ store.dispatch(settingActions.load()); diff --git a/src/background/shared/indicators.js b/src/background/shared/indicators.js new file mode 100644 index 0000000..74002c4 --- /dev/null +++ b/src/background/shared/indicators.js @@ -0,0 +1,13 @@ +const enable = () => { + return browser.browserAction.setIcon({ + path: 'resources/enabled_32x32.png', + }); +}; + +const disable = () => { + return browser.browserAction.setIcon({ + path: 'resources/disabled_32x32.png', + }); +}; + +export { enable, disable }; diff --git a/src/content/components/common/index.js b/src/content/components/common/index.js index 565632c..c5d1df7 100644 --- a/src/content/components/common/index.js +++ b/src/content/components/common/index.js @@ -14,10 +14,12 @@ export default class Common { input.onKey(key => keymapper.key(key)); this.store = store; + this.prevEnabled = this.store.getState().addon.enabled; this.reloadSettings(); messages.onMessage(this.onMessage.bind(this)); + store.subscribe(() => this.update()); } onMessage(message) { @@ -27,6 +29,18 @@ export default class Common { } } + update() { + let enabled = this.store.getState().addon.enabled; + if (enabled !== this.prevEnabled) { + this.prevEnabled = enabled; + + browser.runtime.sendMessage({ + type: messages.ADDON_ENABLED_RESPONSE, + enabled, + }); + } + } + reloadSettings() { browser.runtime.sendMessage({ type: messages.SETTINGS_QUERY, diff --git a/src/content/components/top-content/index.js b/src/content/components/top-content/index.js index cf21ec4..cb9e160 100644 --- a/src/content/components/top-content/index.js +++ b/src/content/components/top-content/index.js @@ -48,11 +48,18 @@ export default class TopContent { } onMessage(message) { + let addonState = this.store.getState().addon; + switch (message.type) { case messages.CONSOLE_UNFOCUS: this.win.focus(); consoleFrames.blur(window.document); return Promise.resolve(); + case messages.ADDON_ENABLED_QUERY: + return Promise.resolve({ + type: messages.ADDON_ENABLED_RESPONSE, + enabled: addonState.enabled, + }); } } } diff --git a/src/shared/messages.js b/src/shared/messages.js index a404658..2a286bf 100644 --- a/src/shared/messages.js +++ b/src/shared/messages.js @@ -48,6 +48,9 @@ export default { FIND_GET_KEYWORD: 'find.get.keyword', FIND_SET_KEYWORD: 'find.set.keyword', + ADDON_ENABLED_QUERY: 'addon.enabled.query', + ADDON_ENABLED_RESPONSE: 'addon.enabled.response', + OPEN_URL: 'open.url', SETTINGS_RELOAD: 'settings.reload',