情况:我正在编写一个适用于任何页面的 Chrome 扩展。
问题问题:我无法将 jQuery 加载到 Facebook,我想了解发生了什么。
假设:Facebook 拥有一些超先进的技术,可以以某种方式检测到:
- 当 jQuery 通过 chrome 扩展加载时
表面上separateJSVM 执行上下文,Facebook 巨头
表面上不知何故知道这一点separateJSVM执行
上下文,并阻止它。
-
jQuery 通过 script.src 加载并阻止它
(当我使用通过 HTTPS 提供服务的 Google CDN 而不是
jQuery 方法 2 不起作用,但还不足以
回答).
DATA
我怎么知道 jQuery 没有加载?
I ⌘⌥j to bring up the console in Chrome. When I do :
> jQuery
>> ReferenceError : jQuery is not defined.
> $('body')
>> Error : Tried to get element "body" but it is not present on the page.
我如何尝试在 facebook 中加载 jQuery?
方法1(必需但失败):
通过manifest.json文件中的以下代码:
"content_scripts" : [
{
"matches" : ["<all_urls>"],
"js" : [
"javascript/jq/jquery-1.9.1.min.js",
"javascript/jq/non-standard.js"
],
"all_frames": true // (or false, same failure)
}
]
方法2(有效,但不够):
通过此 SO 答案中描述的方法(将 jQuery 加载到控制台 https://stackoverflow.com/a/7474386/907415),修改为允许正确的协议:
var jq = document.createElement('script');
jq.src = "//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js";
document.getElementsByTagName('head')[0].appendChild(jq);
jQuery.noConflict();
Summary
假设 1 似乎不太可能,因为覆盖 Web 浏览器的单独执行上下文将是一个主要的安全漏洞(破坏沙箱),并且不太可能受到制裁。因此,我可能有点偏执,忽视了显而易见的事情,希望你们中的一个人能看到这一点。
附录(其他相关代码)
All of 非标准.js :
$.fn.in_groups_of = function( countPerGroup ) {
var groups = [], offset = 0, $group;
while ( ($group = this.slice( offset, (countPerGroup + offset) )).length ) {
groups.push( $group );
offset += countPerGroup;
}
return groups;
};
More of 清单.json :
"manifest_version" : 2,
"permissions" : [
"http://*/",
"https://*/",
"tabs",
"storage",
"unlimitedStorage"
],