Firefox附加组件SDK - 脚本不运行

时间:2016-08-11 13:32:56

标签: javascript firefox firefox-addon firefox-addon-sdk browser-addons

首先我做了一个

jpm init

在专门的文件夹中。

然后我想用某个页面进行基本的DOM操作。

这就是我所做的:

FF-main.js:

var pageMod = require("sdk/page-mod");

pageMod.PageMod({
    include: /\/*.facebook\.*/,
    contentScriptFile: [
        data.url("jquery-2.2.1.min.js"),
        data.url("script.js")
    ]
});

的script.js

window.alert('Hey!');

目前它不是真正的DOM操作,但它仍然不起作用。它使用RegEx表达式仅在facebook上加载所有http / https / www / m + .com .co.uk .nz .fr .de .it .ru(lol)。

然后我做了基本的

jpm xpi
jpm sign ...

当我重新启动Firefox后加载页面时,它没有做任何事情。

为什么?

1 个答案:

答案 0 :(得分:0)

您在RegExp includeoptions object属性中传递了PageMod。这样做时,您的RegExp:

  

必须匹配整个网址,而不仅仅是子集,并且已禁用global,ignoreCase和multiline。

有关详细信息,请参阅discussion on MDN。如果您已经访问过此页面,则可能需要点击 ctrl - F5 ,因为我刚刚更新了一些RegExp示例。

您的RegExp为/\/*.facebook\.*/。这不可能与任何有效网址完整匹配。它目前会匹配以下内容:

.facebook
Afacebook
//////////////Bfacebook................

但是,匹配:

http://www.facebook.com/

因此,您的PageMod永远不会被应用。

你想要这样的东西:

var pageMod = require("sdk/page-mod");

pageMod.PageMod({
    include: /[^:/]+:\/\/[^/]*\.facebook\.([^/.]*|co\.uk)\/.*/, 
    contentScriptFile: [
        data.url("jquery-2.2.1.min.js"),
        data.url("script.js")
    ]
});

但是,列出要匹配的top level domains (TLDs)会更安全。您必须选择是否要匹配太多域(所有TLD或包含facebook的所有域),或仅匹配您已验证属于Facebook的域。您选择的内容取决于您的加载项的功能,以及您希望如何平衡用户的易用性以及未在facebook附近的域上运行的安全性。理想情况下,您将确定Facebook拥有的所有域,这些域显示您想要的内容并包含这些域。

include的一个示例,其中包含您在问题中列出的域名:

    include: /[^:/]+:\/\/[^/]*\.facebook\.(com|co\.uk|nz|fr|de|it|ru)\/.*/,

完整的SDK附加组件:

以下是我用于测试的完整Firefox附加SDK扩展:

的package.json

{
    "title": "Test PageMod RegExp",
    "name": "pagemodregexp1",
    "version": "0.0.1",
    "description": "Test using a RegExp with PageMod",
    "main": "index.js",
    "author": "Makyen",
    "engines": {
        "firefox": ">=38.0a1",
        "fennec": ">=38.0a1"
    },
    "license": "MIT",
    "keywords": [
        "jetpack"
    ]
}

index.js

var self = require("sdk/self");
var data = self.data;

var pageMod = require("sdk/page-mod");

pageMod.PageMod({
    //Works (but matches probably bad domain facebook.co.uk):
    //include: /[^:/]+:\/\/[^/]*\.facebook\.([^/.]*|co\.uk)\/.*/,
    //Works (but matches probably bad domain facebook.co.uk):
    //include: /[^:/]+:\/\/[^/]*\.facebook\.(com|co\.uk|nz|fr|de|it|ru)\/.*/,
    //Works:
    include: /[^:/]+:\/\/[^/]*\.facebook\.com\/.*/,


    contentScriptFile: [
//        data.url('jquery-2.2.1.min.js'),
        data.url('contentScript.js')
    ]
});

数据/ contentScript.js

window.alert('contentScript.js loaded. URL=' + document.URL);
console.log('contentScript.js loaded. URL=' + document.URL);

导航到facebook.com时的控制台输出(以及每个console.log()的提醒):

console.log: pagemodregexp1: contentScript.js loaded. URL=https://staticxx.facebook.com/common/referer_frame.php
console.log: pagemodregexp1: contentScript.js loaded. URL=https://staticxx.facebook.com/common/referer_frame.php
console.log: pagemodregexp1: contentScript.js loaded. URL=https://www.facebook.com/

关于您列出的域名的说明:

facebook.com:   valid
facebook.co.uk: broken good chance it is not be owned by Facebook
                Whois shows registered to: Technomicom Inc.
                NOT registered to Facebook UK LTD (& uses a different physical address)
facebook.nz:    invalid: Server not found
facebook.fr:    valid: redirects to fr-fr.facebook.com
facebook.de:    valid: redirects to de-de.facebook.com
facebook.it:    valid: redirects to facebook.com
facebook.ru:    invalid: Server not found

鉴于Facebook似乎将所有备用域重定向到facebook.com,我建议不要在facebook.com以外的其他域中包含任何其他域名:

include: /[^:/]+:\/\/[^/]*\.facebook\.com\/.*/,