You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在FireGestures用户脚本中调用Firefox扩展提供的函数?

解决用户脚本调用deskCut核心函数无效果的问题

我之前折腾过类似的场景,用户脚本直接调用扩展的函数没反应,核心原因是浏览器的安全隔离机制——用户脚本和浏览器扩展运行在完全不同的上下文环境里,直接跨上下文调用函数是被浏览器安全策略禁止的,所以你直接调用net.evelands.deskcut.create()肯定没效果。

给你两个可行的解决方案,按需选择:

方案一:修改deskCut扩展,对外暴露函数

这是最直接的方式,把扩展的核心函数挂载到全局window对象上,让用户脚本能访问到:

  1. 解压你下载的deskCut xpi文件(把后缀改成zip就能解压),找到和deskcutOverlay.xul绑定的JS文件(一般是deskcutOverlay.js,xul文件里会有<script>标签引入)。
  2. 找到net.evelands.deskcut.create()函数的定义,在函数定义完成后,添加一行代码把它挂载到window:
    // 把create函数暴露给全局window
    window.deskcutCreate = net.evelands.deskcut.create;
    
  3. 把修改后的文件重新打包成xpi(把所有文件压缩成zip,再改回xpi后缀),然后在浏览器里重新安装这个修改后的扩展(记得先卸载原来的)。
  4. 在你的用户脚本里,就可以调用这个暴露出来的函数了,注意要等扩展加载完成再调用:
    // ==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和扩展通信

如果不想直接把函数暴露到全局,也可以用浏览器的消息传递机制,让用户脚本给扩展发消息,扩展收到消息后再调用核心函数:

  1. 同样打开扩展的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; // 保持消息通道开放,以便发送响应
    });
    
  2. 重新打包安装修改后的扩展,然后在用户脚本里发送消息:
    // ==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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:14:13