火狐附加组件 SDK - 脚本不运行



首先我写了一个

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).

然后是basic

jpm xpi
jpm sign ...

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

为什么?

您在PageMod的options对象的include属性中传递RegExp。当这样做时,您的RegExp:

必须匹配整个URL,而不仅仅是的子集,并且禁用了global, ignoreCase和multiline。

更多细节,可以看MDN上的讨论。如果您已经访问过这个页面,您可能需要按ctrl-F5,因为我刚刚更新了一些RegExp示例。

你的RegExp是//*.facebook.*/。这将不可能匹配任何有效URL的全部。它目前将匹配如下内容:

.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")
    ]
});

然而,列出你想要匹配的顶级域名(tld)会更安全。你必须选择是否要匹配太多的域名(所有顶级域名,或所有包含facebook的域名),或者只匹配那些你已经验证属于Facebook的域名。你的选择将取决于你的附加组件的功能,以及你如何平衡用户的易用性与不在接近facebook的域上运行的安全性。理想情况下,你会确定所有的域名是由facebook显示你想要的内容,并包括那些。

include的一个例子,它包含了你在问题中列出的域:

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

完整的SDK插件:

下面是我用来测试的完整的Firefox Add-on 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/.*/,

相关内容

  • 没有找到相关文章

最新更新