【发布时间】:2013-02-18 03:16:13
【问题描述】:
情况:我正在编写一个适用于任何页面的 chrome 扩展。
问题问题:我无法将 jQuery 加载到 Facebook 中,我想了解发生了什么。
假设:Facebook 拥有一些超先进的技术,可以以某种方式检测两者:
- 当通过 chrome 扩展加载 jQuery 时 表面上 独立 JSVM 执行上下文,Facebook megamind 不知何故知道这个表面上单独的JSVM执行 上下文,并阻止它。
-
jQuery 通过 script.src 加载并阻止它(当我使用通过 HTTPS 而不是 没有方法 2 的 jQuery 之一,,但不足以 回答)。
数据
我怎么知道 jQuery 没有加载?
我 ⌘⌥j 在 Chrome 中打开控制台。当我这样做时:
> jQuery
>> ReferenceError : jQuery is not defined.
> $('body')
>> Error : Tried to get element "body" but it is not present on the page.
如何尝试在 facebook 中加载 jQuery?
方法一(需要但失败):
通过 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 答案 (load jQuery into console) 中描述的方法,修改为允许正确的协议:
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();
总结
假设 1 似乎不太可能,因为覆盖 Web 浏览器的单独执行上下文将是一个重大的安全漏洞(破坏该沙盒),并且不太可能受到制裁。因此,我可能是偏执狂并忽略了显而易见的事情,希望你们中的一个人会看到。
附录(其他相关代码)
所有non-standard.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;
};
更多manifest.json:
"manifest_version" : 2,
"permissions" : [
"http://*/",
"https://*/",
"tabs",
"storage",
"unlimitedStorage"
],
【问题讨论】:
-
所以您的扩展程序可以在 Facebook 以外的任何其他网站上运行?
-
@SimonBoudrias 好问题。其实没有。我只检查了 Stackoverflow(但似乎他们加载了自己的 jQuery,所以我得到了误报)。我的扩展程序也不适用于 Google。好点子!也许我需要更改问题的标题,尽管现在这可能太分散注意力了。
-
他们实现的那个小 $ 函数很有趣,它只是假装它做了什么,但实际上它只是一个欺骗性的错误消息。据推测,他们正试图吸引大量试图挖掘 Facebook 胆量的人。
-
好吧,这与 Facebook megamind 或任何东西无关。只是您没有正确加载脚本。此外,请确保通过调用
noConflict来防止与其他 jquery 实例发生冲突。顺便说一句,我不确定内容脚本是如何工作的,但可能值得尝试只使用一个串联脚本。 -
@SimonBoudrias 您是否认为控制台的执行上下文与注入的内容脚本的执行上下文不同?
标签: javascript jquery facebook google-chrome-extension google-chrome-devtools