首先我做了一个
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后加载页面时,它没有做任何事情。
为什么?
答案 0 :(得分:0)
您在RegExp include
的options 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)\/.*/,
以下是我用于测试的完整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\/.*/,