首先我写了一个
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/.*/,