状況: どのページでも動作する chrome 拡張機能を作成しています。
問題 質問: jQuery を Facebook にロードできません。何が起こっているのかを知りたいです。
仮説: Facebook は何らかの方法で両方を検出する超高度な技術を持っています。
- jQuery が、表向きは別のJSVM 実行コンテキストでchrome 拡張機能を介してロードされると、Facebook メガマインドは、この表向きは別のJSVM 実行コンテキストを何らかの方法で認識し、それをブロックします。
そのjQueryはscript.srcを介してロードされ、それをブロックします(方法2が機能しないjQueryの代わりにHTTPSを介して提供するGoogle CDNを使用した場合、回答には不十分です)。
データ
jQuery がロードされていないことを確認するにはどうすればよいですか?
私⌘</kbd>⌥</kbd>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 をコンソールにロードする) で説明されている方法を使用して、正しいプロトコルを許可するように変更します。
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"
],