在Firefox附加SDK扩展中的'onInstalled'上执行脚本

问题描述 投票:0回答:1

我对Mozilla扩展程序开发非常陌生,即使我才刚刚了解扩展程序,附加开发程序都与众不同而且我对在MDN(Mozilla开发人员网络)上看到的内容非常满意。我希望在安装了我的附加组件后立即执行脚本'content_script.js',因此用户无需重新启动浏览器。

[我只是拖放xpi文件并安装它,然后单击网页上的一个按钮,该按钮会将消息发送到我的附件,但是我的附件仅在重新加载网页后才收听此消息。

//main.js

       var chrome = require("chrome");      
    chrome.runtime.onInstalled.addListener(function(){
             executeScript (contentscript.js) in tabs});

//also I tried
    browser.runtime.onInstalled.addListener

[我在尝试使用Mozilla扩展而不是附加组件时尝试了此操作,因为它给我带来了浏览器未定义和chrome.runtime未定义的错误。

然后,我在onInstalled()中找到了AddonManager.addAddonListener()

但是,我仍然很困惑如何在附加组件中使用它。

无论我尝试哪种方式都会给我带来错误。

AddonManager.addAddonListener()

下面的代码删除了该错误,但也不起作用:

//main.js
    const { AddonManager } = require("resource://gre/modules/AddonManager.jsm");
    Cu.import("resource://gre/modules/AddonManager.jsm");


    AddonManager.addAddonListener.onInstalled.addListener(function(){
        console.log('installed');
        tabs.executeScript(tabId, "../data/content_script.js", function(result) { console.log('result ='+result); });           
    });

我的package.json看起来像这样

    const { AddonManager } = require("resource://gre/modules/AddonManager.jsm");
    Cu.import("resource://gre/modules/AddonManager.jsm");


    var listener = {
  onInstalled: function(addon) {
      console.log('installed');
      console.log(addon); 
        tabs.executeScript(tabId, "../data/content_script.js", function(result) { console.log('result ='+result); });           
  }
 };

     AddonManager.addAddonListener(listener);

[ { "title": "test", "name": "test", "version": "1.0.0", "description": "test addon corp", "main": "lib/main.js", "author": "test", "engines": { "firefox": ">=38.0a1", "fennec": ">=38.0a1" }, "license": "MIT", "keywords": [ "jetpack" ] } 包含main.js,但仍未执行,因为当我仅重新加载页面时,我的加载项才起作用。

[我认为我做错了,我在Chrome扩展程序中做到了,这很容易,但是我对Mozilla附加组件一无所知。我什至无法达到“已安装”状态。执行content_script距离很远。

javascript firefox-addon firefox-addon-sdk
1个回答
2
投票

看来您遇到了一些问题:

  • 您仍在混合使用WebExtensions和附加SDK
    • 附加SDK没有要查找main的方法,例如tabs.executeScript()。对于活动选项卡,它将为tabs.executeScript()
  • 当前正在安装的附件的安装的tab.attach() tab.attach()事件发生在发生在附件的任何代码的发生[。因此,对于正在侦听的加载项,您将不会收到此事件。加载项的活动。它在监视执行监视的加载项的活动方面的用途是有限的。
  • 如果用户在删除附件之前将其禁用,则可以获取tabs.activeTab.attach() AddonManager事件。如果用户直接将其删除,则只会收到AddonManager事件。
  • [您可能会遇到以下问题:当内容脚本是由作为[主测试附件]加载的加载项附加了内容脚本时,来自内容脚本的onInstalled不会显示在浏览器控制台中。 C0]。输出在执行onInstalled的控制台窗口中可用。虽然输出是设计使然进入控制台窗口,但我感觉输出没有进入浏览器控制台(除了控制台窗口)还是错误或功能不足。
  • 将内容脚本加载到AddonManager页面中所导致的某些行为与将其加载到普通网页中不同。此行为可能包括使AddonManager输出仅显示为好像是使用onDisabled输出的(即,它不会显示在浏览器控制台中,而是显示在执行Firefox / onDisabled的控制台中)。如果您尝试这样做,则需要对自己的能力进行试验。
  • 您已经说过:“我认为我的main.js在安装后没有立即运行。”这种信念可能是由于没有在onUninstalling输出中寻找正确的位置onUninstalling。因此,我在下面的附加组件中自动打开了浏览器控制台。
    • console.log()jpm run中指定的JavaScript文件在安装了附加组件后运行。它也可以在Firefox启动时运行。
  • 您可以具有jpm run函数,该函数在jpm run JavaScript文件中的代码被评估并执行后会自动调用。此功能可用于查找执行加载项的原因。可能的原因是about:*console.log()console.log()dump()dump()。下面的附加组件演示何时执行此代码并将jpm run传递给它。
  • 为了演示各种内容,我编写了一个Firefox附加SDK扩展,它既加载了两个内容脚本又侦听了console.log()事件。我制作了此加载项的两个版本,它们的名称和ID仅在各自的

    package.json文件中分配给它们的名称和ID不同。这两个附加组件是Browser Consolepackage.json

    第一个附加组件"main",是通过在其目录中运行"main"来加载的。通过拖放exports.main为它创建的<.xpi>来安装第二个附件exports.main。使用Firefox UI,我立即导航到OSX上的"main"

    Ctrl

    -Shift-ACmd-Shift-A ),然后首先禁用install;然后“删除” enable;然后刷新startup页面以使其无法“撤消”删除。然后,我退出Firefox主浏览器窗口。附加组件向控制台提供了大量输出,因此您可以查看事情发生的顺序以及哪个附加组件能够接收哪些upgrade事件。控制台输出为[括号中是我对用户界面所做的操作,以及一些注释]:downgrade

    我建议您在下面的附加组件上进行实验,以了解AddonManager事件可能发生的情况以及代码在附加组件内执行的时间。

    附加文件:

    index.js

    reason

    data / contentScriptA

    AddonManager

    data / contentScriptB

    installinfo@ex1

    package.json
    (对于installinfo @ ex1):

    installinfo@ex2

    package.json
    (对于installinfo @ ex2 ::

    installinfo@ex1

  • © www.soinside.com 2019 - 2024. All rights reserved.