【问题标题】:Running javascript on pinned tabs in firefox在 Firefox 的固定选项卡上运行 javascript
【发布时间】:2020-04-29 20:21:26
【问题描述】:

我想在 Firefox 的固定选项卡中打开的页面上运行一些 javascript,特别是我想修改在固定选项卡中加载的网页的 dom。如何使用 firefox addon api 做到这一点?

【问题讨论】:

    标签: firefox firefox-addon firefox-addon-sdk add-on


    【解决方案1】:

    您可以使用 Firefox tabs API 做到这一点。任何Tab 都有一个可以从后台页面读取的“固定”属性。

    例如,你可以这样做:

    在后台脚本中创建 isTabPinned 请求桥,它将获取选项卡属性并将其发送到内容脚本。

    bg.js

    chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
        if (msg.request == "isTabPinned") {
            sendResponse(sender.tab.pinned);
        }
    });
    

    在 content-script 中向后台脚本桥发送请求以获取选项卡固定状态并在选项卡固定时修改 DOM。

    cs.js

    chrome.runtime.sendMessage({ request: "isTabPinned" }, tabPinned => {
        if(tabPinned){
            //.. modify your DOM here
        }
    });
    

    将内容脚本加载到您需要检查的页面(或示例中的任何页面)和后台脚本。为您的脚本授予“tabs”和“activeTab”权限。

    ma​​nifest.json

    {
        "manifest_version": 2,
        "name": "Pin Detector",
        "version": "0.1",
    
        "background": {
          "scripts": ["bg.js"]
        },
    
        "content_scripts": [
          {
            "matches": ["*://*/*"],
            "js": ["cs.js"]
          }
        ],
    
        "permissions": ["tabs","activeTab"]
    }
    

    【讨论】:

    • 与其在 manifest.josn 中使用 content_scripts 条目注入内容脚本,不如使用 @987654327 以编程方式仅将内容脚本注入固定选项卡中@。您执行此操作的方式使用户访问过的每个页面 都加载和运行您的内容脚本。用户可能会打开数千个选项卡,并且可能会使用每个选项卡访问多个页面。当只有少数可能被固定时,您在每个页面中运行代码是不合理的。具体示例:我有 6 个固定标签,不到 1,800 个标签。
    • 嗯,是的,你是对的,你的方案可能比我的方案有更好的性能:) 我回答的目标是展示解决问题的最简单方法。但另一方面,您的决定将需要一直查询和循环所有 1800 个选项卡,因为我没有发现选项卡上触发的任何事件被固定,但用户可以在运行时固定/取消固定选项卡。
    • tabs.onUpdated() 事件在选项卡被固定/取消固定时触发,并提供已固定的选项卡。它还会在每个选项卡的 URL 更改时触发(并告诉您该选项卡是否已固定),您还需要监听 .如果您的内容脚本必须尽可能接近document_start,那么它会变得有点棘手和复杂。但是,考虑到对于您的方案,您的内容脚本会等待执行任何操作,直到它从后台脚本获取信息(即,如果固定),它已经从 document_start 延迟了两个进程间通信时间。
    • 谢谢!我会在周末写 PoC,如果你没问题,我会把它附在我的答案上 :)
    • 我很好/很高兴您将这种方式添加到您的答案中,或者将您的答案更改为使用该方法。我确实认为这种方法应该是一个答案,因为它使用的资源更少,可能比在每个页面上运行内容脚本要少得多。如果你不添加它,我会用这种方法写一个答案,放在我应该做的事情清单上。这份清单有点长,所以我不确定什么时候/是否会得到它。
    猜你喜欢
    • 1970-01-01
    • 2013-08-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多