| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323 |
- /**
- * FeHelper Options Page
- */
- import Settings from './settings.js';
- import Awesome from '../background/awesome.js'
- import MSG_TYPE from '../static/js/common.js';
- new Vue({
- el: '#pageContainer',
- data: {
- es6Support:true,
- defaultKey: 'Alt+Shift+J',
- selectedOpts: [],
- manifest: {},
- fhTools: {},
- menuFeHelperSeting: false,
- menuDownloadCrx: false,
- sortArray: [],
- donate: {
- text: '微信打赏!鼓励升级!',
- image: './donate.jpeg'
- },
- countDown: 0,
- isFirefox: /Firefox/.test(navigator.userAgent)
- },
- created: function () {
- // 页面滤镜:关掉
- !this.isFirefox && DarkModeMgr.turnLightAuto();
- this.initData().then(() => {
- this.shortCut();
- this.remoteHotFix();
- });
- },
- methods: {
- initData: async function () {
- this.manifest = chrome.runtime.getManifest();
- Settings.getOptions((opts) => {
- this.selectedOpts = Object.keys(opts).filter(k => String(opts[k]) === 'true');
- });
- this.sortArray = await Awesome.SortToolMgr.get();
- // 获取两个特殊右键菜单项的安装情况
- Awesome.menuMgr('fehelper-setting', 'get').then(value => {
- this.menuFeHelperSeting = String(value) !== '0';
- });
- Awesome.menuMgr('download-crx', 'get').then(value => {
- this.menuDownloadCrx = String(value) === '1';
- });
- Awesome.getAllTools().then(tools => {
- this.fhTools = tools;
- let isSortArrEmpty = !this.sortArray.length;
- Object.keys(tools).forEach(tool => {
- if (tools[tool].installed) {
- isSortArrEmpty && (tool !== 'devtools') && this.sortArray.push(tool);
- }
- });
- this.sortTools();
- });
- },
- shortCut: function () {
- // 获取当前热键
- chrome.commands && chrome.commands.getAll && chrome.commands.getAll(keys => {
- keys.some(key => {
- if (key.name === '_execute_browser_action' && key.shortcut) {
- this.defaultKey = key.shortcut;
- return true;
- }
- });
- });
- },
- sortTools: function (repaintMenu) {
- let tools = {};
- let installed = {};
- Object.keys(this.fhTools).forEach(tool => {
- if (this.fhTools[tool].installed) {
- installed[tool] = this.fhTools[tool];
- }
- });
- if (this.sortArray.length) {
- this.sortArray.forEach(tool => {
- tools[tool] = installed[tool];
- });
- Awesome.SortToolMgr.set(this.sortArray);
- } else {
- tools = installed;
- }
- Object.keys(this.fhTools).forEach(tool => {
- if (!tools[tool]) {
- tools[tool] = this.fhTools[tool];
- }
- });
- this.fhTools = tools;
- this.$forceUpdate();
- // 重绘右键菜单,以确保排序实时更新
- repaintMenu && chrome.runtime.sendMessage({
- type: MSG_TYPE.DYNAMIC_TOOL_INSTALL_OR_OFFLOAD,
- action: `menu-upgrade`,
- showTips: false,
- menuOnly: true
- });
- },
- sortUp: function (index) {
- if(index == 0) return;
- this.sortArray[index] = this.sortArray.splice(index - 1, 1, this.sortArray[index])[0];
- this.sortTools(true);
- },
- sortDown: function (index) {
- if(index == this.sortArray.length-1) return;
- this.sortArray[index] = this.sortArray.splice(index + 1, 1, this.sortArray[index])[0];
- this.sortTools(true);
- },
- remoteHotFix: function () {
- let hotfix = () => {
- // 从服务器同步最新添加的一些工具,实现远程更新,无需提审FeHelper
- let remoteHotfixUrl = `${this.manifest.homepage_url}/static/js/hotfix.js?time=${new Date().toLocaleDateString()}`;
- fetch(remoteHotfixUrl).then(resp => resp.text()).then(jsText => {
- try {
- if (!jsText) return false;
- window.evalCore.getEvalInstance(window)(jsText);
- } catch (e) {
- }
- }).catch(error => console.log('远程热修复失败:', error));
- };
- setTimeout(hotfix, 2000);
- },
- close: () => {
- chrome.tabs.query({active: true, currentWindow: true}, (tabs) => {
- chrome.tabs.remove(tabs[0].id);
- });
- },
- cancel: function () {
- this.close();
- },
- save: function () {
- // 还要保存两个特殊的菜单配置项
- let settingAction = this.menuFeHelperSeting ? 'install' : 'offload';
- let crxAction = this.menuDownloadCrx ? 'install' : 'offload';
- Awesome.menuMgr('fehelper-setting', settingAction).then(() => {
- Awesome.menuMgr('download-crx', crxAction).then(() => {
- chrome.runtime.sendMessage({
- type: MSG_TYPE.DYNAMIC_TOOL_INSTALL_OR_OFFLOAD,
- action: `menu-${crxAction}`,
- showTips: false,
- menuOnly: true
- }).then(() => {
- Settings.setOptions(this.selectedOpts, () => {
- // 保存成功提示,同时更新Menu
- chrome.runtime.sendMessage({
- type: MSG_TYPE.DYNAMIC_ANY_THING,
- thing: 'save-options'
- });
- // 自动开关灯一次
- DarkModeMgr.turnLightAuto();
- });
- });
- });
- });
- },
- setShortcuts: function () {
- chrome.tabs.create({
- url: 'chrome://extensions/shortcuts'
- });
- return false;
- },
- donateToggle: function (event) {
- let box = this.$refs.boxDonate;
- if (box.classList.contains('hide')) {
- box.classList.remove('hide');
- box.style.top = (event.target.offsetTop + 30) + 'px';
- box.style.left = event.target.offsetLeft + 'px';
- } else {
- box.classList.add('hide');
- }
- },
- install: function (tool, event) {
- let btn = event.target;
- if (btn.tagName.toLowerCase() === 'i') {
- btn = btn.parentNode;
- }
- if (btn.getAttribute('data-undergoing') === '1') {
- return false;
- }
- btn.setAttribute('data-undergoing', 1);
- let elProgress = btn.querySelector('span.x-progress');
- // 显示安装进度
- let pt = 1;
- Awesome.install(tool).then(() => {
- elProgress.textContent = `(${pt}%)`;
- let ptInterval = setInterval(() => {
- elProgress.textContent = `(${pt}%)`;
- pt+= Math.floor(Math.random() * 20);
- if(pt>100) {
- clearInterval(ptInterval);
- elProgress.textContent = ``;
- this.fhTools[tool].installed = true;
- if (!this.sortArray.includes(tool) && (tool !== 'devtools')) {
- this.sortArray.push(tool);
- }
- // 按照安装状态进行排序
- this.sortTools();
- btn.setAttribute('data-undergoing', 0);
- chrome.runtime.sendMessage({
- type: MSG_TYPE.DYNAMIC_TOOL_INSTALL_OR_OFFLOAD,
- toolName: tool,
- action: 'install',
- showTips: true
- });
- }
- },100);
- });
- },
- offLoad: function (tool, event) {
- if (event.target.getAttribute('data-undergoing') === '1') {
- return false;
- }
- event.target.setAttribute('data-undergoing', 1);
- Awesome.offLoad(tool).then(() => {
- chrome.runtime.sendMessage({
- type: MSG_TYPE.DYNAMIC_TOOL_INSTALL_OR_OFFLOAD,
- action: 'offload',
- showTips: true
- });
- this.fhTools[tool].installed = false;
- event.target.setAttribute('data-undergoing', 0);
- let index = this.sortArray.indexOf(tool);
- index !== -1 && this.sortArray.splice(index, 1);
- // 继续移除右键菜单
- Awesome.menuMgr(tool, 'offload').then(() => {
- this.fhTools[tool].menu = false;
- chrome.runtime.sendMessage({
- type: MSG_TYPE.DYNAMIC_TOOL_INSTALL_OR_OFFLOAD,
- action: `menu-offload`,
- showTips: false,
- menuOnly: true
- });
- // 按照安装状态进行排序
- this.sortTools();
- });
- });
- },
- menuMgr: function (tool, event) {
- if (event.target.getAttribute('data-undergoing') === '1') {
- return false;
- }
- event.target.setAttribute('data-undergoing', 1);
- let offLoadMode = this.fhTools[tool].menu;
- let action = offLoadMode ? 'offload' : 'install';
- Awesome.menuMgr(tool, action).then(() => {
- chrome.runtime.sendMessage({
- type: MSG_TYPE.DYNAMIC_TOOL_INSTALL_OR_OFFLOAD,
- action: `menu-${action}`,
- showTips: true,
- menuOnly: true
- });
- this.fhTools[tool].menu = !offLoadMode;
- event.target.setAttribute('data-undergoing', 0);
- // 页面强制刷新渲染
- this.$forceUpdate();
- });
- },
- turnLight(event) {
- event.preventDefault();
- event.stopPropagation();
- DarkModeMgr.turnLight(true);
- this.countDown = 5;
- let intervalId = setInterval(() => {
- if (this.countDown === 0) {
- DarkModeMgr.turnLight(false);
- clearInterval(intervalId);
- } else {
- this.countDown--;
- }
- }, 1000);
- },
- openFeOnline: function () {
- chrome.tabs.create({
- url: this.manifest.homepage_url
- });
- }
- }
- });
|