如何使用mozilla sdk分离内容脚本?

时间:2014-06-26 22:42:58

标签: ajax sdk firefox-addon mozilla firefox-addon-sdk

我正在写一个密码管理器,我的扩展程序在页面就绪时创建了一个监听器,因此在导航了几个url后,我有一堆监听器。我想回复用户点击“提交”表单按钮,而不是一次激活多个侦听器,所以我想分离内容脚本。

现在它会监听表单提交,然后检查下一页加载的“密码不正确”等,然后做其他一些事情。这是我附加监听器的代码:

tabs.on("ready", function(tab) {
    fillLoginAndPass(tab);
    listenForLoginSubmit(tab);
});

function listenForLoginSubmit(tab) {
    // attach submit listener 
    worker = tab.attach({
        contentScriptFile: [data.url("jquery-1.11.1.min.js"), data.url("listener-script.js")]
    });

    worker.port.on("submittedCredentials", function (formSubmitURL, enteredLogin, loginField, enteredPassword, passwordField) {
        tab.on("ready", function() {
            checkLogin(tab, formSubmitURL, enteredLogin, loginField, enteredPassword, passwordField);
        });
    });
}

我尝试过使用worker.destroy(),但它没有效果 - port.on()脚本仍然执行多次。还有另一种方法吗?提前谢谢。

修改

为了澄清,这是我的代码与worker.destroy()的对应关系:

function listenForLoginSubmit(tab) {
    // attach submit listener 
    worker = tab.attach({
        contentScriptFile: [data.url("jquery-1.11.1.min.js"), data.url("listener-script.js")]       
    });

    worker.on("detach", function() {
        console.log("Worker detached from "+tabs.activeTab.url);
    });

    worker.port.on("submittedCredentials", function (formSubmitURL, enteredLogin, loginField, enteredPassword, passwordField) {
        tab.on("ready", function() {
            checkLogin(tab, formSubmitURL, enteredLogin, loginField, enteredPassword, passwordField);
            worker.destroy();
        });
    });
}

function checkLogin(tab, formSubmitURL, enteredLogin, loginField, enteredPassword, passwordField) {
    console.log("Hello!");
    /* code */
}

产出的差异是:

// without worker.destroy()
/* Log in to wikipedia.org */
console.log: passman: Hello!

/* Log out, return to login page */
/* Log in a second time */
console.log: passman: Hello!
console.log: passman: Hello!
console.log: passman: Worker detached from https://en.wikipedia.org/w/index.php?title=Special:Search&search=&go=Go

// with worker.destroy()
/* Log in to wikipedia.org */
console.log: passman: Hello!
console.log: passman: Worker detached from https://en.wikipedia.org/w/index.php?title=Special:Search&search=&go=Go

/* Log out, return to login page */
/* Log in a second time */
console.log: passman: Hello!
console.log: passman: Worker detached from https://en.wikipedia.org/w/index.php?title=Special:Search&search=&go=Go
console.log: passman: Hello!
console.log: passman: Worker detached from https://en.wikipedia.org/w/index.php?title=Special:Search&search=&go=Go

如果我第三次这样做,我会得到3个“你好!”,依此类推。再次感谢您提供的任何帮助。

编辑2 评论中的错误报告Zer0链接有答案。这是:

let { off } = require("sdk/event/core");
off(worker.port);

2 个答案:

答案 0 :(得分:0)

我不得不说我没有尝试过这个想法,但正如任何人回答的那样,也许它可以帮助你:据我所知,内容脚本是通过工作人员添加的。所以,也许,你可以尝试用一个新的覆盖工人(没有内容脚本):

worker.on("detach", function() {
    worker = tab.attach({
         contentScriptFile: [data.url("jquery-1.11.1.min.js")]       
    });
});

或者,也许,您可以使用listener-script.js空白文件或覆盖该内容脚本中定义的类的代码覆盖该文件。希望它有效或抛出新想法!

答案 1 :(得分:0)

过去的时间这个问题得到了一个公认的答案,因为没有其他人写过这个问题我会的。评论中的错误报告Zer0链接有答案。这是:

let { off } = require("sdk/event/core");
off(worker.port);