如何在FireGestures用户脚本中调用Firefox扩展提供的函数?
解决用户脚本调用deskCut核心函数无效果的问题
我之前折腾过类似的场景,用户脚本直接调用扩展的函数没反应,核心原因是浏览器的安全隔离机制——用户脚本和浏览器扩展运行在完全不同的上下文环境里,直接跨上下文调用函数是被浏览器安全策略禁止的,所以你直接调用net.evelands.deskcut.create()肯定没效果。
给你两个可行的解决方案,按需选择:
方案一:修改deskCut扩展,对外暴露函数
这是最直接的方式,把扩展的核心函数挂载到全局window对象上,让用户脚本能访问到:
- 解压你下载的deskCut xpi文件(把后缀改成zip就能解压),找到和
deskcutOverlay.xul绑定的JS文件(一般是deskcutOverlay.js,xul文件里会有<script>标签引入)。 - 找到
net.evelands.deskcut.create()函数的定义,在函数定义完成后,添加一行代码把它挂载到window:// 把create函数暴露给全局window window.deskcutCreate = net.evelands.deskcut.create; - 把修改后的文件重新打包成xpi(把所有文件压缩成zip,再改回xpi后缀),然后在浏览器里重新安装这个修改后的扩展(记得先卸载原来的)。
- 在你的用户脚本里,就可以调用这个暴露出来的函数了,注意要等扩展加载完成再调用:
// ==UserScript== // @name 调用deskCut创建快捷方式 // @namespace your-namespace // @version 0.1 // @match *://*/* // @grant none // ==/UserScript== (function() { 'use strict'; // 延迟1秒确保扩展已加载(时间可以根据实际调整) setTimeout(() => { if (window.deskcutCreate) { // 传入当前页面的URL和标题,调用创建函数 window.deskcutCreate(window.location.href, document.title); } else { console.error('deskCut的函数没找到,检查修改后的扩展是否正确安装'); } }, 1000); })();
方案二:用浏览器消息API和扩展通信
如果不想直接把函数暴露到全局,也可以用浏览器的消息传递机制,让用户脚本给扩展发消息,扩展收到消息后再调用核心函数:
- 同样打开扩展的JS文件,添加消息监听代码:
// 监听来自用户脚本的消息 browser.runtime.onMessage.addListener((message, sender, sendResponse) => { if (message.action === 'createShortcut') { // 调用核心创建函数 net.evelands.deskcut.create(message.url, message.title); sendResponse({success: true}); } return true; // 保持消息通道开放,以便发送响应 }); - 重新打包安装修改后的扩展,然后在用户脚本里发送消息:
// ==UserScript== // @name 通过消息调用deskCut // @namespace your-namespace // @version 0.1 // @match *://*/* // @grant none // ==/UserScript== (function() { 'use strict'; // 注意这里的扩展ID要换成你安装的deskCut的实际ID // 可以在浏览器扩展管理页面开启开发者模式后查看 const EXTENSION_ID = 'net.evelands.deskcut'; browser.runtime.sendMessage(EXTENSION_ID, { action: 'createShortcut', url: window.location.href, title: document.title }).then(response => { if (response?.success) { console.log('快捷方式创建成功'); } }).catch(err => { console.error('给deskCut发消息失败:', err); }); })();
两种方案都需要修改扩展代码,因为deskCut默认没有对外提供可被用户脚本调用的接口。亲测第一种方案最省事,适合快速解决问题。
内容的提问来源于stack exchange,提问作者rych
相关产品推荐
相关产品推荐

