index.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. /**
  2. * FeHelper Options Page
  3. */
  4. import Settings from './settings.js';
  5. import Awesome from '../background/awesome.js'
  6. import MSG_TYPE from '../static/js/common.js';
  7. new Vue({
  8. el: '#pageContainer',
  9. data: {
  10. es6Support:true,
  11. defaultKey: 'Alt+Shift+J',
  12. selectedOpts: [],
  13. manifest: {},
  14. fhTools: {},
  15. menuFeHelperSeting: false,
  16. menuDownloadCrx: false,
  17. sortArray: [],
  18. donate: {
  19. text: '微信打赏!鼓励升级!',
  20. image: './donate.jpeg'
  21. },
  22. countDown: 0,
  23. isFirefox: /Firefox/.test(navigator.userAgent)
  24. },
  25. created: function () {
  26. // 页面滤镜:关掉
  27. !this.isFirefox && DarkModeMgr.turnLightAuto();
  28. this.initData().then(() => {
  29. this.shortCut();
  30. this.remoteHotFix();
  31. });
  32. },
  33. methods: {
  34. initData: async function () {
  35. this.manifest = chrome.runtime.getManifest();
  36. Settings.getOptions((opts) => {
  37. this.selectedOpts = Object.keys(opts).filter(k => String(opts[k]) === 'true');
  38. });
  39. this.sortArray = await Awesome.SortToolMgr.get();
  40. // 获取两个特殊右键菜单项的安装情况
  41. Awesome.menuMgr('fehelper-setting', 'get').then(value => {
  42. this.menuFeHelperSeting = String(value) !== '0';
  43. });
  44. Awesome.menuMgr('download-crx', 'get').then(value => {
  45. this.menuDownloadCrx = String(value) === '1';
  46. });
  47. Awesome.getAllTools().then(tools => {
  48. this.fhTools = tools;
  49. let isSortArrEmpty = !this.sortArray.length;
  50. Object.keys(tools).forEach(tool => {
  51. if (tools[tool].installed) {
  52. isSortArrEmpty && (tool !== 'devtools') && this.sortArray.push(tool);
  53. }
  54. });
  55. this.sortTools();
  56. });
  57. },
  58. shortCut: function () {
  59. // 获取当前热键
  60. chrome.commands && chrome.commands.getAll && chrome.commands.getAll(keys => {
  61. keys.some(key => {
  62. if (key.name === '_execute_browser_action' && key.shortcut) {
  63. this.defaultKey = key.shortcut;
  64. return true;
  65. }
  66. });
  67. });
  68. },
  69. sortTools: function (repaintMenu) {
  70. let tools = {};
  71. let installed = {};
  72. Object.keys(this.fhTools).forEach(tool => {
  73. if (this.fhTools[tool].installed) {
  74. installed[tool] = this.fhTools[tool];
  75. }
  76. });
  77. if (this.sortArray.length) {
  78. this.sortArray.forEach(tool => {
  79. tools[tool] = installed[tool];
  80. });
  81. Awesome.SortToolMgr.set(this.sortArray);
  82. } else {
  83. tools = installed;
  84. }
  85. Object.keys(this.fhTools).forEach(tool => {
  86. if (!tools[tool]) {
  87. tools[tool] = this.fhTools[tool];
  88. }
  89. });
  90. this.fhTools = tools;
  91. this.$forceUpdate();
  92. // 重绘右键菜单,以确保排序实时更新
  93. repaintMenu && chrome.runtime.sendMessage({
  94. type: MSG_TYPE.DYNAMIC_TOOL_INSTALL_OR_OFFLOAD,
  95. action: `menu-upgrade`,
  96. showTips: false,
  97. menuOnly: true
  98. });
  99. },
  100. sortUp: function (index) {
  101. if(index == 0) return;
  102. this.sortArray[index] = this.sortArray.splice(index - 1, 1, this.sortArray[index])[0];
  103. this.sortTools(true);
  104. },
  105. sortDown: function (index) {
  106. if(index == this.sortArray.length-1) return;
  107. this.sortArray[index] = this.sortArray.splice(index + 1, 1, this.sortArray[index])[0];
  108. this.sortTools(true);
  109. },
  110. remoteHotFix: function () {
  111. let hotfix = () => {
  112. // 从服务器同步最新添加的一些工具,实现远程更新,无需提审FeHelper
  113. let remoteHotfixUrl = `${this.manifest.homepage_url}/static/js/hotfix.js?time=${new Date().toLocaleDateString()}`;
  114. fetch(remoteHotfixUrl).then(resp => resp.text()).then(jsText => {
  115. try {
  116. if (!jsText) return false;
  117. window.evalCore.getEvalInstance(window)(jsText);
  118. } catch (e) {
  119. }
  120. }).catch(error => console.log('远程热修复失败:', error));
  121. };
  122. setTimeout(hotfix, 2000);
  123. },
  124. close: () => {
  125. chrome.tabs.query({active: true, currentWindow: true}, (tabs) => {
  126. chrome.tabs.remove(tabs[0].id);
  127. });
  128. },
  129. cancel: function () {
  130. this.close();
  131. },
  132. save: function () {
  133. // 还要保存两个特殊的菜单配置项
  134. let settingAction = this.menuFeHelperSeting ? 'install' : 'offload';
  135. let crxAction = this.menuDownloadCrx ? 'install' : 'offload';
  136. Awesome.menuMgr('fehelper-setting', settingAction).then(() => {
  137. Awesome.menuMgr('download-crx', crxAction).then(() => {
  138. chrome.runtime.sendMessage({
  139. type: MSG_TYPE.DYNAMIC_TOOL_INSTALL_OR_OFFLOAD,
  140. action: `menu-${crxAction}`,
  141. showTips: false,
  142. menuOnly: true
  143. }).then(() => {
  144. Settings.setOptions(this.selectedOpts, () => {
  145. // 保存成功提示,同时更新Menu
  146. chrome.runtime.sendMessage({
  147. type: MSG_TYPE.DYNAMIC_ANY_THING,
  148. thing: 'save-options'
  149. });
  150. // 自动开关灯一次
  151. DarkModeMgr.turnLightAuto();
  152. });
  153. });
  154. });
  155. });
  156. },
  157. setShortcuts: function () {
  158. chrome.tabs.create({
  159. url: 'chrome://extensions/shortcuts'
  160. });
  161. return false;
  162. },
  163. donateToggle: function (event) {
  164. let box = this.$refs.boxDonate;
  165. if (box.classList.contains('hide')) {
  166. box.classList.remove('hide');
  167. box.style.top = (event.target.offsetTop + 30) + 'px';
  168. box.style.left = event.target.offsetLeft + 'px';
  169. } else {
  170. box.classList.add('hide');
  171. }
  172. },
  173. install: function (tool, event) {
  174. let btn = event.target;
  175. if (btn.tagName.toLowerCase() === 'i') {
  176. btn = btn.parentNode;
  177. }
  178. if (btn.getAttribute('data-undergoing') === '1') {
  179. return false;
  180. }
  181. btn.setAttribute('data-undergoing', 1);
  182. let elProgress = btn.querySelector('span.x-progress');
  183. // 显示安装进度
  184. let pt = 1;
  185. Awesome.install(tool).then(() => {
  186. elProgress.textContent = `(${pt}%)`;
  187. let ptInterval = setInterval(() => {
  188. elProgress.textContent = `(${pt}%)`;
  189. pt+= Math.floor(Math.random() * 20);
  190. if(pt>100) {
  191. clearInterval(ptInterval);
  192. elProgress.textContent = ``;
  193. this.fhTools[tool].installed = true;
  194. if (!this.sortArray.includes(tool) && (tool !== 'devtools')) {
  195. this.sortArray.push(tool);
  196. }
  197. // 按照安装状态进行排序
  198. this.sortTools();
  199. btn.setAttribute('data-undergoing', 0);
  200. chrome.runtime.sendMessage({
  201. type: MSG_TYPE.DYNAMIC_TOOL_INSTALL_OR_OFFLOAD,
  202. toolName: tool,
  203. action: 'install',
  204. showTips: true
  205. });
  206. }
  207. },100);
  208. });
  209. },
  210. offLoad: function (tool, event) {
  211. if (event.target.getAttribute('data-undergoing') === '1') {
  212. return false;
  213. }
  214. event.target.setAttribute('data-undergoing', 1);
  215. Awesome.offLoad(tool).then(() => {
  216. chrome.runtime.sendMessage({
  217. type: MSG_TYPE.DYNAMIC_TOOL_INSTALL_OR_OFFLOAD,
  218. action: 'offload',
  219. showTips: true
  220. });
  221. this.fhTools[tool].installed = false;
  222. event.target.setAttribute('data-undergoing', 0);
  223. let index = this.sortArray.indexOf(tool);
  224. index !== -1 && this.sortArray.splice(index, 1);
  225. // 继续移除右键菜单
  226. Awesome.menuMgr(tool, 'offload').then(() => {
  227. this.fhTools[tool].menu = false;
  228. chrome.runtime.sendMessage({
  229. type: MSG_TYPE.DYNAMIC_TOOL_INSTALL_OR_OFFLOAD,
  230. action: `menu-offload`,
  231. showTips: false,
  232. menuOnly: true
  233. });
  234. // 按照安装状态进行排序
  235. this.sortTools();
  236. });
  237. });
  238. },
  239. menuMgr: function (tool, event) {
  240. if (event.target.getAttribute('data-undergoing') === '1') {
  241. return false;
  242. }
  243. event.target.setAttribute('data-undergoing', 1);
  244. let offLoadMode = this.fhTools[tool].menu;
  245. let action = offLoadMode ? 'offload' : 'install';
  246. Awesome.menuMgr(tool, action).then(() => {
  247. chrome.runtime.sendMessage({
  248. type: MSG_TYPE.DYNAMIC_TOOL_INSTALL_OR_OFFLOAD,
  249. action: `menu-${action}`,
  250. showTips: true,
  251. menuOnly: true
  252. });
  253. this.fhTools[tool].menu = !offLoadMode;
  254. event.target.setAttribute('data-undergoing', 0);
  255. // 页面强制刷新渲染
  256. this.$forceUpdate();
  257. });
  258. },
  259. turnLight(event) {
  260. event.preventDefault();
  261. event.stopPropagation();
  262. DarkModeMgr.turnLight(true);
  263. this.countDown = 5;
  264. let intervalId = setInterval(() => {
  265. if (this.countDown === 0) {
  266. DarkModeMgr.turnLight(false);
  267. clearInterval(intervalId);
  268. } else {
  269. this.countDown--;
  270. }
  271. }, 1000);
  272. },
  273. openFeOnline: function () {
  274. chrome.tabs.create({
  275. url: this.manifest.homepage_url
  276. });
  277. }
  278. }
  279. });