| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- /**
- * FeHelper 右键菜单管理
- * @type {{manage}}
- * @author zhaoxianlie
- */
- import CrxDownloader from './crx-download.js';
- import Awesome from './awesome.js';
- import toolMap from './tools.js';
- import Settings from '../options/settings.js';
- export default (function () {
- let FeJson = {
- contextMenuId:"fhm_main"
- };
- // 邮件菜单配置项
- let defaultMenuOptions = {
- 'download-crx': {
- icon: '♥',
- text: '插件下载分享',
- onClick: function (info, tab) {
- CrxDownloader.downloadCrx(tab);
- }
- },
- 'fehelper-setting': {
- icon: '❂',
- text: 'FeHelper设置',
- onClick: function (info, tab) {
- chrome.runtime.openOptionsPage();
- }
- }
- };
- // 初始化菜单配置
- let _initMenuOptions = (() => {
- Object.keys(toolMap).forEach(tool => {
- // context-menu
- switch (tool) {
- case 'json-format':
- toolMap[tool].menuConfig[0].onClick = function (info, tab) {
- chrome.scripting.executeScript({
- target: {tabId:tab.id,allFrames:false},
- args: [info.selectionText || ''],
- func: (text) => text
- }, resp => chrome.DynamicToolRunner({
- tool, withContent: resp[0].result
- }));
- };
- break;
- case 'code-beautify':
- case 'en-decode':
- toolMap[tool].menuConfig[0].onClick = function (info, tab) {
- chrome.scripting.executeScript({
- target: {tabId:tab.id,allFrames:false},
- args: [info.linkUrl || info.srcUrl || info.selectionText || info.pageUrl || ''],
- func: (text) => text
- }, resp => chrome.DynamicToolRunner({
- tool, withContent: resp[0].result
- }));
- };
- break;
- case 'qr-code':
- toolMap[tool].menuConfig[0].onClick = function (info, tab) {
- chrome.scripting.executeScript({
- target: {tabId:tab.id,allFrames:false},
- args: [info.linkUrl || info.srcUrl || info.selectionText || info.pageUrl || tab.url || ''],
- func: (text) => text
- }, resp => chrome.DynamicToolRunner({
- tool, withContent: resp[0].result
- }));
- };
- toolMap[tool].menuConfig[1].onClick = function (info, tab) {
- chrome.scripting.executeScript({
- target: {tabId:tab.id,allFrames:false},
- args: [info.srcUrl || ''],
- func: (text) => {
- try {
- if (typeof window.qrcodeContentScript === 'function') {
- let qrcode = window.qrcodeContentScript();
- if (typeof qrcode.decode === 'function') {
- qrcode.decode(text);
- return 1;
- }
- }
- } catch (e) {
- return 0;
- }
- }
- });
- };
- break;
- default:
- toolMap[tool].menuConfig[0].onClick = function (info, tab) {
- chrome.DynamicToolRunner({
- tool, withContent: tool === 'image-base64' ? info.srcUrl : ''
- })
- };
- break;
- }
- });
- })();
- /**
- * 创建一个menu 菜单
- * @param toolName
- * @param menuList
- * @returns {boolean}
- * @private
- */
- let _createItem = (toolName, menuList) => {
- menuList && menuList.forEach && menuList.forEach(menu => {
- // 确保每次创建出来的是一个新的主菜单,防止onClick事件冲突
- let menuItemId = 'fhm_c' + escape(menu.text).replace(/\W/g,'') + new Date*1;
- chrome.contextMenus.create({
- id: menuItemId,
- title: menu.icon + ' ' + menu.text,
- contexts: menu.contexts || ['all'],
- parentId: FeJson.contextMenuId
- });
- chrome.contextMenus.onClicked.addListener(((tool,mId,mFunc) => (info, tab) => {
- if(info.menuItemId === mId) {
- if(mFunc) {
- mFunc(info,tab);
- }else{
- chrome.DynamicToolRunner({ tool });
- }
- }
- })(toolName,menuItemId,menu.onClick));
- });
- };
- /**
- * 绘制一条分割线
- * @private
- */
- let _createSeparator = function () {
- chrome.contextMenus.create({
- id: 'fhm_s' + Math.ceil(Math.random()*10e9),
- type: 'separator',
- parentId: FeJson.contextMenuId
- });
- };
- /**
- * 创建扩展专属的右键菜单
- */
- let _initMenus = function () {
- _removeContextMenu(() => {
- let id = chrome.contextMenus.create({
- id: FeJson.contextMenuId ,
- title: "FeHelper",
- contexts: ['page', 'selection', 'editable', 'link', 'image'],
- documentUrlPatterns: ['http://*/*', 'https://*/*', 'file://*/*']
- });
- // 绘制用户安装的菜单,放在前面
- Awesome.getInstalledTools().then(tools => {
- let allMenus = Object.keys(tools).filter(tool => tools[tool].installed && tools[tool].menu);
- let onlineTools = allMenus.filter(tool => tool !== 'devtools' && !tools[tool].hasOwnProperty('_devTool'));
- let devTools = allMenus.filter(tool => tool === 'devtools' || tools[tool].hasOwnProperty('_devTool'));
- // 绘制FH提供的工具菜单
- onlineTools.forEach(tool => _createItem(tool, tools[tool].menuConfig));
- // 如果有本地工具的菜单需要绘制,则需要加一条分割线
- devTools.length && _createSeparator();
- // 绘制本地工具的菜单
- devTools.forEach(tool => {
- // 说明是自定义工具 构造menuConfig
- if(!tools[tool].menuConfig) {
- tools[tool].menuConfig = [{
- icon: tools[tool].icon,
- text: tools[tool].name,
- onClick: (info, tab) => {
- chrome.DynamicToolRunner({
- page: 'dynamic',
- noPage: !!tools[tool].noPage,
- query: `tool=${tool}`
- });
- !!tools[tool].noPage && setTimeout(window.close, 200);
- }
- }];
- }
- _createItem(tool, tools[tool].menuConfig)
- });
- });
- // 绘制两个系统提供的菜单,放到最后
- let sysMenu = ['download-crx', 'fehelper-setting'];
- let arrPromises = sysMenu.map(menu => Awesome.menuMgr(menu, 'get'));
- Promise.all(arrPromises).then(values => {
- let needDraw = String(values[0]) === '1' || String(values[1]) !== '0';
- // 绘制一条分割线
- _createSeparator();
- // 绘制菜单
- String(values[0]) === '1' && _createItem(sysMenu[0], [defaultMenuOptions[sysMenu[0]]]);
- String(values[1]) !== '0' && _createItem(sysMenu[1], [defaultMenuOptions[sysMenu[1]]]);
- });
- });
- };
- /**
- * 移除扩展专属的右键菜单
- */
- let _removeContextMenu = function (callback) {
- chrome.contextMenus.removeAll(callback);
- };
- /**
- * 创建或移除扩展专属的右键菜单
- */
- let _createOrRemoveContextMenu = function () {
- Settings.getOptions((opts) => {
- if (String(opts['OPT_ITEM_CONTEXTMENUS']) !== 'false') {
- _initMenus();
- } else {
- _removeContextMenu();
- }
- });
- };
- return {
- rebuild: _createOrRemoveContextMenu
- };
- })();
|