index.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  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] && 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] && this.fhTools[tool].installed) {
  74. installed[tool] = this.fhTools[tool];
  75. }
  76. });
  77. if (this.sortArray.length) {
  78. this.sortArray.forEach(tool => {
  79. if (this.fhTools[tool]) {
  80. tools[tool] = installed[tool];
  81. }else{
  82. Awesome.offLoad(tool);
  83. }
  84. });
  85. Awesome.SortToolMgr.set(this.sortArray);
  86. } else {
  87. tools = installed;
  88. }
  89. Object.keys(this.fhTools).forEach(tool => {
  90. if (!tools[tool]) {
  91. tools[tool] = this.fhTools[tool];
  92. }
  93. });
  94. this.fhTools = tools;
  95. this.$forceUpdate();
  96. // 重绘右键菜单,以确保排序实时更新
  97. repaintMenu && chrome.runtime.sendMessage({
  98. type: MSG_TYPE.DYNAMIC_TOOL_INSTALL_OR_OFFLOAD,
  99. action: `menu-upgrade`,
  100. showTips: false,
  101. menuOnly: true
  102. });
  103. },
  104. sortUp: function (index) {
  105. if(index == 0) return;
  106. this.sortArray[index] = this.sortArray.splice(index - 1, 1, this.sortArray[index])[0];
  107. this.sortTools(true);
  108. },
  109. sortDown: function (index) {
  110. if(index == this.sortArray.length-1) return;
  111. this.sortArray[index] = this.sortArray.splice(index + 1, 1, this.sortArray[index])[0];
  112. this.sortTools(true);
  113. },
  114. remoteHotFix: function () {
  115. let hotfix = () => {
  116. // 从服务器同步最新添加的一些工具,实现远程更新,无需提审FeHelper
  117. let remoteHotfixUrl = `${this.manifest.homepage_url}/static/js/hotfix.js?cur_ver=${new Date().toLocaleDateString()}`;
  118. fetch(remoteHotfixUrl).then(resp => resp.text()).then(jsText => {
  119. try {
  120. if (!jsText) return false;
  121. window.evalCore.getEvalInstance(window)(jsText);
  122. } catch (e) {
  123. }
  124. }).catch(error => console.log('远程热修复失败:', error));
  125. };
  126. setTimeout(hotfix, 2000);
  127. },
  128. close: () => {
  129. chrome.tabs.query({active: true, currentWindow: true}, (tabs) => {
  130. chrome.tabs.remove(tabs[0].id);
  131. });
  132. },
  133. cancel: function () {
  134. this.close();
  135. },
  136. save: function () {
  137. // 还要保存两个特殊的菜单配置项
  138. let settingAction = this.menuFeHelperSeting ? 'install' : 'offload';
  139. let crxAction = this.menuDownloadCrx ? 'install' : 'offload';
  140. Awesome.menuMgr('fehelper-setting', settingAction).then(() => {
  141. Awesome.menuMgr('download-crx', crxAction).then(() => {
  142. chrome.runtime.sendMessage({
  143. type: MSG_TYPE.DYNAMIC_TOOL_INSTALL_OR_OFFLOAD,
  144. action: `menu-${crxAction}`,
  145. showTips: false,
  146. menuOnly: true
  147. }).then(() => {
  148. Settings.setOptions(this.selectedOpts, () => {
  149. // 保存成功提示,同时更新Menu
  150. chrome.runtime.sendMessage({
  151. type: MSG_TYPE.DYNAMIC_ANY_THING,
  152. thing: 'save-options'
  153. });
  154. // 自动开关灯一次
  155. DarkModeMgr.turnLightAuto();
  156. });
  157. });
  158. });
  159. });
  160. },
  161. setShortcuts: function () {
  162. chrome.tabs.create({
  163. url: 'chrome://extensions/shortcuts'
  164. });
  165. return false;
  166. },
  167. donateToggle: function (type) {
  168. let box = this.$refs.boxDonate;
  169. if (type === 1) {
  170. box.classList.remove('hide');
  171. } else {
  172. box.classList.add('hide');
  173. }
  174. },
  175. install: function (tool, event) {
  176. let btn = event.target;
  177. if (btn.tagName.toLowerCase() === 'i') {
  178. btn = btn.parentNode;
  179. }
  180. if (btn.getAttribute('data-undergoing') === '1') {
  181. return false;
  182. }
  183. btn.setAttribute('data-undergoing', 1);
  184. let elProgress = btn.querySelector('span.x-progress');
  185. // 显示安装进度
  186. let pt = 1;
  187. Awesome.install(tool).then(() => {
  188. elProgress.textContent = `(${pt}%)`;
  189. let ptInterval = setInterval(() => {
  190. elProgress.textContent = `(${pt}%)`;
  191. pt+= Math.floor(Math.random() * 20);
  192. if(pt>100) {
  193. clearInterval(ptInterval);
  194. elProgress.textContent = ``;
  195. this.fhTools[tool].installed = true;
  196. if (!this.sortArray.includes(tool) && (tool !== 'devtools')) {
  197. this.sortArray.push(tool);
  198. }
  199. // 按照安装状态进行排序
  200. this.sortTools();
  201. btn.setAttribute('data-undergoing', 0);
  202. chrome.runtime.sendMessage({
  203. type: MSG_TYPE.DYNAMIC_TOOL_INSTALL_OR_OFFLOAD,
  204. toolName: tool,
  205. action: 'install',
  206. showTips: true
  207. });
  208. }
  209. },100);
  210. });
  211. },
  212. offLoad: function (tool, event) {
  213. if(!confirm('防止误操作;请再次确认是否要卸载这个工具?')) {
  214. return;
  215. }
  216. if (event.target.getAttribute('data-undergoing') === '1') {
  217. return false;
  218. }
  219. event.target.setAttribute('data-undergoing', 1);
  220. Awesome.offLoad(tool).then(() => {
  221. chrome.runtime.sendMessage({
  222. type: MSG_TYPE.DYNAMIC_TOOL_INSTALL_OR_OFFLOAD,
  223. action: 'offload',
  224. showTips: true
  225. });
  226. this.fhTools[tool].installed = false;
  227. event.target.setAttribute('data-undergoing', 0);
  228. let index = this.sortArray.indexOf(tool);
  229. index !== -1 && this.sortArray.splice(index, 1);
  230. // 继续移除右键菜单
  231. Awesome.menuMgr(tool, 'offload').then(() => {
  232. this.fhTools[tool].menu = false;
  233. chrome.runtime.sendMessage({
  234. type: MSG_TYPE.DYNAMIC_TOOL_INSTALL_OR_OFFLOAD,
  235. action: `menu-offload`,
  236. showTips: false,
  237. menuOnly: true
  238. });
  239. // 按照安装状态进行排序
  240. this.sortTools();
  241. });
  242. });
  243. },
  244. menuMgr: function (tool, event) {
  245. if (event.target.getAttribute('data-undergoing') === '1') {
  246. return false;
  247. }
  248. event.target.setAttribute('data-undergoing', 1);
  249. let offLoadMode = this.fhTools[tool].menu;
  250. let action = offLoadMode ? 'offload' : 'install';
  251. Awesome.menuMgr(tool, action).then(() => {
  252. chrome.runtime.sendMessage({
  253. type: MSG_TYPE.DYNAMIC_TOOL_INSTALL_OR_OFFLOAD,
  254. action: `menu-${action}`,
  255. showTips: true,
  256. menuOnly: true
  257. });
  258. this.fhTools[tool].menu = !offLoadMode;
  259. event.target.setAttribute('data-undergoing', 0);
  260. // 页面强制刷新渲染
  261. this.$forceUpdate();
  262. });
  263. },
  264. turnLight(event) {
  265. event.preventDefault();
  266. event.stopPropagation();
  267. DarkModeMgr.turnLight(true);
  268. this.countDown = 5;
  269. let intervalId = setInterval(() => {
  270. if (this.countDown === 0) {
  271. DarkModeMgr.turnLight(false);
  272. clearInterval(intervalId);
  273. } else {
  274. this.countDown--;
  275. }
  276. }, 1000);
  277. },
  278. openFeOnline: function () {
  279. chrome.tabs.create({
  280. url: this.manifest.homepage_url
  281. });
  282. }
  283. }
  284. });